Author: Andreas Möller (localheinz)
Committer: GitHub (web-flow)
Pusher: saundefined
Date: 2024-02-13T16:16:24+03:00

Commit: 
https://github.com/php/web-php/commit/33dd2a89e1cfd5d926fa628609c917edc780bb4d
Raw diff: 
https://github.com/php/web-php/commit/33dd2a89e1cfd5d926fa628609c917edc780bb4d.diff

Enhancement: Turn PHPT tests into PHPUnit test cases (#943)

Changed paths:
  A  tests/Unit/CleanAntiSpamTest.php
  A  tests/Unit/GenChallengeTest.php
  A  tests/Unit/IsEmailableAddressTest.php
  A  tests/Unit/TestAnswerTest.php
  A  tests/Unit/UserNotes/SorterTest.php
  D  tests/Unit/UserNotes/Sorter/sort-no-notes.phpt
  D  tests/Unit/UserNotes/Sorter/sort-notes-full.phpt
  D  tests/Unit/UserNotes/Sorter/sort-single-note-with-no-votes.phpt
  D  tests/Unit/UserNotes/Sorter/sort-some-notes.phpt
  D  tests/Unit/clean-anti-spam.phpt
  D  tests/Unit/gen-challenge.phpt
  D  tests/Unit/is-emailable-address.phpt
  D  tests/Unit/test-answer.phpt
  M  composer.json
  M  tests/phpunit.xml


Diff:

diff --git a/composer.json b/composer.json
index 2b512311e5..f413b64ac9 100644
--- a/composer.json
+++ b/composer.json
@@ -22,7 +22,7 @@
     },
     "autoload-dev": {
         "psr-4": {
-            "phpweb\\Test\\EndToEnd\\": "tests/EndToEnd/"
+            "phpweb\\Test\\": "tests/"
         }
     },
     "config": {
diff --git a/tests/Unit/CleanAntiSpamTest.php b/tests/Unit/CleanAntiSpamTest.php
new file mode 100644
index 0000000000..8d16fed9f1
--- /dev/null
+++ b/tests/Unit/CleanAntiSpamTest.php
@@ -0,0 +1,54 @@
+<?php
+
+declare(strict_types=1);
+
+namespace phpweb\Test\Unit;
+
+use PHPUnit\Framework;
+
+#[Framework\Attributes\CoversFunction('clean_AntiSPAM')]
+final class CleanAntiSpamTest extends Framework\TestCase
+{
+    public static function setUpBeforeClass(): void
+    {
+        require_once __DIR__ . '/../../include/email-validation.inc';
+    }
+
+    #[Framework\Attributes\DataProvider('provideEmailAndExpectedEmail')]
+    public function testCleanAntiSpamReturnsCleanedEmail(
+        string $email,
+        string $expectedEmail,
+    ): void
+    {
+        $cleanedEmail = clean_AntiSPAM($email);
+
+        self::assertSame($expectedEmail, $cleanedEmail);
+    }
+
+    /**
+     * @return \Generator<string, array{0: string, 1: string}>
+     */
+    public static function provideEmailAndExpectedEmail(): \Generator
+    {
+        $values = [
+            'asasasd324...@php.net' => 'asasasd324...@php.net',
+            'jcastagnetto-delete-th...@yahoo.com' => 'jcastagne...@yahoo.com',
+            'jcastagnetto-i-hate-s...@nospamyahoo.com' => 
'jcastagne...@yahoo.com',
+            'jcastagnetto-no-s...@yahoo.com' => 'jcastagne...@yahoo.com',
+            'jcastagne...@nospam-yahoo.com' => 'jcastagne...@yahoo.com',
+            'jesu...@scripps.edu' => 'jesu...@scripps.edu',
+            'jmcastagne...@chek2.com' => 'jmcastagne...@chek2.com',
+            'jmcastagne...@yahoo.com' => 'jmcastagne...@yahoo.com',
+            'some-wr...@asdas.com' => 'some-wr...@asdas.com',
+            'wrong-address-with@@@@-remove_me-and-some-i-hate_SPAM-stuff' => 
'wrong-address-with@@@@and-somestuff',
+            'wrong-email-addr...@lists.php.net' => 
'wrong-email-addr...@lists.php.net',
+        ];
+
+        foreach ($values as $email => $expectedEmail) {
+            yield $email => [
+                $email,
+                $expectedEmail,
+            ];
+        }
+    }
+}
diff --git a/tests/Unit/GenChallengeTest.php b/tests/Unit/GenChallengeTest.php
new file mode 100644
index 0000000000..a22e861312
--- /dev/null
+++ b/tests/Unit/GenChallengeTest.php
@@ -0,0 +1,160 @@
+<?php
+
+declare(strict_types=1);
+
+namespace phpweb\Test\Unit;
+
+use PHPUnit\Framework;
+
+#[Framework\Attributes\CoversFunction('gen_challenge')]
+#[Framework\Attributes\UsesFunction('gen_minus')]
+#[Framework\Attributes\UsesFunction('gen_plus')]
+#[Framework\Attributes\UsesFunction('print_infix')]
+#[Framework\Attributes\UsesFunction('print_prefix')]
+final class GenChallengeTest extends Framework\TestCase
+{
+    public static function setUpBeforeClass(): void
+    {
+        require_once __DIR__ . '/../../manual/spam_challenge.php';
+
+        mt_srand(9001);
+    }
+
+    public function testGenChallengeReturnsChallenge(): void {
+        $challenges = array_map(static function (): array {
+            [$function, $argumentOne, $argumentTwo, $question] = 
gen_challenge();
+
+            return [
+                'function' => $function,
+                'argumentOne' => $argumentOne,
+                'argumentTwo' => $argumentTwo,
+                'question' => $question,
+            ];
+        }, range(1, 20));
+
+        $expected = [
+            [
+                'function' => 'min',
+                'argumentOne' => 'two',
+                'argumentTwo' => 'one',
+                'question' => 'min(two, one)',
+            ],
+            [
+                'function' => 'minus',
+                'argumentOne' => 'five',
+                'argumentTwo' => 'five',
+                'question' => 'five minus five',
+            ],
+            [
+                'function' => 'minus',
+                'argumentOne' => 'four',
+                'argumentTwo' => 'four',
+                'question' => 'four minus four',
+            ],
+            [
+                'function' => 'min',
+                'argumentOne' => 'nine',
+                'argumentTwo' => 'seven',
+                'question' => 'min(nine, seven)',
+            ],
+            [
+                'function' => 'minus',
+                'argumentOne' => 'seven',
+                'argumentTwo' => 'six',
+                'question' => 'seven minus six',
+            ],
+            [
+                'function' => 'max',
+                'argumentOne' => 'three',
+                'argumentTwo' => 'six',
+                'question' => 'max(three, six)',
+            ],
+            [
+                'function' => 'max',
+                'argumentOne' => 'six',
+                'argumentTwo' => 'five',
+                'question' => 'max(six, five)',
+            ],
+            [
+                'function' => 'max',
+                'argumentOne' => 'four',
+                'argumentTwo' => 'three',
+                'question' => 'max(four, three)',
+            ],
+            [
+                'function' => 'min',
+                'argumentOne' => 'two',
+                'argumentTwo' => 'nine',
+                'question' => 'min(two, nine)',
+            ],
+            [
+                'function' => 'plus',
+                'argumentOne' => 'eight',
+                'argumentTwo' => 'one',
+                'question' => 'eight plus one',
+            ],
+            [
+                'function' => 'plus',
+                'argumentOne' => 'three',
+                'argumentTwo' => 'five',
+                'question' => 'three plus five',
+            ],
+            [
+                'function' => 'min',
+                'argumentOne' => 'eight',
+                'argumentTwo' => 'three',
+                'question' => 'min(eight, three)',
+            ],
+            [
+                'function' => 'max',
+                'argumentOne' => 'zero',
+                'argumentTwo' => 'nine',
+                'question' => 'max(zero, nine)',
+            ],
+            [
+                'function' => 'min',
+                'argumentOne' => 'five',
+                'argumentTwo' => 'nine',
+                'question' => 'min(five, nine)',
+            ],
+            [
+                'function' => 'minus',
+                'argumentOne' => 'six',
+                'argumentTwo' => 'four',
+                'question' => 'six minus four',
+            ],
+            [
+                'function' => 'max',
+                'argumentOne' => 'one',
+                'argumentTwo' => 'one',
+                'question' => 'max(one, one)',
+            ],
+            [
+                'function' => 'plus',
+                'argumentOne' => 'five',
+                'argumentTwo' => 'zero',
+                'question' => 'five plus zero',
+            ],
+            [
+                'function' => 'minus',
+                'argumentOne' => 'nine',
+                'argumentTwo' => 'eight',
+                'question' => 'nine minus eight',
+            ],
+            [
+                'function' => 'minus',
+                'argumentOne' => 'three',
+                'argumentTwo' => 'one',
+                'question' => 'three minus one',
+            ],
+            [
+                'function' => 'min',
+                'argumentOne' => 'three',
+                'argumentTwo' => 'one',
+                'question' => 'min(three, one)',
+            ],
+        ];
+
+        self::assertSame($expected, $challenges);
+    }
+}
diff --git a/tests/Unit/IsEmailableAddressTest.php 
b/tests/Unit/IsEmailableAddressTest.php
new file mode 100644
index 0000000000..900f356e1d
--- /dev/null
+++ b/tests/Unit/IsEmailableAddressTest.php
@@ -0,0 +1,73 @@
+<?php
+
+declare(strict_types=1);
+
+namespace phpweb\Test\Unit;
+
+use PHPUnit\Framework;
+
+#[Framework\Attributes\CoversFunction('is_emailable_address')]
+final class IsEmailableAddressTest extends Framework\TestCase
+{
+    public static function setUpBeforeClass(): void
+    {
+        require_once __DIR__ . '/../../include/email-validation.inc';
+    }
+
+    #[Framework\Attributes\DataProvider('provideInvalidEmail')]
+    public function 
testIsEmailableAddressReturnsFalseWhenEmailIsInvalid(string $email): void
+    {
+        $isEmailableAddress = is_emailable_address($email);
+
+        self::assertFalse($isEmailableAddress);
+    }
+
+    /**
+     * @return \Generator<string, array{0: string}>
+     */
+    public static function provideInvalidEmail(): \Generator
+    {
+        $values = [
+            'jcastagnetto-i-hate-s...@nospamyahoo.test',
+            'jcastagne...@nospam-yahoo.com',
+            'jmcastagne...@chek2.com',
+            'wrong-address-with@@@@-remove_me-and-some-i-hate_SPAM-stuff',
+            'wrong-email-addr...@lists.php.net',
+        ];
+
+        foreach ($values as $value) {
+            yield $value => [
+                $value,
+            ];
+        }
+    }
+
+    #[Framework\Attributes\DataProvider('provideValidEmail')]
+    public function testIsEmailableAddressReturnsTrueWhenEmailIsValid(string 
$email): void
+    {
+        $isEmailableAddress = is_emailable_address($email);
+
+        self::assertTrue($isEmailableAddress);
+    }
+
+    /**
+     * @return \Generator<string, array{0: string}>
+     */
+    public static function provideValidEmail(): \Generator
+    {
+        $values = [
+            'asasasd324...@php.net',
+            'jcastagnetto-delete-th...@yahoo.com',
+            'jcastagnetto-no-s...@yahoo.com',
+            'jesu...@scripps.edu',
+            'jmcastagne...@yahoo.com',
+            'some-wr...@asdas.com',
+        ];
+
+        foreach ($values as $value) {
+            yield $value => [
+                $value,
+            ];
+        }
+    }
+}
diff --git a/tests/Unit/TestAnswerTest.php b/tests/Unit/TestAnswerTest.php
new file mode 100644
index 0000000000..a2ae710d63
--- /dev/null
+++ b/tests/Unit/TestAnswerTest.php
@@ -0,0 +1,101 @@
+<?php
+
+declare(strict_types=1);
+
+namespace phpweb\Test\Unit;
+
+use PHPUnit\Framework;
+
+#[Framework\Attributes\CoversFunction('test_answer')]
+#[Framework\Attributes\UsesFunction('minus')]
+#[Framework\Attributes\UsesFunction('plus')]
+final class TestAnswerTest extends Framework\TestCase
+{
+    public static function setUpBeforeClass(): void
+    {
+        require_once __DIR__ . '/../../manual/spam_challenge.php';
+    }
+
+    
#[Framework\Attributes\DataProvider('provideFunctionArgumentsAnswerAndExpectedIsValid')]
+    public function testAnswerReturnsIsValid(
+        string $function,
+        string $argumentOne,
+        string $argumentTwo,
+        string $answer,
+        bool $expectedIsValid,
+    ): void {
+        $isValid = test_answer(
+            $function,
+            $argumentOne,
+            $argumentTwo,
+            $answer,
+        );
+
+        self::assertSame($expectedIsValid, $isValid);
+    }
+
+    /**
+     * @return array<int, array{function: string, argumentOne: string, 
argumentTwo: string, answer: string, expectedIsValid: bool}>
+     */
+    public static function provideFunctionArgumentsAnswerAndExpectedIsValid(): 
array
+    {
+        return [
+            [
+                'function' => 'max',
+                'argumentOne' => 'two',
+                'argumentTwo' => 'one',
+                'answer' => 'two',
+                'expectedIsValid' => true,
+            ],
+            [
+                'function' => 'min',
+                'argumentOne' => 'two',
+                'argumentTwo' => 'one',
+                'answer' => 'one',
+                'expectedIsValid' => true,
+            ],
+            [
+                'function' => 'minus',
+                'argumentOne' => 'five',
+                'argumentTwo' => 'five',
+                'answer' => 'zero',
+                'expectedIsValid' => true,
+            ],
+            [
+                'function' => 'plus',
+                'argumentOne' => 'eight',
+                'argumentTwo' => 'one',
+                'answer' => 'nine',
+                'expectedIsValid' => true,
+            ],
+            [
+                'function' => 'max',
+                'argumentOne' => 'three',
+                'argumentTwo' => 'six',
+                'answer' => 'nine',
+                'expectedIsValid' => false,
+            ],
+            [
+                'function' => 'min',
+                'argumentOne' => 'two',
+                'argumentTwo' => 'nine',
+                'answer' => 'seven',
+                'expectedIsValid' => false,
+            ],
+            [
+                'function' => 'minus',
+                'argumentOne' => 'seven',
+                'argumentTwo' => 'six',
+                'answer' => 'four',
+                'expectedIsValid' => false,
+            ],
+            [
+                'function' => 'plus',
+                'argumentOne' => 'eight',
+                'argumentTwo' => 'one',
+                'answer' => 'seven',
+                'expectedIsValid' => false,
+            ],
+        ];
+    }
+}
diff --git a/tests/Unit/UserNotes/Sorter/sort-no-notes.phpt 
b/tests/Unit/UserNotes/Sorter/sort-no-notes.phpt
deleted file mode 100644
index 891587b298..0000000000
--- a/tests/Unit/UserNotes/Sorter/sort-no-notes.phpt
+++ /dev/null
@@ -1,28 +0,0 @@
---TEST--
-sort no notes
---INI--
-precision=-1
---FILE--
-<?php
-
-use phpweb\UserNotes\Sorter;
-use phpweb\UserNotes\UserNote;
-
-require_once __DIR__ . "/../../../../src/autoload.php";
-
-$notes = [];
-
-$sorter = new Sorter();
-$sorter->sort($notes);
-var_dump(array_map(function (UserNote $note): array {
-    return [
-        "id" => $note->id,
-        "ts" => $note->ts,
-        "upvotes" => $note->upvotes,
-        "downvotes" => $note->downvotes,
-    ];
-}, $notes));
-?>
---EXPECT--
-array(0) {
-}
diff --git a/tests/Unit/UserNotes/Sorter/sort-notes-full.phpt 
b/tests/Unit/UserNotes/Sorter/sort-notes-full.phpt
deleted file mode 100644
index b2d3790ec2..0000000000
--- a/tests/Unit/UserNotes/Sorter/sort-notes-full.phpt
+++ /dev/null
@@ -1,540 +0,0 @@
---TEST--
-sort sample notes from strpos notes
---INI--
-precision=-1
---FILE--
-<?php
-
-use phpweb\UserNotes\Sorter;
-use phpweb\UserNotes\UserNote;
-
-require_once __DIR__ . "/../../../../src/autoload.php";
-
-$file = file(__DIR__ . "/../../../../backend/notes/d7/d7742c269d23ea86");
-$notes = [];
-foreach ($file as $line) {
-    @list($id, $sect, $rate, $ts, $user, $note, $up, $down) = explode("|", 
$line);
-    $notes[$id] = new UserNote($id, $sect, $rate, $ts, $user, 
base64_decode($note, true), (int) $up, (int) $down);
-}
-
-$sorter = new Sorter();
-$sorter->sort($notes);
-var_dump(array_map(function (UserNote $note): array {
-    return [
-        "id" => $note->id,
-        "ts" => $note->ts,
-        "upvotes" => $note->upvotes,
-        "downvotes" => $note->downvotes,
-    ];
-}, $notes));
-?>
---EXPECT--
-array(46) {
-  [110464]=>
-  array(4) {
-    ["id"]=>
-    string(6) "110464"
-    ["ts"]=>
-    string(10) "1351105628"
-    ["upvotes"]=>
-    int(10)
-    ["downvotes"]=>
-    int(2)
-  }
-  [93816]=>
-  array(4) {
-    ["id"]=>
-    string(5) "93816"
-    ["ts"]=>
-    string(10) "1254343074"
-    ["upvotes"]=>
-    int(4)
-    ["downvotes"]=>
-    int(1)
-  }
-  [92849]=>
-  array(4) {
-    ["id"]=>
-    string(5) "92849"
-    ["ts"]=>
-    string(10) "1249997359"
-    ["upvotes"]=>
-    int(4)
-    ["downvotes"]=>
-    int(1)
-  }
-  [70394]=>
-  array(4) {
-    ["id"]=>
-    string(5) "70394"
-    ["ts"]=>
-    string(10) "1160823504"
-    ["upvotes"]=>
-    int(7)
-    ["downvotes"]=>
-    int(3)
-  }
-  [106407]=>
-  array(4) {
-    ["id"]=>
-    string(6) "106407"
-    ["ts"]=>
-    string(10) "1320695958"
-    ["upvotes"]=>
-    int(5)
-    ["downvotes"]=>
-    int(2)
-  }
-  [87868]=>
-  array(4) {
-    ["id"]=>
-    string(5) "87868"
-    ["ts"]=>
-    string(10) "1230396484"
-    ["upvotes"]=>
-    int(5)
-    ["downvotes"]=>
-    int(2)
-  }
-  [82229]=>
-  array(4) {
-    ["id"]=>
-    string(5) "82229"
-    ["ts"]=>
-    string(10) "1207066654"
-    ["upvotes"]=>
-    int(3)
-    ["downvotes"]=>
-    int(1)
-  }
-  [80363]=>
-  array(4) {
-    ["id"]=>
-    string(5) "80363"
-    ["ts"]=>
-    string(10) "1200066332"
-    ["upvotes"]=>
-    int(3)
-    ["downvotes"]=>
-    int(1)
-  }
-  [75146]=>
-  array(4) {
-    ["id"]=>
-    string(5) "75146"
-    ["ts"]=>
-    string(10) "1179195708"
-    ["upvotes"]=>
-    int(3)
-    ["downvotes"]=>
-    int(1)
-  }
-  [102773]=>
-  array(4) {
-    ["id"]=>
-    string(6) "102773"
-    ["ts"]=>
-    string(10) "1299300266"
-    ["upvotes"]=>
-    int(6)
-    ["downvotes"]=>
-    int(3)
-  }
-  [111422]=>
-  array(4) {
-    ["id"]=>
-    string(6) "111422"
-    ["ts"]=>
-    string(10) "1361224553"
-    ["upvotes"]=>
-    int(4)
-    ["downvotes"]=>
-    int(2)
-  }
-  [94469]=>
-  array(4) {
-    ["id"]=>
-    string(5) "94469"
-    ["ts"]=>
-    string(10) "1257516214"
-    ["upvotes"]=>
-    int(4)
-    ["downvotes"]=>
-    int(2)
-  }
-  [99476]=>
-  array(4) {
-    ["id"]=>
-    string(5) "99476"
-    ["ts"]=>
-    string(10) "1282186230"
-    ["upvotes"]=>
-    int(2)
-    ["downvotes"]=>
-    int(1)
-  }
-  [99332]=>
-  array(4) {
-    ["id"]=>
-    string(5) "99332"
-    ["ts"]=>
-    string(10) "1281503061"
-    ["upvotes"]=>
-    int(2)
-    ["downvotes"]=>
-    int(1)
-  }
-  [96926]=>
-  array(4) {
-    ["id"]=>
-    string(5) "96926"
-    ["ts"]=>
-    string(10) "1269330508"
-    ["upvotes"]=>
-    int(2)
-    ["downvotes"]=>
-    int(1)
-  }
-  [93887]=>
-  array(4) {
-    ["id"]=>
-    string(5) "93887"
-    ["ts"]=>
-    string(10) "1254733546"
-    ["upvotes"]=>
-    int(2)
-    ["downvotes"]=>
-    int(1)
-  }
-  [87061]=>
-  array(4) {
-    ["id"]=>
-    string(5) "87061"
-    ["ts"]=>
-    string(10) "1226944352"
-    ["upvotes"]=>
-    int(2)
-    ["downvotes"]=>
-    int(1)
-  }
-  [85835]=>
-  array(4) {
-    ["id"]=>
-    string(5) "85835"
-    ["ts"]=>
-    string(10) "1221823065"
-    ["upvotes"]=>
-    int(2)
-    ["downvotes"]=>
-    int(1)
-  }
-  [72466]=>
-  array(4) {
-    ["id"]=>
-    string(5) "72466"
-    ["ts"]=>
-    string(10) "1169208947"
-    ["upvotes"]=>
-    int(2)
-    ["downvotes"]=>
-    int(1)
-  }
-  [69927]=>
-  array(4) {
-    ["id"]=>
-    string(5) "69927"
-    ["ts"]=>
-    string(10) "1159299208"
-    ["upvotes"]=>
-    int(2)
-    ["downvotes"]=>
-    int(1)
-  }
-  [41762]=>
-  array(4) {
-    ["id"]=>
-    string(5) "41762"
-    ["ts"]=>
-    string(10) "1082561916"
-    ["upvotes"]=>
-    int(2)
-    ["downvotes"]=>
-    int(1)
-  }
-  [107678]=>
-  array(4) {
-    ["id"]=>
-    string(6) "107678"
-    ["ts"]=>
-    string(10) "1330185500"
-    ["upvotes"]=>
-    int(3)
-    ["downvotes"]=>
-    int(2)
-  }
-  [89788]=>
-  array(4) {
-    ["id"]=>
-    string(5) "89788"
-    ["ts"]=>
-    string(10) "1237801686"
-    ["upvotes"]=>
-    int(3)
-    ["downvotes"]=>
-    int(2)
-  }
-  [74286]=>
-  array(4) {
-    ["id"]=>
-    string(5) "74286"
-    ["ts"]=>
-    string(10) "1175594279"
-    ["upvotes"]=>
-    int(3)
-    ["downvotes"]=>
-    int(2)
-  }
-  [58688]=>
-  array(4) {
-    ["id"]=>
-    string(5) "58688"
-    ["ts"]=>
-    string(10) "1131719326"
-    ["upvotes"]=>
-    int(3)
-    ["downvotes"]=>
-    int(2)
-  }
-  [45088]=>
-  array(4) {
-    ["id"]=>
-    string(5) "45088"
-    ["ts"]=>
-    string(10) "1093449145"
-    ["upvotes"]=>
-    int(3)
-    ["downvotes"]=>
-    int(2)
-  }
-  [49739]=>
-  array(4) {
-    ["id"]=>
-    string(5) "49739"
-    ["ts"]=>
-    string(10) "1107758025"
-    ["upvotes"]=>
-    int(2)
-    ["downvotes"]=>
-    int(0)
-  }
-  [108426]=>
-  array(4) {
-    ["id"]=>
-    string(6) "108426"
-    ["ts"]=>
-    string(10) "1335372412"
-    ["upvotes"]=>
-    int(2)
-    ["downvotes"]=>
-    int(2)
-  }
-  [107240]=>
-  array(4) {
-    ["id"]=>
-    string(6) "107240"
-    ["ts"]=>
-    string(10) "1327390683"
-    ["upvotes"]=>
-    int(2)
-    ["downvotes"]=>
-    int(2)
-  }
-  [105984]=>
-  array(4) {
-    ["id"]=>
-    string(6) "105984"
-    ["ts"]=>
-    string(10) "1317340435"
-    ["upvotes"]=>
-    int(2)
-    ["downvotes"]=>
-    int(2)
-  }
-  [99440]=>
-  array(4) {
-    ["id"]=>
-    string(5) "99440"
-    ["ts"]=>
-    string(10) "1282058725"
-    ["upvotes"]=>
-    int(4)
-    ["downvotes"]=>
-    int(4)
-  }
-  [93566]=>
-  array(4) {
-    ["id"]=>
-    string(5) "93566"
-    ["ts"]=>
-    string(10) "1253094436"
-    ["upvotes"]=>
-    int(2)
-    ["downvotes"]=>
-    int(2)
-  }
-  [88798]=>
-  array(4) {
-    ["id"]=>
-    string(5) "88798"
-    ["ts"]=>
-    string(10) "1234090865"
-    ["upvotes"]=>
-    int(1)
-    ["downvotes"]=>
-    int(1)
-  }
-  [84910]=>
-  array(4) {
-    ["id"]=>
-    string(5) "84910"
-    ["ts"]=>
-    string(10) "1217938595"
-    ["upvotes"]=>
-    int(2)
-    ["downvotes"]=>
-    int(2)
-  }
-  [83914]=>
-  array(4) {
-    ["id"]=>
-    string(5) "83914"
-    ["ts"]=>
-    string(10) "1213760931"
-    ["upvotes"]=>
-    int(1)
-    ["downvotes"]=>
-    int(1)
-  }
-  [78483]=>
-  array(4) {
-    ["id"]=>
-    string(5) "78483"
-    ["ts"]=>
-    string(10) "1192337362"
-    ["upvotes"]=>
-    int(1)
-    ["downvotes"]=>
-    int(1)
-  }
-  [74763]=>
-  array(4) {
-    ["id"]=>
-    string(5) "74763"
-    ["ts"]=>
-    string(10) "1177577911"
-    ["upvotes"]=>
-    int(1)
-    ["downvotes"]=>
-    int(1)
-  }
-  [74432]=>
-  array(4) {
-    ["id"]=>
-    string(5) "74432"
-    ["ts"]=>
-    string(10) "1176269720"
-    ["upvotes"]=>
-    int(1)
-    ["downvotes"]=>
-    int(1)
-  }
-  [47879]=>
-  array(4) {
-    ["id"]=>
-    string(5) "47879"
-    ["ts"]=>
-    string(10) "1102066114"
-    ["upvotes"]=>
-    int(1)
-    ["downvotes"]=>
-    int(1)
-  }
-  [40617]=>
-  array(4) {
-    ["id"]=>
-    string(5) "40617"
-    ["ts"]=>
-    string(10) "1078853206"
-    ["upvotes"]=>
-    int(0)
-    ["downvotes"]=>
-    int(0)
-  }
-  [38375]=>
-  array(4) {
-    ["id"]=>
-    string(5) "38375"
-    ["ts"]=>
-    string(10) "1071743640"
-    ["upvotes"]=>
-    int(1)
-    ["downvotes"]=>
-    int(1)
-  }
-  [106295]=>
-  array(4) {
-    ["id"]=>
-    string(6) "106295"
-    ["ts"]=>
-    string(10) "1319574977"
-    ["upvotes"]=>
-    int(2)
-    ["downvotes"]=>
-    int(3)
-  }
-  [95875]=>
-  array(4) {
-    ["id"]=>
-    string(5) "95875"
-    ["ts"]=>
-    string(10) "1264517173"
-    ["upvotes"]=>
-    int(2)
-    ["downvotes"]=>
-    int(3)
-  }
-  [102336]=>
-  array(4) {
-    ["id"]=>
-    string(6) "102336"
-    ["ts"]=>
-    string(10) "1297217360"
-    ["upvotes"]=>
-    int(1)
-    ["downvotes"]=>
-    int(2)
-  }
-  [93781]=>
-  array(4) {
-    ["id"]=>
-    string(5) "93781"
-    ["ts"]=>
-    string(10) "1254189367"
-    ["upvotes"]=>
-    int(1)
-    ["downvotes"]=>
-    int(2)
-  }
-  [90065]=>
-  array(4) {
-    ["id"]=>
-    string(5) "90065"
-    ["ts"]=>
-    string(10) "1238827503"
-    ["upvotes"]=>
-    int(1)
-    ["downvotes"]=>
-    int(2)
-  }
-}
-
diff --git a/tests/Unit/UserNotes/Sorter/sort-single-note-with-no-votes.phpt 
b/tests/Unit/UserNotes/Sorter/sort-single-note-with-no-votes.phpt
deleted file mode 100644
index d90e710cfe..0000000000
--- a/tests/Unit/UserNotes/Sorter/sort-single-note-with-no-votes.phpt
+++ /dev/null
@@ -1,41 +0,0 @@
---TEST--
-sort a single note with no votes
---INI--
-precision=-1
---FILE--
-<?php
-
-use phpweb\UserNotes\Sorter;
-use phpweb\UserNotes\UserNote;
-
-require_once __DIR__ . "/../../../../src/autoload.php";
-
-$notes = [
-    new UserNote('1', '', '', '1613487094', '', '', 0, 0),
-];
-
-$sorter = new Sorter();
-$sorter->sort($notes);
-var_dump(array_map(function (UserNote $note): array {
-  return [
-      "id" => $note->id,
-      "ts" => $note->ts,
-      "upvotes" => $note->upvotes,
-      "downvotes" => $note->downvotes,
-  ];
-}, $notes));
-?>
---EXPECT--
-array(1) {
-  [0]=>
-  array(4) {
-    ["id"]=>
-    string(1) "1"
-    ["ts"]=>
-    string(10) "1613487094"
-    ["upvotes"]=>
-    int(0)
-    ["downvotes"]=>
-    int(0)
-  }
-}
diff --git a/tests/Unit/UserNotes/Sorter/sort-some-notes.phpt 
b/tests/Unit/UserNotes/Sorter/sort-some-notes.phpt
deleted file mode 100644
index 9782e362af..0000000000
--- a/tests/Unit/UserNotes/Sorter/sort-some-notes.phpt
+++ /dev/null
@@ -1,77 +0,0 @@
---TEST--
-sort some notes
---INI--
-precision=-1
---FILE--
-<?php
-
-use phpweb\UserNotes\Sorter;
-use phpweb\UserNotes\UserNote;
-
-require_once __DIR__ . "/../../../../src/autoload.php";
-
-$notes = [
-    new UserNote('1', '', '', '1613487094', '', '', 0, 2),
-    new UserNote('2', '', '', '1508180150', '', '', 0, 0),
-    new UserNote('3', '', '', '1508179844', '', '', 14, 3),
-    new UserNote('4', '', '', '1508179844', '', '', 14, 3),
-];
-
-$sorter = new Sorter();
-$sorter->sort($notes);
-var_dump(array_map(function (UserNote $note): array {
-    return [
-        "id" => $note->id,
-        "ts" => $note->ts,
-        "upvotes" => $note->upvotes,
-        "downvotes" => $note->downvotes,
-    ];
-}, $notes));
-?>
---EXPECT--
-array(4) {
-  [2]=>
-  array(4) {
-    ["id"]=>
-    string(1) "3"
-    ["ts"]=>
-    string(10) "1508179844"
-    ["upvotes"]=>
-    int(14)
-    ["downvotes"]=>
-    int(3)
-  }
-  [3]=>
-  array(4) {
-    ["id"]=>
-    string(1) "4"
-    ["ts"]=>
-    string(10) "1508179844"
-    ["upvotes"]=>
-    int(14)
-    ["downvotes"]=>
-    int(3)
-  }
-  [1]=>
-  array(4) {
-    ["id"]=>
-    string(1) "2"
-    ["ts"]=>
-    string(10) "1508180150"
-    ["upvotes"]=>
-    int(0)
-    ["downvotes"]=>
-    int(0)
-  }
-  [0]=>
-  array(4) {
-    ["id"]=>
-    string(1) "1"
-    ["ts"]=>
-    string(10) "1613487094"
-    ["upvotes"]=>
-    int(0)
-    ["downvotes"]=>
-    int(2)
-  }
-}
diff --git a/tests/Unit/UserNotes/SorterTest.php 
b/tests/Unit/UserNotes/SorterTest.php
new file mode 100644
index 0000000000..16d3f60aa9
--- /dev/null
+++ b/tests/Unit/UserNotes/SorterTest.php
@@ -0,0 +1,409 @@
+<?php
+
+declare(strict_types=1);
+
+namespace phpweb\Test\Unit\UserNotes;
+
+use PHPUnit\Framework;
+use phpweb\UserNotes\Sorter;
+use phpweb\UserNotes\UserNote;
+
+#[Framework\Attributes\CoversClass(Sorter::class)]
+#[Framework\Attributes\UsesClass(UserNote::class)]
+final class SorterTest extends Framework\TestCase
+{
+    public function testSortSortsNotesWhenNotesAreEmpty(): void
+    {
+        $notes = [];
+
+        $sorter = new Sorter();
+
+        $sorter->sort($notes);
+
+        self::assertSame([], $notes);
+    }
+
+    public function testSortSortsSingleNoteWithNoVotes(): void
+    {
+        $notes = [
+            new UserNote('1', '', '', '1613487094', '', '', 0, 0),
+        ];
+
+        $sorter = new Sorter();
+
+        $sorter->sort($notes);
+
+        $normalized = array_map(static function (UserNote $note): array {
+            return self::normalize($note);
+        }, $notes);
+
+        $expected = [
+            0 => [
+                'downvotes' => 0,
+                'id' => '1',
+                'ts' => '1613487094',
+                'upvotes' => 0,
+            ],
+        ];
+
+        self::assertSame($expected, $normalized);
+    }
+
+    public function testSortSortsSomeNotes(): void
+    {
+        $notes = [
+            new UserNote('1', '', '', '1613487094', '', '', 0, 2),
+            new UserNote('2', '', '', '1508180150', '', '', 0, 0),
+            new UserNote('3', '', '', '1508179844', '', '', 14, 3),
+            new UserNote('4', '', '', '1508179844', '', '', 14, 3),
+        ];
+
+        $sorter = new Sorter();
+
+        $sorter->sort($notes);
+
+        $normalized = array_map(static function (UserNote $note): array {
+            return self::normalize($note);
+        }, $notes);
+
+        $expected = [
+            2 => [
+                'downvotes' => 3,
+                'id' => '3',
+                'ts' => '1508179844',
+                'upvotes' => 14,
+            ],
+            3 => [
+                'downvotes' => 3,
+                'id' => '4',
+                'ts' => '1508179844',
+                'upvotes' => 14,
+            ],
+            1 => [
+                'downvotes' => 0,
+                'id' => '2',
+                'ts' => '1508180150',
+                'upvotes' => 0,
+            ],
+            0 => [
+                'downvotes' => 2,
+                'id' => '1',
+                'ts' => '1613487094',
+                'upvotes' => 0,
+            ],
+        ];
+
+        self::assertSame($expected, $normalized);
+    }
+
+    public function testSortSortsFullNotes(): void
+    {
+        $file = file(__DIR__ . '/../../../backend/notes/d7/d7742c269d23ea86');
+
+        $notes = [];
+
+        foreach ($file as $line) {
+            @list($id, $sect, $rate, $ts, $user, $note, $up, $down) = 
explode('|', $line);
+            $notes[$id] = new UserNote($id, $sect, $rate, $ts, $user, 
base64_decode($note, true), (int) $up, (int) $down);
+        }
+
+        $sorter = new Sorter();
+
+        $sorter->sort($notes);
+
+        $normalized = array_map(static function (UserNote $note): array {
+            return self::normalize($note);
+        }, $notes);
+
+        $expected = [
+            110464 => [
+                'downvotes' => 2,
+                'id' => '110464',
+                'ts' => '1351105628',
+                'upvotes' => 10,
+            ],
+            93816 => [
+                'downvotes' => 1,
+                'id' => '93816',
+                'ts' => '1254343074',
+                'upvotes' => 4,
+            ],
+            92849 => [
+                'downvotes' => 1,
+                'id' => '92849',
+                'ts' => '1249997359',
+                'upvotes' => 4,
+            ],
+            70394 => [
+                'downvotes' => 3,
+                'id' => '70394',
+                'ts' => '1160823504',
+                'upvotes' => 7,
+            ],
+            106407 => [
+                'downvotes' => 2,
+                'id' => '106407',
+                'ts' => '1320695958',
+                'upvotes' => 5,
+            ],
+            87868 => [
+                'downvotes' => 2,
+                'id' => '87868',
+                'ts' => '1230396484',
+                'upvotes' => 5,
+            ],
+            82229 => [
+                'downvotes' => 1,
+                'id' => '82229',
+                'ts' => '1207066654',
+                'upvotes' => 3,
+            ],
+            80363 => [
+                'downvotes' => 1,
+                'id' => '80363',
+                'ts' => '1200066332',
+                'upvotes' => 3,
+            ],
+            75146 => [
+                'downvotes' => 1,
+                'id' => '75146',
+                'ts' => '1179195708',
+                'upvotes' => 3,
+            ],
+            102773 => [
+                'downvotes' => 3,
+                'id' => '102773',
+                'ts' => '1299300266',
+                'upvotes' => 6,
+            ],
+            111422 => [
+                'downvotes' => 2,
+                'id' => '111422',
+                'ts' => '1361224553',
+                'upvotes' => 4,
+            ],
+            94469 => [
+                'downvotes' => 2,
+                'id' => '94469',
+                'ts' => '1257516214',
+                'upvotes' => 4,
+            ],
+            99476 => [
+                'downvotes' => 1,
+                'id' => '99476',
+                'ts' => '1282186230',
+                'upvotes' => 2,
+            ],
+            99332 => [
+                'downvotes' => 1,
+                'id' => '99332',
+                'ts' => '1281503061',
+                'upvotes' => 2,
+            ],
+            96926 => [
+                'downvotes' => 1,
+                'id' => '96926',
+                'ts' => '1269330508',
+                'upvotes' => 2,
+            ],
+            93887 => [
+                'downvotes' => 1,
+                'id' => '93887',
+                'ts' => '1254733546',
+                'upvotes' => 2,
+            ],
+            87061 => [
+                'downvotes' => 1,
+                'id' => '87061',
+                'ts' => '1226944352',
+                'upvotes' => 2,
+            ],
+            85835 => [
+                'downvotes' => 1,
+                'id' => '85835',
+                'ts' => '1221823065',
+                'upvotes' => 2,
+            ],
+            72466 => [
+                'downvotes' => 1,
+                'id' => '72466',
+                'ts' => '1169208947',
+                'upvotes' => 2,
+            ],
+            69927 => [
+                'downvotes' => 1,
+                'id' => '69927',
+                'ts' => '1159299208',
+                'upvotes' => 2,
+            ],
+            41762 => [
+                'downvotes' => 1,
+                'id' => '41762',
+                'ts' => '1082561916',
+                'upvotes' => 2,
+            ],
+            107678 => [
+                'downvotes' => 2,
+                'id' => '107678',
+                'ts' => '1330185500',
+                'upvotes' => 3,
+            ],
+            89788 => [
+                'downvotes' => 2,
+                'id' => '89788',
+                'ts' => '1237801686',
+                'upvotes' => 3,
+            ],
+            74286 => [
+                'downvotes' => 2,
+                'id' => '74286',
+                'ts' => '1175594279',
+                'upvotes' => 3,
+            ],
+            58688 => [
+                'downvotes' => 2,
+                'id' => '58688',
+                'ts' => '1131719326',
+                'upvotes' => 3,
+            ],
+            45088 => [
+                'downvotes' => 2,
+                'id' => '45088',
+                'ts' => '1093449145',
+                'upvotes' => 3,
+            ],
+            49739 => [
+                'downvotes' => 0,
+                'id' => '49739',
+                'ts' => '1107758025',
+                'upvotes' => 2,
+            ],
+            108426 => [
+                'downvotes' => 2,
+                'id' => '108426',
+                'ts' => '1335372412',
+                'upvotes' => 2,
+            ],
+            107240 => [
+                'downvotes' => 2,
+                'id' => '107240',
+                'ts' => '1327390683',
+                'upvotes' => 2,
+            ],
+            105984 => [
+                'downvotes' => 2,
+                'id' => '105984',
+                'ts' => '1317340435',
+                'upvotes' => 2,
+            ],
+            99440 => [
+                'downvotes' => 4,
+                'id' => '99440',
+                'ts' => '1282058725',
+                'upvotes' => 4,
+            ],
+            93566 => [
+                'downvotes' => 2,
+                'id' => '93566',
+                'ts' => '1253094436',
+                'upvotes' => 2,
+            ],
+            88798 => [
+                'downvotes' => 1,
+                'id' => '88798',
+                'ts' => '1234090865',
+                'upvotes' => 1,
+            ],
+            84910 => [
+                'downvotes' => 2,
+                'id' => '84910',
+                'ts' => '1217938595',
+                'upvotes' => 2,
+            ],
+            83914 => [
+                'downvotes' => 1,
+                'id' => '83914',
+                'ts' => '1213760931',
+                'upvotes' => 1,
+            ],
+            78483 => [
+                'downvotes' => 1,
+                'id' => '78483',
+                'ts' => '1192337362',
+                'upvotes' => 1,
+            ],
+            74763 => [
+                'downvotes' => 1,
+                'id' => '74763',
+                'ts' => '1177577911',
+                'upvotes' => 1,
+            ],
+            74432 => [
+                'downvotes' => 1,
+                'id' => '74432',
+                'ts' => '1176269720',
+                'upvotes' => 1,
+            ],
+            47879 => [
+                'downvotes' => 1,
+                'id' => '47879',
+                'ts' => '1102066114',
+                'upvotes' => 1,
+            ],
+            40617 => [
+                'downvotes' => 0,
+                'id' => '40617',
+                'ts' => '1078853206',
+                'upvotes' => 0,
+            ],
+            38375 => [
+                'downvotes' => 1,
+                'id' => '38375',
+                'ts' => '1071743640',
+                'upvotes' => 1,
+            ],
+            106295 => [
+                'downvotes' => 3,
+                'id' => '106295',
+                'ts' => '1319574977',
+                'upvotes' => 2,
+            ],
+            95875 => [
+                'downvotes' => 3,
+                'id' => '95875',
+                'ts' => '1264517173',
+                'upvotes' => 2,
+            ],
+            102336 => [
+                'downvotes' => 2,
+                'id' => '102336',
+                'ts' => '1297217360',
+                'upvotes' => 1,
+            ],
+            93781 => [
+                'downvotes' => 2,
+                'id' => '93781',
+                'ts' => '1254189367',
+                'upvotes' => 1,
+            ],
+            90065 => [
+                'downvotes' => 2,
+                'id' => '90065',
+                'ts' => '1238827503',
+                'upvotes' => 1,
+            ],
+        ];
+
+        self::assertSame($expected, $normalized);
+    }
+
+    private static function normalize(UserNote $note): array
+    {
+        return [
+            'downvotes' => $note->downvotes,
+            'id' => $note->id,
+            'ts' => $note->ts,
+            'upvotes' => $note->upvotes,
+        ];
+    }
+}
diff --git a/tests/Unit/clean-anti-spam.phpt b/tests/Unit/clean-anti-spam.phpt
deleted file mode 100644
index 3a4c1f7c0c..0000000000
--- a/tests/Unit/clean-anti-spam.phpt
+++ /dev/null
@@ -1,53 +0,0 @@
---TEST--
-clean_AntiSPAM() removes spam terms
---FILE--
-<?php
-
-require_once __DIR__ . '/../../include/email-validation.inc';
-
-$emails = array (
-    'asasasd324...@php.net',
-    'jcastagnetto-delete-th...@yahoo.com',
-    'jcastagnetto-i-hate-s...@nospamyahoo.com',
-    'jcastagnetto-no-s...@yahoo.com',
-    'jcastagne...@nospam-yahoo.com',
-    'jesu...@scripps.edu',
-    'jmcastagne...@chek2.com',
-    'jmcastagne...@yahoo.com',
-    'some-wr...@asdas.com',
-    'wrong-address-with@@@@-remove_me-and-some-i-hate_SPAM-stuff',
-    'wrong-email-addr...@lists.php.net',
-);
-
-$cleanedEmails = array_map(static function (string $email): string {
-    return clean_AntiSPAM($email);
-}, $emails);
-
-var_dump($cleanedEmails);
-
-?>
---EXPECT--
-array(11) {
-  [0]=>
-  string(21) "asasasd324...@php.net"
-  [1]=>
-  string(22) "jcastagne...@yahoo.com"
-  [2]=>
-  string(22) "jcastagne...@yahoo.com"
-  [3]=>
-  string(22) "jcastagne...@yahoo.com"
-  [4]=>
-  string(22) "jcastagne...@yahoo.com"
-  [5]=>
-  string(19) "jesu...@scripps.edu"
-  [6]=>
-  string(23) "jmcastagne...@chek2.com"
-  [7]=>
-  string(23) "jmcastagne...@yahoo.com"
-  [8]=>
-  string(20) "some-wr...@asdas.com"
-  [9]=>
-  string(35) "wrong-address-with@@@@and-somestuff"
-  [10]=>
-  string(33) "wrong-email-addr...@lists.php.net"
-}
diff --git a/tests/Unit/gen-challenge.phpt b/tests/Unit/gen-challenge.phpt
deleted file mode 100644
index 54cb864ef6..0000000000
--- a/tests/Unit/gen-challenge.phpt
+++ /dev/null
@@ -1,246 +0,0 @@
---TEST--
-gen_challenge() generates a spam challenge
---FILE--
-<?php
-
-require_once __DIR__ . '/../../manual/spam_challenge.php';
-
-mt_srand(9001);
-
-$challenges = array_map(static function (): array {
-    [$function, $argumentOne, $argumentTwo, $question] = gen_challenge();
-
-    return [
-        'function' => $function,
-        'argumentOne' => $argumentOne,
-        'argumentTwo' => $argumentTwo,
-        'question' => $question,
-    ];
-}, range(1, 20));
-
-var_dump($challenges);
-
-?>
---EXPECT--
-array(20) {
-  [0]=>
-  array(4) {
-    ["function"]=>
-    string(3) "min"
-    ["argumentOne"]=>
-    string(3) "two"
-    ["argumentTwo"]=>
-    string(3) "one"
-    ["question"]=>
-    string(13) "min(two, one)"
-  }
-  [1]=>
-  array(4) {
-    ["function"]=>
-    string(5) "minus"
-    ["argumentOne"]=>
-    string(4) "five"
-    ["argumentTwo"]=>
-    string(4) "five"
-    ["question"]=>
-    string(15) "five minus five"
-  }
-  [2]=>
-  array(4) {
-    ["function"]=>
-    string(5) "minus"
-    ["argumentOne"]=>
-    string(4) "four"
-    ["argumentTwo"]=>
-    string(4) "four"
-    ["question"]=>
-    string(15) "four minus four"
-  }
-  [3]=>
-  array(4) {
-    ["function"]=>
-    string(3) "min"
-    ["argumentOne"]=>
-    string(4) "nine"
-    ["argumentTwo"]=>
-    string(5) "seven"
-    ["question"]=>
-    string(16) "min(nine, seven)"
-  }
-  [4]=>
-  array(4) {
-    ["function"]=>
-    string(5) "minus"
-    ["argumentOne"]=>
-    string(5) "seven"
-    ["argumentTwo"]=>
-    string(3) "six"
-    ["question"]=>
-    string(15) "seven minus six"
-  }
-  [5]=>
-  array(4) {
-    ["function"]=>
-    string(3) "max"
-    ["argumentOne"]=>
-    string(5) "three"
-    ["argumentTwo"]=>
-    string(3) "six"
-    ["question"]=>
-    string(15) "max(three, six)"
-  }
-  [6]=>
-  array(4) {
-    ["function"]=>
-    string(3) "max"
-    ["argumentOne"]=>
-    string(3) "six"
-    ["argumentTwo"]=>
-    string(4) "five"
-    ["question"]=>
-    string(14) "max(six, five)"
-  }
-  [7]=>
-  array(4) {
-    ["function"]=>
-    string(3) "max"
-    ["argumentOne"]=>
-    string(4) "four"
-    ["argumentTwo"]=>
-    string(5) "three"
-    ["question"]=>
-    string(16) "max(four, three)"
-  }
-  [8]=>
-  array(4) {
-    ["function"]=>
-    string(3) "min"
-    ["argumentOne"]=>
-    string(3) "two"
-    ["argumentTwo"]=>
-    string(4) "nine"
-    ["question"]=>
-    string(14) "min(two, nine)"
-  }
-  [9]=>
-  array(4) {
-    ["function"]=>
-    string(4) "plus"
-    ["argumentOne"]=>
-    string(5) "eight"
-    ["argumentTwo"]=>
-    string(3) "one"
-    ["question"]=>
-    string(14) "eight plus one"
-  }
-  [10]=>
-  array(4) {
-    ["function"]=>
-    string(4) "plus"
-    ["argumentOne"]=>
-    string(5) "three"
-    ["argumentTwo"]=>
-    string(4) "five"
-    ["question"]=>
-    string(15) "three plus five"
-  }
-  [11]=>
-  array(4) {
-    ["function"]=>
-    string(3) "min"
-    ["argumentOne"]=>
-    string(5) "eight"
-    ["argumentTwo"]=>
-    string(5) "three"
-    ["question"]=>
-    string(17) "min(eight, three)"
-  }
-  [12]=>
-  array(4) {
-    ["function"]=>
-    string(3) "max"
-    ["argumentOne"]=>
-    string(4) "zero"
-    ["argumentTwo"]=>
-    string(4) "nine"
-    ["question"]=>
-    string(15) "max(zero, nine)"
-  }
-  [13]=>
-  array(4) {
-    ["function"]=>
-    string(3) "min"
-    ["argumentOne"]=>
-    string(4) "five"
-    ["argumentTwo"]=>
-    string(4) "nine"
-    ["question"]=>
-    string(15) "min(five, nine)"
-  }
-  [14]=>
-  array(4) {
-    ["function"]=>
-    string(5) "minus"
-    ["argumentOne"]=>
-    string(3) "six"
-    ["argumentTwo"]=>
-    string(4) "four"
-    ["question"]=>
-    string(14) "six minus four"
-  }
-  [15]=>
-  array(4) {
-    ["function"]=>
-    string(3) "max"
-    ["argumentOne"]=>
-    string(3) "one"
-    ["argumentTwo"]=>
-    string(3) "one"
-    ["question"]=>
-    string(13) "max(one, one)"
-  }
-  [16]=>
-  array(4) {
-    ["function"]=>
-    string(4) "plus"
-    ["argumentOne"]=>
-    string(4) "five"
-    ["argumentTwo"]=>
-    string(4) "zero"
-    ["question"]=>
-    string(14) "five plus zero"
-  }
-  [17]=>
-  array(4) {
-    ["function"]=>
-    string(5) "minus"
-    ["argumentOne"]=>
-    string(4) "nine"
-    ["argumentTwo"]=>
-    string(5) "eight"
-    ["question"]=>
-    string(16) "nine minus eight"
-  }
-  [18]=>
-  array(4) {
-    ["function"]=>
-    string(5) "minus"
-    ["argumentOne"]=>
-    string(5) "three"
-    ["argumentTwo"]=>
-    string(3) "one"
-    ["question"]=>
-    string(15) "three minus one"
-  }
-  [19]=>
-  array(4) {
-    ["function"]=>
-    string(3) "min"
-    ["argumentOne"]=>
-    string(5) "three"
-    ["argumentTwo"]=>
-    string(3) "one"
-    ["question"]=>
-    string(15) "min(three, one)"
-  }
-}
diff --git a/tests/Unit/is-emailable-address.phpt 
b/tests/Unit/is-emailable-address.phpt
deleted file mode 100644
index d5c39d531b..0000000000
--- a/tests/Unit/is-emailable-address.phpt
+++ /dev/null
@@ -1,43 +0,0 @@
---TEST--
-is_emailable_address() returns whether email is emailable
---FILE--
-<?php
-
-require_once __DIR__ . '/../../include/email-validation.inc';
-
-$emails = array(
-    'asasasd324...@php.net',
-    'jcastagnetto-delete-th...@yahoo.com',
-    'jcastagnetto-i-hate-s...@nospamyahoo.test',
-    'jcastagnetto-no-s...@yahoo.com',
-    'jcastagne...@nospam-yahoo.com',
-    'jesu...@scripps.edu',
-    'jmcastagne...@chek2.com',
-    'jmcastagne...@yahoo.com',
-    'some-wr...@asdas.com',
-    'wrong-address-with@@@@-remove_me-and-some-i-hate_SPAM-stuff',
-    'wrong-email-addr...@lists.php.net',
-);
-
-$emailsThatAreEmailableAddresses = array_filter($emails, static function 
(string $email): bool {
-    return is_emailable_address($email);
-});
-
-var_dump($emailsThatAreEmailableAddresses);
-
-?>
---EXPECT--
-array(6) {
-  [0]=>
-  string(21) "asasasd324...@php.net"
-  [1]=>
-  string(35) "jcastagnetto-delete-th...@yahoo.com"
-  [3]=>
-  string(30) "jcastagnetto-no-s...@yahoo.com"
-  [5]=>
-  string(19) "jesu...@scripps.edu"
-  [7]=>
-  string(23) "jmcastagne...@yahoo.com"
-  [8]=>
-  string(20) "some-wr...@asdas.com"
-}
diff --git a/tests/Unit/test-answer.phpt b/tests/Unit/test-answer.phpt
deleted file mode 100644
index f3bfcd402c..0000000000
--- a/tests/Unit/test-answer.phpt
+++ /dev/null
@@ -1,211 +0,0 @@
---TEST--
-test_answer() returns true when answer to spam challenge is valid
---FILE--
-<?php
-
-require_once __DIR__ . '/../../manual/spam_challenge.php';
-
-$answers = [
-    [
-        'function' => 'max',
-        'argumentOne' => 'two',
-        'argumentTwo' => 'one',
-        'question' => 'max(two, one)',
-        'answer' => 'two',
-        'isValid' => true,
-    ],
-    [
-        'function' => 'min',
-        'argumentOne' => 'two',
-        'argumentTwo' => 'one',
-        'question' => 'min(two, one)',
-        'answer' => 'one',
-        'isValid' => true,
-    ],
-    [
-        'function' => 'minus',
-        'argumentOne' => 'five',
-        'argumentTwo' => 'five',
-        'question' => 'minus(five, five)',
-        'answer' => 'zero',
-        'isValid' => true,
-    ],
-    [
-        'function' => 'plus',
-        'argumentOne' => 'eight',
-        'argumentTwo' => 'one',
-        'question' => 'plus(eight, one)',
-        'answer' => 'nine',
-        'isValid' => true,
-    ],
-    [
-        'function' => 'max',
-        'argumentOne' => 'three',
-        'argumentTwo' => 'six',
-        'question' => 'max(three, six)',
-        'answer' => 'nine',
-        'isValid' => false,
-    ],
-    [
-        'function' => 'min',
-        'argumentOne' => 'two',
-        'argumentTwo' => 'nine',
-        'question' => 'min(two, nine)',
-        'answer' => 'seven',
-        'isValid' => false,
-    ],
-    [
-        'function' => 'minus',
-        'argumentOne' => 'seven',
-        'argumentTwo' => 'six',
-        'question' => 'minus(seven, six)',
-        'answer' => 'four',
-        'isValid' => false,
-    ],
-    [
-        'function' => 'plus',
-        'argumentOne' => 'eight',
-        'argumentTwo' => 'one',
-        'question' => 'plus(eight, one)',
-        'answer' => 'seven',
-        'isValid' => false,
-    ],
-];
-
-$results = array_map(static function (array $answer): array {
-    $answer['isValid'] = test_answer(
-        $answer['function'],
-        $answer['argumentOne'],
-        $answer['argumentTwo'],
-        $answer['answer']
-    );
-
-    return $answer;
-}, $answers);
-
-var_dump($results);
-
-?>
---EXPECT--
-array(8) {
-  [0]=>
-  array(6) {
-    ["function"]=>
-    string(3) "max"
-    ["argumentOne"]=>
-    string(3) "two"
-    ["argumentTwo"]=>
-    string(3) "one"
-    ["question"]=>
-    string(13) "max(two, one)"
-    ["answer"]=>
-    string(3) "two"
-    ["isValid"]=>
-    bool(true)
-  }
-  [1]=>
-  array(6) {
-    ["function"]=>
-    string(3) "min"
-    ["argumentOne"]=>
-    string(3) "two"
-    ["argumentTwo"]=>
-    string(3) "one"
-    ["question"]=>
-    string(13) "min(two, one)"
-    ["answer"]=>
-    string(3) "one"
-    ["isValid"]=>
-    bool(true)
-  }
-  [2]=>
-  array(6) {
-    ["function"]=>
-    string(5) "minus"
-    ["argumentOne"]=>
-    string(4) "five"
-    ["argumentTwo"]=>
-    string(4) "five"
-    ["question"]=>
-    string(17) "minus(five, five)"
-    ["answer"]=>
-    string(4) "zero"
-    ["isValid"]=>
-    bool(true)
-  }
-  [3]=>
-  array(6) {
-    ["function"]=>
-    string(4) "plus"
-    ["argumentOne"]=>
-    string(5) "eight"
-    ["argumentTwo"]=>
-    string(3) "one"
-    ["question"]=>
-    string(16) "plus(eight, one)"
-    ["answer"]=>
-    string(4) "nine"
-    ["isValid"]=>
-    bool(true)
-  }
-  [4]=>
-  array(6) {
-    ["function"]=>
-    string(3) "max"
-    ["argumentOne"]=>
-    string(5) "three"
-    ["argumentTwo"]=>
-    string(3) "six"
-    ["question"]=>
-    string(15) "max(three, six)"
-    ["answer"]=>
-    string(4) "nine"
-    ["isValid"]=>
-    bool(false)
-  }
-  [5]=>
-  array(6) {
-    ["function"]=>
-    string(3) "min"
-    ["argumentOne"]=>
-    string(3) "two"
-    ["argumentTwo"]=>
-    string(4) "nine"
-    ["question"]=>
-    string(14) "min(two, nine)"
-    ["answer"]=>
-    string(5) "seven"
-    ["isValid"]=>
-    bool(false)
-  }
-  [6]=>
-  array(6) {
-    ["function"]=>
-    string(5) "minus"
-    ["argumentOne"]=>
-    string(5) "seven"
-    ["argumentTwo"]=>
-    string(3) "six"
-    ["question"]=>
-    string(17) "minus(seven, six)"
-    ["answer"]=>
-    string(4) "four"
-    ["isValid"]=>
-    bool(false)
-  }
-  [7]=>
-  array(6) {
-    ["function"]=>
-    string(4) "plus"
-    ["argumentOne"]=>
-    string(5) "eight"
-    ["argumentTwo"]=>
-    string(3) "one"
-    ["question"]=>
-    string(16) "plus(eight, one)"
-    ["answer"]=>
-    string(5) "seven"
-    ["isValid"]=>
-    bool(false)
-  }
-}
diff --git a/tests/phpunit.xml b/tests/phpunit.xml
index 3eac985e8a..5e81e856f0 100644
--- a/tests/phpunit.xml
+++ b/tests/phpunit.xml
@@ -27,6 +27,8 @@
     <coverage includeUncoveredFiles="true"/>
     <source>
         <include>
+            <directory suffix=".php">../manual/</directory>
+            <directory suffix=".inc">../include/</directory>
             <directory suffix=".php">../src/</directory>
         </include>
     </source>
@@ -35,7 +37,7 @@
             <directory suffix=".php">EndToEnd/</directory>
         </testsuite>
         <testsuite name="unit">
-            <directory suffix=".phpt">Unit/</directory>
+            <directory suffix=".php">Unit/</directory>
         </testsuite>
     </testsuites>
 </phpunit>

-- 
PHP Webmaster List Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to