diff --git a/ecrire/tests/Filtre/Form/FormHiddenTest.php b/ecrire/tests/Filtre/Form/FormHiddenTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..8e00324cf36454c2db24fe1ccd0b00d0e722dad4
--- /dev/null
+++ b/ecrire/tests/Filtre/Form/FormHiddenTest.php
@@ -0,0 +1,47 @@
+<?php
+
+declare(strict_types=1);
+
+namespace Spip\Test\Filtre\Form;
+
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Depends;
+use PHPUnit\Framework\TestCase;
+use RuntimeException;
+use Spip\Test\SquelettesTestCase;
+
+class FormHiddenTest extends SquelettesTestCase
+{
+	public function testParametreUrl() {
+		$this->assertSame('x?y=1', parametre_url('x', 'y', '1'));
+		$this->assertSame('x?y=2', parametre_url(parametre_url('x', 'y', '1'), 'y', '2'));
+
+		$this->assertEqualsCode('x?y=1', '[(#VAL{x}|parametre_url{y,1})]');
+		$this->assertEqualsCode('x?y=2', '[(#VAL{x}|parametre_url{y,1}|parametre_url{y,2})]');
+	}
+
+	public function testParametreUrlArray() {
+		$this->assertSame('x?t[]=1&amp;t[]=2', parametre_url('x', 't[]', [1, 2]));
+
+		$this->assertEqualsCode('x?t[]=1&amp;t[]=2', '[(#VAL{x}|parametre_url{t\[\],#LISTE{1,2}})]');
+	}
+
+	public function testFormHiddenUnused() {
+		$url = parametre_url(parametre_url('x', 'toto', '1'), 'toto', '%!');
+		$url .= '&amp;toto=3=2';
+		$hiddens = form_hidden($url);
+		$this->assertCount(1, extraire_balises($hiddens, 'input'), 'bug compte d’input');
+
+		$url = parametre_url('x', 'toto', '3=2');
+		$url .= '&amp;toto=p';
+		$hiddens = form_hidden($url);
+		$this->assertSame('3=2', extraire_attribut(extraire_balise($hiddens, 'input'), 'value'), 'bug value input');
+	}
+
+	public function testFormHiddenArray() {
+		$url = parametre_url('x', 't[]', ['1', '%!']);
+		$url .= '&amp;t[]=3=2';
+		$hiddens = form_hidden($url);
+		$this->assertCount(3, extraire_balises($hiddens, 'input'), 'bug compte d’input');
+	}
+}
diff --git a/ecrire/tests/legacy/unit/filtres/form_hidden.html b/ecrire/tests/legacy/unit/filtres/form_hidden.html
deleted file mode 100644
index 2aac415f55079053a75a19b98dbf5d9432171e5c..0000000000000000000000000000000000000000
--- a/ecrire/tests/legacy/unit/filtres/form_hidden.html
+++ /dev/null
@@ -1,36 +0,0 @@
-#SET{t,t#EVAL{chr(91).chr(93)}}
-
-
-[(#REM)
-
-	Verifier que parametre_url fonctionne
-
-]
-[(#VAL{x}|parametre_url{y,1}|=={'x?y=1'}|?{'', erreur parametre url 1})]
-[(#VAL{x}|parametre_url{y,1}|parametre_url{y,2}|=={'x?y=2'}|?{'',
-erreur parametre url 2<br />})]
-
-
-[(#VAL{x}|parametre_url{#GET{t},#LISTE{1,2}}|=={
-#VAL{x}|concat{'?'}|concat{#GET{t}}|concat{'=1&amp;'}|concat{#GET{t}}|concat{'=2'}
-}|?{'',
-erreur parametre url tableau<br />})]
-
-
-[(#REM)
-
-	Verifie que form_hidden n'ajoute pas des valeurs pour rien
-
-]
-
-[(#VAL{x}|parametre_url{toto,1}|parametre_url{toto,%!}|concat{&amp;toto=3=2}|form_hidden|extraire_balises{input}|count|=={1}|?{'',
-bug compte d'input<br />})]
-
-[(#VAL{x}|parametre_url{toto,3=2}|concat{&amp;toto=p}|form_hidden|extraire_balise{input}|extraire_attribut{value}|=={'3=2'}|?{'',
-bug value<br />})]
-
-[(#REM) si var est un tableau, il faut conserver tous les input ]
-[(#VAL{x}|parametre_url{#GET{t},#LISTE{1,%!}}|concat{&amp;#GET{t}}|concat{=3=2}|form_hidden|extraire_balises{input}|count|=={3}|?{'',
-bug tableau<br />})]
-
-OK
\ No newline at end of file