diff --git a/.gitattributes b/.gitattributes
index ed8e89c1b7a67a23850e5b672b931c5ac1e3b924..ae606a1f1f1ce25101d3ae6ea5ff01da966d86e8 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -11,5 +11,5 @@ docker-compose.yml export-ignore
 /lib/ export-ignore
 /mutualisation/ export-ignore
 /sites/ export-ignore
-/tests/ export-ignore
+/ecrire/tests/ export-ignore
 /themes/ export-ignore
diff --git a/.gitignore b/.gitignore
index 8b330447ba8943ef2f60bdbfdb088f71e6c0294a..da1b5682ff620215bef2c0eb57fd5bdb025eb652 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,10 +2,12 @@
 /vendor/
 /composer.phar
 /composer.local.*
+/phpunit.xml
 /phpcs.xml
 /phpstan.neon
 /docker-compose.override.yml
 /docker-compose.yml
+/.phpunit.cache
 
 # SPIP
 /IMG/
diff --git a/README.md b/README.md
index f1ecf52301a542775dae8c1444f788ffff07b8a2..1a1c61c37edf62e0411eee723fd9c404be537650 100644
--- a/README.md
+++ b/README.md
@@ -21,3 +21,46 @@ maintenu par sa communauté avec tendresse.
 
 - [Reporter une faille de sécurité](https://www.spip.net/fr_article6688.html)
 - [SECURITY.md](SECURITY.md)
+
+## Tests pour SPIP
+
+Suite de tests basée sur PHPUnit, avec un wrapper pour les tests historiques écrits en script PHP standalone ou en squelette HTML
+
+### Commandes spécifiques
+
+Lancer tous les tests
+
+```bash
+vendor/bin/phpunit --colors tests
+```
+
+Voir le détail de tous les tests lancés (y compris leurs noms)
+
+```bash
+vendor/bin/phpunit --colors --debug tests
+```
+
+Lister toutes les suites de tests :
+
+```bash
+vendor/bin/phpunit --colors --debug --list-suites
+```
+
+Lister tous les tests :
+
+```bash
+vendor/bin/phpunit --colors --debug --list-tests
+```
+
+Pour filtrer les tests et n'en executer que certains :
+
+```bash
+vendor/bin/phpunit --colors --debug tests --filter=unit/propre/
+vendor/bin/phpunit --colors --debug --filter=testCouper
+```
+
+### Legacy
+
+Les tests historiques écrits sous forme de PHP ou de squelette HTML sont joués via les 2 composants `LegacyUnitHtmlTest.php` et `LegacyUnitPhpTest.php`
+
+Il est encore possible de lancer dans le navigateur la suite de tests legacy via l'url `monsite.spip/tests/` mais cette méthode est depréciée et ne lancera pas les tests écrits directement pour PHPUnit
diff --git a/composer.json b/composer.json
index 019a4192b8bdc51f20fba529863b116652736935..6bf6f3d47b10112bb503b485ee2ffb4e0f3ca6ae 100644
--- a/composer.json
+++ b/composer.json
@@ -37,7 +37,10 @@
         "dealerdirect/phpcodesniffer-composer-installer": "^1.0",
         "phpcompatibility/php-compatibility": "10.x-dev",
         "phpstan/phpstan": "^1.10",
-        "spip/coding-standards": "^1.3"
+        "spip/coding-standards": "^1.3",
+        "phpunit/phpunit": "^10.1",
+        "symplify/easy-coding-standard": "^11.3",
+        "lolli42/finediff": "^1.0"
     },
     "suggest": {
         "ext-curl": "*",
@@ -45,7 +48,8 @@
         "ext-mbstring": "Faster than the polyfill for string actions",
         "ext-mysqli": "*",
         "ext-pdo": "*",
-        "ext-pdo_sqlite": "*"
+        "ext-pdo_sqlite": "*",
+        "ext-iconv": "Can be used as fallback when ext-mbstring is not available"
     },
     "repositories": {
         "spip": {
@@ -58,9 +62,15 @@
             "Spip\\": "ecrire/src/"
         }
     },
+    "autoload-dev": {
+        "psr-4": {
+            "Spip\\Test\\": "ecrire/tests/"
+        }
+    },
     "archive": {
         "exclude": [
             "!vendor",
+            "phpunit.xml.dist",
             "phpcs.xml.dist",
             "phpstan.neon.dist",
             "phpstan-baseline.neon",
diff --git a/composer.lock b/composer.lock
index 25ece4c96f76ccb088dcbad069e96f69411b0056..0813fa93d23c08f21bef6a8476ff8058f9cabc54 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,7 +4,7 @@
         "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
         "This file is @generated automatically"
     ],
-    "content-hash": "bad6c6a4468e734b6257eb51a03e007a",
+    "content-hash": "0ce3ad653197ff4db023c81a0da1c2f9",
     "packages": [
         {
             "name": "algo26-matthias/idna-convert",
@@ -1431,6 +1431,297 @@
             },
             "time": "2023-01-05T11:28:13+00:00"
         },
+        {
+            "name": "lolli42/finediff",
+            "version": "1.0.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/lolli42/FineDiff.git",
+                "reference": "f72cd968b663fc09bc73ef0ab5a3288583d0d59d"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/lolli42/FineDiff/zipball/f72cd968b663fc09bc73ef0ab5a3288583d0d59d",
+                "reference": "f72cd968b663fc09bc73ef0ab5a3288583d0d59d",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.2.0",
+                "symfony/polyfill-mbstring": "^1.23"
+            },
+            "replace": {
+                "cogpowered/finediff": "*"
+            },
+            "require-dev": {
+                "friendsofphp/php-cs-fixer": "^3.4",
+                "phpstan/phpstan": "^1.6",
+                "phpunit/phpunit": "^8 || ^9"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "cogpowered\\FineDiff\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Raymond Hill"
+                },
+                {
+                    "name": "Rob Crowe",
+                    "email": "rob@cogpowered.com"
+                },
+                {
+                    "name": "Christian Kuhn",
+                    "email": "lolli@schwarzbu.ch",
+                    "role": "maintainer"
+                }
+            ],
+            "description": "PHP implementation of a Fine granularity Diff engine",
+            "homepage": "https://github.com/lolli42/FineDiff",
+            "keywords": [
+                "diff",
+                "finediff",
+                "opcode",
+                "string",
+                "text"
+            ],
+            "support": {
+                "issues": "https://github.com/lolli42/FineDiff/issues",
+                "source": "https://github.com/lolli42/FineDiff/tree/1.0.2"
+            },
+            "time": "2022-05-23T07:44:28+00:00"
+        },
+        {
+            "name": "myclabs/deep-copy",
+            "version": "1.11.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/myclabs/DeepCopy.git",
+                "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/7284c22080590fb39f2ffa3e9057f10a4ddd0e0c",
+                "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.1 || ^8.0"
+            },
+            "conflict": {
+                "doctrine/collections": "<1.6.8",
+                "doctrine/common": "<2.13.3 || >=3,<3.2.2"
+            },
+            "require-dev": {
+                "doctrine/collections": "^1.6.8",
+                "doctrine/common": "^2.13.3 || ^3.2.2",
+                "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13"
+            },
+            "type": "library",
+            "autoload": {
+                "files": [
+                    "src/DeepCopy/deep_copy.php"
+                ],
+                "psr-4": {
+                    "DeepCopy\\": "src/DeepCopy/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "description": "Create deep copies (clones) of your objects",
+            "keywords": [
+                "clone",
+                "copy",
+                "duplicate",
+                "object",
+                "object graph"
+            ],
+            "support": {
+                "issues": "https://github.com/myclabs/DeepCopy/issues",
+                "source": "https://github.com/myclabs/DeepCopy/tree/1.11.1"
+            },
+            "funding": [
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2023-03-08T13:26:56+00:00"
+        },
+        {
+            "name": "nikic/php-parser",
+            "version": "v4.15.4",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/nikic/PHP-Parser.git",
+                "reference": "6bb5176bc4af8bcb7d926f88718db9b96a2d4290"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/6bb5176bc4af8bcb7d926f88718db9b96a2d4290",
+                "reference": "6bb5176bc4af8bcb7d926f88718db9b96a2d4290",
+                "shasum": ""
+            },
+            "require": {
+                "ext-tokenizer": "*",
+                "php": ">=7.0"
+            },
+            "require-dev": {
+                "ircmaxell/php-yacc": "^0.0.7",
+                "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0"
+            },
+            "bin": [
+                "bin/php-parse"
+            ],
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "4.9-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "PhpParser\\": "lib/PhpParser"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Nikita Popov"
+                }
+            ],
+            "description": "A PHP parser written in PHP",
+            "keywords": [
+                "parser",
+                "php"
+            ],
+            "support": {
+                "issues": "https://github.com/nikic/PHP-Parser/issues",
+                "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.4"
+            },
+            "time": "2023-03-05T19:49:14+00:00"
+        },
+        {
+            "name": "phar-io/manifest",
+            "version": "2.0.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/phar-io/manifest.git",
+                "reference": "97803eca37d319dfa7826cc2437fc020857acb53"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53",
+                "reference": "97803eca37d319dfa7826cc2437fc020857acb53",
+                "shasum": ""
+            },
+            "require": {
+                "ext-dom": "*",
+                "ext-phar": "*",
+                "ext-xmlwriter": "*",
+                "phar-io/version": "^3.0.1",
+                "php": "^7.2 || ^8.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.0.x-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Arne Blankerts",
+                    "email": "arne@blankerts.de",
+                    "role": "Developer"
+                },
+                {
+                    "name": "Sebastian Heuer",
+                    "email": "sebastian@phpeople.de",
+                    "role": "Developer"
+                },
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de",
+                    "role": "Developer"
+                }
+            ],
+            "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)",
+            "support": {
+                "issues": "https://github.com/phar-io/manifest/issues",
+                "source": "https://github.com/phar-io/manifest/tree/2.0.3"
+            },
+            "time": "2021-07-20T11:28:43+00:00"
+        },
+        {
+            "name": "phar-io/version",
+            "version": "3.2.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/phar-io/version.git",
+                "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74",
+                "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.2 || ^8.0"
+            },
+            "type": "library",
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Arne Blankerts",
+                    "email": "arne@blankerts.de",
+                    "role": "Developer"
+                },
+                {
+                    "name": "Sebastian Heuer",
+                    "email": "sebastian@phpeople.de",
+                    "role": "Developer"
+                },
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de",
+                    "role": "Developer"
+                }
+            ],
+            "description": "Library for handling version information and constraints",
+            "support": {
+                "issues": "https://github.com/phar-io/version/issues",
+                "source": "https://github.com/phar-io/version/tree/3.2.1"
+            },
+            "time": "2022-02-21T01:04:05+00:00"
+        },
         {
             "name": "phpcompatibility/php-compatibility",
             "version": "dev-develop",
@@ -1643,120 +1934,1558 @@
             "time": "2023-04-12T19:29:52+00:00"
         },
         {
-            "name": "spip/coding-standards",
-            "version": "1.3.0",
+            "name": "phpunit/php-code-coverage",
+            "version": "10.1.1",
             "source": {
                 "type": "git",
-                "url": "https://github.com/JamesRezo/spip-coding-standards.git",
-                "reference": "b6429d4bd34b5d8591a1299babb4a46d6ab28269"
+                "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
+                "reference": "884a0da7f9f46f28b2cb69134217fd810b793974"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/JamesRezo/spip-coding-standards/zipball/b6429d4bd34b5d8591a1299babb4a46d6ab28269",
-                "reference": "b6429d4bd34b5d8591a1299babb4a46d6ab28269",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/884a0da7f9f46f28b2cb69134217fd810b793974",
+                "reference": "884a0da7f9f46f28b2cb69134217fd810b793974",
                 "shasum": ""
             },
             "require": {
-                "ext-mbstring": "*",
-                "php": ">=7.0",
-                "phpcompatibility/php-compatibility": "dev-develop",
-                "squizlabs/php_codesniffer": "^3.7"
+                "ext-dom": "*",
+                "ext-libxml": "*",
+                "ext-xmlwriter": "*",
+                "nikic/php-parser": "^4.15",
+                "php": ">=8.1",
+                "phpunit/php-file-iterator": "^4.0",
+                "phpunit/php-text-template": "^3.0",
+                "sebastian/code-unit-reverse-lookup": "^3.0",
+                "sebastian/complexity": "^3.0",
+                "sebastian/environment": "^6.0",
+                "sebastian/lines-of-code": "^2.0",
+                "sebastian/version": "^4.0",
+                "theseer/tokenizer": "^1.2.0"
             },
             "require-dev": {
-                "phpunit/phpunit": "^9.6"
+                "phpunit/phpunit": "^10.1"
             },
             "suggest": {
-                "dealerdirect/phpcodesniffer-composer-installer": "^1.0 || This Composer plugin will sort out the PHPCS 'installed_paths' automatically."
+                "ext-pcov": "PHP extension that provides line coverage",
+                "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage"
             },
-            "type": "phpcodesniffer-standard",
+            "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-main": "1.3.x-dev"
+                    "dev-main": "10.1-dev"
                 }
             },
             "autoload": {
-                "psr-4": {
-                    "Spip\\CodingStandards\\": "src/"
-                }
+                "classmap": [
+                    "src/"
+                ]
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
-                "MIT"
+                "BSD-3-Clause"
             ],
             "authors": [
                 {
-                    "name": "JamesRezo",
-                    "email": "james@rezo.net"
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de",
+                    "role": "lead"
                 }
             ],
-            "description": "SPIP Coding Standards",
+            "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.",
+            "homepage": "https://github.com/sebastianbergmann/php-code-coverage",
             "keywords": [
-                "dev",
-                "phpcs",
-                "spip"
+                "coverage",
+                "testing",
+                "xunit"
             ],
             "support": {
-                "issues": "https://github.com/JamesRezo/spip-coding-standards/issues",
-                "source": "https://github.com/JamesRezo/spip-coding-standards/tree/1.3.0"
+                "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
+                "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy",
+                "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.1"
             },
-            "time": "2023-03-22T21:25:59+00:00"
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2023-04-17T12:15:40+00:00"
         },
         {
-            "name": "squizlabs/php_codesniffer",
-            "version": "3.7.2",
+            "name": "phpunit/php-file-iterator",
+            "version": "4.0.1",
             "source": {
                 "type": "git",
-                "url": "https://github.com/squizlabs/PHP_CodeSniffer.git",
-                "reference": "ed8e00df0a83aa96acf703f8c2979ff33341f879"
+                "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
+                "reference": "fd9329ab3368f59fe1fe808a189c51086bd4b6bd"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/ed8e00df0a83aa96acf703f8c2979ff33341f879",
-                "reference": "ed8e00df0a83aa96acf703f8c2979ff33341f879",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/fd9329ab3368f59fe1fe808a189c51086bd4b6bd",
+                "reference": "fd9329ab3368f59fe1fe808a189c51086bd4b6bd",
                 "shasum": ""
             },
             "require": {
-                "ext-simplexml": "*",
-                "ext-tokenizer": "*",
-                "ext-xmlwriter": "*",
-                "php": ">=5.4.0"
+                "php": ">=8.1"
             },
             "require-dev": {
-                "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0"
+                "phpunit/phpunit": "^10.0"
             },
-            "bin": [
-                "bin/phpcs",
-                "bin/phpcbf"
-            ],
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "3.x-dev"
+                    "dev-main": "4.0-dev"
                 }
             },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
                 "BSD-3-Clause"
             ],
             "authors": [
                 {
-                    "name": "Greg Sherwood",
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de",
                     "role": "lead"
                 }
             ],
-            "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.",
-            "homepage": "https://github.com/squizlabs/PHP_CodeSniffer",
+            "description": "FilterIterator implementation that filters files based on a list of suffixes.",
+            "homepage": "https://github.com/sebastianbergmann/php-file-iterator/",
             "keywords": [
-                "phpcs",
-                "standards",
-                "static analysis"
+                "filesystem",
+                "iterator"
             ],
             "support": {
-                "issues": "https://github.com/squizlabs/PHP_CodeSniffer/issues",
-                "source": "https://github.com/squizlabs/PHP_CodeSniffer",
-                "wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki"
+                "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues",
+                "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/4.0.1"
             },
-            "time": "2023-02-22T23:07:41+00:00"
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2023-02-10T16:53:14+00:00"
+        },
+        {
+            "name": "phpunit/php-invoker",
+            "version": "4.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/php-invoker.git",
+                "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7",
+                "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.1"
+            },
+            "require-dev": {
+                "ext-pcntl": "*",
+                "phpunit/phpunit": "^10.0"
+            },
+            "suggest": {
+                "ext-pcntl": "*"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "4.0-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de",
+                    "role": "lead"
+                }
+            ],
+            "description": "Invoke callables with a timeout",
+            "homepage": "https://github.com/sebastianbergmann/php-invoker/",
+            "keywords": [
+                "process"
+            ],
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/php-invoker/issues",
+                "source": "https://github.com/sebastianbergmann/php-invoker/tree/4.0.0"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2023-02-03T06:56:09+00:00"
+        },
+        {
+            "name": "phpunit/php-text-template",
+            "version": "3.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/php-text-template.git",
+                "reference": "9f3d3709577a527025f55bcf0f7ab8052c8bb37d"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/9f3d3709577a527025f55bcf0f7ab8052c8bb37d",
+                "reference": "9f3d3709577a527025f55bcf0f7ab8052c8bb37d",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.1"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^10.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "3.0-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de",
+                    "role": "lead"
+                }
+            ],
+            "description": "Simple template engine.",
+            "homepage": "https://github.com/sebastianbergmann/php-text-template/",
+            "keywords": [
+                "template"
+            ],
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/php-text-template/issues",
+                "source": "https://github.com/sebastianbergmann/php-text-template/tree/3.0.0"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2023-02-03T06:56:46+00:00"
+        },
+        {
+            "name": "phpunit/php-timer",
+            "version": "6.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/php-timer.git",
+                "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/e2a2d67966e740530f4a3343fe2e030ffdc1161d",
+                "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.1"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^10.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "6.0-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de",
+                    "role": "lead"
+                }
+            ],
+            "description": "Utility class for timing",
+            "homepage": "https://github.com/sebastianbergmann/php-timer/",
+            "keywords": [
+                "timer"
+            ],
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/php-timer/issues",
+                "source": "https://github.com/sebastianbergmann/php-timer/tree/6.0.0"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2023-02-03T06:57:52+00:00"
+        },
+        {
+            "name": "phpunit/phpunit",
+            "version": "10.1.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/phpunit.git",
+                "reference": "6f0cd95be71add539f8fd2be25b2a4a29789000b"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/6f0cd95be71add539f8fd2be25b2a4a29789000b",
+                "reference": "6f0cd95be71add539f8fd2be25b2a4a29789000b",
+                "shasum": ""
+            },
+            "require": {
+                "ext-dom": "*",
+                "ext-json": "*",
+                "ext-libxml": "*",
+                "ext-mbstring": "*",
+                "ext-xml": "*",
+                "ext-xmlwriter": "*",
+                "myclabs/deep-copy": "^1.10.1",
+                "phar-io/manifest": "^2.0.3",
+                "phar-io/version": "^3.0.2",
+                "php": ">=8.1",
+                "phpunit/php-code-coverage": "^10.1.1",
+                "phpunit/php-file-iterator": "^4.0",
+                "phpunit/php-invoker": "^4.0",
+                "phpunit/php-text-template": "^3.0",
+                "phpunit/php-timer": "^6.0",
+                "sebastian/cli-parser": "^2.0",
+                "sebastian/code-unit": "^2.0",
+                "sebastian/comparator": "^5.0",
+                "sebastian/diff": "^5.0",
+                "sebastian/environment": "^6.0",
+                "sebastian/exporter": "^5.0",
+                "sebastian/global-state": "^6.0",
+                "sebastian/object-enumerator": "^5.0",
+                "sebastian/recursion-context": "^5.0",
+                "sebastian/type": "^4.0",
+                "sebastian/version": "^4.0"
+            },
+            "suggest": {
+                "ext-soap": "To be able to generate mocks based on WSDL files"
+            },
+            "bin": [
+                "phpunit"
+            ],
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "10.1-dev"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "src/Framework/Assert/Functions.php"
+                ],
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de",
+                    "role": "lead"
+                }
+            ],
+            "description": "The PHP Unit Testing framework.",
+            "homepage": "https://phpunit.de/",
+            "keywords": [
+                "phpunit",
+                "testing",
+                "xunit"
+            ],
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/phpunit/issues",
+                "security": "https://github.com/sebastianbergmann/phpunit/security/policy",
+                "source": "https://github.com/sebastianbergmann/phpunit/tree/10.1.2"
+            },
+            "funding": [
+                {
+                    "url": "https://phpunit.de/sponsors.html",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2023-04-22T07:38:19+00:00"
+        },
+        {
+            "name": "sebastian/cli-parser",
+            "version": "2.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/cli-parser.git",
+                "reference": "efdc130dbbbb8ef0b545a994fd811725c5282cae"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/efdc130dbbbb8ef0b545a994fd811725c5282cae",
+                "reference": "efdc130dbbbb8ef0b545a994fd811725c5282cae",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.1"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^10.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "2.0-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de",
+                    "role": "lead"
+                }
+            ],
+            "description": "Library for parsing CLI options",
+            "homepage": "https://github.com/sebastianbergmann/cli-parser",
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/cli-parser/issues",
+                "source": "https://github.com/sebastianbergmann/cli-parser/tree/2.0.0"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2023-02-03T06:58:15+00:00"
+        },
+        {
+            "name": "sebastian/code-unit",
+            "version": "2.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/code-unit.git",
+                "reference": "a81fee9eef0b7a76af11d121767abc44c104e503"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/a81fee9eef0b7a76af11d121767abc44c104e503",
+                "reference": "a81fee9eef0b7a76af11d121767abc44c104e503",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.1"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^10.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "2.0-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de",
+                    "role": "lead"
+                }
+            ],
+            "description": "Collection of value objects that represent the PHP code units",
+            "homepage": "https://github.com/sebastianbergmann/code-unit",
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/code-unit/issues",
+                "source": "https://github.com/sebastianbergmann/code-unit/tree/2.0.0"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2023-02-03T06:58:43+00:00"
+        },
+        {
+            "name": "sebastian/code-unit-reverse-lookup",
+            "version": "3.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
+                "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/5e3a687f7d8ae33fb362c5c0743794bbb2420a1d",
+                "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.1"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^10.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "3.0-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de"
+                }
+            ],
+            "description": "Looks up which function or method a line of code belongs to",
+            "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues",
+                "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/3.0.0"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2023-02-03T06:59:15+00:00"
+        },
+        {
+            "name": "sebastian/comparator",
+            "version": "5.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/comparator.git",
+                "reference": "72f01e6586e0caf6af81297897bd112eb7e9627c"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/72f01e6586e0caf6af81297897bd112eb7e9627c",
+                "reference": "72f01e6586e0caf6af81297897bd112eb7e9627c",
+                "shasum": ""
+            },
+            "require": {
+                "ext-dom": "*",
+                "ext-mbstring": "*",
+                "php": ">=8.1",
+                "sebastian/diff": "^5.0",
+                "sebastian/exporter": "^5.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^10.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "5.0-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de"
+                },
+                {
+                    "name": "Jeff Welch",
+                    "email": "whatthejeff@gmail.com"
+                },
+                {
+                    "name": "Volker Dusch",
+                    "email": "github@wallbash.com"
+                },
+                {
+                    "name": "Bernhard Schussek",
+                    "email": "bschussek@2bepublished.at"
+                }
+            ],
+            "description": "Provides the functionality to compare PHP values for equality",
+            "homepage": "https://github.com/sebastianbergmann/comparator",
+            "keywords": [
+                "comparator",
+                "compare",
+                "equality"
+            ],
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/comparator/issues",
+                "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.0"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2023-02-03T07:07:16+00:00"
+        },
+        {
+            "name": "sebastian/complexity",
+            "version": "3.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/complexity.git",
+                "reference": "e67d240970c9dc7ea7b2123a6d520e334dd61dc6"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/e67d240970c9dc7ea7b2123a6d520e334dd61dc6",
+                "reference": "e67d240970c9dc7ea7b2123a6d520e334dd61dc6",
+                "shasum": ""
+            },
+            "require": {
+                "nikic/php-parser": "^4.10",
+                "php": ">=8.1"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^10.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "3.0-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de",
+                    "role": "lead"
+                }
+            ],
+            "description": "Library for calculating the complexity of PHP code units",
+            "homepage": "https://github.com/sebastianbergmann/complexity",
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/complexity/issues",
+                "source": "https://github.com/sebastianbergmann/complexity/tree/3.0.0"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2023-02-03T06:59:47+00:00"
+        },
+        {
+            "name": "sebastian/diff",
+            "version": "5.0.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/diff.git",
+                "reference": "aae9a0a43bff37bd5d8d0311426c87bf36153f02"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/aae9a0a43bff37bd5d8d0311426c87bf36153f02",
+                "reference": "aae9a0a43bff37bd5d8d0311426c87bf36153f02",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.1"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^10.0",
+                "symfony/process": "^4.2 || ^5"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "5.0-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de"
+                },
+                {
+                    "name": "Kore Nordmann",
+                    "email": "mail@kore-nordmann.de"
+                }
+            ],
+            "description": "Diff implementation",
+            "homepage": "https://github.com/sebastianbergmann/diff",
+            "keywords": [
+                "diff",
+                "udiff",
+                "unidiff",
+                "unified diff"
+            ],
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/diff/issues",
+                "security": "https://github.com/sebastianbergmann/diff/security/policy",
+                "source": "https://github.com/sebastianbergmann/diff/tree/5.0.1"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2023-03-23T05:12:41+00:00"
+        },
+        {
+            "name": "sebastian/environment",
+            "version": "6.0.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/environment.git",
+                "reference": "43c751b41d74f96cbbd4e07b7aec9675651e2951"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/43c751b41d74f96cbbd4e07b7aec9675651e2951",
+                "reference": "43c751b41d74f96cbbd4e07b7aec9675651e2951",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.1"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^10.0"
+            },
+            "suggest": {
+                "ext-posix": "*"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "6.0-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de"
+                }
+            ],
+            "description": "Provides functionality to handle HHVM/PHP environments",
+            "homepage": "https://github.com/sebastianbergmann/environment",
+            "keywords": [
+                "Xdebug",
+                "environment",
+                "hhvm"
+            ],
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/environment/issues",
+                "security": "https://github.com/sebastianbergmann/environment/security/policy",
+                "source": "https://github.com/sebastianbergmann/environment/tree/6.0.1"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2023-04-11T05:39:26+00:00"
+        },
+        {
+            "name": "sebastian/exporter",
+            "version": "5.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/exporter.git",
+                "reference": "f3ec4bf931c0b31e5b413f5b4fc970a7d03338c0"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/f3ec4bf931c0b31e5b413f5b4fc970a7d03338c0",
+                "reference": "f3ec4bf931c0b31e5b413f5b4fc970a7d03338c0",
+                "shasum": ""
+            },
+            "require": {
+                "ext-mbstring": "*",
+                "php": ">=8.1",
+                "sebastian/recursion-context": "^5.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^10.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "5.0-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de"
+                },
+                {
+                    "name": "Jeff Welch",
+                    "email": "whatthejeff@gmail.com"
+                },
+                {
+                    "name": "Volker Dusch",
+                    "email": "github@wallbash.com"
+                },
+                {
+                    "name": "Adam Harvey",
+                    "email": "aharvey@php.net"
+                },
+                {
+                    "name": "Bernhard Schussek",
+                    "email": "bschussek@gmail.com"
+                }
+            ],
+            "description": "Provides the functionality to export PHP variables for visualization",
+            "homepage": "https://www.github.com/sebastianbergmann/exporter",
+            "keywords": [
+                "export",
+                "exporter"
+            ],
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/exporter/issues",
+                "source": "https://github.com/sebastianbergmann/exporter/tree/5.0.0"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2023-02-03T07:06:49+00:00"
+        },
+        {
+            "name": "sebastian/global-state",
+            "version": "6.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/global-state.git",
+                "reference": "aab257c712de87b90194febd52e4d184551c2d44"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/aab257c712de87b90194febd52e4d184551c2d44",
+                "reference": "aab257c712de87b90194febd52e4d184551c2d44",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.1",
+                "sebastian/object-reflector": "^3.0",
+                "sebastian/recursion-context": "^5.0"
+            },
+            "require-dev": {
+                "ext-dom": "*",
+                "phpunit/phpunit": "^10.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "6.0-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de"
+                }
+            ],
+            "description": "Snapshotting of global state",
+            "homepage": "http://www.github.com/sebastianbergmann/global-state",
+            "keywords": [
+                "global state"
+            ],
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/global-state/issues",
+                "source": "https://github.com/sebastianbergmann/global-state/tree/6.0.0"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2023-02-03T07:07:38+00:00"
+        },
+        {
+            "name": "sebastian/lines-of-code",
+            "version": "2.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/lines-of-code.git",
+                "reference": "17c4d940ecafb3d15d2cf916f4108f664e28b130"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/17c4d940ecafb3d15d2cf916f4108f664e28b130",
+                "reference": "17c4d940ecafb3d15d2cf916f4108f664e28b130",
+                "shasum": ""
+            },
+            "require": {
+                "nikic/php-parser": "^4.10",
+                "php": ">=8.1"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^10.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "2.0-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de",
+                    "role": "lead"
+                }
+            ],
+            "description": "Library for counting the lines of code in PHP source code",
+            "homepage": "https://github.com/sebastianbergmann/lines-of-code",
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/lines-of-code/issues",
+                "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.0"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2023-02-03T07:08:02+00:00"
+        },
+        {
+            "name": "sebastian/object-enumerator",
+            "version": "5.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/object-enumerator.git",
+                "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/202d0e344a580d7f7d04b3fafce6933e59dae906",
+                "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.1",
+                "sebastian/object-reflector": "^3.0",
+                "sebastian/recursion-context": "^5.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^10.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "5.0-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de"
+                }
+            ],
+            "description": "Traverses array structures and object graphs to enumerate all referenced objects",
+            "homepage": "https://github.com/sebastianbergmann/object-enumerator/",
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/object-enumerator/issues",
+                "source": "https://github.com/sebastianbergmann/object-enumerator/tree/5.0.0"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2023-02-03T07:08:32+00:00"
+        },
+        {
+            "name": "sebastian/object-reflector",
+            "version": "3.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/object-reflector.git",
+                "reference": "24ed13d98130f0e7122df55d06c5c4942a577957"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/24ed13d98130f0e7122df55d06c5c4942a577957",
+                "reference": "24ed13d98130f0e7122df55d06c5c4942a577957",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.1"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^10.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "3.0-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de"
+                }
+            ],
+            "description": "Allows reflection of object attributes, including inherited and non-public ones",
+            "homepage": "https://github.com/sebastianbergmann/object-reflector/",
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/object-reflector/issues",
+                "source": "https://github.com/sebastianbergmann/object-reflector/tree/3.0.0"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2023-02-03T07:06:18+00:00"
+        },
+        {
+            "name": "sebastian/recursion-context",
+            "version": "5.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/recursion-context.git",
+                "reference": "05909fb5bc7df4c52992396d0116aed689f93712"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/05909fb5bc7df4c52992396d0116aed689f93712",
+                "reference": "05909fb5bc7df4c52992396d0116aed689f93712",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.1"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^10.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "5.0-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de"
+                },
+                {
+                    "name": "Jeff Welch",
+                    "email": "whatthejeff@gmail.com"
+                },
+                {
+                    "name": "Adam Harvey",
+                    "email": "aharvey@php.net"
+                }
+            ],
+            "description": "Provides functionality to recursively process PHP variables",
+            "homepage": "https://github.com/sebastianbergmann/recursion-context",
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/recursion-context/issues",
+                "source": "https://github.com/sebastianbergmann/recursion-context/tree/5.0.0"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2023-02-03T07:05:40+00:00"
+        },
+        {
+            "name": "sebastian/type",
+            "version": "4.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/type.git",
+                "reference": "462699a16464c3944eefc02ebdd77882bd3925bf"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/462699a16464c3944eefc02ebdd77882bd3925bf",
+                "reference": "462699a16464c3944eefc02ebdd77882bd3925bf",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.1"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^10.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "4.0-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de",
+                    "role": "lead"
+                }
+            ],
+            "description": "Collection of value objects that represent the types of the PHP type system",
+            "homepage": "https://github.com/sebastianbergmann/type",
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/type/issues",
+                "source": "https://github.com/sebastianbergmann/type/tree/4.0.0"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2023-02-03T07:10:45+00:00"
+        },
+        {
+            "name": "sebastian/version",
+            "version": "4.0.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/version.git",
+                "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c51fa83a5d8f43f1402e3f32a005e6262244ef17",
+                "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.1"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "4.0-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de",
+                    "role": "lead"
+                }
+            ],
+            "description": "Library that helps with managing the version number of Git-hosted PHP projects",
+            "homepage": "https://github.com/sebastianbergmann/version",
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/version/issues",
+                "source": "https://github.com/sebastianbergmann/version/tree/4.0.1"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2023-02-07T11:34:05+00:00"
+        },
+        {
+            "name": "spip/coding-standards",
+            "version": "1.3.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/JamesRezo/spip-coding-standards.git",
+                "reference": "b6429d4bd34b5d8591a1299babb4a46d6ab28269"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/JamesRezo/spip-coding-standards/zipball/b6429d4bd34b5d8591a1299babb4a46d6ab28269",
+                "reference": "b6429d4bd34b5d8591a1299babb4a46d6ab28269",
+                "shasum": ""
+            },
+            "require": {
+                "ext-mbstring": "*",
+                "php": ">=7.0",
+                "phpcompatibility/php-compatibility": "dev-develop",
+                "squizlabs/php_codesniffer": "^3.7"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^9.6"
+            },
+            "suggest": {
+                "dealerdirect/phpcodesniffer-composer-installer": "^1.0 || This Composer plugin will sort out the PHPCS 'installed_paths' automatically."
+            },
+            "type": "phpcodesniffer-standard",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "1.3.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Spip\\CodingStandards\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "JamesRezo",
+                    "email": "james@rezo.net"
+                }
+            ],
+            "description": "SPIP Coding Standards",
+            "keywords": [
+                "dev",
+                "phpcs",
+                "spip"
+            ],
+            "support": {
+                "issues": "https://github.com/JamesRezo/spip-coding-standards/issues",
+                "source": "https://github.com/JamesRezo/spip-coding-standards/tree/1.3.0"
+            },
+            "time": "2023-03-22T21:25:59+00:00"
+        },
+        {
+            "name": "squizlabs/php_codesniffer",
+            "version": "3.7.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/squizlabs/PHP_CodeSniffer.git",
+                "reference": "ed8e00df0a83aa96acf703f8c2979ff33341f879"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/ed8e00df0a83aa96acf703f8c2979ff33341f879",
+                "reference": "ed8e00df0a83aa96acf703f8c2979ff33341f879",
+                "shasum": ""
+            },
+            "require": {
+                "ext-simplexml": "*",
+                "ext-tokenizer": "*",
+                "ext-xmlwriter": "*",
+                "php": ">=5.4.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0"
+            },
+            "bin": [
+                "bin/phpcs",
+                "bin/phpcbf"
+            ],
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.x-dev"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Greg Sherwood",
+                    "role": "lead"
+                }
+            ],
+            "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.",
+            "homepage": "https://github.com/squizlabs/PHP_CodeSniffer",
+            "keywords": [
+                "phpcs",
+                "standards",
+                "static analysis"
+            ],
+            "support": {
+                "issues": "https://github.com/squizlabs/PHP_CodeSniffer/issues",
+                "source": "https://github.com/squizlabs/PHP_CodeSniffer",
+                "wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki"
+            },
+            "time": "2023-02-22T23:07:41+00:00"
+        },
+        {
+            "name": "symplify/easy-coding-standard",
+            "version": "11.3.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/easy-coding-standard/easy-coding-standard.git",
+                "reference": "d4159e06c0970e71a2a58d350160241e7cb3994b"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/easy-coding-standard/easy-coding-standard/zipball/d4159e06c0970e71a2a58d350160241e7cb3994b",
+                "reference": "d4159e06c0970e71a2a58d350160241e7cb3994b",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.2"
+            },
+            "conflict": {
+                "friendsofphp/php-cs-fixer": "<3.0",
+                "squizlabs/php_codesniffer": "<3.6",
+                "symplify/coding-standard": "<11.3"
+            },
+            "bin": [
+                "bin/ecs"
+            ],
+            "type": "library",
+            "autoload": {
+                "files": [
+                    "bootstrap.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "description": "Use Coding Standard with 0-knowledge of PHP-CS-Fixer and PHP_CodeSniffer",
+            "keywords": [
+                "Code style",
+                "automation",
+                "fixer",
+                "static analysis"
+            ],
+            "support": {
+                "issues": "https://github.com/easy-coding-standard/easy-coding-standard/issues",
+                "source": "https://github.com/easy-coding-standard/easy-coding-standard/tree/11.3.2"
+            },
+            "funding": [
+                {
+                    "url": "https://www.paypal.me/rectorphp",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/tomasvotruba",
+                    "type": "github"
+                }
+            ],
+            "time": "2023-03-22T15:28:51+00:00"
+        },
+        {
+            "name": "theseer/tokenizer",
+            "version": "1.2.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/theseer/tokenizer.git",
+                "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e",
+                "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e",
+                "shasum": ""
+            },
+            "require": {
+                "ext-dom": "*",
+                "ext-tokenizer": "*",
+                "ext-xmlwriter": "*",
+                "php": "^7.2 || ^8.0"
+            },
+            "type": "library",
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Arne Blankerts",
+                    "email": "arne@blankerts.de",
+                    "role": "Developer"
+                }
+            ],
+            "description": "A small library for converting tokenized PHP source code into XML and potentially other formats",
+            "support": {
+                "issues": "https://github.com/theseer/tokenizer/issues",
+                "source": "https://github.com/theseer/tokenizer/tree/1.2.1"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/theseer",
+                    "type": "github"
+                }
+            ],
+            "time": "2021-07-28T10:34:58+00:00"
         }
     ],
     "aliases": [],
diff --git a/tests/tests/Action/EditerLiensTest.php b/ecrire/tests/Action/EditerLiensTest.php
similarity index 99%
rename from tests/tests/Action/EditerLiensTest.php
rename to ecrire/tests/Action/EditerLiensTest.php
index e7147ee88ff3443dccc6bfd77ff85199740642d7..6277a3b52272ab174cb02505c0310549a7207ad4 100644
--- a/tests/tests/Action/EditerLiensTest.php
+++ b/ecrire/tests/Action/EditerLiensTest.php
@@ -12,7 +12,7 @@ declare(strict_types=1);
  *  Pour plus de détails voir le fichier COPYING.txt ou l'aide en ligne.   *
 \***************************************************************************/
 
-namespace Spip\Core\Tests\Action;
+namespace Spip\Test\Action;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Api/AutoriserTest.php b/ecrire/tests/Api/AutoriserTest.php
similarity index 96%
rename from tests/tests/Api/AutoriserTest.php
rename to ecrire/tests/Api/AutoriserTest.php
index 923fc41687b454a6bcf013bf09fef3913f0a32f0..f5bf0feea0b3919909a39823bd95364e72f36e61 100644
--- a/tests/tests/Api/AutoriserTest.php
+++ b/ecrire/tests/Api/AutoriserTest.php
@@ -2,7 +2,7 @@
 
 declare(strict_types=1);
 
-namespace Spip\Core\Tests\Api;
+namespace Spip\Test\Api;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Api/data/autoriser.php b/ecrire/tests/Api/data/autoriser.php
similarity index 100%
rename from tests/tests/Api/data/autoriser.php
rename to ecrire/tests/Api/data/autoriser.php
diff --git a/tests/tests/Config/DepotMetaPackTest.php b/ecrire/tests/Config/DepotMetaPackTest.php
similarity index 99%
rename from tests/tests/Config/DepotMetaPackTest.php
rename to ecrire/tests/Config/DepotMetaPackTest.php
index b95a946eef4ff6c4d6bbf9e795c0a19675bc4cac..2104e348085c0be9f99824a86993a04fa5489d19 100644
--- a/tests/tests/Config/DepotMetaPackTest.php
+++ b/ecrire/tests/Config/DepotMetaPackTest.php
@@ -12,7 +12,7 @@ declare(strict_types=1);
  *  Pour plus de détails voir le fichier COPYING.txt ou l'aide en ligne.   *
 \***************************************************************************/
 
-namespace Spip\Core\Tests\Config;
+namespace Spip\Test\Config;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Config/DepotMetaPersoTest.php b/ecrire/tests/Config/DepotMetaPersoTest.php
similarity index 99%
rename from tests/tests/Config/DepotMetaPersoTest.php
rename to ecrire/tests/Config/DepotMetaPersoTest.php
index 72985b632569ae88cb19fead6399be0388a0c44b..bbe48b79d8d1ca1e029b701857b96091295f7e9f 100644
--- a/tests/tests/Config/DepotMetaPersoTest.php
+++ b/ecrire/tests/Config/DepotMetaPersoTest.php
@@ -12,7 +12,7 @@ declare(strict_types=1);
  *  Pour plus de détails voir le fichier COPYING.txt ou l'aide en ligne.   *
 \***************************************************************************/
 
-namespace Spip\Core\Tests\Config;
+namespace Spip\Test\Config;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Config/DepotMetaTest.php b/ecrire/tests/Config/DepotMetaTest.php
similarity index 99%
rename from tests/tests/Config/DepotMetaTest.php
rename to ecrire/tests/Config/DepotMetaTest.php
index 5eb02720d9e17facee2a6f168d0ed5c89eeac74c..bc90b89a51876d12ad307031c3879a0cd6f08263 100644
--- a/tests/tests/Config/DepotMetaTest.php
+++ b/ecrire/tests/Config/DepotMetaTest.php
@@ -12,7 +12,7 @@ declare(strict_types=1);
  *  Pour plus de détails voir le fichier COPYING.txt ou l'aide en ligne.   *
 \***************************************************************************/
 
-namespace Spip\Core\Tests\Config;
+namespace Spip\Test\Config;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/src/Constraint/IsOk.php b/ecrire/tests/Constraint/IsOk.php
similarity index 95%
rename from tests/src/Constraint/IsOk.php
rename to ecrire/tests/Constraint/IsOk.php
index 344d7bde3a0e9cad81a6a656067ba6093c0675a9..8f6241bb340460f7a83f424de1360eff4f474b92 100644
--- a/tests/src/Constraint/IsOk.php
+++ b/ecrire/tests/Constraint/IsOk.php
@@ -2,7 +2,7 @@
 
 declare(strict_types=1);
 
-namespace Spip\Core\Testing\Constraint;
+namespace Spip\Test\Constraint;
 
 use PHPUnit\Framework\Constraint\Constraint;
 
diff --git a/tests/tests/Distant/NeedProxyTest.php b/ecrire/tests/Distant/NeedProxyTest.php
similarity index 97%
rename from tests/tests/Distant/NeedProxyTest.php
rename to ecrire/tests/Distant/NeedProxyTest.php
index 33c00f71b356e8d237b9a1ea61cc6f7b114482da..842b73f95eff027246e7fdb0a9c8fe4a419fecd2 100644
--- a/tests/tests/Distant/NeedProxyTest.php
+++ b/ecrire/tests/Distant/NeedProxyTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction need_proxy du fichier ./inc/distant.php
  */
 
-namespace Spip\Core\Tests\Distant;
+namespace Spip\Test\Distant;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Distant/UrlToAsciiTest.php b/ecrire/tests/Distant/UrlToAsciiTest.php
similarity index 97%
rename from tests/tests/Distant/UrlToAsciiTest.php
rename to ecrire/tests/Distant/UrlToAsciiTest.php
index f4856a67bea53158e6352155f571ef4481dbeacb..c73bd388986d0a3712a7cec1bb57969a33c77929 100644
--- a/tests/tests/Distant/UrlToAsciiTest.php
+++ b/ecrire/tests/Distant/UrlToAsciiTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction url_to_ascii du fichier ./inc/distant.php
  */
 
-namespace Spip\Core\Tests\Distant;
+namespace Spip\Test\Distant;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Distant/ValiderUrlDistanteTest.php b/ecrire/tests/Distant/ValiderUrlDistanteTest.php
similarity index 97%
rename from tests/tests/Distant/ValiderUrlDistanteTest.php
rename to ecrire/tests/Distant/ValiderUrlDistanteTest.php
index e20882094a7daa6a88383a3db07470f8f064332c..f10cd2b6d4c984ae85cccff6001d1d50dda970f9 100644
--- a/tests/tests/Distant/ValiderUrlDistanteTest.php
+++ b/ecrire/tests/Distant/ValiderUrlDistanteTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction valider_url_distante du fichier ./inc/distant.php
  */
 
-namespace Spip\Core\Tests\Distant;
+namespace Spip\Test\Distant;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/src/Exception/TemplateCompilationErrorException.php b/ecrire/tests/Exception/TemplateCompilationErrorException.php
similarity index 88%
rename from tests/src/Exception/TemplateCompilationErrorException.php
rename to ecrire/tests/Exception/TemplateCompilationErrorException.php
index e7472dad657611e024b7dd7d1fceeb99d8960cbf..efe1964e2e51410b9bb1e710af301a193a1e14e2 100644
--- a/tests/src/Exception/TemplateCompilationErrorException.php
+++ b/ecrire/tests/Exception/TemplateCompilationErrorException.php
@@ -2,7 +2,7 @@
 
 declare(strict_types=1);
 
-namespace Spip\Core\Testing\Exception;
+namespace Spip\Test\Exception;
 
 class TemplateCompilationErrorException extends \Exception
 {
diff --git a/tests/src/Exception/TemplateNotFoundException.php b/ecrire/tests/Exception/TemplateNotFoundException.php
similarity index 88%
rename from tests/src/Exception/TemplateNotFoundException.php
rename to ecrire/tests/Exception/TemplateNotFoundException.php
index 8e656878f624b1b361cb4c0c2a1e177ca110bb7e..cd2a5deee2df844d9e1290e9c955a529acf68bb2 100644
--- a/tests/src/Exception/TemplateNotFoundException.php
+++ b/ecrire/tests/Exception/TemplateNotFoundException.php
@@ -2,7 +2,7 @@
 
 declare(strict_types=1);
 
-namespace Spip\Core\Testing\Exception;
+namespace Spip\Test\Exception;
 
 class TemplateNotFoundException extends \Exception
 {
diff --git a/tests/tests/Filtre/AjouterClassTest.php b/ecrire/tests/Filtre/AjouterClassTest.php
similarity index 97%
rename from tests/tests/Filtre/AjouterClassTest.php
rename to ecrire/tests/Filtre/AjouterClassTest.php
index dad5df2be2804686aaf6e23df7c29b467d930fc6..935ca7447c05c994aae264f477b71fc317633ac7 100644
--- a/tests/tests/Filtre/AjouterClassTest.php
+++ b/ecrire/tests/Filtre/AjouterClassTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction ajouter_class du fichier ./inc/filtres.php
  */
 
-namespace Spip\Core\Tests\Filtre;
+namespace Spip\Test\Filtre;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Filtre/AntispamTest.php b/ecrire/tests/Filtre/AntispamTest.php
similarity index 92%
rename from tests/tests/Filtre/AntispamTest.php
rename to ecrire/tests/Filtre/AntispamTest.php
index b51e6343c9ebc0b55b0b3254edb4495e897e3521..b0b2fe9415cc611fac3f8c01905890663471e41e 100644
--- a/tests/tests/Filtre/AntispamTest.php
+++ b/ecrire/tests/Filtre/AntispamTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction antispam du fichier inc/filtres.php
  */
 
-namespace Spip\Core\Tests\Filtre;
+namespace Spip\Test\Filtre;
 
 use PHPUnit\Framework\TestCase;
 
@@ -22,5 +22,4 @@ class AntispamTest extends TestCase
 		$actual = antispam('email@domain.tld');
 		$this->assertStringNotContainsString('@', $actual);
 	}
-
 }
diff --git a/tests/tests/Filtre/AppliquerFiltreTest.php b/ecrire/tests/Filtre/AppliquerFiltreTest.php
similarity index 95%
rename from tests/tests/Filtre/AppliquerFiltreTest.php
rename to ecrire/tests/Filtre/AppliquerFiltreTest.php
index 2e42be4f5181059fbe7e566aae47bfc82d557bde..2915ec2c6647fcb49811ac85ec61435940ab4946 100644
--- a/tests/tests/Filtre/AppliquerFiltreTest.php
+++ b/ecrire/tests/Filtre/AppliquerFiltreTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction appliquer_filtre du fichier inc/filtres.php
  */
 
-namespace Spip\Core\Tests\Filtre;
+namespace Spip\Test\Filtre;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Filtre/ChercherFiltreTest.php b/ecrire/tests/Filtre/ChercherFiltreTest.php
similarity index 99%
rename from tests/tests/Filtre/ChercherFiltreTest.php
rename to ecrire/tests/Filtre/ChercherFiltreTest.php
index 0c43c1206e50649807972d37c62db9d15f58ecc3..3bc3b22ca8fe6086e1608f64793f522b9776e936 100644
--- a/tests/tests/Filtre/ChercherFiltreTest.php
+++ b/ecrire/tests/Filtre/ChercherFiltreTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction chercher_filtre du fichier inc/filtres.php
  */
 
-namespace Spip\Core\Tests\Filtre;
+namespace Spip\Test\Filtre;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Filtre/CommuterClassTest.php b/ecrire/tests/Filtre/CommuterClassTest.php
similarity index 97%
rename from tests/tests/Filtre/CommuterClassTest.php
rename to ecrire/tests/Filtre/CommuterClassTest.php
index d6bd45deee3d0998ebcd7c56ef77237576ad3e55..c8a735c0564d4947749b92b3da9981ac3b3133e4 100644
--- a/tests/tests/Filtre/CommuterClassTest.php
+++ b/ecrire/tests/Filtre/CommuterClassTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction commuter_class du fichier ./inc/filtres.php
  */
 
-namespace Spip\Core\Tests\Filtre;
+namespace Spip\Test\Filtre;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Filtre/CorrigerEntitesHtmlTest.php b/ecrire/tests/Filtre/CorrigerEntitesHtmlTest.php
similarity index 98%
rename from tests/tests/Filtre/CorrigerEntitesHtmlTest.php
rename to ecrire/tests/Filtre/CorrigerEntitesHtmlTest.php
index a401744cde1534b2874fa9d01f4cd409fe58abdf..2184f0484eb748427c97cd2d4784a67cd9e828f3 100644
--- a/tests/tests/Filtre/CorrigerEntitesHtmlTest.php
+++ b/ecrire/tests/Filtre/CorrigerEntitesHtmlTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction corriger_entites_html du fichier ./inc/filtres.php
  */
 
-namespace Spip\Core\Tests\Filtre;
+namespace Spip\Test\Filtre;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Filtre/Date/AffdateCourtTest.php b/ecrire/tests/Filtre/Date/AffdateCourtTest.php
similarity index 99%
rename from tests/tests/Filtre/Date/AffdateCourtTest.php
rename to ecrire/tests/Filtre/Date/AffdateCourtTest.php
index 39a1d8353f63b01bc9e567a690f3e39a115ebc30..6839938bf18a3c6d4c880d6e3d7e77a5354fafc7 100644
--- a/tests/tests/Filtre/Date/AffdateCourtTest.php
+++ b/ecrire/tests/Filtre/Date/AffdateCourtTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction affdate_court du fichier inc/filtres.php
  */
 
-namespace Spip\Core\Tests\Filtre\Date;
+namespace Spip\Test\Filtre\Date;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Filtre/Date/AffdateDebutFinTest.php b/ecrire/tests/Filtre/Date/AffdateDebutFinTest.php
similarity index 99%
rename from tests/tests/Filtre/Date/AffdateDebutFinTest.php
rename to ecrire/tests/Filtre/Date/AffdateDebutFinTest.php
index 80c1eee6f9c31468b6bcb6761f73dce176a50fc5..2659bffc1736fba984ca3fb59c38c6044f4b6289 100644
--- a/tests/tests/Filtre/Date/AffdateDebutFinTest.php
+++ b/ecrire/tests/Filtre/Date/AffdateDebutFinTest.php
@@ -2,7 +2,7 @@
 
 declare(strict_types=1);
 
-namespace Spip\Core\Tests\Filtre\Date;
+namespace Spip\Test\Filtre\Date;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Filtre/Date/AffdateHeureTest.php b/ecrire/tests/Filtre/Date/AffdateHeureTest.php
similarity index 99%
rename from tests/tests/Filtre/Date/AffdateHeureTest.php
rename to ecrire/tests/Filtre/Date/AffdateHeureTest.php
index a45adddc798a0bd0e928ab7ff4b6b3b282ba538b..d7ad5cbeb15cb63aebecacdb1d057619bb1072b4 100644
--- a/tests/tests/Filtre/Date/AffdateHeureTest.php
+++ b/ecrire/tests/Filtre/Date/AffdateHeureTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction affdate_heure du fichier inc/filtres.php
  */
 
-namespace Spip\Core\Tests\Filtre\Date;
+namespace Spip\Test\Filtre\Date;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Filtre/Date/AffdateJourcourtTest.php b/ecrire/tests/Filtre/Date/AffdateJourcourtTest.php
similarity index 99%
rename from tests/tests/Filtre/Date/AffdateJourcourtTest.php
rename to ecrire/tests/Filtre/Date/AffdateJourcourtTest.php
index 3e3509331d89ec5c8f1af688f905031cd63a5ed8..283bbd36c6b2404769479759ac6a10d668f12105 100644
--- a/tests/tests/Filtre/Date/AffdateJourcourtTest.php
+++ b/ecrire/tests/Filtre/Date/AffdateJourcourtTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction affdate_jourcourt du fichier inc/filtres.php
  */
 
-namespace Spip\Core\Tests\Filtre\Date;
+namespace Spip\Test\Filtre\Date;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Filtre/Date/AffdateMoisAnneeTest.php b/ecrire/tests/Filtre/Date/AffdateMoisAnneeTest.php
similarity index 99%
rename from tests/tests/Filtre/Date/AffdateMoisAnneeTest.php
rename to ecrire/tests/Filtre/Date/AffdateMoisAnneeTest.php
index 53a75dc0feddac7753b1535beb01e667e643a1b7..6b415e3325f5a8b6f6f1e9a700388a023b348b3a 100644
--- a/tests/tests/Filtre/Date/AffdateMoisAnneeTest.php
+++ b/ecrire/tests/Filtre/Date/AffdateMoisAnneeTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction affdate_mois_annee du fichier inc/filtres.php
  */
 
-namespace Spip\Core\Tests\Filtre\Date;
+namespace Spip\Test\Filtre\Date;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Filtre/Date/AnneeTest.php b/ecrire/tests/Filtre/Date/AnneeTest.php
similarity index 99%
rename from tests/tests/Filtre/Date/AnneeTest.php
rename to ecrire/tests/Filtre/Date/AnneeTest.php
index a945daa711200ab75b29636170c18a2f8476fa9c..44618f02be07c9c71aaf553265faf2e3430c1304 100644
--- a/tests/tests/Filtre/Date/AnneeTest.php
+++ b/ecrire/tests/Filtre/Date/AnneeTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction annee du fichier inc/filtres.php
  */
 
-namespace Spip\Core\Tests\Filtre\Date;
+namespace Spip\Test\Filtre\Date;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Filtre/Date/DateIcalTest.php b/ecrire/tests/Filtre/Date/DateIcalTest.php
similarity index 99%
rename from tests/tests/Filtre/Date/DateIcalTest.php
rename to ecrire/tests/Filtre/Date/DateIcalTest.php
index a1f82e8df92640b33aa82c3061bb42af83cd0759..a0132481f65262c712572751ae5735f00526c9b9 100644
--- a/tests/tests/Filtre/Date/DateIcalTest.php
+++ b/ecrire/tests/Filtre/Date/DateIcalTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction date_ical du fichier inc/filtres.php
  */
 
-namespace Spip\Core\Tests\Filtre\Date;
+namespace Spip\Test\Filtre\Date;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Filtre/Date/DateInterfaceTest.php b/ecrire/tests/Filtre/Date/DateInterfaceTest.php
similarity index 99%
rename from tests/tests/Filtre/Date/DateInterfaceTest.php
rename to ecrire/tests/Filtre/Date/DateInterfaceTest.php
index 08f4acca214211dfc7b0732bf2fbcd4630b5d5a2..7ef5a47f2d33b6f3d6d705679f39556af8f74b02 100644
--- a/tests/tests/Filtre/Date/DateInterfaceTest.php
+++ b/ecrire/tests/Filtre/Date/DateInterfaceTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction date_interface du fichier inc/filtres.php
  */
 
-namespace Spip\Core\Tests\Filtre\Date;
+namespace Spip\Test\Filtre\Date;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Filtre/Date/DateRelativeTest.php b/ecrire/tests/Filtre/Date/DateRelativeTest.php
similarity index 99%
rename from tests/tests/Filtre/Date/DateRelativeTest.php
rename to ecrire/tests/Filtre/Date/DateRelativeTest.php
index 527bc8f8e4d21ab6764407f6101089635088f886..630eb8d83f37faaad20a112e55ad658c1bc2433b 100644
--- a/tests/tests/Filtre/Date/DateRelativeTest.php
+++ b/ecrire/tests/Filtre/Date/DateRelativeTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction date_relative du fichier inc/filtres.php
  */
 
-namespace Spip\Core\Tests\Filtre\Date;
+namespace Spip\Test\Filtre\Date;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Filtre/Date/HeuresMinutesTest.php b/ecrire/tests/Filtre/Date/HeuresMinutesTest.php
similarity index 99%
rename from tests/tests/Filtre/Date/HeuresMinutesTest.php
rename to ecrire/tests/Filtre/Date/HeuresMinutesTest.php
index d75fe8b1266469d6f4acd631e6268638538510cb..ce7fd056262c9a873a69aeb8d00a9854a764f484 100644
--- a/tests/tests/Filtre/Date/HeuresMinutesTest.php
+++ b/ecrire/tests/Filtre/Date/HeuresMinutesTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction heures_minutes du fichier inc/filtres.php
  */
 
-namespace Spip\Core\Tests\Filtre\Date;
+namespace Spip\Test\Filtre\Date;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Filtre/Date/HeuresTest.php b/ecrire/tests/Filtre/Date/HeuresTest.php
similarity index 99%
rename from tests/tests/Filtre/Date/HeuresTest.php
rename to ecrire/tests/Filtre/Date/HeuresTest.php
index a1d545e81aa93b45f400ac7a0aededf59b927c40..c57df4b8e1cda4dd10fba5f8730af1c71a7be7e9 100644
--- a/tests/tests/Filtre/Date/HeuresTest.php
+++ b/ecrire/tests/Filtre/Date/HeuresTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction heures du fichier inc/filtres.php
  */
 
-namespace Spip\Core\Tests\Filtre\Date;
+namespace Spip\Test\Filtre\Date;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Filtre/Date/JourTest.php b/ecrire/tests/Filtre/Date/JourTest.php
similarity index 99%
rename from tests/tests/Filtre/Date/JourTest.php
rename to ecrire/tests/Filtre/Date/JourTest.php
index 9a85c8f3b69e7ba8cb293378edf5a0029310f590..c89e0ce8ed23b467656a91118891b1495e6c509f 100644
--- a/tests/tests/Filtre/Date/JourTest.php
+++ b/ecrire/tests/Filtre/Date/JourTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction jour du fichier inc/filtres.php
  */
 
-namespace Spip\Core\Tests\Filtre\Date;
+namespace Spip\Test\Filtre\Date;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Filtre/Date/JournumTest.php b/ecrire/tests/Filtre/Date/JournumTest.php
similarity index 99%
rename from tests/tests/Filtre/Date/JournumTest.php
rename to ecrire/tests/Filtre/Date/JournumTest.php
index ab902812afabf6e4d1482db4ad3b63db4cda805a..f6814d1a7299165dd8f6905c16e92301549f407d 100644
--- a/tests/tests/Filtre/Date/JournumTest.php
+++ b/ecrire/tests/Filtre/Date/JournumTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction journum du fichier inc/filtres.php
  */
 
-namespace Spip\Core\Tests\Filtre\Date;
+namespace Spip\Test\Filtre\Date;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Filtre/Date/MinutesTest.php b/ecrire/tests/Filtre/Date/MinutesTest.php
similarity index 99%
rename from tests/tests/Filtre/Date/MinutesTest.php
rename to ecrire/tests/Filtre/Date/MinutesTest.php
index 06635b9fd1609056a24031c864a80ddfeaa3cc08..55dc44ca375268abb4dde0e50fe6332ad6cf4fb9 100644
--- a/tests/tests/Filtre/Date/MinutesTest.php
+++ b/ecrire/tests/Filtre/Date/MinutesTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction minutes du fichier inc/filtres.php
  */
 
-namespace Spip\Core\Tests\Filtre\Date;
+namespace Spip\Test\Filtre\Date;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Filtre/Date/MoisTest.php b/ecrire/tests/Filtre/Date/MoisTest.php
similarity index 99%
rename from tests/tests/Filtre/Date/MoisTest.php
rename to ecrire/tests/Filtre/Date/MoisTest.php
index fd2f13f2ae9299a6b0900fa310580f79465e115d..d3636ed48a23aacaeea23661f84ad9d19524adde 100644
--- a/tests/tests/Filtre/Date/MoisTest.php
+++ b/ecrire/tests/Filtre/Date/MoisTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction mois du fichier inc/filtres.php
  */
 
-namespace Spip\Core\Tests\Filtre\Date;
+namespace Spip\Test\Filtre\Date;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Filtre/Date/NomJourTest.php b/ecrire/tests/Filtre/Date/NomJourTest.php
similarity index 99%
rename from tests/tests/Filtre/Date/NomJourTest.php
rename to ecrire/tests/Filtre/Date/NomJourTest.php
index a1f2dc9bb7bd144b88def6fea0e4788614bcba2f..77e8524c752715f27954c4032120c1f7cbdfd2a5 100644
--- a/tests/tests/Filtre/Date/NomJourTest.php
+++ b/ecrire/tests/Filtre/Date/NomJourTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction nom_jour du fichier inc/filtres.php
  */
 
-namespace Spip\Core\Tests\Filtre\Date;
+namespace Spip\Test\Filtre\Date;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Filtre/Date/NomMoisTest.php b/ecrire/tests/Filtre/Date/NomMoisTest.php
similarity index 99%
rename from tests/tests/Filtre/Date/NomMoisTest.php
rename to ecrire/tests/Filtre/Date/NomMoisTest.php
index c5df63be723d4962e42da197cebcca71691e4feb..399d8bf3805fb11a18b8d380b52997294d3de0c3 100644
--- a/tests/tests/Filtre/Date/NomMoisTest.php
+++ b/ecrire/tests/Filtre/Date/NomMoisTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction nom_mois du fichier inc/filtres.php
  */
 
-namespace Spip\Core\Tests\Filtre\Date;
+namespace Spip\Test\Filtre\Date;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Filtre/Date/NormaliserDateTest.php b/ecrire/tests/Filtre/Date/NormaliserDateTest.php
similarity index 99%
rename from tests/tests/Filtre/Date/NormaliserDateTest.php
rename to ecrire/tests/Filtre/Date/NormaliserDateTest.php
index 3a64f979d1de01af3739ec71a562f6df3b6fe0dd..f42a396a61c554fbd60923b84bf8ca2718500f93 100644
--- a/tests/tests/Filtre/Date/NormaliserDateTest.php
+++ b/ecrire/tests/Filtre/Date/NormaliserDateTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction normaliser_date du fichier inc/filtres.php
  */
 
-namespace Spip\Core\Tests\Filtre\Date;
+namespace Spip\Test\Filtre\Date;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Filtre/Date/RecupDateTest.php b/ecrire/tests/Filtre/Date/RecupDateTest.php
similarity index 99%
rename from tests/tests/Filtre/Date/RecupDateTest.php
rename to ecrire/tests/Filtre/Date/RecupDateTest.php
index 8b9fca856c150bc8ee76695e7ca717443a8c0eb3..f281c2a66c8f84f15b5fb7f0da9f1ef3401a09ce 100644
--- a/tests/tests/Filtre/Date/RecupDateTest.php
+++ b/ecrire/tests/Filtre/Date/RecupDateTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction recup_date du fichier inc/filtres.php
  */
 
-namespace Spip\Core\Tests\Filtre\Date;
+namespace Spip\Test\Filtre\Date;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Filtre/Date/RecupHeureTest.php b/ecrire/tests/Filtre/Date/RecupHeureTest.php
similarity index 98%
rename from tests/tests/Filtre/Date/RecupHeureTest.php
rename to ecrire/tests/Filtre/Date/RecupHeureTest.php
index be6642661d67bd405fad65fc496d6c2e013ca178..994d01fba76fb227af8904cfccddf54169a87a1e 100644
--- a/tests/tests/Filtre/Date/RecupHeureTest.php
+++ b/ecrire/tests/Filtre/Date/RecupHeureTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction recup_heure du fichier inc/filtres.php
  */
 
-namespace Spip\Core\Tests\Filtre\Date;
+namespace Spip\Test\Filtre\Date;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Filtre/Date/SaisonTest.php b/ecrire/tests/Filtre/Date/SaisonTest.php
similarity index 99%
rename from tests/tests/Filtre/Date/SaisonTest.php
rename to ecrire/tests/Filtre/Date/SaisonTest.php
index 1806e6590605ecb896b598c280c3b9239a6553a1..0786799f007a25eddacfc52e9c02a96b1c583dc7 100644
--- a/tests/tests/Filtre/Date/SaisonTest.php
+++ b/ecrire/tests/Filtre/Date/SaisonTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction saison du fichier inc/filtres.php
  */
 
-namespace Spip\Core\Tests\Filtre\Date;
+namespace Spip\Test\Filtre\Date;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Filtre/Date/ViderDateTest.php b/ecrire/tests/Filtre/Date/ViderDateTest.php
similarity index 99%
rename from tests/tests/Filtre/Date/ViderDateTest.php
rename to ecrire/tests/Filtre/Date/ViderDateTest.php
index 2de0d6c94390faee898432a5b41013fb89b8d175..b84331af41784d98c0243a94ad482a973b2f43e1 100644
--- a/tests/tests/Filtre/Date/ViderDateTest.php
+++ b/ecrire/tests/Filtre/Date/ViderDateTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction vider_date du fichier inc/filtres.php
  */
 
-namespace Spip\Core\Tests\Filtre\Date;
+namespace Spip\Test\Filtre\Date;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Filtre/DivTest.php b/ecrire/tests/Filtre/DivTest.php
similarity index 99%
rename from tests/tests/Filtre/DivTest.php
rename to ecrire/tests/Filtre/DivTest.php
index a7c35754c26132a39bf62c16aaa2e2563964a181..2e902945f8eb70ff1d141be5523e5e4ff19ebb61 100644
--- a/tests/tests/Filtre/DivTest.php
+++ b/ecrire/tests/Filtre/DivTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction div du fichier inc/filtres.php
  */
 
-namespace Spip\Core\Tests\Filtre;
+namespace Spip\Test\Filtre;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Filtre/EchapperTagsTest.php b/ecrire/tests/Filtre/EchapperTagsTest.php
similarity index 97%
rename from tests/tests/Filtre/EchapperTagsTest.php
rename to ecrire/tests/Filtre/EchapperTagsTest.php
index 8fbe2e5cadb72c8a6bba7d0793fdb711870a1d65..a68a4a1183fa58f67084cb329ec15591356eb437 100644
--- a/tests/tests/Filtre/EchapperTagsTest.php
+++ b/ecrire/tests/Filtre/EchapperTagsTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction echapper_tags du fichier inc/filtres.php
  */
 
-namespace Spip\Core\Tests\Filtre;
+namespace Spip\Test\Filtre;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Filtre/ExtraireBalisesTest.php b/ecrire/tests/Filtre/ExtraireBalisesTest.php
similarity index 94%
rename from tests/tests/Filtre/ExtraireBalisesTest.php
rename to ecrire/tests/Filtre/ExtraireBalisesTest.php
index 49fb344efd0e6dee80b96c2785bf68e8259ba947..f3f86b34aefc2804b087551b10166cfef676c97b 100644
--- a/tests/tests/Filtre/ExtraireBalisesTest.php
+++ b/ecrire/tests/Filtre/ExtraireBalisesTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction extraire_multi du fichier ./inc/filtres.php
  */
 
-namespace Spip\Core\Tests\Filtre;
+namespace Spip\Test\Filtre;
 
 use PHPUnit\Framework\TestCase;
 
@@ -206,50 +206,50 @@ class ExtraireBalisesTest extends TestCase
 				'<div class="message">Hello <div class="inside">World<div>!</div></div></div>',
 				'div'
 			],
-			'div_3_et_autofermante_1' =>[
+			'div_3_et_autofermante_1' => [
 				['<div class="message">Hello <div class="inside">World<div>! <div/> </div></div></div>'],
 				'<div class="message">Hello <div class="inside">World<div>! <div/> </div></div></div>',
 				'div'
 			],
-			'div_3_et_autofermante_2' =>[
+			'div_3_et_autofermante_2' => [
 				['<div class="message">Hello <div class="inside">World<div>!<div/></div><div/></div></div>'],
 				'<div class="message">Hello <div class="inside">World<div>!<div/></div><div/></div></div>',
 				'div'
 			],
-			'div_3_et_autofermante_3' =>[
+			'div_3_et_autofermante_3' => [
 				['<div class="message">Hello <div class="inside">World<div>!<div/></div><div/></div><div/></div>'],
 				'<div class="message">Hello <div class="inside">World<div>!<div/></div><div/></div><div/></div>',
 				'div'
 			],
-			'div_3_et_autofermante_4' =>[
+			'div_3_et_autofermante_4' => [
 				['<div class="message">Hello <div class="inside">World<div>!<div/></div><div/></div><div/></div>', '<div/>'],
 				'<div class="message">Hello <div class="inside">World<div>!<div/></div><div/></div><div/></div><div/>',
 				'div'
 			],
-			'div_3_et_autofermante_5' =>[
+			'div_3_et_autofermante_5' => [
 				['<div/>', '<div class="message">Hello <div class="inside">World<div>!<div/></div><div/></div><div/></div>', '<div/>'],
 				'<div/><div class="message">Hello <div class="inside">World<div>!<div/></div><div/></div><div/></div><div/>',
 				'div'
 			],
-			'div_3_et_autofermante_5_nbmax' =>[
+			'div_3_et_autofermante_5_nbmax' => [
 				['<div/>'],
 				'<div/><div class="message">Hello <div class="inside">World<div>!<div/></div><div/></div><div/></div><div/>',
 				'div',
 				['nb_max' => 1]
 			],
-			'div_3_et_autofermante_5_profondeur_2' =>[
+			'div_3_et_autofermante_5_profondeur_2' => [
 				['<div class="hello">Hello</div>', '<div class="world">World</div>', '<div>!</div>', '<div/>'],
 				'<div class="message"><div class="hello">Hello</div> <div class="world">World</div><div>!</div> <div/></div>',
 				'div',
 				['profondeur' => '2'],
 			],
-			'div_3_et_autofermante_5_profondeur_3' =>[
+			'div_3_et_autofermante_5_profondeur_3' => [
 				[],
 				'<div class="message"><div class="hello">Hello</div> <div class="world">World</div><div>!</div> <div/></div>',
 				'div',
 				['profondeur' => '3'],
 			],
-			'div_3_et_autofermante_5_profondeur_3_2' =>[
+			'div_3_et_autofermante_5_profondeur_3_2' => [
 				['<div>lo</div>'],
 				'<div class="message"><div class="hello">Hel<div>lo</div></div> <div class="world">World</div><div>!</div> <div/></div>',
 				'div',
diff --git a/tests/tests/Filtre/ExtraireMultiTest.php b/ecrire/tests/Filtre/ExtraireMultiTest.php
similarity index 98%
rename from tests/tests/Filtre/ExtraireMultiTest.php
rename to ecrire/tests/Filtre/ExtraireMultiTest.php
index 7bbac2ff1bb810655cd2b4bb208bf2687c45981e..0b67eab3d4aa847cc1ca77a89c8f3865f69a8c3e 100644
--- a/tests/tests/Filtre/ExtraireMultiTest.php
+++ b/ecrire/tests/Filtre/ExtraireMultiTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction extraire_multi du fichier ./inc/filtres.php
  */
 
-namespace Spip\Core\Tests\Filtre;
+namespace Spip\Test\Filtre;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Filtre/FiltreBaliseImgDistTest.php b/ecrire/tests/Filtre/FiltreBaliseImgDistTest.php
similarity index 95%
rename from tests/tests/Filtre/FiltreBaliseImgDistTest.php
rename to ecrire/tests/Filtre/FiltreBaliseImgDistTest.php
index 33586b9db4ec384e32109e67acee79d6cc4d9857..a983c829898612ed0ba28219ff0cfd7c81261c5d 100644
--- a/tests/tests/Filtre/FiltreBaliseImgDistTest.php
+++ b/ecrire/tests/Filtre/FiltreBaliseImgDistTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction filtre_balise_img_dist du fichier ./inc/filtres.php
  */
 
-namespace Spip\Core\Tests\Filtre;
+namespace Spip\Test\Filtre;
 
 use PHPUnit\Framework\TestCase;
 
@@ -24,7 +24,7 @@ class FiltreBaliseImgDistTest extends TestCase
 	{
 		static $f = null;
 		// chercher la fonction si elle n'existe pas
-		if ($f === null && ! function_exists($f = 'filtre_balise_img_dist')) {
+		if ($f === null && !function_exists($f = 'filtre_balise_img_dist')) {
 			find_in_path('inc/filtres.php', '', true);
 			$f = chercher_filtre($f);
 		}
@@ -35,12 +35,13 @@ class FiltreBaliseImgDistTest extends TestCase
 
 	public static function providerFiltresFiltreBaliseImgDist(): array
 	{
-		return [[
+		return [
+			[
 
 
-			0 => "<img src='https://www.spip.net/IMG/logo/siteon0.png' alt='' width='300' height='223' />",
-			1 => 'https://www.spip.net/IMG/logo/siteon0.png',
-		],
+				0 => "<img src='https://www.spip.net/IMG/logo/siteon0.png' alt='' width='300' height='223' />",
+				1 => 'https://www.spip.net/IMG/logo/siteon0.png',
+			],
 			[
 				0 => "<img src='prive/images/logo-spip.png' alt='' width='231' height='172' />",
 				1 => 'prive/images/logo-spip.png',
diff --git a/tests/tests/Filtre/FiltrerEntitesTest.php b/ecrire/tests/Filtre/FiltrerEntitesTest.php
similarity index 98%
rename from tests/tests/Filtre/FiltrerEntitesTest.php
rename to ecrire/tests/Filtre/FiltrerEntitesTest.php
index 37edab198de664710916c11946b3ad01ee21bd6b..2d006b6f880b7640efc5b22d580a71d79058f11a 100644
--- a/tests/tests/Filtre/FiltrerEntitesTest.php
+++ b/ecrire/tests/Filtre/FiltrerEntitesTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction filtrer_entites du fichier inc/filtres.php
  */
 
-namespace Spip\Core\Tests\Filtre;
+namespace Spip\Test\Filtre;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Filtre/Form/FormHiddenArboTest.php b/ecrire/tests/Filtre/Form/FormHiddenArboTest.php
similarity index 84%
rename from tests/tests/Filtre/Form/FormHiddenArboTest.php
rename to ecrire/tests/Filtre/Form/FormHiddenArboTest.php
index 03568b804b19f6aed4783a88cde44d9628b3c104..e5d010a3c0f795c6a01d4c9c90438e94a1087dac 100644
--- a/tests/tests/Filtre/Form/FormHiddenArboTest.php
+++ b/ecrire/tests/Filtre/Form/FormHiddenArboTest.php
@@ -6,13 +6,11 @@ declare(strict_types=1);
  * Test unitaire de la fonction affdate_court du fichier inc/filtres.php
  */
 
-namespace Spip\Core\Tests\Filtre\Form;
+namespace Spip\Test\Filtre\Form;
 
 use PHPUnit\Framework\TestCase;
 
 class FormHiddenArboTest extends FormHiddenCase
 {
 	public const TYPE = 'arbo';
-
-
 }
diff --git a/tests/tests/Filtre/Form/FormHiddenCase.php b/ecrire/tests/Filtre/Form/FormHiddenCase.php
similarity index 97%
rename from tests/tests/Filtre/Form/FormHiddenCase.php
rename to ecrire/tests/Filtre/Form/FormHiddenCase.php
index 076113ba6a9c5975af194bffdf387ce54f0b6ca6..5a265788e1800bcb28fced03d096ce59ddd4ee43 100644
--- a/tests/tests/Filtre/Form/FormHiddenCase.php
+++ b/ecrire/tests/Filtre/Form/FormHiddenCase.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction affdate_court du fichier inc/filtres.php
  */
 
-namespace Spip\Core\Tests\Filtre\Form;
+namespace Spip\Test\Filtre\Form;
 
 use PHPUnit\Framework\TestCase;
 
@@ -43,7 +43,8 @@ class FormHiddenCase extends TestCase
 		}
 	}
 
-	protected static function getIdRubrique(): ?int {
+	protected static function getIdRubrique(): ?int
+	{
 		include_spip('base/abstract_sql');
 		$id_rubrique = sql_getfetsel(
 			'id_rubrique',
diff --git a/tests/tests/Filtre/Form/FormHiddenHtmlTest.php b/ecrire/tests/Filtre/Form/FormHiddenHtmlTest.php
similarity index 85%
rename from tests/tests/Filtre/Form/FormHiddenHtmlTest.php
rename to ecrire/tests/Filtre/Form/FormHiddenHtmlTest.php
index 9bc8c79240db10ae7ccb5342826240157f78661a..e018e177ada4ebbdc5976d246efb211d9ec82e99 100644
--- a/tests/tests/Filtre/Form/FormHiddenHtmlTest.php
+++ b/ecrire/tests/Filtre/Form/FormHiddenHtmlTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction affdate_court du fichier inc/filtres.php
  */
 
-namespace Spip\Core\Tests\Filtre\Form;
+namespace Spip\Test\Filtre\Form;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Filtre/Form/FormHiddenLibresTest.php b/ecrire/tests/Filtre/Form/FormHiddenLibresTest.php
similarity index 85%
rename from tests/tests/Filtre/Form/FormHiddenLibresTest.php
rename to ecrire/tests/Filtre/Form/FormHiddenLibresTest.php
index 842bde6030602ecc000d19ef22ad1abdcef9c128..72d4e53f7bcd1570013a95409732b29bbc0aff65 100644
--- a/tests/tests/Filtre/Form/FormHiddenLibresTest.php
+++ b/ecrire/tests/Filtre/Form/FormHiddenLibresTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction affdate_court du fichier inc/filtres.php
  */
 
-namespace Spip\Core\Tests\Filtre\Form;
+namespace Spip\Test\Filtre\Form;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Filtre/Form/FormHiddenPageTest.php b/ecrire/tests/Filtre/Form/FormHiddenPageTest.php
similarity index 85%
rename from tests/tests/Filtre/Form/FormHiddenPageTest.php
rename to ecrire/tests/Filtre/Form/FormHiddenPageTest.php
index 1f3cf00494bf4add69e2b29cd33885f94de49aae..6a7341555749eefc857bb8918f0c22ece69f1b5d 100644
--- a/tests/tests/Filtre/Form/FormHiddenPageTest.php
+++ b/ecrire/tests/Filtre/Form/FormHiddenPageTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction affdate_court du fichier inc/filtres.php
  */
 
-namespace Spip\Core\Tests\Filtre\Form;
+namespace Spip\Test\Filtre\Form;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Filtre/Form/FormHiddenPropresQsTest.php b/ecrire/tests/Filtre/Form/FormHiddenPropresQsTest.php
similarity index 86%
rename from tests/tests/Filtre/Form/FormHiddenPropresQsTest.php
rename to ecrire/tests/Filtre/Form/FormHiddenPropresQsTest.php
index 556e9ecdbc0bce9ae4e86126cb5b7eafc492151d..6b683815ad9ac2b53aa10fc8ef11af61a4d19bee 100644
--- a/tests/tests/Filtre/Form/FormHiddenPropresQsTest.php
+++ b/ecrire/tests/Filtre/Form/FormHiddenPropresQsTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction affdate_court du fichier inc/filtres.php
  */
 
-namespace Spip\Core\Tests\Filtre\Form;
+namespace Spip\Test\Filtre\Form;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Filtre/Form/FormHiddenPropresTest.php b/ecrire/tests/Filtre/Form/FormHiddenPropresTest.php
similarity index 85%
rename from tests/tests/Filtre/Form/FormHiddenPropresTest.php
rename to ecrire/tests/Filtre/Form/FormHiddenPropresTest.php
index d724dc662a1467c5f2b3e6c3c7e10505806fb553..e1ee2875f6f348de08986e96931089941bba0f20 100644
--- a/tests/tests/Filtre/Form/FormHiddenPropresTest.php
+++ b/ecrire/tests/Filtre/Form/FormHiddenPropresTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction affdate_court du fichier inc/filtres.php
  */
 
-namespace Spip\Core\Tests\Filtre\Form;
+namespace Spip\Test\Filtre\Form;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Filtre/Form/FormHiddenStandardTest.php b/ecrire/tests/Filtre/Form/FormHiddenStandardTest.php
similarity index 85%
rename from tests/tests/Filtre/Form/FormHiddenStandardTest.php
rename to ecrire/tests/Filtre/Form/FormHiddenStandardTest.php
index 10391e9b0817e8270dc4667ae4379cd6a27d27d1..2ec01c06e8a871ce0e2d1058414e874d8f23eedb 100644
--- a/tests/tests/Filtre/Form/FormHiddenStandardTest.php
+++ b/ecrire/tests/Filtre/Form/FormHiddenStandardTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction affdate_court du fichier inc/filtres.php
  */
 
-namespace Spip\Core\Tests\Filtre\Form;
+namespace Spip\Test\Filtre\Form;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Filtre/HauteurTest.php b/ecrire/tests/Filtre/HauteurTest.php
similarity index 96%
rename from tests/tests/Filtre/HauteurTest.php
rename to ecrire/tests/Filtre/HauteurTest.php
index fe21fb0f56b203e418b5a38c69c609171755bd29..757cb9f5f18b25bf000d2321973a6e2c54d094ec 100644
--- a/tests/tests/Filtre/HauteurTest.php
+++ b/ecrire/tests/Filtre/HauteurTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction hauteur du fichier inc/filtres.php
  */
 
-namespace Spip\Core\Tests\Filtre;
+namespace Spip\Test\Filtre;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Filtre/IdentifiantSlugTest.php b/ecrire/tests/Filtre/IdentifiantSlugTest.php
similarity index 99%
rename from tests/tests/Filtre/IdentifiantSlugTest.php
rename to ecrire/tests/Filtre/IdentifiantSlugTest.php
index 6c639ff347754737feaa7e0ba8de03befb0c8746..ba948e8640f2edcad88063565af8f06f539d77f3 100644
--- a/tests/tests/Filtre/IdentifiantSlugTest.php
+++ b/ecrire/tests/Filtre/IdentifiantSlugTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction identifiant_slug du fichier ./inc/filtres.php
  */
 
-namespace Spip\Core\Tests\Filtre;
+namespace Spip\Test\Filtre;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Filtre/InsererAttributTest.php b/ecrire/tests/Filtre/InsererAttributTest.php
similarity index 99%
rename from tests/tests/Filtre/InsererAttributTest.php
rename to ecrire/tests/Filtre/InsererAttributTest.php
index 9c24da617628dd0e9c0d6dfbbbaa1ca3021a346d..fb410f9d9a05ac623b25c67c085cb67fe0a0fe02 100644
--- a/tests/tests/Filtre/InsererAttributTest.php
+++ b/ecrire/tests/Filtre/InsererAttributTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction inserer_attribut du fichier ./inc/filtres.php
  */
 
-namespace Spip\Core\Tests\Filtre;
+namespace Spip\Test\Filtre;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Filtre/LabelTest.php b/ecrire/tests/Filtre/LabelTest.php
similarity index 99%
rename from tests/tests/Filtre/LabelTest.php
rename to ecrire/tests/Filtre/LabelTest.php
index 4a3de31631583b611cffc5dec60b84d6a8e8151b..582d68c72a6f394ee3fcf0cfb3ea02da804a10cf 100644
--- a/tests/tests/Filtre/LabelTest.php
+++ b/ecrire/tests/Filtre/LabelTest.php
@@ -12,7 +12,7 @@ declare(strict_types=1);
  *  Pour plus de détails voir le fichier COPYING.txt ou l'aide en ligne.   *
 \***************************************************************************/
 
-namespace Spip\Core\Tests\Filtre;
+namespace Spip\Test\Filtre;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Filtre/LargeurTest.php b/ecrire/tests/Filtre/LargeurTest.php
similarity index 96%
rename from tests/tests/Filtre/LargeurTest.php
rename to ecrire/tests/Filtre/LargeurTest.php
index d30ef2fb2ff1557298f7b16f7919b774eea59423..d4909e44b9dfb529ab513565d8b74aefb2dffa96 100644
--- a/tests/tests/Filtre/LargeurTest.php
+++ b/ecrire/tests/Filtre/LargeurTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction largeur du fichier inc/filtres.php
  */
 
-namespace Spip\Core\Tests\Filtre;
+namespace Spip\Test\Filtre;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Filtre/LienOuExposeTest.php b/ecrire/tests/Filtre/LienOuExposeTest.php
similarity index 99%
rename from tests/tests/Filtre/LienOuExposeTest.php
rename to ecrire/tests/Filtre/LienOuExposeTest.php
index 0128771b6522784e4ede9d815ba28df09c6cd079..9b73e8a6fa9a3846ca3ce2c61fff5674301551f8 100644
--- a/tests/tests/Filtre/LienOuExposeTest.php
+++ b/ecrire/tests/Filtre/LienOuExposeTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction lien_ou_expose du fichier ./inc/filtres.php
  */
 
-namespace Spip\Core\Tests\Filtre;
+namespace Spip\Test\Filtre;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Filtre/Mime/FiltreTextCsvDistTest.php b/ecrire/tests/Filtre/Mime/FiltreTextCsvDistTest.php
similarity index 99%
rename from tests/tests/Filtre/Mime/FiltreTextCsvDistTest.php
rename to ecrire/tests/Filtre/Mime/FiltreTextCsvDistTest.php
index 88e1e8a0b7e01d05b37c1379a0725c5b9054e603..c0cc5d6d8b9ad84d7bd03290672e72e3c367c57b 100644
--- a/tests/tests/Filtre/Mime/FiltreTextCsvDistTest.php
+++ b/ecrire/tests/Filtre/Mime/FiltreTextCsvDistTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction filtre_text_csv_dist du fichier inc/filtres_mime.php
  */
 
-namespace Spip\Core\Tests\Filtre\Mime;
+namespace Spip\Test\Filtre\Mime;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Filtre/Mime/FiltreTextDistTest.php b/ecrire/tests/Filtre/Mime/FiltreTextDistTest.php
similarity index 98%
rename from tests/tests/Filtre/Mime/FiltreTextDistTest.php
rename to ecrire/tests/Filtre/Mime/FiltreTextDistTest.php
index e63e5774c9c398d43c0d18e739fba426da535857..0e1e9cf45bb510e661737129dd42bf12d47dc93d 100644
--- a/tests/tests/Filtre/Mime/FiltreTextDistTest.php
+++ b/ecrire/tests/Filtre/Mime/FiltreTextDistTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction filtre_text_dist du fichier inc/filtres_mime.php
  */
 
-namespace Spip\Core\Tests\Filtre\Mime;
+namespace Spip\Test\Filtre\Mime;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Filtre/Mini/ProtocoleVerifierTest.php b/ecrire/tests/Filtre/Mini/ProtocoleVerifierTest.php
similarity index 97%
rename from tests/tests/Filtre/Mini/ProtocoleVerifierTest.php
rename to ecrire/tests/Filtre/Mini/ProtocoleVerifierTest.php
index 2dd9255eab26ab7f21f684fb3b3716e7c4a2b91a..0c2347f30bb8b59db747834c92fb322357c6435f 100644
--- a/tests/tests/Filtre/Mini/ProtocoleVerifierTest.php
+++ b/ecrire/tests/Filtre/Mini/ProtocoleVerifierTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction protocole_verifier du fichier ./inc/filtres_mini.php
  */
 
-namespace Spip\Core\Tests\Filtre\Mini;
+namespace Spip\Test\Filtre\Mini;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Filtre/ModuloTest.php b/ecrire/tests/Filtre/ModuloTest.php
similarity index 99%
rename from tests/tests/Filtre/ModuloTest.php
rename to ecrire/tests/Filtre/ModuloTest.php
index b3917b415f61cb71283d120029d284a20f6eb27a..d4c924a86459ce736168ee0d4070bd957f5b9487 100644
--- a/tests/tests/Filtre/ModuloTest.php
+++ b/ecrire/tests/Filtre/ModuloTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction modulo du fichier inc/filtres.php
  */
 
-namespace Spip\Core\Tests\Filtre;
+namespace Spip\Test\Filtre;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Filtre/MoinsTest.php b/ecrire/tests/Filtre/MoinsTest.php
similarity index 99%
rename from tests/tests/Filtre/MoinsTest.php
rename to ecrire/tests/Filtre/MoinsTest.php
index 8cd72d079e4c68df3fc724897619b4b54933ddb0..8e3c6740df897ae4ce6f81e6fe8c59b0dd73995d 100644
--- a/tests/tests/Filtre/MoinsTest.php
+++ b/ecrire/tests/Filtre/MoinsTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction moins du fichier inc/filtres.php
  */
 
-namespace Spip\Core\Tests\Filtre;
+namespace Spip\Test\Filtre;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Filtre/MultTest.php b/ecrire/tests/Filtre/MultTest.php
similarity index 99%
rename from tests/tests/Filtre/MultTest.php
rename to ecrire/tests/Filtre/MultTest.php
index 743d1bfdcaebc6a19f2a46f05d63b4be523a6ff0..986f8a562e59200d2731aff0e7004525aad631a7 100644
--- a/tests/tests/Filtre/MultTest.php
+++ b/ecrire/tests/Filtre/MultTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction mult du fichier inc/filtres.php
  */
 
-namespace Spip\Core\Tests\Filtre;
+namespace Spip\Test\Filtre;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Filtre/PlusTest.php b/ecrire/tests/Filtre/PlusTest.php
similarity index 99%
rename from tests/tests/Filtre/PlusTest.php
rename to ecrire/tests/Filtre/PlusTest.php
index 57fda685c233fc8fcbe585f9a085d359c968cfe6..3ac2fea9ce44e77f7444a8218bf055b6aeb276f2 100644
--- a/tests/tests/Filtre/PlusTest.php
+++ b/ecrire/tests/Filtre/PlusTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction plus du fichier inc/filtres.php
  */
 
-namespace Spip\Core\Tests\Filtre;
+namespace Spip\Test\Filtre;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Filtre/PostAutobrTest.php b/ecrire/tests/Filtre/PostAutobrTest.php
similarity index 97%
rename from tests/tests/Filtre/PostAutobrTest.php
rename to ecrire/tests/Filtre/PostAutobrTest.php
index 7b47eae58f98fff7d4c029bcc17dfb68a467c019..025f4c2f685f6a7002d2b26d961b602aa806b9ac 100644
--- a/tests/tests/Filtre/PostAutobrTest.php
+++ b/ecrire/tests/Filtre/PostAutobrTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction post_autobr du fichier ./inc/filtres.php
  */
 
-namespace Spip\Core\Tests\Filtre;
+namespace Spip\Test\Filtre;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Filtre/ProtegerAmpTest.php b/ecrire/tests/Filtre/ProtegerAmpTest.php
similarity index 97%
rename from tests/tests/Filtre/ProtegerAmpTest.php
rename to ecrire/tests/Filtre/ProtegerAmpTest.php
index f84d156dd990bf108ce4e8c663b9775025c75302..6fd1693077fb9493f2f230e3428b2affe657cd6a 100644
--- a/tests/tests/Filtre/ProtegerAmpTest.php
+++ b/ecrire/tests/Filtre/ProtegerAmpTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction proteger_amp du fichier inc/filtres.php
  */
 
-namespace Spip\Core\Tests\Filtre;
+namespace Spip\Test\Filtre;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Filtre/RecupererNumeroTest.php b/ecrire/tests/Filtre/RecupererNumeroTest.php
similarity index 96%
rename from tests/tests/Filtre/RecupererNumeroTest.php
rename to ecrire/tests/Filtre/RecupererNumeroTest.php
index 42c4df3797c893c919fbdd9289c00dc55c4fc3c5..f68c4191466c3a8b02e8621801b405ace8216423 100644
--- a/tests/tests/Filtre/RecupererNumeroTest.php
+++ b/ecrire/tests/Filtre/RecupererNumeroTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction recuperer_numero du fichier inc/filtres.php
  */
 
-namespace Spip\Core\Tests\Filtre;
+namespace Spip\Test\Filtre;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Filtre/SecondesTest.php b/ecrire/tests/Filtre/SecondesTest.php
similarity index 99%
rename from tests/tests/Filtre/SecondesTest.php
rename to ecrire/tests/Filtre/SecondesTest.php
index 7e195cfc2ba9f932344afe9aaa71b77cfe808f7b..4259c4716479a8684bc1d05eb81ac848045ab389 100644
--- a/tests/tests/Filtre/SecondesTest.php
+++ b/ecrire/tests/Filtre/SecondesTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction secondes du fichier inc/filtres.php
  */
 
-namespace Spip\Core\Tests\Filtre;
+namespace Spip\Test\Filtre;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Filtre/SinonTest.php b/ecrire/tests/Filtre/SinonTest.php
similarity index 99%
rename from tests/tests/Filtre/SinonTest.php
rename to ecrire/tests/Filtre/SinonTest.php
index f2222c268104377c845ff3f7ffefcd53c30c861f..e14caf91e8d22be26f6729be8895053c141a43f3 100644
--- a/tests/tests/Filtre/SinonTest.php
+++ b/ecrire/tests/Filtre/SinonTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction sinon du fichier inc/filtres.php
  */
 
-namespace Spip\Core\Tests\Filtre;
+namespace Spip\Test\Filtre;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Filtre/SpipHtmlentitiesTest.php b/ecrire/tests/Filtre/SpipHtmlentitiesTest.php
similarity index 99%
rename from tests/tests/Filtre/SpipHtmlentitiesTest.php
rename to ecrire/tests/Filtre/SpipHtmlentitiesTest.php
index 28105990321eeafe1699bbe3f42c6219d327762a..0f8d32454dad8272d3540d0166af54021bf6d870 100644
--- a/tests/tests/Filtre/SpipHtmlentitiesTest.php
+++ b/ecrire/tests/Filtre/SpipHtmlentitiesTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction spip_htmlentities du fichier ./inc/filtres.php
  */
 
-namespace Spip\Core\Tests\Filtre;
+namespace Spip\Test\Filtre;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Filtre/SpipHtmlspecialcharsTest.php b/ecrire/tests/Filtre/SpipHtmlspecialcharsTest.php
similarity index 99%
rename from tests/tests/Filtre/SpipHtmlspecialcharsTest.php
rename to ecrire/tests/Filtre/SpipHtmlspecialcharsTest.php
index 998fa0768b68b77b5412cbbbc1f3e7b435b7842d..ed7b6862edfe5063f16dd04aa8c0d4236b2ecabb 100644
--- a/tests/tests/Filtre/SpipHtmlspecialcharsTest.php
+++ b/ecrire/tests/Filtre/SpipHtmlspecialcharsTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction spip_htmlspecialchars du fichier ./inc/filtres.php
  */
 
-namespace Spip\Core\Tests\Filtre;
+namespace Spip\Test\Filtre;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Filtre/SupprimerClassTest.php b/ecrire/tests/Filtre/SupprimerClassTest.php
similarity index 98%
rename from tests/tests/Filtre/SupprimerClassTest.php
rename to ecrire/tests/Filtre/SupprimerClassTest.php
index 3e0b46a5bd621523d460a7c5b9ac2127e6956da7..ed31d16db2deffec6e6c435c7230692fe4f98c9b 100644
--- a/tests/tests/Filtre/SupprimerClassTest.php
+++ b/ecrire/tests/Filtre/SupprimerClassTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction supprimer_class du fichier ./inc/filtres.php
  */
 
-namespace Spip\Core\Tests\Filtre;
+namespace Spip\Test\Filtre;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Filtre/SupprimerNumeroTest.php b/ecrire/tests/Filtre/SupprimerNumeroTest.php
similarity index 96%
rename from tests/tests/Filtre/SupprimerNumeroTest.php
rename to ecrire/tests/Filtre/SupprimerNumeroTest.php
index f346976f13a3ac0b08884f648a8db3ac4f218317..04c74bdfdd0bc16a8e47f1db7d8ee34095421d7d 100644
--- a/tests/tests/Filtre/SupprimerNumeroTest.php
+++ b/ecrire/tests/Filtre/SupprimerNumeroTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction supprimer_numero du fichier inc/filtres.php
  */
 
-namespace Spip\Core\Tests\Filtre;
+namespace Spip\Test\Filtre;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Filtre/SupprimerTagsTest.php b/ecrire/tests/Filtre/SupprimerTagsTest.php
similarity index 97%
rename from tests/tests/Filtre/SupprimerTagsTest.php
rename to ecrire/tests/Filtre/SupprimerTagsTest.php
index a751dc37d219c893bbfdc6f776dd3ddef8be362b..1f4d74e48cafc32decca39ca785902709ad68eb1 100644
--- a/tests/tests/Filtre/SupprimerTagsTest.php
+++ b/ecrire/tests/Filtre/SupprimerTagsTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction supprimer_tags du fichier inc/filtres.php
  */
 
-namespace Spip\Core\Tests\Filtre;
+namespace Spip\Test\Filtre;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Filtre/TailleEnOctetsTest.php b/ecrire/tests/Filtre/TailleEnOctetsTest.php
similarity index 97%
rename from tests/tests/Filtre/TailleEnOctetsTest.php
rename to ecrire/tests/Filtre/TailleEnOctetsTest.php
index dcc36f9daa42822d71b59005e08a2e98b649530d..a963081bcfcac4c0c8f5832af49adab1cd542626 100644
--- a/tests/tests/Filtre/TailleEnOctetsTest.php
+++ b/ecrire/tests/Filtre/TailleEnOctetsTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction taille_en_octets du fichier inc/filtres.php
  */
 
-namespace Spip\Core\Tests\Filtre;
+namespace Spip\Test\Filtre;
 
 use PHPUnit\Framework\TestCase;
 
@@ -47,7 +47,7 @@ class TailleEnOctetsTest extends TestCase
 	public static function providerFiltresTailleEnOctetsBI(): array
 	{
 		$list = [
-			0 =>'',
+			0 => '',
 			-1 => '',
 			1 => '1 octets',
 			2 => '2 octets',
@@ -69,7 +69,7 @@ class TailleEnOctetsTest extends TestCase
 	public static function providerFiltresTailleEnOctetsSI(): array
 	{
 		$list = [
-			0 =>'',
+			0 => '',
 			-1 => '',
 			1 => '1 octets',
 			2 => '2 octets',
diff --git a/tests/tests/Filtre/TailleImageTest.php b/ecrire/tests/Filtre/TailleImageTest.php
similarity index 96%
rename from tests/tests/Filtre/TailleImageTest.php
rename to ecrire/tests/Filtre/TailleImageTest.php
index 0f01b09e505265976e0dd86efc04cd6694e6b80f..b3db7c916d8dc6ad3687d3ee394466b2ed64e142 100644
--- a/tests/tests/Filtre/TailleImageTest.php
+++ b/ecrire/tests/Filtre/TailleImageTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction taille_image du fichier inc/filtres.php
  */
 
-namespace Spip\Core\Tests\Filtre;
+namespace Spip\Test\Filtre;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Filtre/TexteBackendTest.php b/ecrire/tests/Filtre/TexteBackendTest.php
similarity index 97%
rename from tests/tests/Filtre/TexteBackendTest.php
rename to ecrire/tests/Filtre/TexteBackendTest.php
index d50c7517cc771c9eea6717706ec111d72caa8d53..12e1fe7e26f789c00fa39b7cd109f691288c8296 100644
--- a/tests/tests/Filtre/TexteBackendTest.php
+++ b/ecrire/tests/Filtre/TexteBackendTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction texte_backend du fichier inc/filtres.php
  */
 
-namespace Spip\Core\Tests\Filtre;
+namespace Spip\Test\Filtre;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Filtre/TexteBackendqTest.php b/ecrire/tests/Filtre/TexteBackendqTest.php
similarity index 97%
rename from tests/tests/Filtre/TexteBackendqTest.php
rename to ecrire/tests/Filtre/TexteBackendqTest.php
index 2ddec16148811728ece3391a6cc94c937d1138c6..92f70d312d97c82f0582d36a2565fcadce744d5c 100644
--- a/tests/tests/Filtre/TexteBackendqTest.php
+++ b/ecrire/tests/Filtre/TexteBackendqTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction texte_backendq du fichier inc/filtres.php
  */
 
-namespace Spip\Core\Tests\Filtre;
+namespace Spip\Test\Filtre;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Filtre/WrapTest.php b/ecrire/tests/Filtre/WrapTest.php
similarity index 96%
rename from tests/tests/Filtre/WrapTest.php
rename to ecrire/tests/Filtre/WrapTest.php
index cc3329edb46e320ad34c45087fac8886f3e97fc7..3f4c3246d3f31637a54838e5267ead3ca7adc48c 100644
--- a/tests/tests/Filtre/WrapTest.php
+++ b/ecrire/tests/Filtre/WrapTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction wrap du fichier inc/filtres.php
  */
 
-namespace Spip\Core\Tests\Filtre;
+namespace Spip\Test\Filtre;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Fixtures/data/dailymotion.rss b/ecrire/tests/Fixtures/data/dailymotion.rss
similarity index 100%
rename from tests/tests/Fixtures/data/dailymotion.rss
rename to ecrire/tests/Fixtures/data/dailymotion.rss
diff --git a/tests/tests/Format/Json/Var2jsTest.php b/ecrire/tests/Format/Json/Var2jsTest.php
similarity index 99%
rename from tests/tests/Format/Json/Var2jsTest.php
rename to ecrire/tests/Format/Json/Var2jsTest.php
index eddbe8e4fb562c5aacdf72a88e9d416dfc327679..48da31d356fa6eeedcd5e3c7bc228b19ea36b752 100644
--- a/tests/tests/Format/Json/Var2jsTest.php
+++ b/ecrire/tests/Format/Json/Var2jsTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction var2js du fichier ./inc/json.php
  */
 
-namespace Spip\Core\Tests\Format\Json;
+namespace Spip\Test\Format\Json;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Format/Xml/SpipXmlParseTest.php b/ecrire/tests/Format/Xml/SpipXmlParseTest.php
similarity index 93%
rename from tests/tests/Format/Xml/SpipXmlParseTest.php
rename to ecrire/tests/Format/Xml/SpipXmlParseTest.php
index 54290dea13b6d7916a2c1e92a7a302c4af8fa213..e81091ed4a63f39998bd19e8e53488ed01193fee 100644
--- a/tests/tests/Format/Xml/SpipXmlParseTest.php
+++ b/ecrire/tests/Format/Xml/SpipXmlParseTest.php
@@ -6,30 +6,30 @@ declare(strict_types=1);
  * Test unitaire de la fonction spip_xml_parse du fichier inc/xml.php
  */
 
-namespace Spip\Core\Tests\Format\Xml;
+namespace Spip\Test\Format\Xml;
 
 use PHPUnit\Framework\TestCase;
 
 class SpipXmlParseTest extends TestCase
 {
-	public static function setUpBeforeClass(): void
-	{
-		find_in_path('inc/xml.php', '', true);
-	}
+  public static function setUpBeforeClass(): void
+  {
+    find_in_path('inc/xml.php', '', true);
+  }
 
-	/**
-	 * @dataProvider providerXmlSpipXmlParse
-	 */
-	public function testXmlSpipXmlParse($expected, ...$args): void
-	{
-		$actual = serialize(spip_xml_parse(...$args));
-		$this->assertSame($expected, $actual);
-	}
+  /**
+   * @dataProvider providerXmlSpipXmlParse
+   */
+  public function testXmlSpipXmlParse($expected, ...$args): void
+  {
+    $actual = serialize(spip_xml_parse(...$args));
+    $this->assertSame($expected, $actual);
+  }
 
-	public static function providerXmlSpipXmlParse(): array
-	{
-		$essais = [];
-		$xml1 = '<' . <<<CODE_SAMPLE
+  public static function providerXmlSpipXmlParse(): array
+  {
+    $essais = [];
+    $xml1 = '<' . <<<CODE_SAMPLE
 ?xml version="1.0" encoding="utf-8"?>
 <urlset xmlns="http://www.google.com/schemas/sitemap/0.84">
 <url><loc>http://localhost/_core/spip/spip.php?breve25</loc>
@@ -48,10 +48,10 @@ class SpipXmlParseTest extends TestCase
 </url>
 </urlset>
 CODE_SAMPLE;
-		$tree1 = <<<CODE_SAMPLE
+    $tree1 = <<<CODE_SAMPLE
 a:1:{s:57:"urlset xmlns="http://www.google.com/schemas/sitemap/0.84"";a:1:{i:0;a:1:{s:3:"url";a:3:{i:0;a:3:{s:3:"loc";a:1:{i:0;s:44:"http://localhost/_core/spip/spip.php?breve25";}s:7:"lastmod";a:1:{i:0;s:10:"2003-12-31";}s:8:"priority";a:1:{i:0;s:3:"0.8";}}i:1;a:3:{s:3:"loc";a:1:{i:0;s:44:"http://localhost/_core/spip/spip.php?breve32";}s:7:"lastmod";a:1:{i:0;s:10:"2004-02-10";}s:8:"priority";a:1:{i:0;s:3:"0.8";}}i:2;a:3:{s:3:"loc";a:1:{i:0;s:44:"http://localhost/_core/spip/spip.php?breve64";}s:7:"lastmod";a:1:{i:0;s:10:"2005-01-31";}s:8:"priority";a:1:{i:0;s:3:"0.8";}}}}}}
 CODE_SAMPLE;
-		$xml2 = '<' . <<<CODE_SAMPLE
+    $xml2 = '<' . <<<CODE_SAMPLE
 ?xml version="1.0" encoding="UTF-8"?>
 <opml version="1.0">
   <head>
@@ -108,11 +108,11 @@ CODE_SAMPLE;
   </body>
 </opml>
 CODE_SAMPLE;
-		$tree2 = <<<CODE_SAMPLE
+    $tree2 = <<<CODE_SAMPLE
 a:1:{s:18:"opml version="1.0"";a:1:{i:0;a:2:{s:4:"head";a:1:{i:0;a:2:{s:5:"title";a:1:{i:0;s:9:"arbo_riec";}s:14:"expansionState";a:1:{i:0;s:93:"0,9,14,24,28,30,31,35,41,43,44,46,48,55,58,61,66,71,74,77,78,82,87,89,90,92,96,98,102,110,112";}}}s:4:"body";a:1:{i:0;a:3:{s:27:"outline text="Citoyenneté"";a:1:{i:0;a:8:{s:98:"outline text="Page d'accueil" Contenu="Articles et brèves d'actualité + Vos questions en direct"";a:1:{i:0;s:0:"";}s:152:"outline text="Le maire et les adjoints" Contenu="Nom, fonction, contact, horaires de permanence et photo de chaque élu" Fonctionnalité="Trombinoscope"";a:1:{i:0;s:0:"";}s:88:"outline text="Les conseillers municipaux" Contenu="idem" Fonctionnalité="Trombinoscope"";a:1:{i:0;s:0:"";}s:81:"outline text="Les commissions" Contenu="Présentation générale des commissions"";a:1:{i:0;a:1:{s:83:"outline text="Une fiche par commission" Contenu="Domaine de compétence et membres"";a:1:{i:0;s:0:"";}}}s:173:"outline text="Les conseils municipaux" Contenu="Présentation générale, téléchargement du dernier compte-rendu et agenda des prochains conseils" Fonctionnalité="Agenda"";a:1:{i:0;a:1:{s:136:"outline text="Comptes-rendus" Contenu="Les comptes-rendus de conseils à télécharger" Fonctionnalité="Publications et archivage auto"";a:1:{i:0;a:1:{s:82:"outline text="Un article par compte-rendu" Contenu="Texte ou doc à télécharger"";a:1:{i:0;s:0:"";}}}}}s:113:"outline text="Les réunions de quartier" Contenu="Présentation et agenda des réunions" Fonctionnalité="Agenda"";a:1:{i:0;s:0:"";}s:83:"outline text="L’Atelier municipal sur l’environnement" Contenu="Texte + photos"";a:1:{i:0;s:0:"";}s:78:"outline text="L’intercommunalité" Contenu="Texte de présentation + photos"";a:1:{i:0;a:5:{s:47:"outline text="Cocopaq" Contenu="Texte + photos"";a:1:{i:0;s:0:"";}s:71:"outline text="Syndicat de Voirie de Rosporden" Contenu="Texte + photos"";a:1:{i:0;s:0:"";}s:63:"outline text="SIVU de Riec sur Bélon" Contenu="Texte + photos"";a:1:{i:0;s:0:"";}s:45:"outline text="Sicom" Contenu="Texte + photos"";a:1:{i:0;s:0:"";}s:100:"outline text="Syndicat d’eau et d’électricification de Riec sur Belon" Contenu="Texte + photos"";a:1:{i:0;s:0:"";}}}}}s:23:"outline text="Economie"";a:1:{i:0;a:9:{s:83:"outline text="Page d'accueil" Contenu="Actualité + lien vers les marchés publics"";a:1:{i:0;s:0:"";}s:74:"outline text="Marchés publics" Contenu="Texte de présentation + contact"";a:1:{i:0;a:2:{s:131:"outline text="Avis d'attribution" Contenu="Texte accueil et affichage des derniers avis" Fonctionnalité="Publications + archivage"";a:1:{i:0;a:1:{s:74:"outline text="Un article par avis" Contenu="Texte ou doc à télécharger"";a:1:{i:0;s:0:"";}}}s:113:"outline text="Avis de publicité" Contenu="Texte + affichage des avis en cours" Fonctionnalité="Marchés public"";a:1:{i:0;a:1:{s:495:"outline text="Un article par avis" Contenu="Texte + docs à télécharger" Fonctionnalité="Un formulaire invite le visiteur à fournir son adresse email. Un email lui est alors automatiquement expédié qui contient un lien. En cliquant sur ce lien, le visiteur revient sur la page mais cette fois il a la possibilité de télécharger les pièces jointes à l'avis. Les mails sont ainsi collectés et ceux qui ont téléchargé les pièces peuvent ainsi être contactés en cas de changement."";a:1:{i:0;s:0:"";}}}}}s:37:"outline text="Les atouts de la ville"";a:1:{i:0;a:2:{s:62:"outline text="Production ostréicole" Contenu="Texte + photos"";a:1:{i:0;s:0:"";}s:133:"outline text="Situation géographique" Contenu="Même contenu que dans La Ville ?" Fonctionnalité="modèle de duplication d'article"";a:1:{i:0;s:0:"";}}}s:53:"outline text="S’implanter" Contenu="Texte + photos"";a:1:{i:0;s:0:"";}s:47:"outline text="Le GAER" Contenu="Texte + photos"";a:1:{i:0;s:0:"";}s:136:"outline text="Les commerces" Contenu="Présentation + formulaire d'inscription à l'annuaire" Fonctionnalité="Fonctionnalité annuaire"";a:1:{i:0;s:0:"";}s:138:"outline text="Les entreprises" Contenu="Présentation + formulaire d'inscription à l'annuaire" Fonctionnalité="Fonctionnalité annuaire"";a:1:{i:0;s:0:"";}s:105:"outline text="Les ZA et ZI" Contenu="Présentation + carte des ZA-ZI" Fonctionnalité="Carte interactive"";a:1:{i:0;a:1:{s:87:"outline text="Une page par zone" Contenu="Fiche de présentation + photo + plan accès"";a:1:{i:0;s:0:"";}}}s:50:"outline text="Le marché" Contenu="Texte + photos"";a:1:{i:0;s:0:"";}}}s:40:"outline text="Tourisme version anglaise"";a:1:{i:0;s:0:"";}}}}}}
 CODE_SAMPLE;
-		$essais['sitemap'] = [$tree1, $xml1];
-		$essais['opml'] = [$tree2, $xml2];
-		return $essais;
-	}
+    $essais['sitemap'] = [$tree1, $xml1];
+    $essais['opml'] = [$tree2, $xml2];
+    return $essais;
+  }
 }
diff --git a/tests/tests/Formulaire/ProtegeChampTest.php b/ecrire/tests/Formulaire/ProtegeChampTest.php
similarity index 99%
rename from tests/tests/Formulaire/ProtegeChampTest.php
rename to ecrire/tests/Formulaire/ProtegeChampTest.php
index 963ae7c7f30dd09f27df8b1630097989b2d06608..71f2a361abba5a15760653f17b307305e7fecde7 100644
--- a/tests/tests/Formulaire/ProtegeChampTest.php
+++ b/ecrire/tests/Formulaire/ProtegeChampTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction protege_champ du fichier ./balise/formulaire_.php
  */
 
-namespace Spip\Core\Tests\Formulaire;
+namespace Spip\Test\Formulaire;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Genie/MajTest.php b/ecrire/tests/Genie/MajTest.php
similarity index 98%
rename from tests/tests/Genie/MajTest.php
rename to ecrire/tests/Genie/MajTest.php
index 8984c689bd81b8debe13af62269fa9cbf7a49ecf..b41e52221d60592faa65486a1ba17b41e3cf8046 100644
--- a/tests/tests/Genie/MajTest.php
+++ b/ecrire/tests/Genie/MajTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction info_maj_versions du fichier ./genie/mise_a_jour.php
  */
 
-namespace Spip\Core\Tests\Genie;
+namespace Spip\Test\Genie;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/LegacyUnitHtmlTest.php b/ecrire/tests/LegacyUnitHtmlTest.php
similarity index 97%
rename from tests/tests/LegacyUnitHtmlTest.php
rename to ecrire/tests/LegacyUnitHtmlTest.php
index 14ed2ae58fd5b7beb0404b00ecd4036b3ec4b4b8..f41b67cbb867355c1e62f4913202c28f27d043a6 100644
--- a/tests/tests/LegacyUnitHtmlTest.php
+++ b/ecrire/tests/LegacyUnitHtmlTest.php
@@ -12,7 +12,7 @@ declare(strict_types=1);
  *  Pour plus de détails voir le fichier COPYING.txt ou l'aide en ligne.   *
 \***************************************************************************/
 
-namespace Spip\Core\Tests;
+namespace Spip\Test;
 
 use PHPUnit\Framework\Attributes\DataProvider;
 use PHPUnit\Framework\Attributes\Group;
@@ -48,7 +48,7 @@ class LegacyUnitHtmlTest extends TestCase
 	protected function legacyHtmlRun($inFname)
 	{
 		chdir(_SPIP_TEST_INC);
-		if (! is_file('../' . $inFname)) {
+		if (!is_file('../' . $inFname)) {
 			$this->fail(
 				"{$inFname} is missing" . json_encode([getcwd(), _SPIP_TEST_INC, _SPIP_TEST_CHDIR], JSON_THROW_ON_ERROR)
 			);
diff --git a/tests/tests/LegacyUnitPhpTest.php b/ecrire/tests/LegacyUnitPhpTest.php
similarity index 95%
rename from tests/tests/LegacyUnitPhpTest.php
rename to ecrire/tests/LegacyUnitPhpTest.php
index 8aa5a7217f2c4d4dd59787ad93f386d3fb44c00d..0adfb7bbafd5da7e44e1fea9c655f1693a08d3d5 100644
--- a/tests/tests/LegacyUnitPhpTest.php
+++ b/ecrire/tests/LegacyUnitPhpTest.php
@@ -12,7 +12,7 @@ declare(strict_types=1);
  *  Pour plus de détails voir le fichier COPYING.txt ou l'aide en ligne.   *
 \***************************************************************************/
 
-namespace Spip\Core\Tests;
+namespace Spip\Test;
 
 use PHPUnit\Framework\Attributes\DataProvider;
 use PHPUnit\Framework\Attributes\Group;
@@ -52,7 +52,7 @@ class LegacyUnitPhpTest extends TestCase
 	protected function legacyPhpRun($inFname)
 	{
 		chdir(_SPIP_TEST_INC);
-		if (! is_file('../' . $inFname) || ! $realPath = realpath('../' . $inFname)) {
+		if (!is_file('../' . $inFname) || !$realPath = realpath('../' . $inFname)) {
 			$this->fail(
 				"{$inFname} is missing" . json_encode([getcwd(), _SPIP_TEST_INC, _SPIP_TEST_CHDIR], JSON_THROW_ON_ERROR)
 			);
diff --git a/tests/tests/Plugin/PluginVersionCompatibleTest.php b/ecrire/tests/Plugin/PluginVersionCompatibleTest.php
similarity index 99%
rename from tests/tests/Plugin/PluginVersionCompatibleTest.php
rename to ecrire/tests/Plugin/PluginVersionCompatibleTest.php
index fcbdedac5c8dad5b99a9f53f8f330fd822226283..43ac6b2991756840d6d8bf09c89366877e484943 100644
--- a/tests/tests/Plugin/PluginVersionCompatibleTest.php
+++ b/ecrire/tests/Plugin/PluginVersionCompatibleTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction plugin_version_compatible du fichier ./inc/plugin.php
  */
 
-namespace Spip\Core\Tests\Plugin;
+namespace Spip\Test\Plugin;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Plugin/SpipVersionCompareTest.php b/ecrire/tests/Plugin/SpipVersionCompareTest.php
similarity index 99%
rename from tests/tests/Plugin/SpipVersionCompareTest.php
rename to ecrire/tests/Plugin/SpipVersionCompareTest.php
index 27e995b6274305fdbe4c72f1aa91f65e6ec3ed3e..4d438857725d4449aae5e9cb04d6c54a30e4a50b 100644
--- a/tests/tests/Plugin/SpipVersionCompareTest.php
+++ b/ecrire/tests/Plugin/SpipVersionCompareTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction spip_version_compare du fichier ./inc/plugin.php
  */
 
-namespace Spip\Core\Tests\Plugin;
+namespace Spip\Test\Plugin;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Propre/ChevronOuvrantTest.php b/ecrire/tests/Propre/ChevronOuvrantTest.php
similarity index 97%
rename from tests/tests/Propre/ChevronOuvrantTest.php
rename to ecrire/tests/Propre/ChevronOuvrantTest.php
index 53a03530d8749ec52ef94ca74aeb9f2874bb9327..f1406e25645e80a78af65d73dd59f099ff0be2e5 100644
--- a/tests/tests/Propre/ChevronOuvrantTest.php
+++ b/ecrire/tests/Propre/ChevronOuvrantTest.php
@@ -8,7 +8,7 @@ declare(strict_types=1);
  * cas du chevron ouvrant
  */
 
-namespace Spip\Core\Tests\Propre;
+namespace Spip\Test\Propre;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Propre/CodeImbriqueTest.php b/ecrire/tests/Propre/CodeImbriqueTest.php
similarity index 99%
rename from tests/tests/Propre/CodeImbriqueTest.php
rename to ecrire/tests/Propre/CodeImbriqueTest.php
index 6965f7a26c9facea2ac16414023fda1621d4a0a8..5049f9acdac7e48013a809feb7718c28b4f602ff 100644
--- a/tests/tests/Propre/CodeImbriqueTest.php
+++ b/ecrire/tests/Propre/CodeImbriqueTest.php
@@ -8,7 +8,7 @@ declare(strict_types=1);
  * cas du code imbriqué : Ne pas crasher sur les <code><code></code> imbriqués
  */
 
-namespace Spip\Core\Tests\Propre;
+namespace Spip\Test\Propre;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Propre/EchappeHtmlTest.php b/ecrire/tests/Propre/EchappeHtmlTest.php
similarity index 98%
rename from tests/tests/Propre/EchappeHtmlTest.php
rename to ecrire/tests/Propre/EchappeHtmlTest.php
index f92c0798262df570b04f4bb56e3f5abef7fc3145..9a01cc1168fab2c759442f9475ddbe49ff591ba0 100644
--- a/tests/tests/Propre/EchappeHtmlTest.php
+++ b/ecrire/tests/Propre/EchappeHtmlTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction echappe_html du fichier inc/texte.php
  */
 
-namespace Spip\Core\Tests\Propre;
+namespace Spip\Test\Propre;
 
 use PHPUnit\Framework\TestCase;
 
@@ -70,7 +70,8 @@ class EchappeHtmlTest extends TestCase
 			'avant 1' . $marque . 'apres 1</code>apres 2',
 			'avant 1<code class="php"> avant 2<code>le code</code>apres 1</code>apres 2',
 		];
-		$essais['complexe imbriqué'] = [<<<CODE_SAMPLE
+		$essais['complexe imbriqué'] = [
+			<<<CODE_SAMPLE
 {{{code class="php"}}}
 avant blah
 {$marque}
@@ -82,8 +83,7 @@ apres blah et avant php
 Voilà , {$marque}</code>
 
 On peut croire que c'est embétant , faut mettre une div autour pour encadrer , mais cela permet d'orienter geshi en cours de route comme dans [Compte à rebours (revisited)->article6]
-CODE_SAMPLE
-			, <<<CODE_SAMPLE
+CODE_SAMPLE, <<<CODE_SAMPLE
 {{{code class="php"}}}
 avant blah
 <code class="blah">
@@ -128,7 +128,8 @@ CODE_SAMPLE
 			'avant 1' . $marque . 'apres 2',
 			'avant 1<code class="php"> avant 2 code le code code apres 1</code>apres 2',
 		];
-		$essais['pourriture'] = [<<<CODE_SAMPLE
+		$essais['pourriture'] = [
+			<<<CODE_SAMPLE
 Le code mis en {$marque} ou en {$marque} peut lui même contenir  {$marque} ou {$marque} ...
 {$marque}
 Je voudrais présenter l'usage du plugin coloration_code qui fournit une extension à geshi : la classe "spip".
@@ -162,8 +163,7 @@ et le tour est joué
 </code>
 
 Donc comme l'ancien coloration_code, le  &lt;/code> est mangé et "et le tour est joué" apparait hors-code.
-CODE_SAMPLE
-			, <<<CODE_SAMPLE
+CODE_SAMPLE, <<<CODE_SAMPLE
 Le code mis en <code><code></code> ou en <code><cadre></code> peut lui même contenir  <code><code></code> ou <code><cadre></code> ...
 <code class="xxx">
 ça 'xiste pô
diff --git a/tests/tests/Propre/TraiterModelesTest.php b/ecrire/tests/Propre/TraiterModelesTest.php
similarity index 97%
rename from tests/tests/Propre/TraiterModelesTest.php
rename to ecrire/tests/Propre/TraiterModelesTest.php
index 2ea27e3569e080af499b82dfa1b1c647d68b9389..9497ad1a8566ccbec955a44c8219cf990d8dca6a 100644
--- a/tests/tests/Propre/TraiterModelesTest.php
+++ b/ecrire/tests/Propre/TraiterModelesTest.php
@@ -2,7 +2,7 @@
 
 declare(strict_types=1);
 
-namespace Spip\Core\Tests\Propre;
+namespace Spip\Test\Propre;
 
 use PHPUnit\Framework\TestCase;
 
@@ -25,7 +25,6 @@ class TraiterModelesTest extends TestCase
 		traiter_modeles($texte, ['documents' => ['doc', 'emb', 'img']]);
 		$this->assertNotEmpty($GLOBALS['doublons_documents_inclus']);
 		$this->assertEquals([1, 2, 3], $GLOBALS['doublons_documents_inclus']);
-
 	}
 
 	public function testTraiterModelesAlbums(): void
@@ -44,7 +43,5 @@ class TraiterModelesTest extends TestCase
 		$this->assertNull($GLOBALS['doublons_documents_inclus'] ?? null);
 		$this->assertNotEmpty($GLOBALS['doublons_albums_inclus']);
 		$this->assertEquals([4], $GLOBALS['doublons_albums_inclus']);
-
 	}
-
 }
diff --git a/tests/tests/Propre/TraiterRaccourcisTest.php b/ecrire/tests/Propre/TraiterRaccourcisTest.php
similarity index 98%
rename from tests/tests/Propre/TraiterRaccourcisTest.php
rename to ecrire/tests/Propre/TraiterRaccourcisTest.php
index 67e74e930c715eb79cdaa6d02259cee7dccfb98d..84caaef6579055fce6548a31d171fc9c8e4acc78 100644
--- a/tests/tests/Propre/TraiterRaccourcisTest.php
+++ b/ecrire/tests/Propre/TraiterRaccourcisTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction traiter_raccourcis du fichier inc/texte.php
  */
 
-namespace Spip\Core\Tests\Propre;
+namespace Spip\Test\Propre;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Propre/TraiterTableauTest.php b/ecrire/tests/Propre/TraiterTableauTest.php
similarity index 79%
rename from tests/tests/Propre/TraiterTableauTest.php
rename to ecrire/tests/Propre/TraiterTableauTest.php
index da8553a9aaf9f30bccd471c97822e4bed6ee8c55..2a70a6abaab6e18e58634f49a425e691228eaa14 100644
--- a/tests/tests/Propre/TraiterTableauTest.php
+++ b/ecrire/tests/Propre/TraiterTableauTest.php
@@ -2,7 +2,7 @@
 
 declare(strict_types=1);
 
-namespace Spip\Core\Tests\Propre;
+namespace Spip\Test\Propre;
 
 use PHPUnit\Framework\TestCase;
 
@@ -36,7 +36,8 @@ class TraiterTableauTest extends TestCase
 	{
 		return [
 			// trois tests un peu identiques sur <br />...
-			'caption seul' => [['preg_match', ',<caption>\s*titre de mon tableau\s*</caption>,i', true],
+			'caption seul' => [
+				['preg_match', ',<caption>\s*titre de mon tableau\s*</caption>,i', true],
 				'|| titre de mon tableau||
 |{{Colonne 0}} | {{Colonne 1}} | {{Colonne 2}} | {{Colonne 3}} | {{Colonne 4}} |
 | {{Bourg-les-Valence}} | 10,39 | 20,14 | 46,02 | 15,99 |
@@ -45,7 +46,8 @@ class TraiterTableauTest extends TestCase
 | {{Montelimar}} | 20,15 | 26,43 | 70,21 | 16,82 |
 | {{Bourg-de-Peage}} | 13,22 | 30 | 50 | 14,67 |',
 			],
-			'caption' => [['preg_match', ',<caption>\s*titre de mon tableau.*</caption>,i', true],
+			'caption' => [
+				['preg_match', ',<caption>\s*titre de mon tableau.*</caption>,i', true],
 				'|| titre de mon tableau | resume de mon tableau ||
 |{{Colonne 0}} | {{Colonne 1}} | {{Colonne 2}} | {{Colonne 3}} | {{Colonne 4}} |
 | {{Bourg-les-Valence}} | 10,39 | 20,14 | 46,02 | 15,99 |
@@ -54,8 +56,10 @@ class TraiterTableauTest extends TestCase
 | {{Montelimar}} | 20,15 | 26,43 | 70,21 | 16,82 |
 | {{Bourg-de-Peage}} | 13,22 | 30 | 50 | 14,67 |',
 			],
-			'summary' => [[
-				'preg_match', ',<table[^>]*aria-describedby="([^"]*)"[^>]*>.*<caption>.* id="(\1)"[^>]*>\s*resume de mon tableau.*</caption>,is', true, ],
+			'summary' => [
+				[
+					'preg_match', ',<table[^>]*aria-describedby="([^"]*)"[^>]*>.*<caption>.* id="(\1)"[^>]*>\s*resume de mon tableau.*</caption>,is', true,
+				],
 				'|| titre de mon tableau | resume de mon tableau ||
 |{{Colonne 0}} | {{Colonne 1}} | {{Colonne 2}} | {{Colonne 3}} | {{Colonne 4}} |
 | {{Bourg-les-Valence}} | 10,39 | 20,14 | 46,02 | 15,99 |
@@ -64,7 +68,8 @@ class TraiterTableauTest extends TestCase
 | {{Montelimar}} | 20,15 | 26,43 | 70,21 | 16,82 |
 | {{Bourg-de-Peage}} | 13,22 | 30 | 50 | 14,67 |',
 			],
-			'thead simple' => [['preg_match', ',<thead>\s*<tr[^>]*>(:?<th[^>]*>.*</th>){5}\s*</tr>\s*</thead>,Uims', true],
+			'thead simple' => [
+				['preg_match', ',<thead>\s*<tr[^>]*>(:?<th[^>]*>.*</th>){5}\s*</tr>\s*</thead>,Uims', true],
 				'|| titre de mon tableau | resume de mon tableau ||
 |{{Colonne 0}} | {{Colonne 1}} | {{Colonne 2}} | {{Colonne 3}} | {{Colonne 4}} |
 | {{Bourg-les-Valence}} | 10,39 | 20,14 | 46,02 | 15,99 |
@@ -73,8 +78,10 @@ class TraiterTableauTest extends TestCase
 | {{Montelimar}} | 20,15 | 26,43 | 70,21 | 16,82 |
 | {{Bourg-de-Peage}} | 13,22 | 30 | 50 | 14,67 |',
 			],
-			'thead avec une colonne vide' => [[
-				'preg_match', ',<thead>\s*<tr[^>]*>(:?<th[^>]*>.*</th>){5}\s*</tr>\s*</thead>,Uims', true, ],
+			'thead avec une colonne vide' => [
+				[
+					'preg_match', ',<thead>\s*<tr[^>]*>(:?<th[^>]*>.*</th>){5}\s*</tr>\s*</thead>,Uims', true,
+				],
 				'|| titre de mon tableau | resume de mon tableau ||
 | | {{Colonne 1}} | {{Colonne 2}} | {{Colonne 3}} | {{Colonne 4}} |
 | {{Bourg-les-Valence}} | 10,39 | 20,14 | 46,02 | 15,99 |
@@ -83,8 +90,10 @@ class TraiterTableauTest extends TestCase
 | {{Montelimar}} | 20,15 | 26,43 | 70,21 | 16,82 |
 | {{Bourg-de-Peage}} | 13,22 | 30 | 50 | 14,67 |',
 			],
-			'thead avec une colonne vide et un retour ligne' => [[
-				'preg_match', ',<thead>\s*<tr[^>]*>(:?<th[^>]*>.*</th>){5}\s*</tr>\s*</thead>,Uims', true, ],
+			'thead avec une colonne vide et un retour ligne' => [
+				[
+					'preg_match', ',<thead>\s*<tr[^>]*>(:?<th[^>]*>.*</th>){5}\s*</tr>\s*</thead>,Uims', true,
+				],
 				'|| titre de mon tableau | resume de mon tableau ||
 | | {{Colonne 1}} | {{Colonne 2}} | {{Colonne 3
 _ avec retour ligne}} | {{Colonne 4}} |
@@ -94,7 +103,8 @@ _ avec retour ligne}} | {{Colonne 4}} |
 | {{Montelimar}} | 20,15 | 26,43 | 70,21 | 16,82 |
 | {{Bourg-de-Peage}} | 13,22 | 30 | 50 | 14,67 |',
 			],
-			'thead errone' => [['preg_match', ',<thead>\s*<tr[^>]*>(:?<th[^>]*>.*</th>){5}\s*</tr>\s*</thead>,Uims', false],
+			'thead errone' => [
+				['preg_match', ',<thead>\s*<tr[^>]*>(:?<th[^>]*>.*</th>){5}\s*</tr>\s*</thead>,Uims', false],
 				'|| titre de mon tableau | resume de mon tableau ||
 |{{Colonne 0}} | {Colonne 1}} | {{Colonne 2}} | {{Colonne 3}} | {{Colonne 4}} |
 | {{Bourg-les-Valence}} | 10,39 | 20,14 | 46,02 | 15,99 |
@@ -104,7 +114,8 @@ _ avec retour ligne}} | {{Colonne 4}} |
 | {{Bourg-de-Peage}} | 13,22 | 30 | 50 | 14,67 |',
 			],
 			'fusion par |<|' => [['preg_match', ',colspan=.*colspan=,is', true], '| {{Bourg-de-Peage}} | 1-2 |<|3-4|<|'],
-			"fusion |<| avec conservation d'URL dans un raccourci de liens" => [['preg_match', ',colspan=.*->,is', true],
+			"fusion |<| avec conservation d'URL dans un raccourci de liens" => [
+				['preg_match', ',colspan=.*->,is', true],
 				'|test avec fusion dans tous les sens|<|
 |test1 |[mon beau lien->http://foo.fr]|',
 			],
diff --git a/tests/utils/rector/config/set/spip_test_essais_migration.php b/ecrire/tests/Rector/rector/config/set/spip_test_essais_migration.php
similarity index 100%
rename from tests/utils/rector/config/set/spip_test_essais_migration.php
rename to ecrire/tests/Rector/rector/config/set/spip_test_essais_migration.php
diff --git a/tests/utils/rector/src/Rector/MoveSpipTestsEssais.php b/ecrire/tests/Rector/rector/src/Rector/MoveSpipTestsEssais.php
similarity index 68%
rename from tests/utils/rector/src/Rector/MoveSpipTestsEssais.php
rename to ecrire/tests/Rector/rector/src/Rector/MoveSpipTestsEssais.php
index 4dfc442dd80bc32cac567ab96bb6c1b1257df439..af1a43d55c8e9c83919f8750c3ec777197d47103 100644
--- a/tests/utils/rector/src/Rector/MoveSpipTestsEssais.php
+++ b/ecrire/tests/Rector/rector/src/Rector/MoveSpipTestsEssais.php
@@ -14,7 +14,7 @@ use Rector\Core\Application\FileSystem\RemovedAndAddedFilesCollector;
 
 final class MoveSpipTestsEssais extends AbstractRector
 {
-    private RemovedAndAddedFilesCollector $removedAndAddedFilesCollector;
+	private RemovedAndAddedFilesCollector $removedAndAddedFilesCollector;
 
 	public function __construct(RemovedAndAddedFilesCollector $removedAndAddedFilesCollector)
 	{
@@ -32,13 +32,13 @@ final class MoveSpipTestsEssais extends AbstractRector
 				new CodeSample(
 					<<<CODESAMPLE
 					// essais/some_dir/some_file.php
-					namespace Spip\Core\Tests\Something;
+					namespace Spip\Test\Something;
 					class SomeWhatTest {
 					}
 					CODESAMPLE,
 					<<<CODESAMPLE
 					// Something/SomeWhatTest.php
-					namespace Spip\Core\Tests\Something;
+					namespace Spip\Test\Something;
 					class SomeWhatTest {
 					}
 					CODESAMPLE,
@@ -59,24 +59,24 @@ final class MoveSpipTestsEssais extends AbstractRector
 	public function refactor(Node $node): ?Node
 	{
 		$className = $this->getName($node);
-        if ($className === null) {
-            return null;
-        }
+		if ($className === null) {
+			return null;
+		}
 
-        $classShortName = $this->nodeNameResolver->getShortName($className);
-        $filePath = $this->file->getFilePath();
-        $basename = \pathinfo($filePath, \PATHINFO_FILENAME);
-        if ($classShortName === $basename) {
-            return null;
-        }
+		$classShortName = $this->nodeNameResolver->getShortName($className);
+		$filePath = $this->file->getFilePath();
+		$basename = \pathinfo($filePath, \PATHINFO_FILENAME);
+		if ($classShortName === $basename) {
+			return null;
+		}
 
 		$ns = new FullyQualified($className);
 		$newPath = str_replace('\\', '/', $ns->slice(3)->toString());
 
-        // no match → rename file
-        $newFileLocation = \dirname($filePath, 3) . \DIRECTORY_SEPARATOR . $newPath . '.php';
+		// no match → rename file
+		$newFileLocation = \dirname($filePath, 3) . \DIRECTORY_SEPARATOR . $newPath . '.php';
 
-        $this->removedAndAddedFilesCollector->addMovedFile($this->file, $newFileLocation);
-        return null;
+		$this->removedAndAddedFilesCollector->addMovedFile($this->file, $newFileLocation);
+		return null;
 	}
 }
diff --git a/tests/utils/rector/src/Rector/RefactorSpipTestsEssais.php b/ecrire/tests/Rector/rector/src/Rector/RefactorSpipTestsEssais.php
similarity index 100%
rename from tests/utils/rector/src/Rector/RefactorSpipTestsEssais.php
rename to ecrire/tests/Rector/rector/src/Rector/RefactorSpipTestsEssais.php
diff --git a/tests/utils/rector/src/Rector/Set/ValueObject/SpipTestSetList.php b/ecrire/tests/Rector/rector/src/Rector/Set/ValueObject/SpipTestSetList.php
similarity index 100%
rename from tests/utils/rector/src/Rector/Set/ValueObject/SpipTestSetList.php
rename to ecrire/tests/Rector/rector/src/Rector/Set/ValueObject/SpipTestSetList.php
diff --git a/tests/tests/Sql/Objets/IdTableObjetTest.php b/ecrire/tests/Sql/Objets/IdTableObjetTest.php
similarity index 98%
rename from tests/tests/Sql/Objets/IdTableObjetTest.php
rename to ecrire/tests/Sql/Objets/IdTableObjetTest.php
index 48bf2cff645c82c5f13f26a0bb60f1de7478b1e9..644e0f373400d832c8111f43affa6b3a7a7de106 100644
--- a/tests/tests/Sql/Objets/IdTableObjetTest.php
+++ b/ecrire/tests/Sql/Objets/IdTableObjetTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction id_table_objet du fichier base/connect_sql.php
  */
 
-namespace Spip\Core\Tests\Sql\Objets;
+namespace Spip\Test\Sql\Objets;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Sql/Objets/ObjetTypeTest.php b/ecrire/tests/Sql/Objets/ObjetTypeTest.php
similarity index 98%
rename from tests/tests/Sql/Objets/ObjetTypeTest.php
rename to ecrire/tests/Sql/Objets/ObjetTypeTest.php
index 0bc553168ed40222118db43cf490ef5366363f61..580c38951e36334e41fa7e5b6ab4f2ca6db3f5e6 100644
--- a/tests/tests/Sql/Objets/ObjetTypeTest.php
+++ b/ecrire/tests/Sql/Objets/ObjetTypeTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction objet_type du fichier base/connect_sql.php
  */
 
-namespace Spip\Core\Tests\Sql\Objets;
+namespace Spip\Test\Sql\Objets;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Sql/Objets/QueryEchappeTextesTest.php b/ecrire/tests/Sql/Objets/QueryEchappeTextesTest.php
similarity index 96%
rename from tests/tests/Sql/Objets/QueryEchappeTextesTest.php
rename to ecrire/tests/Sql/Objets/QueryEchappeTextesTest.php
index 3c5a7680950eee57ad5e9f6e30ac33027c51ef56..52f6961a2e8856fac02ff87ad45d4babedf9a633 100644
--- a/tests/tests/Sql/Objets/QueryEchappeTextesTest.php
+++ b/ecrire/tests/Sql/Objets/QueryEchappeTextesTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction query_echappe_textes du fichier base/connect_sql.php
  */
 
-namespace Spip\Core\Tests\Sql\Objets;
+namespace Spip\Test\Sql\Objets;
 
 use PHPUnit\Framework\TestCase;
 
@@ -84,7 +84,8 @@ class QueryEchappeTextesTest extends TestCase
 			[
 				0 => [
 					'UPDATE spip_truc SET html=%1$s WHERE id_truc=1',
-					["'''0'' style=''margin: 0;padding: 0;width: 100\x04@#{$md5}#@\x04;border: 0;height: auto;lin'"], ],
+					["'''0'' style=''margin: 0;padding: 0;width: 100\x04@#{$md5}#@\x04;border: 0;height: auto;lin'"],
+				],
 				1 => "UPDATE spip_truc SET html='''0'' style=''margin: 0;padding: 0;width: 100%;border: 0;height: auto;lin' WHERE id_truc=1",
 			],
 			[
@@ -97,7 +98,8 @@ class QueryEchappeTextesTest extends TestCase
 			[
 				0 => [
 					'UPDATE spip_truc SET texte=%1$s, html=%2$s WHERE id_truc=1',
-					["''", "'''0'' style=''margin: 0;padding: 0;width: 100\x04@#{$md5}#@\x04;border: 0;height: auto;lin'"], ],
+					["''", "'''0'' style=''margin: 0;padding: 0;width: 100\x04@#{$md5}#@\x04;border: 0;height: auto;lin'"],
+				],
 				1 => "UPDATE spip_truc SET texte='', html='''0'' style=''margin: 0;padding: 0;width: 100%;border: 0;height: auto;lin' WHERE id_truc=1",
 			],
 		];
diff --git a/tests/tests/Sql/Objets/TableObjetSqlTest.php b/ecrire/tests/Sql/Objets/TableObjetSqlTest.php
similarity index 98%
rename from tests/tests/Sql/Objets/TableObjetSqlTest.php
rename to ecrire/tests/Sql/Objets/TableObjetSqlTest.php
index f3bbbf7f7792f196918a710688fb224b75e2b3a7..2fa1ce99207d6ab4ec448fe0f4dfb3b3850d927e 100644
--- a/tests/tests/Sql/Objets/TableObjetSqlTest.php
+++ b/ecrire/tests/Sql/Objets/TableObjetSqlTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction table_objet_sql du fichier base/connect_sql.php
  */
 
-namespace Spip\Core\Tests\Sql\Objets;
+namespace Spip\Test\Sql\Objets;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Sql/Objets/TableObjetTest.php b/ecrire/tests/Sql/Objets/TableObjetTest.php
similarity index 98%
rename from tests/tests/Sql/Objets/TableObjetTest.php
rename to ecrire/tests/Sql/Objets/TableObjetTest.php
index 2c5524f624d65bc02563025199405a97c5683055..8859c9ca0f3fe56c549cd733377c0da3178eb3e8 100644
--- a/tests/tests/Sql/Objets/TableObjetTest.php
+++ b/ecrire/tests/Sql/Objets/TableObjetTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction table_objet du fichier base/connect_sql.php
  */
 
-namespace Spip\Core\Tests\Sql\Objets;
+namespace Spip\Test\Sql\Objets;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Sql/SqlInMysqlTest.php b/ecrire/tests/Sql/SqlInMysqlTest.php
similarity index 99%
rename from tests/tests/Sql/SqlInMysqlTest.php
rename to ecrire/tests/Sql/SqlInMysqlTest.php
index ada1492a6d7f3d5169a14de29ab15d3ceae4bf8c..58ad4081b9fd8a4a246a4b37c9db60c6194ae0ec 100644
--- a/tests/tests/Sql/SqlInMysqlTest.php
+++ b/ecrire/tests/Sql/SqlInMysqlTest.php
@@ -2,7 +2,7 @@
 
 declare(strict_types=1);
 
-namespace Spip\Core\Tests\Sql;
+namespace Spip\Test\Sql;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Sql/SqlInSqliteTest.php b/ecrire/tests/Sql/SqlInSqliteTest.php
similarity index 99%
rename from tests/tests/Sql/SqlInSqliteTest.php
rename to ecrire/tests/Sql/SqlInSqliteTest.php
index ed4db0192182becc1caee8d8e43cadb39bb0cad3..ecef0207640d6bc62b691ed66706af106053746c 100644
--- a/tests/tests/Sql/SqlInSqliteTest.php
+++ b/ecrire/tests/Sql/SqlInSqliteTest.php
@@ -2,7 +2,7 @@
 
 declare(strict_types=1);
 
-namespace Spip\Core\Tests\Sql;
+namespace Spip\Test\Sql;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Squelettes/Balise/AutoriserTest.php b/ecrire/tests/Squelettes/Balise/AutoriserTest.php
similarity index 81%
rename from tests/tests/Squelettes/Balise/AutoriserTest.php
rename to ecrire/tests/Squelettes/Balise/AutoriserTest.php
index 00a172ed0875320697075fc8d530d15be070cdc2..f12644688ddb33f8be24a6a1276099dd6e52e43f 100644
--- a/tests/tests/Squelettes/Balise/AutoriserTest.php
+++ b/ecrire/tests/Squelettes/Balise/AutoriserTest.php
@@ -2,9 +2,9 @@
 
 declare(strict_types=1);
 
-namespace Spip\Core\Tests\Squelettes\Balise;
+namespace Spip\Test\Squelettes\Balise;
 
-use Spip\Core\Testing\SquelettesTestCase;
+use Spip\Test\SquelettesTestCase;
 
 class AutoriserTest extends SquelettesTestCase
 {
diff --git a/tests/tests/Squelettes/Balise/BaliseDetacheeTest.php b/ecrire/tests/Squelettes/Balise/BaliseDetacheeTest.php
similarity index 90%
rename from tests/tests/Squelettes/Balise/BaliseDetacheeTest.php
rename to ecrire/tests/Squelettes/Balise/BaliseDetacheeTest.php
index db5c9b32bba8614fefa8ce58023f8c93dcf28b33..20651725589a45c485c608d7f3905dbe0987d873 100644
--- a/tests/tests/Squelettes/Balise/BaliseDetacheeTest.php
+++ b/ecrire/tests/Squelettes/Balise/BaliseDetacheeTest.php
@@ -2,10 +2,10 @@
 
 declare(strict_types=1);
 
-namespace Spip\Core\Tests\Squelettes\Balise;
+namespace Spip\Test\Squelettes\Balise;
 
-use Spip\Core\Testing\SquelettesTestCase;
-use Spip\Core\Testing\Templating;
+use Spip\Test\SquelettesTestCase;
+use Spip\Test\Templating;
 
 class BaliseDetacheeTest extends SquelettesTestCase
 {
diff --git a/tests/tests/Squelettes/Balise/BaliseGeneriqueTest.php b/ecrire/tests/Squelettes/Balise/BaliseGeneriqueTest.php
similarity index 96%
rename from tests/tests/Squelettes/Balise/BaliseGeneriqueTest.php
rename to ecrire/tests/Squelettes/Balise/BaliseGeneriqueTest.php
index 823ba7f4183cb8b7db1d1a2c9e13241c58a956d6..5c2785cec02ccee6bc3315c1e99cb3cee043d97e 100644
--- a/tests/tests/Squelettes/Balise/BaliseGeneriqueTest.php
+++ b/ecrire/tests/Squelettes/Balise/BaliseGeneriqueTest.php
@@ -2,10 +2,10 @@
 
 declare(strict_types=1);
 
-namespace Spip\Core\Tests\Squelettes\Balise;
+namespace Spip\Test\Squelettes\Balise;
 
-use Spip\Core\Testing\SquelettesTestCase;
-use Spip\Core\Testing\Templating;
+use Spip\Test\SquelettesTestCase;
+use Spip\Test\Templating;
 
 class BaliseGeneriqueTest extends SquelettesTestCase
 {
diff --git a/tests/tests/Squelettes/Balise/ConfigTest.php b/ecrire/tests/Squelettes/Balise/ConfigTest.php
similarity index 98%
rename from tests/tests/Squelettes/Balise/ConfigTest.php
rename to ecrire/tests/Squelettes/Balise/ConfigTest.php
index 0177741764da8eb74b352fb09687823bb771cef0..72f713beb6b34423cee2ede83ddca33cc2244d0d 100644
--- a/tests/tests/Squelettes/Balise/ConfigTest.php
+++ b/ecrire/tests/Squelettes/Balise/ConfigTest.php
@@ -2,10 +2,10 @@
 
 declare(strict_types=1);
 
-namespace Spip\Core\Tests\Squelettes\Balise;
+namespace Spip\Test\Squelettes\Balise;
 
-use Spip\Core\Testing\SquelettesTestCase;
-use Spip\Core\Testing\Templating;
+use Spip\Test\SquelettesTestCase;
+use Spip\Test\Templating;
 
 class ConfigTest extends SquelettesTestCase
 {
diff --git a/tests/tests/Squelettes/Balise/ConstTest.php b/ecrire/tests/Squelettes/Balise/ConstTest.php
similarity index 87%
rename from tests/tests/Squelettes/Balise/ConstTest.php
rename to ecrire/tests/Squelettes/Balise/ConstTest.php
index 716ec44e491a91092452d0eecda3287ea8c6f2f9..3adc00fbe4844d2434c9c822dcd2e2918977b9f4 100644
--- a/tests/tests/Squelettes/Balise/ConstTest.php
+++ b/ecrire/tests/Squelettes/Balise/ConstTest.php
@@ -2,9 +2,9 @@
 
 declare(strict_types=1);
 
-namespace Spip\Core\Tests\Squelettes\Balise;
+namespace Spip\Test\Squelettes\Balise;
 
-use Spip\Core\Testing\SquelettesTestCase;
+use Spip\Test\SquelettesTestCase;
 
 class ConstTest extends SquelettesTestCase
 {
diff --git a/tests/tests/Squelettes/Balise/EvalTest.php b/ecrire/tests/Squelettes/Balise/EvalTest.php
similarity index 80%
rename from tests/tests/Squelettes/Balise/EvalTest.php
rename to ecrire/tests/Squelettes/Balise/EvalTest.php
index ea62889abab8e0e96e88370b6156c80bdf238c5a..f45d5a41bec20d6ab43edd1ce3411cdf27d0312b 100644
--- a/tests/tests/Squelettes/Balise/EvalTest.php
+++ b/ecrire/tests/Squelettes/Balise/EvalTest.php
@@ -2,9 +2,9 @@
 
 declare(strict_types=1);
 
-namespace Spip\Core\Tests\Squelettes\Balise;
+namespace Spip\Test\Squelettes\Balise;
 
-use Spip\Core\Testing\SquelettesTestCase;
+use Spip\Test\SquelettesTestCase;
 
 class EvalTest extends SquelettesTestCase
 {
diff --git a/tests/tests/Squelettes/Balise/ExposeTest.php b/ecrire/tests/Squelettes/Balise/ExposeTest.php
similarity index 89%
rename from tests/tests/Squelettes/Balise/ExposeTest.php
rename to ecrire/tests/Squelettes/Balise/ExposeTest.php
index 8987ffd823aff8f12b29fb22a1a7b2c8d629db53..61242e7a916e84f1a9c6ded51007808fd77d22bb 100644
--- a/tests/tests/Squelettes/Balise/ExposeTest.php
+++ b/ecrire/tests/Squelettes/Balise/ExposeTest.php
@@ -2,9 +2,9 @@
 
 declare(strict_types=1);
 
-namespace Spip\Core\Tests\Squelettes\Balise;
+namespace Spip\Test\Squelettes\Balise;
 
-use Spip\Core\Testing\SquelettesTestCase;
+use Spip\Test\SquelettesTestCase;
 
 class ExposeTest extends SquelettesTestCase
 {
@@ -26,7 +26,7 @@ class ExposeTest extends SquelettesTestCase
 			'id_rubrique != ' . (int) $id_rubrique,
 		]);
 
-		if (! $id_rubrique || ! $id_seconde_rubrique) {
+		if (!$id_rubrique || !$id_seconde_rubrique) {
 			$this->markTestSkipped('Vous devez avoir au moins 2 rubriques racines publiees pour tester #EXPOSE...');
 		}
 
diff --git a/tests/tests/Squelettes/Balise/InclureStatiqueTest.php b/ecrire/tests/Squelettes/Balise/InclureStatiqueTest.php
similarity index 91%
rename from tests/tests/Squelettes/Balise/InclureStatiqueTest.php
rename to ecrire/tests/Squelettes/Balise/InclureStatiqueTest.php
index a31f269e28dc9f8be5084d6df99955f7dad3220e..1bbca6c975c1f80ae8ed7b9e87a1c49266317b62 100644
--- a/tests/tests/Squelettes/Balise/InclureStatiqueTest.php
+++ b/ecrire/tests/Squelettes/Balise/InclureStatiqueTest.php
@@ -2,10 +2,10 @@
 
 declare(strict_types=1);
 
-namespace Spip\Core\Tests\Squelettes\Balise;
+namespace Spip\Test\Squelettes\Balise;
 
-use Spip\Core\Testing\SquelettesTestCase;
-use Spip\Core\Testing\Templating;
+use Spip\Test\SquelettesTestCase;
+use Spip\Test\Templating;
 
 class InclureStatiqueTest extends SquelettesTestCase
 {
@@ -22,13 +22,13 @@ class InclureStatiqueTest extends SquelettesTestCase
 		$this->assertEqualsCode(
 			'Hello WorldHello World',
 			'#INCLURE{fond=' . $dir . '/data/texte_hello_world}'
-			. '#INCLURE{fond=' . $dir . '/data/texte_hello_world}'
+				. '#INCLURE{fond=' . $dir . '/data/texte_hello_world}'
 		);
 		$this->assertEqualsCode(
 			'Hello WorldHello World',
 			'
 			#INCLURE{fond=' . $dir . '/data/texte_hello_world}'
-			. '#INCLURE{fond=' . $dir . '/data/texte_hello_world}'
+				. '#INCLURE{fond=' . $dir . '/data/texte_hello_world}'
 		);
 	}
 
diff --git a/tests/tests/Squelettes/Balise/InclureTest.php b/ecrire/tests/Squelettes/Balise/InclureTest.php
similarity index 91%
rename from tests/tests/Squelettes/Balise/InclureTest.php
rename to ecrire/tests/Squelettes/Balise/InclureTest.php
index 19c5ca4e91187669dfc09928f93478a68c5bf155..2e3dc30d84936cf236141000f729e96ea9642655 100644
--- a/tests/tests/Squelettes/Balise/InclureTest.php
+++ b/ecrire/tests/Squelettes/Balise/InclureTest.php
@@ -2,10 +2,10 @@
 
 declare(strict_types=1);
 
-namespace Spip\Core\Tests\Squelettes\Balise;
+namespace Spip\Test\Squelettes\Balise;
 
-use Spip\Core\Testing\SquelettesTestCase;
-use Spip\Core\Testing\Templating;
+use Spip\Test\SquelettesTestCase;
+use Spip\Test\Templating;
 
 class InclureTest extends SquelettesTestCase
 {
@@ -22,13 +22,13 @@ class InclureTest extends SquelettesTestCase
 		$this->assertEqualsCode(
 			'Hello WorldHello World',
 			'<INCLURE{fond=' . $dir . '/data/texte_hello_world}>'
-			. '<INCLURE{fond=' . $dir . '/data/texte_hello_world}>'
+				. '<INCLURE{fond=' . $dir . '/data/texte_hello_world}>'
 		);
 		$this->assertEqualsCode(
 			'Hello WorldHello World',
 			'
 			 <INCLURE{fond=' . $dir . '/data/texte_hello_world}>'
-			. '<INCLURE{fond=' . $dir . '/data/texte_hello_world}>'
+				. '<INCLURE{fond=' . $dir . '/data/texte_hello_world}>'
 		);
 	}
 
diff --git a/tests/tests/Squelettes/Balise/IntroductionTest.php b/ecrire/tests/Squelettes/Balise/IntroductionTest.php
similarity index 92%
rename from tests/tests/Squelettes/Balise/IntroductionTest.php
rename to ecrire/tests/Squelettes/Balise/IntroductionTest.php
index 36c7ef4a1eb20e9bc4bfbd24223fe94c9e0c6ef9..ae42743bebbd7f8dc3d85680eda817bc6ca17a2a 100644
--- a/tests/tests/Squelettes/Balise/IntroductionTest.php
+++ b/ecrire/tests/Squelettes/Balise/IntroductionTest.php
@@ -2,17 +2,18 @@
 
 declare(strict_types=1);
 
-namespace Spip\Core\Tests\Squelettes\Balise;
+namespace Spip\Test\Squelettes\Balise;
 
-use Spip\Core\Testing\SquelettesTestCase;
-use Spip\Core\Testing\Templating;
+use Spip\Test\SquelettesTestCase;
+use Spip\Test\Templating;
 
 class IntroductionTest extends SquelettesTestCase
 {
-	protected function getIdArticleLong() : int
+	protected function getIdArticleLong(): int
 	{
 		include_spip('base/abstract_sql');
-		$id_article = sql_getfetsel('id_article',
+		$id_article = sql_getfetsel(
+			'id_article',
 			'spip_articles',
 			"descriptif='' AND LENGTH(CONCAT(chapo, texte)) > 520 AND texte!='' AND LENGTH(chapo) > 100",
 			'',
diff --git a/tests/tests/Squelettes/Balise/LesauteursTest.php b/ecrire/tests/Squelettes/Balise/LesauteursTest.php
similarity index 80%
rename from tests/tests/Squelettes/Balise/LesauteursTest.php
rename to ecrire/tests/Squelettes/Balise/LesauteursTest.php
index 0f470a255ed65bf9a68b2593b4586fd9fbda5415..395ec9b17d94e0414894899358d66236659734f0 100644
--- a/tests/tests/Squelettes/Balise/LesauteursTest.php
+++ b/ecrire/tests/Squelettes/Balise/LesauteursTest.php
@@ -2,10 +2,10 @@
 
 declare(strict_types=1);
 
-namespace Spip\Core\Tests\Squelettes\Balise;
+namespace Spip\Test\Squelettes\Balise;
 
-use Spip\Core\Testing\SquelettesTestCase;
-use Spip\Core\Testing\Templating;
+use Spip\Test\SquelettesTestCase;
+use Spip\Test\Templating;
 
 class LesauteursTest extends SquelettesTestCase
 {
diff --git a/tests/tests/Squelettes/Balise/MimeTypeTest.php b/ecrire/tests/Squelettes/Balise/MimeTypeTest.php
similarity index 83%
rename from tests/tests/Squelettes/Balise/MimeTypeTest.php
rename to ecrire/tests/Squelettes/Balise/MimeTypeTest.php
index e08185f2c94773ee04b545ae74e43cdc979eb1d5..c011f6cc306291bee423b99ef1a8db6982b1e996 100644
--- a/tests/tests/Squelettes/Balise/MimeTypeTest.php
+++ b/ecrire/tests/Squelettes/Balise/MimeTypeTest.php
@@ -2,10 +2,10 @@
 
 declare(strict_types=1);
 
-namespace Spip\Core\Tests\Squelettes\Balise;
+namespace Spip\Test\Squelettes\Balise;
 
-use Spip\Core\Testing\SquelettesTestCase;
-use Spip\Core\Testing\Templating;
+use Spip\Test\SquelettesTestCase;
+use Spip\Test\Templating;
 
 /**
  * FIXME: Déplacer dans le plugin Medias
diff --git a/tests/tests/Squelettes/Balise/NotesTest.php b/ecrire/tests/Squelettes/Balise/NotesTest.php
similarity index 93%
rename from tests/tests/Squelettes/Balise/NotesTest.php
rename to ecrire/tests/Squelettes/Balise/NotesTest.php
index 21a469c5a5feafa9ca08bc694f971945032cdeb5..7214f5fc12f499514e7ddb1b5e57993fb06ff01e 100644
--- a/tests/tests/Squelettes/Balise/NotesTest.php
+++ b/ecrire/tests/Squelettes/Balise/NotesTest.php
@@ -2,9 +2,9 @@
 
 declare(strict_types=1);
 
-namespace Spip\Core\Tests\Squelettes\Balise;
+namespace Spip\Test\Squelettes\Balise;
 
-use Spip\Core\Testing\SquelettesTestCase;
+use Spip\Test\SquelettesTestCase;
 
 class NotesTest extends SquelettesTestCase
 {
diff --git a/tests/tests/Squelettes/Balise/SelfTest.php b/ecrire/tests/Squelettes/Balise/SelfTest.php
similarity index 76%
rename from tests/tests/Squelettes/Balise/SelfTest.php
rename to ecrire/tests/Squelettes/Balise/SelfTest.php
index 258597a4ba14af9f43903ce8ebef64c040026d86..d5d172f4bce5aef0df93e454c2cff19c4542da6e 100644
--- a/tests/tests/Squelettes/Balise/SelfTest.php
+++ b/ecrire/tests/Squelettes/Balise/SelfTest.php
@@ -2,9 +2,9 @@
 
 declare(strict_types=1);
 
-namespace Spip\Core\Tests\Squelettes\Balise;
+namespace Spip\Test\Squelettes\Balise;
 
-use Spip\Core\Testing\SquelettesTestCase;
+use Spip\Test\SquelettesTestCase;
 
 class SelfTest extends SquelettesTestCase
 {
diff --git a/tests/tests/Squelettes/Balise/SessionTest.php b/ecrire/tests/Squelettes/Balise/SessionTest.php
similarity index 93%
rename from tests/tests/Squelettes/Balise/SessionTest.php
rename to ecrire/tests/Squelettes/Balise/SessionTest.php
index 1c808982c3bb776d1f8e370f6d4a61097b187b71..4f478367c35e6d37bb883b587b53682984e5bbdd 100644
--- a/tests/tests/Squelettes/Balise/SessionTest.php
+++ b/ecrire/tests/Squelettes/Balise/SessionTest.php
@@ -2,9 +2,9 @@
 
 declare(strict_types=1);
 
-namespace Spip\Core\Tests\Squelettes\Balise;
+namespace Spip\Test\Squelettes\Balise;
 
-use Spip\Core\Testing\SquelettesTestCase;
+use Spip\Test\SquelettesTestCase;
 
 class SessionTest extends SquelettesTestCase
 {
diff --git a/tests/tests/Squelettes/Balise/ValTest.php b/ecrire/tests/Squelettes/Balise/ValTest.php
similarity index 78%
rename from tests/tests/Squelettes/Balise/ValTest.php
rename to ecrire/tests/Squelettes/Balise/ValTest.php
index 225926364229fafbf682b62c83e3e7a3da35c4b1..49334a03690aadd2f64111eb3db0ec28ed9322e1 100644
--- a/tests/tests/Squelettes/Balise/ValTest.php
+++ b/ecrire/tests/Squelettes/Balise/ValTest.php
@@ -2,9 +2,9 @@
 
 declare(strict_types=1);
 
-namespace Spip\Core\Tests\Squelettes\Balise;
+namespace Spip\Test\Squelettes\Balise;
 
-use Spip\Core\Testing\SquelettesTestCase;
+use Spip\Test\SquelettesTestCase;
 
 class ValTest extends SquelettesTestCase
 {
diff --git a/tests/tests/Squelettes/Balise/data/balise_detachee.html b/ecrire/tests/Squelettes/Balise/data/balise_detachee.html
similarity index 100%
rename from tests/tests/Squelettes/Balise/data/balise_detachee.html
rename to ecrire/tests/Squelettes/Balise/data/balise_detachee.html
diff --git a/tests/tests/Squelettes/Balise/data/balise_env_test.html b/ecrire/tests/Squelettes/Balise/data/balise_env_test.html
similarity index 100%
rename from tests/tests/Squelettes/Balise/data/balise_env_test.html
rename to ecrire/tests/Squelettes/Balise/data/balise_env_test.html
diff --git a/tests/tests/Squelettes/Balise/data/balise_expose.html b/ecrire/tests/Squelettes/Balise/data/balise_expose.html
similarity index 100%
rename from tests/tests/Squelettes/Balise/data/balise_expose.html
rename to ecrire/tests/Squelettes/Balise/data/balise_expose.html
diff --git a/tests/tests/Squelettes/Balise/data/balise_expose_dans_inclusion.html b/ecrire/tests/Squelettes/Balise/data/balise_expose_dans_inclusion.html
similarity index 100%
rename from tests/tests/Squelettes/Balise/data/balise_expose_dans_inclusion.html
rename to ecrire/tests/Squelettes/Balise/data/balise_expose_dans_inclusion.html
diff --git a/tests/tests/Squelettes/Balise/data/inclure_vide.html b/ecrire/tests/Squelettes/Balise/data/inclure_vide.html
similarity index 100%
rename from tests/tests/Squelettes/Balise/data/inclure_vide.html
rename to ecrire/tests/Squelettes/Balise/data/inclure_vide.html
diff --git a/tests/tests/Squelettes/Balise/data/note_inclue_affichee.html b/ecrire/tests/Squelettes/Balise/data/note_inclue_affichee.html
similarity index 100%
rename from tests/tests/Squelettes/Balise/data/note_inclue_affichee.html
rename to ecrire/tests/Squelettes/Balise/data/note_inclue_affichee.html
diff --git a/tests/tests/Squelettes/Balise/data/note_inclue_nonaffichee.html b/ecrire/tests/Squelettes/Balise/data/note_inclue_nonaffichee.html
similarity index 100%
rename from tests/tests/Squelettes/Balise/data/note_inclue_nonaffichee.html
rename to ecrire/tests/Squelettes/Balise/data/note_inclue_nonaffichee.html
diff --git a/tests/tests/Squelettes/Balise/data/notes.html b/ecrire/tests/Squelettes/Balise/data/notes.html
similarity index 100%
rename from tests/tests/Squelettes/Balise/data/notes.html
rename to ecrire/tests/Squelettes/Balise/data/notes.html
diff --git a/tests/tests/Squelettes/Balise/data/texte_hello_world.html b/ecrire/tests/Squelettes/Balise/data/texte_hello_world.html
similarity index 100%
rename from tests/tests/Squelettes/Balise/data/texte_hello_world.html
rename to ecrire/tests/Squelettes/Balise/data/texte_hello_world.html
diff --git a/tests/tests/Squelettes/Boucle/BoucleGeneriqueTest.php b/ecrire/tests/Squelettes/Boucle/BoucleGeneriqueTest.php
similarity index 95%
rename from tests/tests/Squelettes/Boucle/BoucleGeneriqueTest.php
rename to ecrire/tests/Squelettes/Boucle/BoucleGeneriqueTest.php
index d435b059fe49f4976f69d5c3bb05f24785b6cbf5..c545176f44a45cc5fb3bc27f1d092be8460c6cd1 100644
--- a/tests/tests/Squelettes/Boucle/BoucleGeneriqueTest.php
+++ b/ecrire/tests/Squelettes/Boucle/BoucleGeneriqueTest.php
@@ -2,9 +2,9 @@
 
 declare(strict_types=1);
 
-namespace Spip\Core\Tests\Squelettes\Boucle;
+namespace Spip\Test\Squelettes\Boucle;
 
-use Spip\Core\Testing\SquelettesTestCase;
+use Spip\Test\SquelettesTestCase;
 
 class BoucleGeneriqueTest extends SquelettesTestCase
 {
diff --git a/tests/tests/Squelettes/Boucle/BoucleRecursiveTest.php b/ecrire/tests/Squelettes/Boucle/BoucleRecursiveTest.php
similarity index 75%
rename from tests/tests/Squelettes/Boucle/BoucleRecursiveTest.php
rename to ecrire/tests/Squelettes/Boucle/BoucleRecursiveTest.php
index 5e84d21f63b9afcf4d34505991db931f8f16d43c..7c86ac08ee701f0b810ec0d9769c9e0af9a9f813 100644
--- a/tests/tests/Squelettes/Boucle/BoucleRecursiveTest.php
+++ b/ecrire/tests/Squelettes/Boucle/BoucleRecursiveTest.php
@@ -2,9 +2,9 @@
 
 declare(strict_types=1);
 
-namespace Spip\Core\Tests\Squelettes\Boucle;
+namespace Spip\Test\Squelettes\Boucle;
 
-use Spip\Core\Testing\SquelettesTestCase;
+use Spip\Test\SquelettesTestCase;
 
 class BoucleRecursiveTest extends SquelettesTestCase
 {
diff --git a/tests/tests/Squelettes/Boucle/HierarchieTest.php b/ecrire/tests/Squelettes/Boucle/HierarchieTest.php
similarity index 92%
rename from tests/tests/Squelettes/Boucle/HierarchieTest.php
rename to ecrire/tests/Squelettes/Boucle/HierarchieTest.php
index 0d9b45c058c951f82605f364472674c88adc7510..97f8ff5549e49ee97e768776da457b6fd26d6488 100644
--- a/tests/tests/Squelettes/Boucle/HierarchieTest.php
+++ b/ecrire/tests/Squelettes/Boucle/HierarchieTest.php
@@ -2,9 +2,9 @@
 
 declare(strict_types=1);
 
-namespace Spip\Core\Tests\Squelettes\Boucle;
+namespace Spip\Test\Squelettes\Boucle;
 
-use Spip\Core\Testing\SquelettesTestCase;
+use Spip\Test\SquelettesTestCase;
 
 class HierarchieTest extends SquelettesTestCase
 {
diff --git a/tests/tests/Squelettes/Boucle/data/boucle_vide.html b/ecrire/tests/Squelettes/Boucle/data/boucle_vide.html
similarity index 100%
rename from tests/tests/Squelettes/Boucle/data/boucle_vide.html
rename to ecrire/tests/Squelettes/Boucle/data/boucle_vide.html
diff --git a/tests/tests/Squelettes/Boucle/data/bug764.html b/ecrire/tests/Squelettes/Boucle/data/bug764.html
similarity index 100%
rename from tests/tests/Squelettes/Boucle/data/bug764.html
rename to ecrire/tests/Squelettes/Boucle/data/bug764.html
diff --git a/tests/tests/Squelettes/Critere/DoublonsTest.php b/ecrire/tests/Squelettes/Critere/DoublonsTest.php
similarity index 94%
rename from tests/tests/Squelettes/Critere/DoublonsTest.php
rename to ecrire/tests/Squelettes/Critere/DoublonsTest.php
index 57e332e57caacb4e34ac620c918955a438a6df5e..4ff00cf451ffd05d25d4e0932f016be4688087ef 100644
--- a/tests/tests/Squelettes/Critere/DoublonsTest.php
+++ b/ecrire/tests/Squelettes/Critere/DoublonsTest.php
@@ -2,10 +2,10 @@
 
 declare(strict_types=1);
 
-namespace Spip\Core\Tests\Squelettes\Critere;
+namespace Spip\Test\Squelettes\Critere;
 
-use Spip\Core\Testing\SquelettesTestCase;
-use Spip\Core\Testing\Templating;
+use Spip\Test\SquelettesTestCase;
+use Spip\Test\Templating;
 
 class DoublonsTest extends SquelettesTestCase
 {
diff --git a/tests/tests/Squelettes/Critere/data/doublons.html b/ecrire/tests/Squelettes/Critere/data/doublons.html
similarity index 100%
rename from tests/tests/Squelettes/Critere/data/doublons.html
rename to ecrire/tests/Squelettes/Critere/data/doublons.html
diff --git a/tests/tests/Squelettes/Filtre/IntroductionTest.php b/ecrire/tests/Squelettes/Filtre/IntroductionTest.php
similarity index 96%
rename from tests/tests/Squelettes/Filtre/IntroductionTest.php
rename to ecrire/tests/Squelettes/Filtre/IntroductionTest.php
index f68134e078b73330094df264b310afe549ab7d48..974a8e884ddf3a2cbbb8769ede76100714d61284 100644
--- a/tests/tests/Squelettes/Filtre/IntroductionTest.php
+++ b/ecrire/tests/Squelettes/Filtre/IntroductionTest.php
@@ -2,9 +2,9 @@
 
 declare(strict_types=1);
 
-namespace Spip\Core\Tests\Squelettes\Filtre;
+namespace Spip\Test\Squelettes\Filtre;
 
-use Spip\Core\Testing\SquelettesTestCase;
+use Spip\Test\SquelettesTestCase;
 
 class IntroductionTest extends SquelettesTestCase
 {
diff --git a/tests/tests/Squelettes/Filtre/LogiquesTest.php b/ecrire/tests/Squelettes/Filtre/LogiquesTest.php
similarity index 96%
rename from tests/tests/Squelettes/Filtre/LogiquesTest.php
rename to ecrire/tests/Squelettes/Filtre/LogiquesTest.php
index 536841d466f0f573a08d574bb49ff549bc1ba774..3e50e81efc39e4c90ed87bd3940666db2ceafeac 100644
--- a/tests/tests/Squelettes/Filtre/LogiquesTest.php
+++ b/ecrire/tests/Squelettes/Filtre/LogiquesTest.php
@@ -2,9 +2,9 @@
 
 declare(strict_types=1);
 
-namespace Spip\Core\Tests\Squelettes\Filtre;
+namespace Spip\Test\Squelettes\Filtre;
 
-use Spip\Core\Testing\SquelettesTestCase;
+use Spip\Test\SquelettesTestCase;
 
 class LogiquesTest extends SquelettesTestCase
 {
diff --git a/tests/src/SquelettesTestCase.php b/ecrire/tests/SquelettesTestCase.php
similarity index 98%
rename from tests/src/SquelettesTestCase.php
rename to ecrire/tests/SquelettesTestCase.php
index 7af401836982fa58148657a0626df16994e34a45..827ce018c7e86476c5c006cb1cbe7dde8e4b8264 100644
--- a/tests/src/SquelettesTestCase.php
+++ b/ecrire/tests/SquelettesTestCase.php
@@ -2,13 +2,11 @@
 
 declare(strict_types=1);
 
-namespace Spip\Core\Testing;
+namespace Spip\Test;
 
 use PHPUnit\Framework\Constraint\LogicalNot;
 use PHPUnit\Framework\TestCase;
-use Spip\Core\Testing\Constraint\IsOk;
-use Spip\Core\Testing\Template\FileLoader;
-use Spip\Core\Testing\Template\StringLoader;
+use Spip\Test\Constraint\IsOk;
 
 abstract class SquelettesTestCase extends TestCase
 {
diff --git a/tests/src/Template.php b/ecrire/tests/Template.php
similarity index 95%
rename from tests/src/Template.php
rename to ecrire/tests/Template.php
index 38bd1a1a91bcfa7c1e58477cac8ba2671e9def0b..4351c93056f40dc1b2628eebc5d80fbc319c4ae7 100644
--- a/tests/src/Template.php
+++ b/ecrire/tests/Template.php
@@ -2,9 +2,9 @@
 
 declare(strict_types=1);
 
-namespace Spip\Core\Testing;
+namespace Spip\Test;
 
-use Spip\Core\Testing\Exception\TemplateCompilationErrorException;
+use Spip\Test\Exception\TemplateCompilationErrorException;
 
 class Template
 {
diff --git a/tests/src/Template/Loader/ChainLoader.php b/ecrire/tests/Template/Loader/ChainLoader.php
similarity index 86%
rename from tests/src/Template/Loader/ChainLoader.php
rename to ecrire/tests/Template/Loader/ChainLoader.php
index 59146f1cb6a87742c4d30b5397963f2aa1cc382d..aeeaf0463f1d7901e005ddd7d5cd8ee3af4ddb48 100644
--- a/tests/src/Template/Loader/ChainLoader.php
+++ b/ecrire/tests/Template/Loader/ChainLoader.php
@@ -2,9 +2,9 @@
 
 declare(strict_types=1);
 
-namespace Spip\Core\Testing\Template\Loader;
+namespace Spip\Test\Template\Loader;
 
-use Spip\Core\Testing\Exception\TemplateNotFoundException;
+use Spip\Test\Exception\TemplateNotFoundException;
 
 class ChainLoader implements LoaderInterface
 {
@@ -40,7 +40,7 @@ class ChainLoader implements LoaderInterface
 	public function getCacheKey(string $name): string
 	{
 		foreach ($this->loaders as $loader) {
-			if (! $loader->exists($name)) {
+			if (!$loader->exists($name)) {
 				continue;
 			}
 
@@ -53,7 +53,7 @@ class ChainLoader implements LoaderInterface
 	public function getSourceFile(string $name): string
 	{
 		foreach ($this->loaders as $loader) {
-			if (! $loader->exists($name)) {
+			if (!$loader->exists($name)) {
 				continue;
 			}
 
diff --git a/tests/src/Template/Loader/FileLoader.php b/ecrire/tests/Template/Loader/FileLoader.php
similarity index 87%
rename from tests/src/Template/Loader/FileLoader.php
rename to ecrire/tests/Template/Loader/FileLoader.php
index 0a93229887793f54cda5b96b6bb8ec8bb418ada4..6a57233f899eb851dfca50f1d271187fe0268c9f 100644
--- a/tests/src/Template/Loader/FileLoader.php
+++ b/ecrire/tests/Template/Loader/FileLoader.php
@@ -2,9 +2,9 @@
 
 declare(strict_types=1);
 
-namespace Spip\Core\Testing\Template\Loader;
+namespace Spip\Test\Template\Loader;
 
-use Spip\Core\Testing\Exception\TemplateNotFoundException;
+use Spip\Test\Exception\TemplateNotFoundException;
 
 class FileLoader implements LoaderInterface
 {
diff --git a/tests/src/Template/Loader/LoaderInterface.php b/ecrire/tests/Template/Loader/LoaderInterface.php
similarity index 82%
rename from tests/src/Template/Loader/LoaderInterface.php
rename to ecrire/tests/Template/Loader/LoaderInterface.php
index c63ccd160a1dd2554cfe141e9b6069187fd8f953..41d4f9c1d297cbf0628bc779685734ba787c30e8 100644
--- a/tests/src/Template/Loader/LoaderInterface.php
+++ b/ecrire/tests/Template/Loader/LoaderInterface.php
@@ -2,7 +2,7 @@
 
 declare(strict_types=1);
 
-namespace Spip\Core\Testing\Template\Loader;
+namespace Spip\Test\Template\Loader;
 
 interface LoaderInterface
 {
diff --git a/tests/src/Template/Loader/StringLoader.php b/ecrire/tests/Template/Loader/StringLoader.php
similarity index 96%
rename from tests/src/Template/Loader/StringLoader.php
rename to ecrire/tests/Template/Loader/StringLoader.php
index be3dc0058ecbb2a618b41fd5de2f07354c08691d..a5ec9d52f0bcd3b911a3c2d5d7697ecf8c2bc286 100644
--- a/tests/src/Template/Loader/StringLoader.php
+++ b/ecrire/tests/Template/Loader/StringLoader.php
@@ -2,7 +2,7 @@
 
 declare(strict_types=1);
 
-namespace Spip\Core\Testing\Template\Loader;
+namespace Spip\Test\Template\Loader;
 
 class StringLoader implements LoaderInterface
 {
@@ -48,7 +48,7 @@ class StringLoader implements LoaderInterface
 
 		$this->ecrire_fichier($fond . '.html', $code);
 
-		if (! empty($options['fonctions'])) {
+		if (!empty($options['fonctions'])) {
 			// un fichier unique pour ces fonctions
 			$func = $this->cacheDirectory . 'func_' . md5($options['fonctions']) . '.php';
 			$this->ecrire_fichier($func, $this->php($options['fonctions']));
diff --git a/tests/src/Templating.php b/ecrire/tests/Templating.php
similarity index 83%
rename from tests/src/Templating.php
rename to ecrire/tests/Templating.php
index a46cacfb7a493c73cdeca8c0d93b0bf71d015df2..5e8e0d6f273b865d699acf6cd2e6eb8fe7ac00ea 100644
--- a/tests/src/Templating.php
+++ b/ecrire/tests/Templating.php
@@ -2,11 +2,11 @@
 
 declare(strict_types=1);
 
-namespace Spip\Core\Testing;
+namespace Spip\Test;
 
-use Spip\Core\Testing\Template\Loader\FileLoader;
-use Spip\Core\Testing\Template\Loader\LoaderInterface;
-use Spip\Core\Testing\Template\Loader\StringLoader;
+use Spip\Test\Template\Loader\FileLoader;
+use Spip\Test\Template\Loader\LoaderInterface;
+use Spip\Test\Template\Loader\StringLoader;
 
 class Templating
 {
diff --git a/tests/tests/Testing/SquelettesTestCaseTest.php b/ecrire/tests/Testing/SquelettesTestCaseTest.php
similarity index 94%
rename from tests/tests/Testing/SquelettesTestCaseTest.php
rename to ecrire/tests/Testing/SquelettesTestCaseTest.php
index 4bba7c6ee596f8fef87bb68e2679f2d0a5a7d827..bd816c79f57ed159d2fe56ea100e8e83feda35b7 100644
--- a/tests/tests/Testing/SquelettesTestCaseTest.php
+++ b/ecrire/tests/Testing/SquelettesTestCaseTest.php
@@ -2,10 +2,10 @@
 
 declare(strict_types=1);
 
-namespace Spip\Core\Tests\Testing;
+namespace Spip\Test\Testing;
 
 use PHPUnit\Framework\AssertionFailedError;
-use Spip\Core\Testing\SquelettesTestCase;
+use Spip\Test\SquelettesTestCase;
 
 class SquelettesTestCaseTest extends SquelettesTestCase
 {
diff --git a/tests/tests/Testing/TemplateTest.php b/ecrire/tests/Testing/TemplateTest.php
similarity index 81%
rename from tests/tests/Testing/TemplateTest.php
rename to ecrire/tests/Testing/TemplateTest.php
index 53bd799356a57b19780644e82968ee2f7ea4f8dc..39bcfef088acdebf4f09624abfb7506e7e26c491 100644
--- a/tests/tests/Testing/TemplateTest.php
+++ b/ecrire/tests/Testing/TemplateTest.php
@@ -2,10 +2,10 @@
 
 declare(strict_types=1);
 
-namespace Spip\Core\Tests\Testing;
+namespace Spip\Test\Testing;
 
-use Spip\Core\Testing\SquelettesTestCase;
-use Spip\Core\Testing\Template;
+use Spip\Test\SquelettesTestCase;
+use Spip\Test\Template;
 
 class TemplateTest extends SquelettesTestCase
 {
diff --git a/tests/tests/Testing/TemplatingTest.php b/ecrire/tests/Testing/TemplatingTest.php
similarity index 93%
rename from tests/tests/Testing/TemplatingTest.php
rename to ecrire/tests/Testing/TemplatingTest.php
index 3d4cec01a62b34e89927c51524865c96b325c794..76e4c74150f52f39d197674fa4433842a1e5da88 100644
--- a/tests/tests/Testing/TemplatingTest.php
+++ b/ecrire/tests/Testing/TemplatingTest.php
@@ -2,14 +2,14 @@
 
 declare(strict_types=1);
 
-namespace Spip\Core\Tests\Testing;
-
-use Spip\Core\Testing\Exception\TemplateNotFoundException;
-use Spip\Core\Testing\SquelettesTestCase;
-use Spip\Core\Testing\Template\Loader\ChainLoader;
-use Spip\Core\Testing\Template\Loader\FileLoader;
-use Spip\Core\Testing\Template\Loader\StringLoader;
-use Spip\Core\Testing\Templating;
+namespace Spip\Test\Testing;
+
+use Spip\Test\Exception\TemplateNotFoundException;
+use Spip\Test\SquelettesTestCase;
+use Spip\Test\Template\Loader\ChainLoader;
+use Spip\Test\Template\Loader\FileLoader;
+use Spip\Test\Template\Loader\StringLoader;
+use Spip\Test\Templating;
 
 class TemplatingTest extends SquelettesTestCase
 {
diff --git a/tests/tests/Testing/data/balise_env_test.html b/ecrire/tests/Testing/data/balise_env_test.html
similarity index 100%
rename from tests/tests/Testing/data/balise_env_test.html
rename to ecrire/tests/Testing/data/balise_env_test.html
diff --git a/tests/tests/Testing/data/texte_hello_world.html b/ecrire/tests/Testing/data/texte_hello_world.html
similarity index 100%
rename from tests/tests/Testing/data/texte_hello_world.html
rename to ecrire/tests/Testing/data/texte_hello_world.html
diff --git a/tests/tests/Texte/CouperTest.php b/ecrire/tests/Texte/CouperTest.php
similarity index 98%
rename from tests/tests/Texte/CouperTest.php
rename to ecrire/tests/Texte/CouperTest.php
index e375573e06eb1f2a5f4b30a7cc50b816ab658514..b65ec54c70c206e9d46f99dcf0b5779547282257 100644
--- a/tests/tests/Texte/CouperTest.php
+++ b/ecrire/tests/Texte/CouperTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction couper du fichier inc/texte_mini.php
  */
 
-namespace Spip\Core\Tests\Texte;
+namespace Spip\Test\Texte;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Texte/EchapperHtmlSuspectTest.php b/ecrire/tests/Texte/EchapperHtmlSuspectTest.php
similarity index 86%
rename from tests/tests/Texte/EchapperHtmlSuspectTest.php
rename to ecrire/tests/Texte/EchapperHtmlSuspectTest.php
index 5083f66d96e7397a18e44809b375a99b820b7f2c..e591c4f23b94221dc5d4e1ab95f2e3c3100af3e4 100644
--- a/tests/tests/Texte/EchapperHtmlSuspectTest.php
+++ b/ecrire/tests/Texte/EchapperHtmlSuspectTest.php
@@ -6,17 +6,19 @@ declare(strict_types=1);
  * Test unitaire de la fonction propre du fichier inc/texte.php
  */
 
-namespace Spip\Core\Tests\Texte;
+namespace Spip\Test\Texte;
 
 use PHPUnit\Framework\TestCase;
 
-class EchapperHtmlSuspectTest extends TestCase {
+class EchapperHtmlSuspectTest extends TestCase
+{
 
 	static $filtrer_javascript;
 	static $lang;
 
 
-	public static function setUpBeforeClass(): void {
+	public static function setUpBeforeClass(): void
+	{
 		find_in_path('inc/texte.php', '', true);
 		static::$filtrer_javascript = $GLOBALS['filtrer_javascript'] ?? null;
 		$GLOBALS['filtrer_javascript'] = -1;
@@ -25,7 +27,8 @@ class EchapperHtmlSuspectTest extends TestCase {
 		changer_langue('en');
 	}
 
-	public static function tearDownAfterClass(): void {
+	public static function tearDownAfterClass(): void
+	{
 		$GLOBALS['filtrer_javascript'] = static::$filtrer_javascript;
 		$GLOBALS['spip_lang'] = static::$lang;
 	}
@@ -33,12 +36,14 @@ class EchapperHtmlSuspectTest extends TestCase {
 	/**
 	 * @dataProvider providerIsHtmlSafe
 	 */
-	public function testIsHtmlSafe($expected, ...$args): void {
+	public function testIsHtmlSafe($expected, ...$args): void
+	{
 		$actual = is_html_safe(...$args);
 		$this->assertSame($expected, $actual);
 	}
 
-	public static function providerIsHtmlSafe(): array {
+	public static function providerIsHtmlSafe(): array
+	{
 		return [
 			'relOK' => [
 				true,
@@ -74,5 +79,4 @@ class EchapperHtmlSuspectTest extends TestCase {
 			],
 		];
 	}
-
 }
diff --git a/tests/tests/Texte/InterdireScriptLaxisteTest.php b/ecrire/tests/Texte/InterdireScriptLaxisteTest.php
similarity index 90%
rename from tests/tests/Texte/InterdireScriptLaxisteTest.php
rename to ecrire/tests/Texte/InterdireScriptLaxisteTest.php
index 9862fd0984bee8091e6480d0954536bccb4c4a93..aeb51343ed0956c5632598fe1e68c0bed31e8211 100644
--- a/tests/tests/Texte/InterdireScriptLaxisteTest.php
+++ b/ecrire/tests/Texte/InterdireScriptLaxisteTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction interdire_script du fichier inc/texte.php
  */
 
-namespace Spip\Core\Tests\Texte;
+namespace Spip\Test\Texte;
 
 use PHPUnit\Framework\TestCase;
 
@@ -40,8 +40,10 @@ class InterdireScriptLaxisteTest extends TestCase
 
 	public static function providerTexteInterdireScriptLaxiste(): array
 	{
-		return [[
-			"<script type='text/javascript' src='toto.js'></script>", "<script type='text/javascript' src='toto.js'></script>", ],
+		return [
+			[
+				"<script type='text/javascript' src='toto.js'></script>", "<script type='text/javascript' src='toto.js'></script>",
+			],
 			[
 				"<script type='text/javascript' src='spip.php?page=toto'></script>",
 				"<script type='text/javascript' src='spip.php?page=toto'></script>",
diff --git a/tests/tests/Texte/InterdireScriptParanoTest.php b/ecrire/tests/Texte/InterdireScriptParanoTest.php
similarity index 89%
rename from tests/tests/Texte/InterdireScriptParanoTest.php
rename to ecrire/tests/Texte/InterdireScriptParanoTest.php
index 716be86c7ab506a63f9e0f7d9067d0e16f38c851..aae0113c09a60019776c175273517e9059a792d6 100644
--- a/tests/tests/Texte/InterdireScriptParanoTest.php
+++ b/ecrire/tests/Texte/InterdireScriptParanoTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction interdire_script du fichier inc/texte.php
  */
 
-namespace Spip\Core\Tests\Texte;
+namespace Spip\Test\Texte;
 
 use PHPUnit\Framework\TestCase;
 
@@ -40,8 +40,10 @@ class InterdireScriptParanoTest extends TestCase
 
 	public static function providerTexteInterdireScriptParano(): array
 	{
-		return [[
-			"<code class=\"echappe-js\">&lt;script type='text/javascript' src='toto.js'&gt;&lt;/script&gt;</code>", "<script type='text/javascript' src='toto.js'></script>", ],
+		return [
+			[
+				"<code class=\"echappe-js\">&lt;script type='text/javascript' src='toto.js'&gt;&lt;/script&gt;</code>", "<script type='text/javascript' src='toto.js'></script>",
+			],
 			[
 				"<code class=\"echappe-js\">&lt;script type='text/javascript' src='spip.php?page=toto'&gt;&lt;/script&gt;</code>",
 				"<script type='text/javascript' src='spip.php?page=toto'></script>",
diff --git a/tests/tests/Texte/PropreTest.php b/ecrire/tests/Texte/PropreTest.php
similarity index 98%
rename from tests/tests/Texte/PropreTest.php
rename to ecrire/tests/Texte/PropreTest.php
index b3e4a7db6afdb298f1fed3a1d77399faa70eddbb..7a7668b5126c172f5e0e767e064364d670bbe724 100644
--- a/tests/tests/Texte/PropreTest.php
+++ b/ecrire/tests/Texte/PropreTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction propre du fichier inc/texte.php
  */
 
-namespace Spip\Core\Tests\Texte;
+namespace Spip\Test\Texte;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/ecrire/tests/Texte/TypoTest.php b/ecrire/tests/Texte/TypoTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..0b8775caecfc25e179da4652d0a4f2317c2e526f
--- /dev/null
+++ b/ecrire/tests/Texte/TypoTest.php
@@ -0,0 +1,142 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * Test unitaire de la fonction propre du fichier inc/texte.php
+ */
+
+namespace Spip\Test\Texte;
+
+use PHPUnit\Framework\TestCase;
+
+class TypoTest extends TestCase
+{
+	public static function setUpBeforeClass(): void
+	{
+		find_in_path('inc/texte.php', '', true);
+	}
+
+	protected function setUp(): void
+	{
+		$GLOBALS['meta']['type_urls'] = 'page';
+		$GLOBALS['type_urls'] = 'page';
+		// ce test est en fr
+		changer_langue('fr');
+	}
+
+	/**
+	 * @dataProvider providerTexteTypo
+	 */
+	public function testTexteTypo($expected, ...$args): void
+	{
+		$actual = typo(...$args);
+		$this->assertSame($expected, $actual);
+	}
+
+	public static function providerTexteTypo(): array
+	{
+		return [
+			0 =>
+			[
+				0 => 'Quelle question&nbsp;!',
+				1 => 'Quelle question!',
+			],
+			1 =>
+			[
+				0 => '',
+				1 => '',
+				2 => true,
+			],
+			2 =>
+			[
+				0 => '',
+				1 => '',
+				2 => false,
+			],
+			3 =>
+			[
+				0 => '0',
+				1 => '0',
+				2 => true,
+			],
+			4 =>
+			[
+				0 => '0',
+				1 => '0',
+				2 => false,
+			],
+			5 =>
+			[
+				0 => 'Un texte avec des <a href="http://spip.net">liens</a> [Article 1->art1] [spip->http://www.spip.net] http://www.spip.net',
+				1 => 'Un texte avec des <a href="http://spip.net">liens</a> [Article 1->art1] [spip->http://www.spip.net] http://www.spip.net',
+				2 => true,
+			],
+			6 =>
+			[
+				0 => 'Un texte avec des <a href="http://spip.net">liens</a> [Article 1->art1] [spip->http://www.spip.net] http://www.spip.net',
+				1 => 'Un texte avec des <a href="http://spip.net">liens</a> [Article 1->art1] [spip->http://www.spip.net] http://www.spip.net',
+				2 => false,
+			],
+			7 =>
+			[
+				0 => 'Un texte avec des entit&eacute;s &amp;&lt;&gt;&quot;',
+				1 => 'Un texte avec des entit&eacute;s &amp;&lt;&gt;&quot;',
+				2 => true,
+			],
+			8 =>
+			[
+				0 => 'Un texte avec des entit&eacute;s &amp;&lt;&gt;&quot;',
+				1 => 'Un texte avec des entit&eacute;s &amp;&lt;&gt;&quot;',
+				2 => false,
+			],
+			9 =>
+			[
+				0 => 'Un texte sans entites &amp;&lt;>"&#8217;',
+				1 => 'Un texte sans entites &<>"\'',
+				2 => true,
+			],
+			10 =>
+			[
+				0 => 'Un texte sans entites &amp;&lt;>"&#8217;',
+				1 => 'Un texte sans entites &<>"\'',
+				2 => false,
+			],
+			11 =>
+			[
+				0 => "{{{Des raccourcis}}} {italique} {{gras}} <code class=\"spip_code spip_code_inline\" dir=\"ltr\">du code</code>",
+				1 => '{{{Des raccourcis}}} {italique} {{gras}} <code>du code</code>',
+				2 => true,
+			],
+			12 =>
+			[
+				0 => '{{{Des raccourcis}}} {italique} {{gras}} <code>du code</code>',
+				1 => '{{{Des raccourcis}}} {italique} {{gras}} <code>du code</code>',
+				2 => false,
+			],
+			13 =>
+			[
+				0 => 'Un modele <tt>&lt;modeleinexistant|lien=[-&gt;http://www.spip.net]&gt;</tt>',
+				1 => 'Un modele <modeleinexistant|lien=[->http://www.spip.net]>',
+				2 => true,
+			],
+			14 =>
+			[
+				0 => 'Un modele <tt>&lt;modeleinexistant|lien=[-&gt;http://www.spip.net]&gt;</tt>',
+				1 => 'Un modele <modeleinexistant|lien=[->http://www.spip.net]>',
+				2 => false,
+			],
+			15 =>
+			[
+				0 => 'Chat&nbsp;!!',
+				1 => 'Chat!!'
+			],
+			// et pas apres "(" -- http://trac.rezo.net/trac/spip/changeset/10177
+			'r10177' =>
+			[
+				0 => '(!)',
+				1 => '(!)'
+			],
+		];
+	}
+}
diff --git a/tests/tests/Typographie/FrTest.php b/ecrire/tests/Typographie/FrTest.php
similarity index 99%
rename from tests/tests/Typographie/FrTest.php
rename to ecrire/tests/Typographie/FrTest.php
index 0f9f09f1c72ab06da003a5eedb3874c001135d5f..177ded48140908544604878e44f740889970afff 100644
--- a/tests/tests/Typographie/FrTest.php
+++ b/ecrire/tests/Typographie/FrTest.php
@@ -12,7 +12,7 @@ declare(strict_types=1);
  *  Pour plus de détails voir le fichier COPYING.txt ou l'aide en ligne.   *
 \***************************************************************************/
 
-namespace Spip\Core\Tests\Typographie;
+namespace Spip\Test\Typographie;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Typographie/FrTextwheelTest.php b/ecrire/tests/Typographie/FrTextwheelTest.php
similarity index 95%
rename from tests/tests/Typographie/FrTextwheelTest.php
rename to ecrire/tests/Typographie/FrTextwheelTest.php
index 902785cb52b413f8ba763706c758b696a18b6d86..b2887e8e611d485596ff5718debe884aa41dfc76 100644
--- a/tests/tests/Typographie/FrTextwheelTest.php
+++ b/ecrire/tests/Typographie/FrTextwheelTest.php
@@ -12,7 +12,7 @@ declare(strict_types=1);
  *  Pour plus de détails voir le fichier COPYING.txt ou l'aide en ligne.   *
 \***************************************************************************/
 
-namespace Spip\Core\Tests\Typographie;
+namespace Spip\Test\Typographie;
 
 class FrTextwheelTest extends FrTest
 {
diff --git a/tests/tests/Typographie/NotesTest.php b/ecrire/tests/Typographie/NotesTest.php
similarity index 99%
rename from tests/tests/Typographie/NotesTest.php
rename to ecrire/tests/Typographie/NotesTest.php
index d315293418631613243f212769a0a6c58d6c433c..194b131f8ac8b791c3e0ee61901ef8aa47cf8eb1 100644
--- a/tests/tests/Typographie/NotesTest.php
+++ b/ecrire/tests/Typographie/NotesTest.php
@@ -2,7 +2,7 @@
 
 declare(strict_types=1);
 
-namespace Spip\Core\Tests\Typographie;
+namespace Spip\Test\Typographie;
 
 use PHPUnit\Framework\TestCase;
 
@@ -43,7 +43,6 @@ class NotesTest extends TestCase
 		$this->assertMatchesRegularExpression('/nb1/', $note);
 		$this->assertMatchesRegularExpression('/#nh1/', $note);
 		$this->assertMatchesRegularExpression('/Note en bas de page/', $note);
-
 	}
 
 	public function testNoteSeuleEtTexte(): void
diff --git a/tests/tests/Utils/ParametreUrlTest.php b/ecrire/tests/Utils/ParametreUrlTest.php
similarity index 99%
rename from tests/tests/Utils/ParametreUrlTest.php
rename to ecrire/tests/Utils/ParametreUrlTest.php
index b536aa880f505399e539020774bd4333303447f7..a315b841a279854478b9f20ec95c38a3746ab797 100644
--- a/tests/tests/Utils/ParametreUrlTest.php
+++ b/ecrire/tests/Utils/ParametreUrlTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction parametre_url du fichier ./inc/utils.php
  */
 
-namespace Spip\Core\Tests\Utils;
+namespace Spip\Test\Utils;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Utils/TesterUrlAbsolueTest.php b/ecrire/tests/Utils/TesterUrlAbsolueTest.php
similarity index 96%
rename from tests/tests/Utils/TesterUrlAbsolueTest.php
rename to ecrire/tests/Utils/TesterUrlAbsolueTest.php
index 31e905cc20d271aeb082735adf6f2a98b05612b3..5b2529b41bf51ce1d410c602d8fe86f3de69d7b4 100644
--- a/tests/tests/Utils/TesterUrlAbsolueTest.php
+++ b/ecrire/tests/Utils/TesterUrlAbsolueTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction tester_url_absolue du fichier ./inc/utils.php
  */
 
-namespace Spip\Core\Tests\Utils;
+namespace Spip\Test\Utils;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/Utils/UrlDeTest.php b/ecrire/tests/Utils/UrlDeTest.php
similarity index 98%
rename from tests/tests/Utils/UrlDeTest.php
rename to ecrire/tests/Utils/UrlDeTest.php
index 63e3249a5f47d325b7623bec55c20c451a27214c..27e7e8787aebefd2f6889596119e9cb627f18523 100644
--- a/tests/tests/Utils/UrlDeTest.php
+++ b/ecrire/tests/Utils/UrlDeTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction url_de_ du fichier ./inc/utils.php
  */
 
-namespace Spip\Core\Tests\Utils;
+namespace Spip\Test\Utils;
 
 use PHPUnit\Framework\TestCase;
 
diff --git a/tests/tests/bootstrap.php b/ecrire/tests/bootstrap.php
similarity index 100%
rename from tests/tests/bootstrap.php
rename to ecrire/tests/bootstrap.php
diff --git a/tests/tests/legacy/css/tests.css b/ecrire/tests/legacy/css/tests.css
similarity index 100%
rename from tests/tests/legacy/css/tests.css
rename to ecrire/tests/legacy/css/tests.css
diff --git a/tests/tests/legacy/js/jquery-3.2.js b/ecrire/tests/legacy/js/jquery-3.2.js
similarity index 100%
rename from tests/tests/legacy/js/jquery-3.2.js
rename to ecrire/tests/legacy/js/jquery-3.2.js
diff --git a/tests/tests/legacy/js/testrunner.js b/ecrire/tests/legacy/js/testrunner.js
similarity index 100%
rename from tests/tests/legacy/js/testrunner.js
rename to ecrire/tests/legacy/js/testrunner.js
diff --git a/tests/tests/legacy/squel.php b/ecrire/tests/legacy/squel.php
similarity index 100%
rename from tests/tests/legacy/squel.php
rename to ecrire/tests/legacy/squel.php
diff --git a/tests/tests/legacy/squelettes/balise/formulaire_test_phraseur.php b/ecrire/tests/legacy/squelettes/balise/formulaire_test_phraseur.php
similarity index 100%
rename from tests/tests/legacy/squelettes/balise/formulaire_test_phraseur.php
rename to ecrire/tests/legacy/squelettes/balise/formulaire_test_phraseur.php
diff --git a/tests/tests/legacy/squelettes/cache_session_w_1.html b/ecrire/tests/legacy/squelettes/cache_session_w_1.html
similarity index 100%
rename from tests/tests/legacy/squelettes/cache_session_w_1.html
rename to ecrire/tests/legacy/squelettes/cache_session_w_1.html
diff --git a/tests/tests/legacy/squelettes/cache_session_w_2.html b/ecrire/tests/legacy/squelettes/cache_session_w_2.html
similarity index 100%
rename from tests/tests/legacy/squelettes/cache_session_w_2.html
rename to ecrire/tests/legacy/squelettes/cache_session_w_2.html
diff --git a/tests/tests/legacy/squelettes/cache_session_w_3.html b/ecrire/tests/legacy/squelettes/cache_session_w_3.html
similarity index 100%
rename from tests/tests/legacy/squelettes/cache_session_w_3.html
rename to ecrire/tests/legacy/squelettes/cache_session_w_3.html
diff --git a/tests/tests/legacy/squelettes/cache_session_wo_1.html b/ecrire/tests/legacy/squelettes/cache_session_wo_1.html
similarity index 100%
rename from tests/tests/legacy/squelettes/cache_session_wo_1.html
rename to ecrire/tests/legacy/squelettes/cache_session_wo_1.html
diff --git a/tests/tests/legacy/squelettes/cache_session_wo_2.html b/ecrire/tests/legacy/squelettes/cache_session_wo_2.html
similarity index 100%
rename from tests/tests/legacy/squelettes/cache_session_wo_2.html
rename to ecrire/tests/legacy/squelettes/cache_session_wo_2.html
diff --git a/tests/tests/legacy/squelettes/cache_session_wo_3.html b/ecrire/tests/legacy/squelettes/cache_session_wo_3.html
similarity index 100%
rename from tests/tests/legacy/squelettes/cache_session_wo_3.html
rename to ecrire/tests/legacy/squelettes/cache_session_wo_3.html
diff --git a/tests/tests/legacy/squelettes/cache_session_wo_4.html b/ecrire/tests/legacy/squelettes/cache_session_wo_4.html
similarity index 100%
rename from tests/tests/legacy/squelettes/cache_session_wo_4.html
rename to ecrire/tests/legacy/squelettes/cache_session_wo_4.html
diff --git a/tests/tests/legacy/squelettes/cache_session_wo_5.html b/ecrire/tests/legacy/squelettes/cache_session_wo_5.html
similarity index 100%
rename from tests/tests/legacy/squelettes/cache_session_wo_5.html
rename to ecrire/tests/legacy/squelettes/cache_session_wo_5.html
diff --git a/tests/tests/legacy/squelettes/cache_session_wo_6.html b/ecrire/tests/legacy/squelettes/cache_session_wo_6.html
similarity index 100%
rename from tests/tests/legacy/squelettes/cache_session_wo_6.html
rename to ecrire/tests/legacy/squelettes/cache_session_wo_6.html
diff --git a/tests/tests/legacy/squelettes/cache_session_wo_7.html b/ecrire/tests/legacy/squelettes/cache_session_wo_7.html
similarity index 100%
rename from tests/tests/legacy/squelettes/cache_session_wo_7.html
rename to ecrire/tests/legacy/squelettes/cache_session_wo_7.html
diff --git a/tests/tests/legacy/squelettes/formulaires/test_dyn_lang.html b/ecrire/tests/legacy/squelettes/formulaires/test_dyn_lang.html
similarity index 100%
rename from tests/tests/legacy/squelettes/formulaires/test_dyn_lang.html
rename to ecrire/tests/legacy/squelettes/formulaires/test_dyn_lang.html
diff --git a/tests/tests/legacy/squelettes/formulaires/test_dyn_lang.php b/ecrire/tests/legacy/squelettes/formulaires/test_dyn_lang.php
similarity index 100%
rename from tests/tests/legacy/squelettes/formulaires/test_dyn_lang.php
rename to ecrire/tests/legacy/squelettes/formulaires/test_dyn_lang.php
diff --git a/tests/tests/legacy/squelettes/formulaires/test_phraseur.html b/ecrire/tests/legacy/squelettes/formulaires/test_phraseur.html
similarity index 100%
rename from tests/tests/legacy/squelettes/formulaires/test_phraseur.html
rename to ecrire/tests/legacy/squelettes/formulaires/test_phraseur.html
diff --git a/tests/tests/legacy/squelettes/inclure/A_session_w.html b/ecrire/tests/legacy/squelettes/inclure/A_session_w.html
similarity index 100%
rename from tests/tests/legacy/squelettes/inclure/A_session_w.html
rename to ecrire/tests/legacy/squelettes/inclure/A_session_w.html
diff --git a/tests/tests/legacy/squelettes/inclure/A_session_wo.html b/ecrire/tests/legacy/squelettes/inclure/A_session_wo.html
similarity index 100%
rename from tests/tests/legacy/squelettes/inclure/A_session_wo.html
rename to ecrire/tests/legacy/squelettes/inclure/A_session_wo.html
diff --git a/tests/tests/legacy/squelettes/inclure/B_session_w.html b/ecrire/tests/legacy/squelettes/inclure/B_session_w.html
similarity index 100%
rename from tests/tests/legacy/squelettes/inclure/B_session_w.html
rename to ecrire/tests/legacy/squelettes/inclure/B_session_w.html
diff --git a/tests/tests/legacy/squelettes/inclure/B_session_wo.html b/ecrire/tests/legacy/squelettes/inclure/B_session_wo.html
similarity index 100%
rename from tests/tests/legacy/squelettes/inclure/B_session_wo.html
rename to ecrire/tests/legacy/squelettes/inclure/B_session_wo.html
diff --git a/tests/tests/legacy/squelettes/inclure/C_session_w.html b/ecrire/tests/legacy/squelettes/inclure/C_session_w.html
similarity index 100%
rename from tests/tests/legacy/squelettes/inclure/C_session_w.html
rename to ecrire/tests/legacy/squelettes/inclure/C_session_w.html
diff --git a/tests/tests/legacy/squelettes/inclure/C_session_wo.html b/ecrire/tests/legacy/squelettes/inclure/C_session_wo.html
similarity index 100%
rename from tests/tests/legacy/squelettes/inclure/C_session_wo.html
rename to ecrire/tests/legacy/squelettes/inclure/C_session_wo.html
diff --git a/tests/tests/legacy/squelettes/modeles/foreach_test_ul_li.html b/ecrire/tests/legacy/squelettes/modeles/foreach_test_ul_li.html
similarity index 100%
rename from tests/tests/legacy/squelettes/modeles/foreach_test_ul_li.html
rename to ecrire/tests/legacy/squelettes/modeles/foreach_test_ul_li.html
diff --git a/tests/tests/legacy/squelettes/modeles/foreach_ul_li.html b/ecrire/tests/legacy/squelettes/modeles/foreach_ul_li.html
similarity index 100%
rename from tests/tests/legacy/squelettes/modeles/foreach_ul_li.html
rename to ecrire/tests/legacy/squelettes/modeles/foreach_ul_li.html
diff --git a/tests/tests/legacy/squelettes/root.html b/ecrire/tests/legacy/squelettes/root.html
similarity index 100%
rename from tests/tests/legacy/squelettes/root.html
rename to ecrire/tests/legacy/squelettes/root.html
diff --git a/tests/tests/legacy/test.inc b/ecrire/tests/legacy/test.inc
similarity index 100%
rename from tests/tests/legacy/test.inc
rename to ecrire/tests/legacy/test.inc
diff --git a/tests/tests/legacy/test_fonctions.php b/ecrire/tests/legacy/test_fonctions.php
similarity index 99%
rename from tests/tests/legacy/test_fonctions.php
rename to ecrire/tests/legacy/test_fonctions.php
index ad58db2cc8e9f4819c0e32591dbd9c51c05a8461..6c982d6d29ff23c4c52557ce1f05e074c6e1d173 100644
--- a/tests/tests/legacy/test_fonctions.php
+++ b/ecrire/tests/legacy/test_fonctions.php
@@ -3,7 +3,7 @@
 declare(strict_types=1);
 
 // pour FineDiff
-include_once _SPIP_TEST_INC . '/vendor/autoload.php';
+#include_once _SPIP_TEST_INC . '/vendor/autoload.php';
 
 function tests_init_dossier_squelettes()
 {
diff --git a/tests/tests/legacy/unit/abstract_sql/.ok b/ecrire/tests/legacy/unit/abstract_sql/.ok
similarity index 100%
rename from tests/tests/legacy/unit/abstract_sql/.ok
rename to ecrire/tests/legacy/unit/abstract_sql/.ok
diff --git a/tests/tests/legacy/unit/abstract_sql/00_sql_create_drop_view.php b/ecrire/tests/legacy/unit/abstract_sql/00_sql_create_drop_view.php
similarity index 100%
rename from tests/tests/legacy/unit/abstract_sql/00_sql_create_drop_view.php
rename to ecrire/tests/legacy/unit/abstract_sql/00_sql_create_drop_view.php
diff --git a/tests/tests/legacy/unit/abstract_sql/10_sql_insert_select.php b/ecrire/tests/legacy/unit/abstract_sql/10_sql_insert_select.php
similarity index 100%
rename from tests/tests/legacy/unit/abstract_sql/10_sql_insert_select.php
rename to ecrire/tests/legacy/unit/abstract_sql/10_sql_insert_select.php
diff --git a/tests/tests/legacy/unit/abstract_sql/20_sql_update_delete.php b/ecrire/tests/legacy/unit/abstract_sql/20_sql_update_delete.php
similarity index 100%
rename from tests/tests/legacy/unit/abstract_sql/20_sql_update_delete.php
rename to ecrire/tests/legacy/unit/abstract_sql/20_sql_update_delete.php
diff --git a/tests/tests/legacy/unit/abstract_sql/30_sql_alter.php b/ecrire/tests/legacy/unit/abstract_sql/30_sql_alter.php
similarity index 100%
rename from tests/tests/legacy/unit/abstract_sql/30_sql_alter.php
rename to ecrire/tests/legacy/unit/abstract_sql/30_sql_alter.php
diff --git a/tests/tests/legacy/unit/abstract_sql/40_sql_divers.php b/ecrire/tests/legacy/unit/abstract_sql/40_sql_divers.php
similarity index 100%
rename from tests/tests/legacy/unit/abstract_sql/40_sql_divers.php
rename to ecrire/tests/legacy/unit/abstract_sql/40_sql_divers.php
diff --git a/tests/tests/legacy/unit/abstract_sql/inc-sql_datas.inc b/ecrire/tests/legacy/unit/abstract_sql/inc-sql_datas.inc
similarity index 100%
rename from tests/tests/legacy/unit/abstract_sql/inc-sql_datas.inc
rename to ecrire/tests/legacy/unit/abstract_sql/inc-sql_datas.inc
diff --git a/tests/tests/legacy/unit/balises/balise_dyn_langue.html b/ecrire/tests/legacy/unit/balises/balise_dyn_langue.html
similarity index 100%
rename from tests/tests/legacy/unit/balises/balise_dyn_langue.html
rename to ecrire/tests/legacy/unit/balises/balise_dyn_langue.html
diff --git a/tests/tests/legacy/unit/balises/balise_dyn_langue_fonctions.php b/ecrire/tests/legacy/unit/balises/balise_dyn_langue_fonctions.php
similarity index 100%
rename from tests/tests/legacy/unit/balises/balise_dyn_langue_fonctions.php
rename to ecrire/tests/legacy/unit/balises/balise_dyn_langue_fonctions.php
diff --git a/tests/tests/legacy/unit/balises/balise_dyn_langue_modele.html b/ecrire/tests/legacy/unit/balises/balise_dyn_langue_modele.html
similarity index 100%
rename from tests/tests/legacy/unit/balises/balise_dyn_langue_modele.html
rename to ecrire/tests/legacy/unit/balises/balise_dyn_langue_modele.html
diff --git a/tests/tests/legacy/unit/balises/balise_dyn_langue_modele_fonctions.php b/ecrire/tests/legacy/unit/balises/balise_dyn_langue_modele_fonctions.php
similarity index 100%
rename from tests/tests/legacy/unit/balises/balise_dyn_langue_modele_fonctions.php
rename to ecrire/tests/legacy/unit/balises/balise_dyn_langue_modele_fonctions.php
diff --git a/tests/tests/legacy/unit/balises/doublons.html b/ecrire/tests/legacy/unit/balises/doublons.html
similarity index 100%
rename from tests/tests/legacy/unit/balises/doublons.html
rename to ecrire/tests/legacy/unit/balises/doublons.html
diff --git a/tests/tests/legacy/unit/balises/filtre.html b/ecrire/tests/legacy/unit/balises/filtre.html
similarity index 100%
rename from tests/tests/legacy/unit/balises/filtre.html
rename to ecrire/tests/legacy/unit/balises/filtre.html
diff --git a/tests/tests/legacy/unit/balises/filtre_fonctions.php b/ecrire/tests/legacy/unit/balises/filtre_fonctions.php
similarity index 100%
rename from tests/tests/legacy/unit/balises/filtre_fonctions.php
rename to ecrire/tests/legacy/unit/balises/filtre_fonctions.php
diff --git a/tests/tests/legacy/unit/balises/formulaire_.html b/ecrire/tests/legacy/unit/balises/formulaire_.html
similarity index 100%
rename from tests/tests/legacy/unit/balises/formulaire_.html
rename to ecrire/tests/legacy/unit/balises/formulaire_.html
diff --git a/tests/tests/legacy/unit/balises/formulaire__fonctions.php b/ecrire/tests/legacy/unit/balises/formulaire__fonctions.php
similarity index 100%
rename from tests/tests/legacy/unit/balises/formulaire__fonctions.php
rename to ecrire/tests/legacy/unit/balises/formulaire__fonctions.php
diff --git a/tests/tests/legacy/unit/balises/inclure_array.html b/ecrire/tests/legacy/unit/balises/inclure_array.html
similarity index 100%
rename from tests/tests/legacy/unit/balises/inclure_array.html
rename to ecrire/tests/legacy/unit/balises/inclure_array.html
diff --git a/tests/tests/legacy/unit/balises/inclure_manquant.html b/ecrire/tests/legacy/unit/balises/inclure_manquant.html
similarity index 100%
rename from tests/tests/legacy/unit/balises/inclure_manquant.html
rename to ecrire/tests/legacy/unit/balises/inclure_manquant.html
diff --git a/tests/tests/legacy/unit/balises/inclure_manquant_fonctions.php b/ecrire/tests/legacy/unit/balises/inclure_manquant_fonctions.php
similarity index 100%
rename from tests/tests/legacy/unit/balises/inclure_manquant_fonctions.php
rename to ecrire/tests/legacy/unit/balises/inclure_manquant_fonctions.php
diff --git a/tests/tests/legacy/unit/balises/inclus_article.html b/ecrire/tests/legacy/unit/balises/inclus_article.html
similarity index 100%
rename from tests/tests/legacy/unit/balises/inclus_article.html
rename to ecrire/tests/legacy/unit/balises/inclus_article.html
diff --git a/tests/tests/legacy/unit/balises/inclus_rien.html b/ecrire/tests/legacy/unit/balises/inclus_rien.html
similarity index 100%
rename from tests/tests/legacy/unit/balises/inclus_rien.html
rename to ecrire/tests/legacy/unit/balises/inclus_rien.html
diff --git a/tests/tests/legacy/unit/balises/phraseur_balise_dyn.html b/ecrire/tests/legacy/unit/balises/phraseur_balise_dyn.html
similarity index 100%
rename from tests/tests/legacy/unit/balises/phraseur_balise_dyn.html
rename to ecrire/tests/legacy/unit/balises/phraseur_balise_dyn.html
diff --git a/tests/tests/legacy/unit/cache/cache_sessions.php b/ecrire/tests/legacy/unit/cache/cache_sessions.php
similarity index 100%
rename from tests/tests/legacy/unit/cache/cache_sessions.php
rename to ecrire/tests/legacy/unit/cache/cache_sessions.php
diff --git a/tests/tests/legacy/unit/criteres/branche.html b/ecrire/tests/legacy/unit/criteres/branche.html
similarity index 100%
rename from tests/tests/legacy/unit/criteres/branche.html
rename to ecrire/tests/legacy/unit/criteres/branche.html
diff --git a/tests/tests/legacy/unit/criteres/origine_traduction.html b/ecrire/tests/legacy/unit/criteres/origine_traduction.html
similarity index 100%
rename from tests/tests/legacy/unit/criteres/origine_traduction.html
rename to ecrire/tests/legacy/unit/criteres/origine_traduction.html
diff --git a/tests/tests/legacy/unit/criteres/regexp-like.html b/ecrire/tests/legacy/unit/criteres/regexp-like.html
similarity index 100%
rename from tests/tests/legacy/unit/criteres/regexp-like.html
rename to ecrire/tests/legacy/unit/criteres/regexp-like.html
diff --git a/tests/tests/legacy/unit/criteres/traduction.html b/ecrire/tests/legacy/unit/criteres/traduction.html
similarity index 100%
rename from tests/tests/legacy/unit/criteres/traduction.html
rename to ecrire/tests/legacy/unit/criteres/traduction.html
diff --git a/tests/tests/legacy/unit/documents/affichage_documents.html b/ecrire/tests/legacy/unit/documents/affichage_documents.html
similarity index 100%
rename from tests/tests/legacy/unit/documents/affichage_documents.html
rename to ecrire/tests/legacy/unit/documents/affichage_documents.html
diff --git a/tests/tests/legacy/unit/entrees_sorties/flock_sous_repertoire.php b/ecrire/tests/legacy/unit/entrees_sorties/flock_sous_repertoire.php
similarity index 100%
rename from tests/tests/legacy/unit/entrees_sorties/flock_sous_repertoire.php
rename to ecrire/tests/legacy/unit/entrees_sorties/flock_sous_repertoire.php
diff --git a/tests/tests/legacy/unit/entrees_sorties/spip_nfslock.php b/ecrire/tests/legacy/unit/entrees_sorties/spip_nfslock.php
similarity index 100%
rename from tests/tests/legacy/unit/entrees_sorties/spip_nfslock.php
rename to ecrire/tests/legacy/unit/entrees_sorties/spip_nfslock.php
diff --git a/tests/tests/legacy/unit/filtres/abs_url.html b/ecrire/tests/legacy/unit/filtres/abs_url.html
similarity index 100%
rename from tests/tests/legacy/unit/filtres/abs_url.html
rename to ecrire/tests/legacy/unit/filtres/abs_url.html
diff --git a/tests/tests/legacy/unit/filtres/affdate.php b/ecrire/tests/legacy/unit/filtres/affdate.php
similarity index 100%
rename from tests/tests/legacy/unit/filtres/affdate.php
rename to ecrire/tests/legacy/unit/filtres/affdate.php
diff --git a/tests/tests/legacy/unit/filtres/attribut_html.php b/ecrire/tests/legacy/unit/filtres/attribut_html.php
similarity index 100%
rename from tests/tests/legacy/unit/filtres/attribut_html.php
rename to ecrire/tests/legacy/unit/filtres/attribut_html.php
diff --git a/tests/tests/legacy/unit/filtres/date_iso.php b/ecrire/tests/legacy/unit/filtres/date_iso.php
similarity index 100%
rename from tests/tests/legacy/unit/filtres/date_iso.php
rename to ecrire/tests/legacy/unit/filtres/date_iso.php
diff --git a/tests/tests/legacy/unit/filtres/entites_html.php b/ecrire/tests/legacy/unit/filtres/entites_html.php
similarity index 100%
rename from tests/tests/legacy/unit/filtres/entites_html.php
rename to ecrire/tests/legacy/unit/filtres/entites_html.php
diff --git a/tests/tests/legacy/unit/filtres/extraire_attribut.php b/ecrire/tests/legacy/unit/filtres/extraire_attribut.php
similarity index 100%
rename from tests/tests/legacy/unit/filtres/extraire_attribut.php
rename to ecrire/tests/legacy/unit/filtres/extraire_attribut.php
diff --git a/tests/tests/legacy/unit/filtres/form_hidden.html b/ecrire/tests/legacy/unit/filtres/form_hidden.html
similarity index 100%
rename from tests/tests/legacy/unit/filtres/form_hidden.html
rename to ecrire/tests/legacy/unit/filtres/form_hidden.html
diff --git a/tests/tests/legacy/unit/filtres/liens_absolus.php b/ecrire/tests/legacy/unit/filtres/liens_absolus.php
similarity index 100%
rename from tests/tests/legacy/unit/filtres/liens_absolus.php
rename to ecrire/tests/legacy/unit/filtres/liens_absolus.php
diff --git a/tests/tests/legacy/unit/filtres/liens_absolus_prive.php b/ecrire/tests/legacy/unit/filtres/liens_absolus_prive.php
similarity index 100%
rename from tests/tests/legacy/unit/filtres/liens_absolus_prive.php
rename to ecrire/tests/legacy/unit/filtres/liens_absolus_prive.php
diff --git a/tests/tests/legacy/unit/filtres/liens_ouvrants.html b/ecrire/tests/legacy/unit/filtres/liens_ouvrants.html
similarity index 100%
rename from tests/tests/legacy/unit/filtres/liens_ouvrants.html
rename to ecrire/tests/legacy/unit/filtres/liens_ouvrants.html
diff --git a/tests/tests/legacy/unit/filtres/logique.html b/ecrire/tests/legacy/unit/filtres/logique.html
similarity index 100%
rename from tests/tests/legacy/unit/filtres/logique.html
rename to ecrire/tests/legacy/unit/filtres/logique.html
diff --git a/tests/tests/legacy/unit/filtres/suivre_liens.php b/ecrire/tests/legacy/unit/filtres/suivre_liens.php
similarity index 100%
rename from tests/tests/legacy/unit/filtres/suivre_liens.php
rename to ecrire/tests/legacy/unit/filtres/suivre_liens.php
diff --git a/tests/tests/legacy/unit/path/creer_chemin.php b/ecrire/tests/legacy/unit/path/creer_chemin.php
similarity index 100%
rename from tests/tests/legacy/unit/path/creer_chemin.php
rename to ecrire/tests/legacy/unit/path/creer_chemin.php
diff --git a/tests/tests/legacy/unit/plugin/dir_plugins_suppl.php b/ecrire/tests/legacy/unit/plugin/dir_plugins_suppl.php
similarity index 100%
rename from tests/tests/legacy/unit/plugin/dir_plugins_suppl.php
rename to ecrire/tests/legacy/unit/plugin/dir_plugins_suppl.php
diff --git a/tests/tests/legacy/unit/propre/doublons_notes.html b/ecrire/tests/legacy/unit/propre/doublons_notes.html
similarity index 100%
rename from tests/tests/legacy/unit/propre/doublons_notes.html
rename to ecrire/tests/legacy/unit/propre/doublons_notes.html
diff --git a/tests/tests/legacy/unit/propre/doublons_notes_fonctions.php b/ecrire/tests/legacy/unit/propre/doublons_notes_fonctions.php
similarity index 100%
rename from tests/tests/legacy/unit/propre/doublons_notes_fonctions.php
rename to ecrire/tests/legacy/unit/propre/doublons_notes_fonctions.php
diff --git a/tests/tests/legacy/unit/propre/liens.php b/ecrire/tests/legacy/unit/propre/liens.php
similarity index 100%
rename from tests/tests/legacy/unit/propre/liens.php
rename to ecrire/tests/legacy/unit/propre/liens.php
diff --git a/tests/tests/legacy/unit/propre/liens_classes.php b/ecrire/tests/legacy/unit/propre/liens_classes.php
similarity index 100%
rename from tests/tests/legacy/unit/propre/liens_classes.php
rename to ecrire/tests/legacy/unit/propre/liens_classes.php
diff --git a/tests/tests/legacy/unit/rubriques/creer_rubrique_nommee.html b/ecrire/tests/legacy/unit/rubriques/creer_rubrique_nommee.html
similarity index 100%
rename from tests/tests/legacy/unit/rubriques/creer_rubrique_nommee.html
rename to ecrire/tests/legacy/unit/rubriques/creer_rubrique_nommee.html
diff --git a/tests/tests/legacy/unit/xml/xmlhack.html b/ecrire/tests/legacy/unit/xml/xmlhack.html
similarity index 100%
rename from tests/tests/legacy/unit/xml/xmlhack.html
rename to ecrire/tests/legacy/unit/xml/xmlhack.html
diff --git a/tests/tests/legacy/unit/xml/xmlhack_fonctions.php b/ecrire/tests/legacy/unit/xml/xmlhack_fonctions.php
similarity index 100%
rename from tests/tests/legacy/unit/xml/xmlhack_fonctions.php
rename to ecrire/tests/legacy/unit/xml/xmlhack_fonctions.php
diff --git a/tests/tests/legacy/unit/xml/xmlhack_inclure.html b/ecrire/tests/legacy/unit/xml/xmlhack_inclure.html
similarity index 100%
rename from tests/tests/legacy/unit/xml/xmlhack_inclure.html
rename to ecrire/tests/legacy/unit/xml/xmlhack_inclure.html
diff --git a/tests/tests/legacy/unit/xml/xmlhack_inclure_dyn.html b/ecrire/tests/legacy/unit/xml/xmlhack_inclure_dyn.html
similarity index 100%
rename from tests/tests/legacy/unit/xml/xmlhack_inclure_dyn.html
rename to ecrire/tests/legacy/unit/xml/xmlhack_inclure_dyn.html
diff --git a/tests/tests/legacy/unit/xml/xmlhack_inclure_dyn_php.html b/ecrire/tests/legacy/unit/xml/xmlhack_inclure_dyn_php.html
similarity index 100%
rename from tests/tests/legacy/unit/xml/xmlhack_inclure_dyn_php.html
rename to ecrire/tests/legacy/unit/xml/xmlhack_inclure_dyn_php.html
diff --git a/tests/tests/legacy/unit/xml/xmlhack_inclure_php.html b/ecrire/tests/legacy/unit/xml/xmlhack_inclure_php.html
similarity index 100%
rename from tests/tests/legacy/unit/xml/xmlhack_inclure_php.html
rename to ecrire/tests/legacy/unit/xml/xmlhack_inclure_php.html
diff --git a/tests/tests/legacy/unit/xml/xmlhack_php.html b/ecrire/tests/legacy/unit/xml/xmlhack_php.html
similarity index 100%
rename from tests/tests/legacy/unit/xml/xmlhack_php.html
rename to ecrire/tests/legacy/unit/xml/xmlhack_php.html
diff --git a/tests/tests/legacy/unit/xml/xmlhack_php_fonctions.php b/ecrire/tests/legacy/unit/xml/xmlhack_php_fonctions.php
similarity index 100%
rename from tests/tests/legacy/unit/xml/xmlhack_php_fonctions.php
rename to ecrire/tests/legacy/unit/xml/xmlhack_php_fonctions.php
diff --git a/tests/tests/legacy/unit/xml/xmlhack_recuperer_fond.php b/ecrire/tests/legacy/unit/xml/xmlhack_recuperer_fond.php
similarity index 100%
rename from tests/tests/legacy/unit/xml/xmlhack_recuperer_fond.php
rename to ecrire/tests/legacy/unit/xml/xmlhack_recuperer_fond.php
diff --git a/tests/tests/legacy/unit/z_todo/NA_echappements.php b/ecrire/tests/legacy/unit/z_todo/NA_echappements.php
similarity index 100%
rename from tests/tests/legacy/unit/z_todo/NA_echappements.php
rename to ecrire/tests/legacy/unit/z_todo/NA_echappements.php
diff --git a/tests/tests/legacy/unit/z_todo/NA_email_valide.php b/ecrire/tests/legacy/unit/z_todo/NA_email_valide.php
similarity index 100%
rename from tests/tests/legacy/unit/z_todo/NA_email_valide.php
rename to ecrire/tests/legacy/unit/z_todo/NA_email_valide.php
diff --git a/tests/tests/legacy/unit/z_todo/NA_email_valide_5322.php b/ecrire/tests/legacy/unit/z_todo/NA_email_valide_5322.php
similarity index 100%
rename from tests/tests/legacy/unit/z_todo/NA_email_valide_5322.php
rename to ecrire/tests/legacy/unit/z_todo/NA_email_valide_5322.php
diff --git a/tests/tests/legacy/unit/z_todo/email_valide_5322.xml b/ecrire/tests/legacy/unit/z_todo/email_valide_5322.xml
similarity index 100%
rename from tests/tests/legacy/unit/z_todo/email_valide_5322.xml
rename to ecrire/tests/legacy/unit/z_todo/email_valide_5322.xml
diff --git a/tests/ecs.php b/ecs.php
similarity index 91%
rename from tests/ecs.php
rename to ecs.php
index 0d2398f44e207ddb989e358d3fa6f04fde8c766f..c65795cf373c01c54bc837258b2d8df02b735855 100644
--- a/tests/ecs.php
+++ b/ecs.php
@@ -14,8 +14,7 @@ return static function (ECSConfig $ecsConfig): void {
 	$ecsConfig->indentation('tab');
 
     $ecsConfig->paths([
-        __DIR__ . '/src',
-        __DIR__ . '/tests',
+        __DIR__ . '/ecrire/tests',
     ]);
 
 };
diff --git a/tests/phpunit.xml.dist b/phpunit.xml.dist
similarity index 74%
rename from tests/phpunit.xml.dist
rename to phpunit.xml.dist
index c364dc76fa265f6a7fe4529209d2d22c52266c2a..72c022b292bab10e75cf2ccc906ec49885e61eba 100755
--- a/tests/phpunit.xml.dist
+++ b/phpunit.xml.dist
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <phpunit
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    bootstrap="./tests/bootstrap.php"
+    bootstrap="vendor/autoload.php"
     colors="true"
     stopOnFailure="false"
     xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/10.0/phpunit.xsd"
@@ -9,6 +9,6 @@
 >
   <coverage/>
 	<testsuites>
-		<testsuite name="core"><directory>./tests/</directory></testsuite>
+		<testsuite name="spip"><directory>./ecrire/tests/</directory></testsuite>
  	</testsuites>
 </phpunit>
diff --git a/tests/rector.php b/rector.php
similarity index 91%
rename from tests/rector.php
rename to rector.php
index 2d6cbac1f5b2dea56d60c30eb5ddcf1b306ad8a6..468a8bad7076dfba7417683899a502971a79d27a 100644
--- a/tests/rector.php
+++ b/rector.php
@@ -13,8 +13,7 @@ return static function (RectorConfig $rectorConfig): void {
 	$rectorConfig->disableParallel();
 
     $rectorConfig->paths([
-        __DIR__ . '/src',
-        __DIR__ . '/tests'
+        __DIR__ . '/ecrire/tests'
     ]);
 
     // define sets of rules
diff --git a/tests/.gitignore b/tests/.gitignore
deleted file mode 100644
index 7e5cd045528520cc8a698417bbc7ba3c2552b2ec..0000000000000000000000000000000000000000
--- a/tests/.gitignore
+++ /dev/null
@@ -1,9 +0,0 @@
-.idea
-composer.lock
-/vendor/
-/vendor-bin/*/vendor/
-.phpunit.result.cache
-.phpunit.cache/
-phpunit.xml
-phpunit.xml.bak
-tests/bootstrap_plugins.php
diff --git a/tests/Makefile b/tests/Makefile
deleted file mode 100644
index 387e2c320f8fc33cb620ed37affb6f5da6aa9f98..0000000000000000000000000000000000000000
--- a/tests/Makefile
+++ /dev/null
@@ -1,12 +0,0 @@
-tests: vendor phpunit.xml bootstrap_plugins.php
-	vendor/bin/phpunit --colors
-
-phpunit.xml:
-	php bin/configure.php
-
-bootstrap_plugins.php:
-	php bin/configure.php
-
-vendor: composer.json
-	composer update
-	touch $@
diff --git a/tests/README.md b/tests/README.md
deleted file mode 100644
index 25c3996f9e1b4dbbd3cafdea08929ca713cda0c7..0000000000000000000000000000000000000000
--- a/tests/README.md
+++ /dev/null
@@ -1,58 +0,0 @@
-# Tests pour SPIP
-
-Suite de tests basée sur PHPUnit, avec un wrapper pour les tests historiques écrits en script PHP standalone ou en squelette HTML
-
-## Installation
-
-Placez-vous à la racine du site.
-
-```
-git clone https://git.spip.net/spip/tests.git
-cd tests
-make tests
-```
-
-## Commande principale
-
-Lancer tous les tests
-```
-make tests
-```
-
-## Commandes spécifiques
-
-Lancer tous les tests
-```
-vendor/bin/phpunit --colors tests
-```
-
-Voir le détail de tous les tests lancés (y compris leurs noms)
-```
-vendor/bin/phpunit --colors --debug tests
-```
-
-Lister toutes les suites de tests :
-```
-vendor/bin/phpunit --colors --debug --list-suites
-```
-
-Lister tous les tests :
-```
-vendor/bin/phpunit --colors --debug --list-tests
-```
-
-Pour filtrer les tests et n'en executer que certains :
-```
-vendor/bin/phpunit --colors --debug tests --filter=unit/propre/
-vendor/bin/phpunit --colors --debug --filter=testCouper
-```
-
-## Ajouter des tests
-
-TODO
-
-## Legacy
-
-Les tests historiques écrits sous forme de PHP ou de squelette HTML sont joués via les 2 composants `LegacyUnitHtmlTest.php` et `LegacyUnitPhpTest.php`
-
-Il est encore possible de lancer dans le navigateur la suite de tests legacy via l'url `monsite.spip/tests/` mais cette méthode est depréciée et ne lancera pas les tests écrits directement pour PHPUnit
diff --git a/tests/bin/configure.php b/tests/bin/configure.php
deleted file mode 100755
index e825167e3dcde48fc225f84828631f6b8d15d037..0000000000000000000000000000000000000000
--- a/tests/bin/configure.php
+++ /dev/null
@@ -1,60 +0,0 @@
-#!/usr/bin/env php
-<?php
-
-// les args a passer a phpUnit
-$args = $argv;
-array_shift($args);
-
-$dir_tests = dirname(__DIR__) . '/';
-$file_bootstrap_plugins = $dir_tests . "tests/bootstrap_plugins.php";
-if (!file_exists($file_bootstrap_plugins)) {
-	file_put_contents($file_bootstrap_plugins,"<?"."php\n");
-}
-
-// charger SPIP
-require_once $dir_tests . 'tests/bootstrap.php';
-
-// Lister les repertoires du path qui contiennent des dossier tests/ avec des tests PHPUnit
-
-$dirs = [];
-$bootstraps = [];
-foreach (creer_chemin() as $d) {
-	if ($d and
-		is_dir("{$d}tests")
-		and (count(glob("{$d}tests/*Test.php")) or count(glob("{$d}tests/*/*Test.php")))
-	) {
-		$bases[] = "{$d}tests";
-
-		if (file_exists($f = "{$d}tests/bootstrap.php")) {
-			$bootstraps[] = $f;
-		}
-	}
-}
-
-$prefixe_dir = '../';
-while (!is_dir($dir_tests . $prefixe_dir . 'ecrire')) {
-	$prefixe_dir .= '../';
-}
-
-$testsuites = [];
-foreach ($bases as $base) {
-	$name = dirname($base);
-	$testsuites[] = "<testsuite name=\"$name\"><directory>{$prefixe_dir}{$base}/</directory></testsuite>";
-}
-
-$testsuites = "\t\t" . implode("\n\t\t", $testsuites) . "\n";
-
-// generer le phpunit.xml a jour
-$config = file_get_contents($dir_tests .  'phpunit.xml.dist');
-$p = strpos($config, "\t</testsuites>");
-$config = substr_replace($config, $testsuites, $p, 0);
-
-file_put_contents($dir_tests . "phpunit.xml", $config);
-
-
-// generer le bootstrap_plugins.php a jour
-$code = "<?" . "php\n";
-foreach ($bootstraps as $bootstrap) {
-	$code .= "include_once '".addslashes($bootstrap)."';\n";
-}
-file_put_contents($file_bootstrap_plugins, $code);
diff --git a/tests/composer.json b/tests/composer.json
deleted file mode 100644
index 91ca89927a72ec1b4ce9e584ab30f43a5a61f236..0000000000000000000000000000000000000000
--- a/tests/composer.json
+++ /dev/null
@@ -1,46 +0,0 @@
-{
-    "name": "spip/tests",
-    "description": "Test suite for SPIP.",
-    "license": [
-        "MIT"
-    ],
-    "type": "library",
-    "keywords": [
-        "cms",
-        "spip"
-    ],
-    "require": {
-        "php": ">=8.1.0",
-        "ext-ctype": "*",
-        "ext-json": "*"
-    },
-    "require-dev": {
-        "lolli42/finediff": "^1.0",
-        "phpunit/phpunit": "^10.0",
-        "symfony/var-dumper": "^6.2",
-        "symplify/easy-coding-standard": "^11.1"
-    },
-    "suggest": {
-        "ext-iconv": "Can be used as fallback when ext-mbstring is not available",
-        "ext-mbstring": "For best performance, mbstring should be installed as it is faster than ext-iconv"
-    },
-    "repositories": [],
-    "autoload": {
-        "psr-4": {
-            "Spip\\Core\\Testing\\": "src/"
-        }
-    },
-    "autoload-dev": {
-        "psr-4": {
-            "Spip\\Core\\Tests\\": "tests/",
-            "Utils\\Rector\\": "utils/rector/src",
-            "Utils\\Rector\\Tests\\": "utils/rector/tests"
-        }
-    },
-    "config": {
-        "platform": {
-            "php": "8.1.17"
-        },
-        "sort-packages": true
-    }
-}
diff --git a/tests/index.php b/tests/index.php
deleted file mode 100644
index 3200493b6a6201b54b43befaab014ace51c10a0f..0000000000000000000000000000000000000000
--- a/tests/index.php
+++ /dev/null
@@ -1,103 +0,0 @@
-<?php
-	$dir = (isset($_GET['dir']) AND ($_GET['dir'])) ? $_GET['dir'] : '..';
-	chdir($dir);
-	require 'ecrire/inc_version.php';
-
-	// pas admin ? passe ton chemin (ce script est un vilain trou de securite)
-	if ((!isset($GLOBALS['visiteur_session']['statut'])
-	     OR $GLOBALS['visiteur_session']['statut'] != '0minirezo')
-	     AND !in_array($_SERVER["REMOTE_ADDR"], array('127.0.0.1', '127.0.1.1', '::1')) ) {
-		die('Administrateur local requis !');
-	}
-
-	// supprimer le vieux logs de tests
-	spip_unlink(_DIR_TMP."testrunner.log");
-
-	// chercher les bases de tests
-	$bases = array('tests/unit');
-	foreach (creer_chemin() as $d) {
-		if ($d && @is_dir("{$d}tests"))
-			$bases[] = "{$d}tests";
-	}
-
-	// déclarations
-	$sectionold = '';
-
-	echo
-		"<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Strict//EN'
-			'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'>\n",
-		"<html><head><title>Tests de SPIP</title>",
-		"<script src='tests/legacy/js/jquery-3.2.js' type='text/javascript'></script>\n",
-		"<script src='tests/legacy/js/testrunner.js' type='text/javascript'></script>\n",
-		"<link rel='stylesheet' href='tests/legacy/css/tests.css' type='text/css' />\n",
-		"</head><body>\n",
-		"<h1>",
-		"Tests SPIP ", version_spip(),
-		"</h1>\n";
-
-	include_once __DIR__ . '/tests/legacy/test_fonctions.php';
-
-	define('_DIR_TESTS', basename(__DIR__).'/');
-
-	$tests = tests_legacy_lister();
-
-	// utiliser le parametre $_GET['fichier'] pour limiter les tests a un seul fichier
-	if (isset($_GET['fichier']) AND $_GET['fichier'] != '' AND preg_match('[^\d\w-.]', $_GET['fichier']) != 1)
-		$fic = $_GET['fichier'];
-
-
-	foreach ($tests as $joli => $test) {
-		if (isset($fic) AND $fic != '' AND substr_count($test, $fic) == 0)
-			continue;
-
-
-		if (preg_match(',\.php$,', $test))
-			$url = '../'.$test.'?mode=test_general';
-		else
-			$url = "tests/legacy/squel.php?test=$test&amp;var_mode=recalcul";
-
-		$section = dirname($joli);
-		$dirTests = true;
-		$section_vcs = "";
-		if (strpos($section, 'tests/') !== 0) {
-			$dirTests = false;
-			if ($vcs = decrire_version_git(dirname(dirname($test)))) {
-				$section_vcs = ' ['.$vcs['commit_short'].']';
-			}
-		}
-		if ($section <> $sectionold) {
-			if ($sectionold) echo "</dl>\n";
-			$titre = $dirTests ? $section : "<a href='../$section'>$section</a>$section_vcs";
-			echo "<dl><dt>$titre</dt>\n";
-			$sectionold = $section;
-		}
-
-		echo "<dd>
-			<a href='$url' class='joli' title='".basename($test)."'>".basename($joli).":</a> &nbsp;
-			&nbsp;</dd>\n";
-	}
-
-	echo "</dl>\n";
-
-	echo "<div id='count'>";
-	echo "<span id='succes'>0</span> succ&#232;s, ";
-	echo "<span id='echec'>0</span> &#233;chec / ";
-	echo "<span id='total'>0</span> total";
-	echo "<br />tests exp&#233;di&#233;s en <span id='timer'>0</span>ms";
-	echo "</div>";
-
-	echo "</body></html>";
-
-
-function version_spip() {
-	include_spip('inc/minipres');
-	$version = $GLOBALS['spip_version_affichee'];
-	if ($vcs = decrire_version_git(_DIR_RACINE)) {
-		$version .= ' ' . ($vcs['vcs'] ?? '')
-		. "[<a href='https://git.spip.net/spip/spip/commit/"
-		. $vcs['commit'] . "' onclick=\"window.open(this.href); return false;\">"
-		. $vcs['commit_short'] . "</a>]";
-	}
-
-	return $version;
-}
diff --git a/tests/tests/Texte/TypoTest.php b/tests/tests/Texte/TypoTest.php
deleted file mode 100644
index 0782b03d8baf054fbc88d2581eef3542ac9e4e68..0000000000000000000000000000000000000000
--- a/tests/tests/Texte/TypoTest.php
+++ /dev/null
@@ -1,142 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-/**
- * Test unitaire de la fonction propre du fichier inc/texte.php
- */
-
-namespace Spip\Core\Tests\Texte;
-
-use PHPUnit\Framework\TestCase;
-
-class TypoTest extends TestCase
-{
-	public static function setUpBeforeClass(): void
-	{
-		find_in_path('inc/texte.php', '', true);
-	}
-
-	protected function setUp(): void
-	{
-		$GLOBALS['meta']['type_urls'] = 'page';
-		$GLOBALS['type_urls'] = 'page';
-		// ce test est en fr
-		changer_langue('fr');
-	}
-
-	/**
-	 * @dataProvider providerTexteTypo
-	 */
-	public function testTexteTypo($expected, ...$args): void
-	{
-		$actual = typo(...$args);
-		$this->assertSame($expected, $actual);
-	}
-
-	public static function providerTexteTypo(): array
-	{
-		return [
-			0 =>
-			 [
-			 	0 => 'Quelle question&nbsp;!',
-			 	1 => 'Quelle question!',
-			 ],
-			1 =>
-			 [
-			 	0 => '',
-			 	1 => '',
-			 	2 => true,
-			 ],
-			2 =>
-			 [
-			 	0 => '',
-			 	1 => '',
-			 	2 => false,
-			 ],
-			3 =>
-			 [
-			 	0 => '0',
-			 	1 => '0',
-			 	2 => true,
-			 ],
-			4 =>
-			 [
-			 	0 => '0',
-			 	1 => '0',
-			 	2 => false,
-			 ],
-			5 =>
-			 [
-			 	0 => 'Un texte avec des <a href="http://spip.net">liens</a> [Article 1->art1] [spip->http://www.spip.net] http://www.spip.net',
-			 	1 => 'Un texte avec des <a href="http://spip.net">liens</a> [Article 1->art1] [spip->http://www.spip.net] http://www.spip.net',
-			 	2 => true,
-			 ],
-			6 =>
-			 [
-			 	0 => 'Un texte avec des <a href="http://spip.net">liens</a> [Article 1->art1] [spip->http://www.spip.net] http://www.spip.net',
-			 	1 => 'Un texte avec des <a href="http://spip.net">liens</a> [Article 1->art1] [spip->http://www.spip.net] http://www.spip.net',
-			 	2 => false,
-			 ],
-			7 =>
-			 [
-			 	0 => 'Un texte avec des entit&eacute;s &amp;&lt;&gt;&quot;',
-			 	1 => 'Un texte avec des entit&eacute;s &amp;&lt;&gt;&quot;',
-			 	2 => true,
-			 ],
-			8 =>
-			 [
-			 	0 => 'Un texte avec des entit&eacute;s &amp;&lt;&gt;&quot;',
-			 	1 => 'Un texte avec des entit&eacute;s &amp;&lt;&gt;&quot;',
-			 	2 => false,
-			 ],
-			9 =>
-			 [
-			 	0 => 'Un texte sans entites &amp;&lt;>"&#8217;',
-			 	1 => 'Un texte sans entites &<>"\'',
-			 	2 => true,
-			 ],
-			10 =>
-			 [
-			 	0 => 'Un texte sans entites &amp;&lt;>"&#8217;',
-			 	1 => 'Un texte sans entites &<>"\'',
-			 	2 => false,
-			 ],
-			11 =>
-			 [
-			 	0 => "{{{Des raccourcis}}} {italique} {{gras}} <code class=\"spip_code spip_code_inline\" dir=\"ltr\">du code</code>",
-			 	1 => '{{{Des raccourcis}}} {italique} {{gras}} <code>du code</code>',
-			 	2 => true,
-			 ],
-			12 =>
-			 [
-			 	0 => '{{{Des raccourcis}}} {italique} {{gras}} <code>du code</code>',
-			 	1 => '{{{Des raccourcis}}} {italique} {{gras}} <code>du code</code>',
-			 	2 => false,
-			 ],
-			13 =>
-			 [
-			 	0 => 'Un modele <tt>&lt;modeleinexistant|lien=[-&gt;http://www.spip.net]&gt;</tt>',
-			 	1 => 'Un modele <modeleinexistant|lien=[->http://www.spip.net]>',
-			 	2 => true,
-			 ],
-			14 =>
-			 [
-			 	0 => 'Un modele <tt>&lt;modeleinexistant|lien=[-&gt;http://www.spip.net]&gt;</tt>',
-			 	1 => 'Un modele <modeleinexistant|lien=[->http://www.spip.net]>',
-			 	2 => false,
-			 ],
-			15 =>
-			 [
-			    0 => 'Chat&nbsp;!!',
-			    1 => 'Chat!!'
-			 ],
-			// et pas apres "(" -- http://trac.rezo.net/trac/spip/changeset/10177
-			'r10177' =>
-			 [
-			    0 => '(!)',
-			    1 => '(!)'
-			 ],
-		];
-	}
-}