diff -pruN 6.4.1-1/.github/workflows/continuous-integration-32-bits.yml 6.6.0-1/.github/workflows/continuous-integration-32-bits.yml
--- 6.4.1-1/.github/workflows/continuous-integration-32-bits.yml	1970-01-01 00:00:00.000000000 +0000
+++ 6.6.0-1/.github/workflows/continuous-integration-32-bits.yml	2025-10-10 11:34:09.000000000 +0000
@@ -0,0 +1,50 @@
+name: "Continuous Integration - 32-bits"
+
+on:
+  push:
+    branches:
+      - master
+  pull_request:
+    branches:
+      - master
+
+env:
+  COMPOSER_FLAGS: "--ansi --no-interaction --no-progress --prefer-dist"
+
+jobs:
+  tests:
+    name: "PHP 8.4 - 32-bits"
+
+    runs-on: ubuntu-latest
+    container: shivammathur/node:latest-i386
+
+    steps:
+      - name: "Checkout"
+        uses: "actions/checkout@v4"
+
+      - name: "Install PHP"
+        uses: "shivammathur/setup-php@v2"
+        with:
+          coverage: "none"
+          extensions: "intl, zip"
+          ini-values: "memory_limit=-1, phar.readonly=0, error_reporting=E_ALL, display_errors=On"
+          php-version: "8.4"
+          tools: composer
+
+      - name: Check PHP_INT_MAX
+        run: |
+          MAX=$(php -r "echo PHP_INT_MAX;")
+          if [ "$MAX" -ne 2147483647 ]; then
+            echo "Error: PHP is not 32-bits (PHP_INT_MAX is $MAX)"
+            exit 1
+          fi
+        env:
+          MAX: ""
+
+      - name: Install dependencies
+        run: |
+          git config --global --add safe.directory $(pwd)
+          composer install
+
+      - name: Run tests
+        run: "composer test"
\ No newline at end of file
diff -pruN 6.4.1-1/.github/workflows/continuous-integration.yml 6.6.0-1/.github/workflows/continuous-integration.yml
--- 6.4.1-1/.github/workflows/continuous-integration.yml	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/.github/workflows/continuous-integration.yml	2025-10-10 11:34:09.000000000 +0000
@@ -21,22 +21,14 @@ jobs:
     strategy:
       fail-fast: false
       matrix:
-        php-version:
-          - "7.2"
-          - "7.3"
-          - "7.4"
-          - "8.0"
-          - "8.1"
-          - "8.2"
-          - "8.3"
-          - "8.4"
+        php-version: [ '7.2', '7.3', '7.4', '8.0', '8.1', '8.2', '8.3', '8.4']
         dependencies: [highest]
         include:
           - php-version: "7.2"
             dependencies: lowest
-#          - php-version: "8.5"
-#            dependencies: highest
-#            experimental: true
+          - php-version: "8.5"
+            dependencies: ignore
+            experimental: true
 
     steps:
       - name: "Checkout"
diff -pruN 6.4.1-1/.github/workflows/lint.yml 6.6.0-1/.github/workflows/lint.yml
--- 6.4.1-1/.github/workflows/lint.yml	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/.github/workflows/lint.yml	2025-10-10 11:34:09.000000000 +0000
@@ -36,3 +36,7 @@ jobs:
       - name: "Lint PHP files"
         run: |
           parallel-lint . --checkstyle --exclude vendor --show-deprecated | cs2pr
+
+      - name: "Validate conforming class autoloading"
+        run: |
+          composer dump-autoload --no-dev --optimize --strict-psr --strict-ambiguous
diff -pruN 6.4.1-1/CHANGELOG.md 6.6.0-1/CHANGELOG.md
--- 6.4.1-1/CHANGELOG.md	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/CHANGELOG.md	2025-10-10 11:34:09.000000000 +0000
@@ -7,6 +7,40 @@ and this project adheres to [Semantic Ve
 
 ## [Unreleased]
 
+## [6.6.0] - 2025-10-10
+### Added
+- Add lint check for class autoloading PSR compliance ([#845](https://github.com/jsonrainbow/json-schema/pull/845))
+- add implementation for strict fully validating using draft-06 schema ([#843](https://github.com/jsonrainbow/json-schema/pull/835))
+
+## [6.5.2] - 2025-09-09
+### Fixed
+- Fix issue when http headers are already present ([#843](https://github.com/jsonrainbow/json-schema/pull/843))
+
+## [6.5.1] - 2025-08-29
+### Changed
+- ci: Add PHP 8.5 to pipeline, ignoring dependencies and as experimental ([#842](https://github.com/jsonrainbow/json-schema/pull/842))
+
+## [6.5.0] - 2025-08-29
+### Changed
+- Update test case to current (PHP) standards ([#831](https://github.com/jsonrainbow/json-schema/pull/831))
+- Upgrade test suite to use generators ([#834](https://github.com/jsonrainbow/json-schema/pull/834))
+- update to latest json schema test suite ([#821](https://github.com/jsonrainbow/json-schema/pull/821))
+### Fixed
+- Fix PHP 8.5 $http_response_header deprecation ([#840](https://github.com/jsonrainbow/json-schema/pull/840))
+
+## [6.4.2] - 2025-06-03
+### Fixed
+- Fix objects are non-unique despite key order ([#819](https://github.com/jsonrainbow/json-schema/pull/819))
+- Id's not being resolved and id property affects sibling ref which it should not do ([#828](https://github.com/jsonrainbow/json-schema/pull/828)) 
+
+### Changed
+- Added extra breaking change to UPDATE-6.0.md regarding BaseConstraint::addError signature change ([#823](https://github.com/jsonrainbow/json-schema/pull/823))
+- Update constraint class to PHP 7.2 language level ([#824](https://github.com/jsonrainbow/json-schema/pull/824))
+- Update base constraint class to PHP 7.2 language level ([#826](https://github.com/jsonrainbow/json-schema/pull/826))
+
+### Added
+- Introduce 32 bits CI workflow on latest php version ([#825](https://github.com/jsonrainbow/json-schema/pull/825))
+
 ## [6.4.1] - 2025-04-04
 ### Fixed
 - Fix support for 32bits PHP ([#817](https://github.com/jsonrainbow/json-schema/pull/817))
diff -pruN 6.4.1-1/README.md 6.6.0-1/README.md
--- 6.4.1-1/README.md	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/README.md	2025-10-10 11:34:09.000000000 +0000
@@ -3,10 +3,19 @@
 [![Build Status](https://github.com/jsonrainbow/json-schema/actions/workflows/continuous-integration.yml/badge.svg)](https://github.com/jsonrainbow/json-schema/actions)
 [![Latest Stable Version](https://poser.pugx.org/justinrainbow/json-schema/v/stable)](https://packagist.org/packages/justinrainbow/json-schema)
 [![Total Downloads](https://poser.pugx.org/justinrainbow/json-schema/downloads)](https://packagist.org/packages/justinrainbow/json-schema/stats)
+![Supported Dialects](https://img.shields.io/endpoint?url=https%3A%2F%2Fbowtie.report%2Fbadges%2Fphp-justinrainbow-json-schema%2Fsupported_versions.json)
 
-A PHP Implementation for validating `JSON` Structures against a given `Schema` with support for `Schemas` of Draft-3 or Draft-4. Features of newer Drafts might not be supported. See [Table of All Versions of Everything](https://json-schema.org/specification-links.html#table-of-all-versions-of-everything) to get an overview of all existing Drafts.
+A PHP Implementation for validating `JSON` Structures against a given `Schema` with support for `Schemas` of Draft-3, 
+Draft-4 or Draft-6. 
+
+Features of newer Drafts might not be supported. See [Table of All Versions of Everything](https://json-schema.org/specification-links.html#table-of-all-versions-of-everything) to get an overview 
+of all existing Drafts. See [json-schema](http://json-schema.org/) for more details about the JSON Schema specification
+
+# Compliance
+![Draft 3](https://img.shields.io/endpoint?url=https%3A%2F%2Fbowtie.report%2Fbadges%2Fphp-justinrainbow-json-schema%2Fcompliance%2Fdraft3.json)
+![Draft 4](https://img.shields.io/endpoint?url=https%3A%2F%2Fbowtie.report%2Fbadges%2Fphp-justinrainbow-json-schema%2Fcompliance%2Fdraft4.json)
+![Draft 6](https://img.shields.io/endpoint?url=https%3A%2F%2Fbowtie.report%2Fbadges%2Fphp-justinrainbow-json-schema%2Fcompliance%2Fdraft6.json)
 
-See [json-schema](http://json-schema.org/) for more details.
 
 ## Installation
 
@@ -187,24 +196,25 @@ A number of flags are available to alter
 third argument to `Validator::validate()`, or can be provided as the third argument to
 `Factory::__construct()` if you wish to persist them across multiple `validate()` calls.
 
-| Flag | Description |
-|------|-------------|
-| `Constraint::CHECK_MODE_NORMAL` | Validate in 'normal' mode - this is the default |
-| `Constraint::CHECK_MODE_TYPE_CAST` | Enable fuzzy type checking for associative arrays and objects |
-| `Constraint::CHECK_MODE_COERCE_TYPES` | Convert data types to match the schema where possible |
-| `Constraint::CHECK_MODE_EARLY_COERCE` | Apply type coercion as soon as possible |
-| `Constraint::CHECK_MODE_APPLY_DEFAULTS` | Apply default values from the schema if not set |
-| `Constraint::CHECK_MODE_ONLY_REQUIRED_DEFAULTS` | When applying defaults, only set values that are required |
-| `Constraint::CHECK_MODE_EXCEPTIONS` | Throw an exception immediately if validation fails |
-| `Constraint::CHECK_MODE_DISABLE_FORMAT` | Do not validate "format" constraints |
-| `Constraint::CHECK_MODE_VALIDATE_SCHEMA` | Validate the schema as well as the provided document |
+| Flag                                            | Description                                                     |
+|-------------------------------------------------|-----------------------------------------------------------------|
+| `Constraint::CHECK_MODE_NORMAL`                 | Validate in 'normal' mode - this is the default                 |
+| `Constraint::CHECK_MODE_TYPE_CAST`              | Enable fuzzy type checking for associative arrays and objects   |
+| `Constraint::CHECK_MODE_COERCE_TYPES` [^1][^2]  | Convert data types to match the schema where possible           |
+| `Constraint::CHECK_MODE_EARLY_COERCE` [^2]      | Apply type coercion as soon as possible                         |
+| `Constraint::CHECK_MODE_APPLY_DEFAULTS` [^1]    | Apply default values from the schema if not set                 |
+| `Constraint::CHECK_MODE_ONLY_REQUIRED_DEFAULTS` | When applying defaults, only set values that are required       |
+| `Constraint::CHECK_MODE_EXCEPTIONS`             | Throw an exception immediately if validation fails              |
+| `Constraint::CHECK_MODE_DISABLE_FORMAT`         | Do not validate "format" constraints                            |
+| `Constraint::CHECK_MODE_VALIDATE_SCHEMA`        | Validate the schema as well as the provided document            |
+| `Constraint::CHECK_MODE_STRICT` [^3]            | Validate the scheme using strict mode using the specified draft | 
 
-Please note that using `CHECK_MODE_COERCE_TYPES` or `CHECK_MODE_APPLY_DEFAULTS` will modify your
+[^1]: Please note that using `CHECK_MODE_COERCE_TYPES` or `CHECK_MODE_APPLY_DEFAULTS` will modify your
 original data.
-
-`CHECK_MODE_EARLY_COERCE` has no effect unless used in combination with `CHECK_MODE_COERCE_TYPES`. If
+[^2]: `CHECK_MODE_EARLY_COERCE` has no effect unless used in combination with `CHECK_MODE_COERCE_TYPES`. If
 enabled, the validator will use (and coerce) the first compatible type it encounters, even if the
 schema defines another type that matches directly and does not require coercion.
+[^3]: `CHECK_MODE_STRICT` only can be used for Draft-6 at this point.
 
 ## Running the tests
 
diff -pruN 6.4.1-1/UPGRADE-6.0.md 6.6.0-1/UPGRADE-6.0.md
--- 6.4.1-1/UPGRADE-6.0.md	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/UPGRADE-6.0.md	2025-10-10 11:34:09.000000000 +0000
@@ -24,4 +24,22 @@ Thank you for your support and contribut
     foreach ($validator->getErrors() as $error) {
         echo $error['constraint']['name']; // required
     }
-    ```
\ No newline at end of file
+    ```
+
+## BaseConstraint::addError signature changed
+
+* The signature for the `BaseConstraint::AddError` method has changed.
+
+  The `$message` parameter has been removed and replaced by the `ConstraintError` parameter. 
+  The `ConstraintError` object encapsulates the error message along with additional information about the constraint violation.
+
+    *Before*
+    ```php
+    public function addError(?JsonPointer $path, $message, $constraint = '', ?array $more = null)
+    ```
+
+    *After*
+    ```php
+    public function addError(ConstraintError $constraint, ?JsonPointer $path = null, array $more = []): void
+    ```
+
diff -pruN 6.4.1-1/composer.json 6.6.0-1/composer.json
--- 6.4.1-1/composer.json	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/composer.json	2025-10-10 11:34:09.000000000 +0000
@@ -33,7 +33,7 @@
     },
     "require-dev": {
         "friendsofphp/php-cs-fixer": "3.3.0",
-        "json-schema/json-schema-test-suite": "1.2.0",
+        "json-schema/json-schema-test-suite": "^23.2",
         "phpunit/phpunit": "^8.5",
         "phpspec/prophecy": "^1.19",
         "phpstan/phpstan": "^1.12",
@@ -59,11 +59,11 @@
             "type": "package",
             "package": {
                 "name": "json-schema/json-schema-test-suite",
-                "version": "1.2.0",
+                "version": "23.2.0",
                 "source": {
                     "type": "git",
                     "url": "https://github.com/json-schema/JSON-Schema-Test-Suite",
-                    "reference": "1.2.0"
+                    "reference": "23.2.0"
                 }
             }
         }
diff -pruN 6.4.1-1/debian/changelog 6.6.0-1/debian/changelog
--- 6.4.1-1/debian/changelog	2025-04-05 08:54:34.000000000 +0000
+++ 6.6.0-1/debian/changelog	2025-10-12 11:07:51.000000000 +0000
@@ -1,3 +1,60 @@
+php-json-schema (6.6.0-1) unstable; urgency=medium
+
+  [ Viktor Djupsjöbacka ]
+  * Add lint check for class autoloading PSR compliance (#845)
+
+  [ Danny van der Sluijs ]
+  * feat: add implementation for strict fully validating using draft-06 schema
+    (#835)
+  * docs: Prepare 6.6.0 release
+
+  [ David Prévot ]
+  * Drop now useless file
+
+ -- David Prévot <taffit@debian.org>  Sun, 12 Oct 2025 13:07:51 +0200
+
+php-json-schema (6.5.2-1) unstable; urgency=medium
+
+  [ Jordi Boggiano ]
+  * Fix issue when http headers are already present (#843)
+
+  [ Danny van der Sluijs ]
+  * docs: Prepare 6.5.2 release
+
+ -- David Prévot <taffit@debian.org>  Thu, 11 Sep 2025 12:29:25 +0200
+
+php-json-schema (6.5.1-1) unstable; urgency=medium
+
+  * Upload to unstable now that Trixie has been released
+
+  [ Danny van der Sluijs ]
+  * refactor: Update test case to current (PHP) standards (#831)
+  * Upgrade test suite to use generators (#834)
+  * feat: update to latest json schema test suite (#821)
+  * Fix PHP 8.5 $http_response_header deprecation (#841)
+  * docs: Prepare 6.5.1 release
+
+  [ David Prévot ]
+  * debian/control: Document nocheck flag
+  * Remove Rules-Requires-Root
+
+ -- David Prévot <taffit@debian.org>  Wed, 03 Sep 2025 08:21:35 +0200
+
+php-json-schema (6.4.2-1) experimental; urgency=medium
+
+  * Upload to experimental during the freeze
+
+  [ Danny van der Sluijs ]
+  * Fix objects are non unique despite key order (#819)
+  * Update constraint class to PHP 7.2 language level (#824)
+  * refactor: update BaseConstraint.php to PHP 7.2 language level (#826)
+  * docs: prepare 6.4.2 release
+
+  [ Björn Brala ]
+  * Update UPGRADE-6.0.md (#823)
+
+ -- David Prévot <taffit@debian.org>  Thu, 05 Jun 2025 07:58:36 +0200
+
 php-json-schema (6.4.1-1) unstable; urgency=medium
 
   [ Danny van der Sluijs ]
diff -pruN 6.4.1-1/debian/control 6.6.0-1/debian/control
--- 6.4.1-1/debian/control	2025-04-05 08:53:31.000000000 +0000
+++ 6.6.0-1/debian/control	2025-10-12 11:05:00.000000000 +0000
@@ -6,16 +6,15 @@ Uploaders: andrea rota <a@xelera.eu>, Da
 Build-Depends: debhelper-compat (= 13),
                dh-sequence-phpcomposer,
                help2man,
-               php-curl,
+               php-curl <!nocheck>,
                php-enum,
-               php-phpspec-prophecy,
+               php-phpspec-prophecy <!nocheck>,
                phpab,
-               phpunit
+               phpunit <!nocheck>
 Standards-Version: 4.7.2
 Homepage: https://github.com/justinrainbow/json-schema
 Vcs-Git: https://salsa.debian.org/php-team/pear/php-json-schema.git
 Vcs-Browser: https://salsa.debian.org/php-team/pear/php-json-schema
-Rules-Requires-Root: no
 
 Package: php-json-schema
 Architecture: all
diff -pruN 6.4.1-1/debian/docs 6.6.0-1/debian/docs
--- 6.4.1-1/debian/docs	2025-04-05 08:54:34.000000000 +0000
+++ 6.6.0-1/debian/docs	2025-09-03 06:08:30.000000000 +0000
@@ -1,3 +1,3 @@
 README.md
-dist/schema
 UPGRADE-6.0.md
+dist/schema
diff -pruN 6.4.1-1/debian/patches/0003-Modernize-PHPUnit-syntax.patch 6.6.0-1/debian/patches/0003-Modernize-PHPUnit-syntax.patch
--- 6.4.1-1/debian/patches/0003-Modernize-PHPUnit-syntax.patch	2025-04-05 08:52:18.000000000 +0000
+++ 6.6.0-1/debian/patches/0003-Modernize-PHPUnit-syntax.patch	2025-10-12 11:02:56.000000000 +0000
@@ -3,83 +3,73 @@ Date: Sat, 5 Apr 2025 10:48:15 +0200
 Subject: Modernize PHPUnit syntax
 
 ---
- tests/Constraints/BaseTestCase.php                  | 17 +++++------------
+ tests/Constraints/BaseTestCase.php                  |  5 +++++
  tests/Constraints/CoerciveTest.php                  |  5 +++--
  tests/Constraints/DefaultPropertiesTest.php         | 13 ++++---------
  tests/Constraints/FactoryTest.php                   |  9 +++------
  tests/Constraints/FormatTest.php                    | 13 ++++---------
  tests/Constraints/SchemaValidationTest.php          |  9 +++------
  tests/Constraints/TypeTest.php                      |  9 +++------
+ tests/Drafts/Draft3Test.php                         |  2 ++
  tests/Entity/JsonPointerTest.php                    |  5 ++---
+ tests/JsonSchemaTestSuiteTest.php                   |  2 ++
  tests/RefTest.php                                   |  3 ++-
  tests/Rfc3339Test.php                               |  9 +++------
  tests/Tool/DeepComparerTest.php                     |  9 +++------
  .../Validator/RelativeReferenceValidatorTest.php    |  5 +++--
  tests/Tool/Validator/UriValidatorTest.php           |  5 +++--
  tests/Uri/UriRetrieverTest.php                      | 21 ++++++---------------
- 14 files changed, 47 insertions(+), 85 deletions(-)
+ 16 files changed, 51 insertions(+), 73 deletions(-)
 
 diff --git a/tests/Constraints/BaseTestCase.php b/tests/Constraints/BaseTestCase.php
-index ba55b46..009c2d7 100644
+index 3cdb6e0..463cd34 100644
 --- a/tests/Constraints/BaseTestCase.php
 +++ b/tests/Constraints/BaseTestCase.php
-@@ -14,6 +14,7 @@ use JsonSchema\Constraints\Factory;
+@@ -11,6 +11,7 @@ use JsonSchema\DraftIdentifiers;
  use JsonSchema\SchemaStorage;
  use JsonSchema\Uri\UriResolver;
  use JsonSchema\Validator;
 +use PHPUnit\Framework\Attributes\DataProvider;
  
- /**
-  * @package JsonSchema\Tests\Constraints
-@@ -23,9 +24,7 @@ abstract class BaseTestCase extends VeryBaseTestCase
-     protected $schemaSpec = 'http://json-schema.org/draft-04/schema#';
-     protected $validateSchema = false;
- 
--    /**
--     * @dataProvider getInvalidTests
--     */
+ abstract class BaseTestCase extends VeryBaseTestCase
+ {
+@@ -22,6 +23,7 @@ abstract class BaseTestCase extends VeryBaseTestCase
+      *
+      * @param ?int-mask-of<Constraint::CHECK_MODE_*> $checkMode
+      */
 +    #[DataProvider('getInvalidTests')]
-     public function testInvalidCases($input, $schema, $checkMode = Constraint::CHECK_MODE_NORMAL, $errors = []): void
+     public function testInvalidCases(string $input, string $schema, ?int $checkMode = Constraint::CHECK_MODE_NORMAL, array $errors = []): void
      {
-         $checkMode = $checkMode === null ? Constraint::CHECK_MODE_NORMAL : $checkMode;
-@@ -52,9 +51,7 @@ abstract class BaseTestCase extends VeryBaseTestCase
-         $this->assertFalse($validator->isValid(), print_r($validator->getErrors(), true));
-     }
- 
--    /**
--     * @dataProvider getInvalidForAssocTests
--     */
+         $checkMode = $checkMode ?? Constraint::CHECK_MODE_NORMAL;
+@@ -54,6 +56,7 @@ abstract class BaseTestCase extends VeryBaseTestCase
+      *
+      * @param ?int-mask-of<Constraint::CHECK_MODE_*> $checkMode
+      */
 +    #[DataProvider('getInvalidForAssocTests')]
-     public function testInvalidCasesUsingAssoc($input, $schema, $checkMode = Constraint::CHECK_MODE_TYPE_CAST, $errors = []): void
+     public function testInvalidCasesUsingAssoc(string $input, string $schema, ?int $checkMode = Constraint::CHECK_MODE_TYPE_CAST, array $errors = []): void
      {
-         $checkMode = $checkMode === null ? Constraint::CHECK_MODE_TYPE_CAST : $checkMode;
-@@ -84,9 +81,7 @@ abstract class BaseTestCase extends VeryBaseTestCase
-         $this->assertFalse($validator->isValid(), print_r($validator->getErrors(), true));
-     }
- 
--    /**
--     * @dataProvider getValidTests
--     */
+         $checkMode = $checkMode ?? Constraint::CHECK_MODE_TYPE_CAST;
+@@ -89,6 +92,7 @@ abstract class BaseTestCase extends VeryBaseTestCase
+      *
+      * @param ?int-mask-of<Constraint::CHECK_MODE_*> $checkMode
+      */
 +    #[DataProvider('getValidTests')]
-     public function testValidCases($input, $schema, $checkMode = Constraint::CHECK_MODE_NORMAL): void
+     public function testValidCases(string $input, string $schema, int $checkMode = Constraint::CHECK_MODE_NORMAL): void
      {
          if ($this->validateSchema) {
-@@ -106,9 +101,7 @@ abstract class BaseTestCase extends VeryBaseTestCase
-         $this->assertTrue($validator->isValid(), print_r($validator->getErrors(), true));
-     }
- 
--    /**
--     * @dataProvider getValidForAssocTests
--     */
+@@ -115,6 +119,7 @@ abstract class BaseTestCase extends VeryBaseTestCase
+      *
+      * @param ?int-mask-of<Constraint::CHECK_MODE_*> $checkMode
+      */
 +    #[DataProvider('getValidForAssocTests')]
-     public function testValidCasesUsingAssoc($input, $schema, $checkMode = Constraint::CHECK_MODE_TYPE_CAST): void
+     public function testValidCasesUsingAssoc(string $input, string $schema, ?int $checkMode = Constraint::CHECK_MODE_TYPE_CAST): void
      {
          if ($this->validateSchema) {
 diff --git a/tests/Constraints/CoerciveTest.php b/tests/Constraints/CoerciveTest.php
-index 3c028ba..eef2fc1 100644
+index 47dcc07..87251d7 100644
 --- a/tests/Constraints/CoerciveTest.php
 +++ b/tests/Constraints/CoerciveTest.php
-@@ -13,6 +13,7 @@ use JsonSchema\Constraints\Constraint;
+@@ -8,6 +8,7 @@ use JsonSchema\Constraints\Constraint;
  use JsonSchema\Constraints\Factory;
  use JsonSchema\Constraints\TypeCheck\LooseTypeCheck;
  use JsonSchema\Validator;
@@ -87,7 +77,7 @@ index 3c028ba..eef2fc1 100644
  
  class CoerciveTest extends VeryBaseTestCase
  {
-@@ -189,7 +190,7 @@ class CoerciveTest extends VeryBaseTestCase
+@@ -184,7 +185,7 @@ class CoerciveTest extends VeryBaseTestCase
          return $tests;
      }
  
@@ -96,7 +86,7 @@ index 3c028ba..eef2fc1 100644
      public function testCoerceCases($schema, $data, $startType, $endType, $endValue, $valid, $extraFlags = 0, $assoc = false): void
      {
          $validator = new Validator($this->factory);
-@@ -231,7 +232,7 @@ class CoerciveTest extends VeryBaseTestCase
+@@ -226,7 +227,7 @@ class CoerciveTest extends VeryBaseTestCase
          }
      }
  
@@ -106,10 +96,10 @@ index 3c028ba..eef2fc1 100644
      {
          $this->testCoerceCases($schema, $data, $startType, $endType, $endValue, $valid, $early, true);
 diff --git a/tests/Constraints/DefaultPropertiesTest.php b/tests/Constraints/DefaultPropertiesTest.php
-index 2849835..702de51 100644
+index e43b980..084b2fd 100644
 --- a/tests/Constraints/DefaultPropertiesTest.php
 +++ b/tests/Constraints/DefaultPropertiesTest.php
-@@ -13,6 +13,7 @@ use JsonSchema\Constraints\Constraint;
+@@ -8,6 +8,7 @@ use JsonSchema\Constraints\Constraint;
  use JsonSchema\Constraints\Factory;
  use JsonSchema\SchemaStorage;
  use JsonSchema\Validator;
@@ -117,7 +107,7 @@ index 2849835..702de51 100644
  
  class DefaultPropertiesTest extends VeryBaseTestCase
  {
-@@ -167,9 +168,7 @@ class DefaultPropertiesTest extends VeryBaseTestCase
+@@ -162,9 +163,7 @@ class DefaultPropertiesTest extends VeryBaseTestCase
          ];
      }
  
@@ -128,7 +118,7 @@ index 2849835..702de51 100644
      public function testValidCases($input, $schema, $expectOutput = null, $checkMode = 0): void
      {
          if (is_string($input)) {
-@@ -194,9 +193,7 @@ class DefaultPropertiesTest extends VeryBaseTestCase
+@@ -189,9 +188,7 @@ class DefaultPropertiesTest extends VeryBaseTestCase
          }
      }
  
@@ -139,7 +129,7 @@ index 2849835..702de51 100644
      public function testValidCasesUsingAssoc($input, $schema, $expectOutput = null, $checkMode = 0): void
      {
          $input = json_decode($input, true);
-@@ -205,9 +202,7 @@ class DefaultPropertiesTest extends VeryBaseTestCase
+@@ -200,9 +197,7 @@ class DefaultPropertiesTest extends VeryBaseTestCase
          self::testValidCases($input, $schema, $expectOutput, $checkMode);
      }
  
@@ -151,10 +141,10 @@ index 2849835..702de51 100644
      {
          $input = json_decode($input, true);
 diff --git a/tests/Constraints/FactoryTest.php b/tests/Constraints/FactoryTest.php
-index 9136f50..70917a4 100644
+index 0ff6e92..55892e0 100644
 --- a/tests/Constraints/FactoryTest.php
 +++ b/tests/Constraints/FactoryTest.php
-@@ -17,6 +17,7 @@ use JsonSchema\Constraints\ConstraintInterface;
+@@ -10,6 +10,7 @@ use JsonSchema\Constraints\ConstraintInterface;
  use JsonSchema\Constraints\Factory;
  use JsonSchema\Entity\JsonPointer;
  use JsonSchema\Exception\InvalidArgumentException;
@@ -162,7 +152,7 @@ index 9136f50..70917a4 100644
  use PHPUnit\Framework\TestCase;
  
  class MyBadConstraint
-@@ -32,9 +33,7 @@ class MyStringConstraint extends Constraint
+@@ -25,9 +26,7 @@ class MyStringConstraint extends Constraint
  
  class FactoryTest extends TestCase
  {
@@ -173,7 +163,7 @@ index 9136f50..70917a4 100644
      public function testCreateInstanceForConstraintName(string $constraintName, string $expectedClass): void
      {
          $factory = new Factory();
-@@ -59,9 +58,7 @@ class FactoryTest extends TestCase
+@@ -52,9 +51,7 @@ class FactoryTest extends TestCase
          yield 'Schema' => ['schema', Constraints\SchemaConstraint::class];
      }
  
@@ -185,10 +175,10 @@ index 9136f50..70917a4 100644
      {
          $factory = new Factory();
 diff --git a/tests/Constraints/FormatTest.php b/tests/Constraints/FormatTest.php
-index 25eab1c..03a45dd 100644
+index 7247105..67ef74b 100644
 --- a/tests/Constraints/FormatTest.php
 +++ b/tests/Constraints/FormatTest.php
-@@ -12,6 +12,7 @@ namespace JsonSchema\Tests\Constraints;
+@@ -7,6 +7,7 @@ namespace JsonSchema\Tests\Constraints;
  use JsonSchema\Constraints\Constraint;
  use JsonSchema\Constraints\Factory;
  use JsonSchema\Constraints\FormatConstraint;
@@ -196,7 +186,7 @@ index 25eab1c..03a45dd 100644
  
  class FormatTest extends BaseTestCase
  {
-@@ -54,9 +55,7 @@ class FormatTest extends BaseTestCase
+@@ -50,9 +51,7 @@ class FormatTest extends BaseTestCase
          $this->assertEmpty($validator->getErrors());
      }
  
@@ -207,7 +197,7 @@ index 25eab1c..03a45dd 100644
      public function testValidFormat($string, $format): void
      {
          $validator = new FormatConstraint();
-@@ -67,9 +66,7 @@ class FormatTest extends BaseTestCase
+@@ -63,9 +62,7 @@ class FormatTest extends BaseTestCase
          $this->assertEmpty($validator->getErrors());
      }
  
@@ -218,7 +208,7 @@ index 25eab1c..03a45dd 100644
      public function testInvalidFormat($string, $format): void
      {
          $validator = new FormatConstraint();
-@@ -80,9 +77,7 @@ class FormatTest extends BaseTestCase
+@@ -76,9 +73,7 @@ class FormatTest extends BaseTestCase
          $this->assertCount(1, $validator->getErrors(), 'Expected 1 error');
      }
  
@@ -230,10 +220,10 @@ index 25eab1c..03a45dd 100644
      {
          $factory = new Factory();
 diff --git a/tests/Constraints/SchemaValidationTest.php b/tests/Constraints/SchemaValidationTest.php
-index 65268f4..7b20061 100644
+index e7b4196..b4c92ef 100644
 --- a/tests/Constraints/SchemaValidationTest.php
 +++ b/tests/Constraints/SchemaValidationTest.php
-@@ -11,6 +11,7 @@ namespace JsonSchema\Tests\Constraints;
+@@ -6,6 +6,7 @@ namespace JsonSchema\Tests\Constraints;
  
  use JsonSchema\Constraints\Constraint;
  use JsonSchema\Validator;
@@ -241,7 +231,7 @@ index 65268f4..7b20061 100644
  use PHPUnit\Framework\TestCase;
  
  class SchemaValidationTest extends TestCase
-@@ -61,9 +62,7 @@ class SchemaValidationTest extends TestCase
+@@ -56,9 +57,7 @@ class SchemaValidationTest extends TestCase
          ];
      }
  
@@ -252,7 +242,7 @@ index 65268f4..7b20061 100644
      public function testInvalidCases($schema): void
      {
          $input = json_decode('{"propertyOne":"valueOne"}');
-@@ -82,9 +81,7 @@ class SchemaValidationTest extends TestCase
+@@ -77,9 +76,7 @@ class SchemaValidationTest extends TestCase
          }
      }
  
@@ -264,18 +254,18 @@ index 65268f4..7b20061 100644
      {
          $input = json_decode('{"propertyOne":"valueOne"}');
 diff --git a/tests/Constraints/TypeTest.php b/tests/Constraints/TypeTest.php
-index 1b6edc4..8056e65 100644
+index 8292b9b..d9bf404 100644
 --- a/tests/Constraints/TypeTest.php
 +++ b/tests/Constraints/TypeTest.php
-@@ -11,6 +11,7 @@ namespace JsonSchema\Tests\Constraints;
+@@ -6,6 +6,7 @@ namespace JsonSchema\Tests\Constraints;
  
  use JsonSchema\Constraints\TypeCheck\LooseTypeCheck;
  use JsonSchema\Constraints\TypeConstraint;
 +use PHPUnit\Framework\Attributes\DataProvider;
  use PHPUnit\Framework\TestCase;
  
- /**
-@@ -41,9 +42,7 @@ class TypeTest extends TestCase
+ class TypeTest extends TestCase
+@@ -29,9 +30,7 @@ class TypeTest extends TestCase
          ];
      }
  
@@ -286,7 +276,7 @@ index 1b6edc4..8056e65 100644
      public function testIndefiniteArticleForTypeInTypeCheckErrorMessage($type, $wording, $value = null, $label = 'NULL'): void
      {
          $constraint = new TypeConstraint();
-@@ -100,9 +99,7 @@ class TypeTest extends TestCase
+@@ -88,9 +87,7 @@ class TypeTest extends TestCase
          return $wordings;
      }
  
@@ -297,20 +287,37 @@ index 1b6edc4..8056e65 100644
      public function testValidateTypeNameWording($nameWording): void
      {
          $t = new TypeConstraint();
+diff --git a/tests/Drafts/Draft3Test.php b/tests/Drafts/Draft3Test.php
+index 1edee6b..f56d4a7 100644
+--- a/tests/Drafts/Draft3Test.php
++++ b/tests/Drafts/Draft3Test.php
+@@ -8,6 +8,7 @@ use JsonSchema\Constraints\Factory;
+ use JsonSchema\DraftIdentifiers;
+ use JsonSchema\SchemaStorage;
+ use JsonSchema\Validator;
++use PHPUnit\Framework\Attributes\DataProvider;
+ 
+ class Draft3Test extends BaseDraftTestCase
+ {
+@@ -24,6 +25,7 @@ class Draft3Test extends BaseDraftTestCase
+      * @param mixed $data
+      * @dataProvider refPreventsASiblingIdFromChangingTheBaseUriProvider
+      */
++    #[DataProvider('refPreventsASiblingIdFromChangingTheBaseUriProvider')]
+     public function testRefPreventsASiblingIdFromChangingTheBaseUriProvider($data, bool $expectedResult): void
+     {
+         $schema = json_decode(<<<'JSON'
 diff --git a/tests/Entity/JsonPointerTest.php b/tests/Entity/JsonPointerTest.php
-index cb27c68..3f7dff6 100644
+index f6be662..2ac0168 100644
 --- a/tests/Entity/JsonPointerTest.php
 +++ b/tests/Entity/JsonPointerTest.php
-@@ -13,6 +13,7 @@ namespace JsonSchema\Tests\Entity;
+@@ -6,13 +6,12 @@ namespace JsonSchema\Tests\Entity;
  
  use JsonSchema\Entity\JsonPointer;
  use JsonSchema\Exception\InvalidArgumentException;
 +use PHPUnit\Framework\Attributes\DataProvider;
  use PHPUnit\Framework\TestCase;
  
- /**
-@@ -22,9 +23,7 @@ use PHPUnit\Framework\TestCase;
-  */
  class JsonPointerTest extends TestCase
  {
 -    /**
@@ -320,11 +327,31 @@ index cb27c68..3f7dff6 100644
      public function testJsonPointer(
          string $testValue,
          string $expectedFileName,
+diff --git a/tests/JsonSchemaTestSuiteTest.php b/tests/JsonSchemaTestSuiteTest.php
+index 9e07c3a..bcbcc8c 100644
+--- a/tests/JsonSchemaTestSuiteTest.php
++++ b/tests/JsonSchemaTestSuiteTest.php
+@@ -10,6 +10,7 @@ use JsonSchema\Constraints\Factory;
+ use JsonSchema\SchemaStorage;
+ use JsonSchema\SchemaStorageInterface;
+ use JsonSchema\Validator;
++use PHPUnit\Framework\Attributes\DataProvider;
+ use PHPUnit\Framework\TestCase;
+ use RecursiveDirectoryIterator;
+ use RecursiveIteratorIterator;
+@@ -22,6 +23,7 @@ class JsonSchemaTestSuiteTest extends TestCase
+      * @param \stdClass|bool $schema
+      * @param mixed          $data
+      */
++    #[DataProvider('casesDataProvider')]
+     public function testTestCaseValidatesCorrectly(
+         string $testCaseDescription,
+         string $testDescription,
 diff --git a/tests/RefTest.php b/tests/RefTest.php
-index 3b66d58..7ebaf64 100644
+index 574fe9c..5ea6b66 100644
 --- a/tests/RefTest.php
 +++ b/tests/RefTest.php
-@@ -10,6 +10,7 @@
+@@ -5,6 +5,7 @@ declare(strict_types=1);
  namespace JsonSchema\Tests;
  
  use JsonSchema\Validator;
@@ -332,7 +359,7 @@ index 3b66d58..7ebaf64 100644
  use PHPUnit\Framework\TestCase;
  
  class RefTest extends TestCase
-@@ -61,7 +62,7 @@ class RefTest extends TestCase
+@@ -56,7 +57,7 @@ class RefTest extends TestCase
          ];
      }
  
@@ -402,11 +429,11 @@ index cb7b02a..197e42e 100644
      {
          self::assertFalse(DeepComparer::isEqual($left, $right));
 diff --git a/tests/Tool/Validator/RelativeReferenceValidatorTest.php b/tests/Tool/Validator/RelativeReferenceValidatorTest.php
-index 2a9b6d6..04f1bd2 100644
+index 7b46e23..ade3788 100644
 --- a/tests/Tool/Validator/RelativeReferenceValidatorTest.php
 +++ b/tests/Tool/Validator/RelativeReferenceValidatorTest.php
 @@ -5,17 +5,18 @@ declare(strict_types=1);
- namespace Tool\Validator;
+ namespace JsonSchema\Tests\Tool\Validator;
  
  use JsonSchema\Tool\Validator\RelativeReferenceValidator;
 +use PHPUnit\Framework\Attributes\DataProvider;
@@ -427,11 +454,11 @@ index 2a9b6d6..04f1bd2 100644
      {
          self::assertFalse(RelativeReferenceValidator::isValid($ref));
 diff --git a/tests/Tool/Validator/UriValidatorTest.php b/tests/Tool/Validator/UriValidatorTest.php
-index 80a45c8..83cc0d9 100644
+index 13e99b8..56e6f8a 100644
 --- a/tests/Tool/Validator/UriValidatorTest.php
 +++ b/tests/Tool/Validator/UriValidatorTest.php
 @@ -5,17 +5,18 @@ declare(strict_types=1);
- namespace Tool\Validator;
+ namespace JsonSchema\Tests\Tool\Validator;
  
  use JsonSchema\Tool\Validator\UriValidator;
 +use PHPUnit\Framework\Attributes\DataProvider;
@@ -452,18 +479,18 @@ index 80a45c8..83cc0d9 100644
      {
          self::assertFalse(UriValidator::isValid($uri));
 diff --git a/tests/Uri/UriRetrieverTest.php b/tests/Uri/UriRetrieverTest.php
-index e1addf8..1343dbf 100644
+index 8baf0ff..0173b9b 100644
 --- a/tests/Uri/UriRetrieverTest.php
 +++ b/tests/Uri/UriRetrieverTest.php
-@@ -15,6 +15,7 @@ use JsonSchema\Exception\ResourceNotFoundException;
+@@ -11,6 +11,7 @@ use JsonSchema\Exception\ResourceNotFoundException;
  use JsonSchema\Exception\UriResolverException;
  use JsonSchema\Uri\UriRetriever;
  use JsonSchema\Validator;
 +use PHPUnit\Framework\Attributes\DataProvider;
  use PHPUnit\Framework\TestCase;
  
- /**
-@@ -47,9 +48,7 @@ class UriRetrieverTest extends TestCase
+ class UriRetrieverTest extends TestCase
+@@ -40,9 +41,7 @@ class UriRetrieverTest extends TestCase
          return $retriever;
      }
  
@@ -474,7 +501,7 @@ index e1addf8..1343dbf 100644
      public function testChildExtendsParentValidTest($childSchema, $parentSchema): void
      {
          $this->mockRetriever($parentSchema);
-@@ -62,9 +61,7 @@ class UriRetrieverTest extends TestCase
+@@ -55,9 +54,7 @@ class UriRetrieverTest extends TestCase
          $this->assertTrue($this->validator->isValid());
      }
  
@@ -485,7 +512,7 @@ index e1addf8..1343dbf 100644
      public function testChildExtendsParentInvalidChildTest($childSchema, $parentSchema): void
      {
          $this->mockRetriever($parentSchema);
-@@ -77,9 +74,7 @@ class UriRetrieverTest extends TestCase
+@@ -70,9 +67,7 @@ class UriRetrieverTest extends TestCase
          $this->assertFalse($this->validator->isValid());
      }
  
@@ -496,7 +523,7 @@ index e1addf8..1343dbf 100644
      public function testChildExtendsParentInvalidParentTest($childSchema, $parentSchema): void
      {
          $this->mockRetriever($parentSchema);
-@@ -92,9 +87,7 @@ class UriRetrieverTest extends TestCase
+@@ -85,9 +80,7 @@ class UriRetrieverTest extends TestCase
          $this->assertFalse($this->validator->isValid());
      }
  
@@ -507,7 +534,7 @@ index e1addf8..1343dbf 100644
      public function testResolveRelativeUri($childSchema, $parentSchema): void
      {
          self::setParentSchemaExtendsValue($parentSchema, 'grandparent');
-@@ -422,9 +415,7 @@ EOF;
+@@ -423,9 +416,7 @@ EOF;
          ];
      }
  
diff -pruN 6.4.1-1/debian/patches/0004-Handle-package.patch 6.6.0-1/debian/patches/0004-Handle-package.patch
--- 6.4.1-1/debian/patches/0004-Handle-package.patch	2025-04-05 08:52:18.000000000 +0000
+++ 6.6.0-1/debian/patches/0004-Handle-package.patch	2025-10-12 11:02:56.000000000 +0000
@@ -7,7 +7,7 @@ Subject: Handle package://
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 diff --git a/src/JsonSchema/Uri/UriRetriever.php b/src/JsonSchema/Uri/UriRetriever.php
-index 4094ccc..79516c9 100644
+index 361512a..fbe992e 100644
 --- a/src/JsonSchema/Uri/UriRetriever.php
 +++ b/src/JsonSchema/Uri/UriRetriever.php
 @@ -344,7 +344,7 @@ class UriRetriever implements BaseUriRetrieverInterface
diff -pruN 6.4.1-1/debian/patches/0005-Use-file-actually-available-in-distributed-package.patch 6.6.0-1/debian/patches/0005-Use-file-actually-available-in-distributed-package.patch
--- 6.4.1-1/debian/patches/0005-Use-file-actually-available-in-distributed-package.patch	2025-04-05 08:52:18.000000000 +0000
+++ 6.6.0-1/debian/patches/0005-Use-file-actually-available-in-distributed-package.patch	2025-10-12 11:02:56.000000000 +0000
@@ -7,10 +7,10 @@ Subject: Use file actually available in
  1 file changed, 2 insertions(+), 2 deletions(-)
 
 diff --git a/tests/Uri/UriRetrieverTest.php b/tests/Uri/UriRetrieverTest.php
-index 8141926..e1addf8 100644
+index 4e79176..8baf0ff 100644
 --- a/tests/Uri/UriRetrieverTest.php
 +++ b/tests/Uri/UriRetrieverTest.php
-@@ -324,11 +324,11 @@ EOF;
+@@ -321,11 +321,11 @@ EOF;
          $retriever = new UriRetriever();
  
          // load schema from package
diff -pruN 6.4.1-1/debian/pkg-php-tools-autoloaders 6.6.0-1/debian/pkg-php-tools-autoloaders
--- 6.4.1-1/debian/pkg-php-tools-autoloaders	2025-04-05 08:09:27.000000000 +0000
+++ 6.6.0-1/debian/pkg-php-tools-autoloaders	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-justinrainbow json-schema JsonSchema/autoload.php
diff -pruN 6.4.1-1/debian/tests/control 6.6.0-1/debian/tests/control
--- 6.4.1-1/debian/tests/control	2025-04-05 08:52:18.000000000 +0000
+++ 6.6.0-1/debian/tests/control	2025-09-11 10:28:34.000000000 +0000
@@ -1,8 +1,3 @@
 Tests: phpunit
 Restrictions: allow-stderr, flaky, rw-build-tree
-Depends: php-curl,
-         php-phpspec-prophecy,
-         phpab,
-         phpunit,
-         pkg-php-tools (>= 1.41~),
-         @
+Depends: php-curl, php-phpspec-prophecy, phpab, phpunit, pkg-php-tools, @
diff -pruN 6.4.1-1/debian/upstream/changelog 6.6.0-1/debian/upstream/changelog
--- 6.4.1-1/debian/upstream/changelog	2025-04-05 08:09:27.000000000 +0000
+++ 6.6.0-1/debian/upstream/changelog	1970-01-01 00:00:00.000000000 +0000
@@ -1,310 +0,0 @@
-5.3.0 - Jul 6, 2024
-
-    Bumped minimum PHP requirement to 7.1.0 #731
-    Fixed PHP 8.4 deprecation warnings #731
-
-5.2.13 - Sep 26, 2023
-
-    [Backport] Add attribute #[\AllowDynamicProperties] to allow applying defaults without deprecation warning (#695)
-
-5.2.12 - Apr 13, 2022
-
-    Backport Fix type validation failing for "any" and false-y type wording (#686)
-
-5.2.11 - Jul 22, 2021
-
-   #669 Backports PHP 8.1 support
-
-5.2.10 - May 27, 2020
-
-   #631 Backports for 5.2.10: Fixes in build process and PHP 8
-
-5.2.9 - Sep 25, 2019
-
-   #591 Backports for 5.2.9
-
-5.2.8 - Jan 15, 2019
-
-   #558 Backports for 5.2.8
-
-5.2.7 - Feb 14, 2018
-
-   #495 Backports for 5.2.7
-
-5.2.6 - Oct 21, 2017
-
-   #460 Backports for 5.2.6
-
-5.2.5 - Oct 10, 2017
-
-   Backports for 5.2.5 #457
-
-5.2.4 - Oct 4, 2017
-
-   Fresh tag to rectify 5.2.3 mistag.
-
-5.2.3 - Oct 4, 2017
-
-   #453 Backports for 5.2.3
-
-5.2.2 - Oct 2, 2017
-
-   #431 Backports for 5.2.2 (Part 1)
-   #432 Added property name in draft-3 required error
-   #433 Backports for 5.2.2 (Part 2)
-   #450 Backports for 5.2.2 (Part 3)
-
-5.2.1 - May 16, 2017
-
-    #353 Validation of JSON-Schema
-    #405 fix bug when applying defaults
-    #408 SchemaStorage::addSchema() should call BaseConsstraint::arrayToObjectRecursive() on the provide schemas
-    #409 [BUGFIX] Cast empty schema arrays to object
-    #411 [BUGFIX] Split $objectDefinition into $schema and $properties
-    #415 Issue-414: Allow The Option of T or space for Date time.
-    #416 Testcase for minProperties with properties defined + Fix Test
-    #419 [BUGFIX] Split "uri" format into "uri" & "uri-reference", fix meta-schema bug
-    #421 [BUGFIX] Tweak phpdocumentor dependency to avoid install conflicts
-
-5.2.0 - Mar 22, 2017
-
-    #362 (package:// URIs and bundle local copy of the spec schemas)
-    #372 (bugfix for issue #371)
-    #378 (bugfix for #376, add provided schema under a dummy URI)
-    #382 (add quiet / verbose options to CLI script)
-    #383 (add CHECK_MODE_DISABLE_FORMAT)
-    #366 (more unit tests)
-    #389 (allow assoc array as schema)
-    #398 (enable FILTER_FLAG_EMAIL_UNICODE if available)
-    #394 (anyOf / oneOf exceptions - bugfix for #393)
-    #365 (default recursion & bugfixes for #359 & #377, refactor defaults, other minor fixes)
-    #357 (schema validation)
-    #400 (remove stale files from #357)
-
-5.1.0 - Feb 21, 2017
-
-    #349 Add option to apply default values from the schema
-    #354 Option to throw exceptions when an error is encountered
-    #355 Make code-style more consistent
-
-5.0.0 - Feb 15, 2017
-
-    #347 Fix regex for Rfc3339 validation
-    #351 Add new config option, refactor coerce feature to use this, and simplify the public API
-
-4.1.0 - Dec 22, 2016
-
-    #335 Fix various details in README.md
-    #336 Better coercion
-    #339 Added SchemaStorageInterface
-    #342 fix #341 validate-json command
-
-4.0.1 - Nov 9, 2016
-
-    #322 handle coercion of multiple types
-    #325 handle negative integers
-    #326 update readme for 4.0.0
-    #328 add php lang tag to code block
-    #330 [BUGFIX] Use unicode matching for patterns
-
-4.0.0 - Oct 10, 2016
-
-    #304 Return points, spelling and dead code
-    #308 Add support for type coercion
-    #310 performance improvements
-    #314 Updated to check that $ref is a string
-    #316 fix(NumberConstraint): force positive value on first arg
-    #317 Add support for $ref on properties
-    #318 chore(phpunit): ignore local phpunit.xml
-    #319 feat(demo): add simple demo script
-
-3.0.1 - Aug 26, 2016
-
-    #306 Master is not 2.0.x anymore but 3.0.x
-
-3.0.0 - Aug 15, 2016
-
-    #234 Fix: allow explicit 0 secfracs in datetime format
-    #276 use JsonPointer for path handling
-    #277 New way of handling references
-    #278 Exception interface
-    #282 fix instancing wrong type, breaks inheritance
-    #283 move MinMaxPropertiesTest to proper location
-    #286 Support json_decode assoc
-    #287 Updating to use more correct hostname regex. This fixes #129
-    #290 Cache the results of RefResolver::resolve()
-    #292 Fix #291 failed tests with lestest PHP
-    #294 Change error reporting for invalid types with multiple valid types
-
-2.0.5 - Jun 2, 2016
-
-    #272 chore(composer): remove version in favor of VCS tags
-    #273 Throw ResourceNotFoundException outside of re-defined error-handler
-    #275 Fix constraint of error
-
-2.0.4 - May 24, 2016
-
-    #271 Revert "Do not override error handler"
-
-
-2.0.3 - May 10, 2016
-
-    #262 Do not override error handler
-
-
-2.0.2 - May 9, 2016
-
-    #261 Fixes min/max properties validation for non objects
-
-
-2.0.1 - Apr 28, 2016
-
-    #259 feat(UriRetriever): application/json support
-
-
-2.0.0 - Apr 14, 2016
-
-    #174 Enhancement: Require more recent phpunit/phpunit
-    #223 Fix: Remove conditions never evaluating to true
-    #227 Fix: Generate coverage on one PHP version only
-    #231 fix(composer): reduce minimum php to 5.3.3
-    #232 Moving constraints min- and maxProperties to ObjectConstraint
-    #238 add rfc3339 helper class
-    #245 #240 Fix RefResolver and make it compatible with draft-04
-    #246 chore(LICENSE): switch to MIT
-
-
-1.6.1 - Jan 25, 2016
-
-    #213 Fix exclusive min/max strictness
-    #217 fixup dev-master alias
-    #218 feat(composer): require PHP 5.3.29 (PHP 5.3.x EOL version) minimum
-    #221 feat(Factory): add setConstraintClass
-    #222 feat(travis): pivot to container-based infrastructure
-
-
-1.6.0 - Jan 6, 2016
-
-    #142 Optional extra arguments for custom error messages
-    #143 Add constraint factory
-    #192 Create .gitattributes
-    #194 bugfix: patternProperties raised errors when the pattern has slashes
-    #202 Fix CollectionConstraint to allow uniqueItems to be false
-    #204 Fix path output for required properties
-    #206 An email is a string, not much else.
-    #207 Fix non-6 digit microsecond date time formats
-    #209 RefResolver::$depth restoration after JsonDecodingException
-
-
-1.5.0 - Sep 8, 2015
-
-    #182 Fix #93 ($ref to local definition not working)
-
-
-1.4.4 - Jul 14, 2015
-
-    #161 Throw exception if max depth exceeded
-    #168 Enhancement: Speed up builds as much as possible
-    #170 Fix: Start all messages with a capital letter
-    #171 Fix: Be more specific with error message
-
-
-1.4.3 - Jul 13, 2015
-	
-    #154 For missing properties, the key for that error in set to ""
-    #159 Promote HHVM.
-    #163 Enhancement: Use SVG badge for displaying Travis build status
-    #164 Fix: Autoload test resources with Composer
-    #165 Fix: Remove unused imports
-    #166 Fix: Encourage to use phpunit as installed with Composer
-    #167 Fix: Constraint::addError() does not return anything
-
-
-1.4.2 - Jun 14, 2015
-
-    #96 Update minimum PHP version to 5.3.2
-    #105 Fix URI generic syntax delimit path components by slash ("/")
-    #109 PHP < 5.4.0 compatibility for "--dump-schema"
-    #125 Do not throw errors when using unknown/custom format
-    #139 Remove composer.lock
-    #150 [Constraints] make error messages better.
-    #152 Fetching JSON Array from URI
-    #153 Fix warning on file_get_contents
-    #155 chore(travis): remove phpdoc ext and ignore output
-    #156 [travis-ci] Add PHP 7 to build matrix
-    #157 Scrutinizer-CI is not used
-
-
-1.4.1 - Mar 27, 2015
-
-    #132 Make the enum element comparison strict
-
-
-1.4.0 - Mar 23, 2015
-
-    #136 New constraints name - for PHP7
-
-    This version breaks BC for anyone directly using the JsonSchema\Constraints\* classes.
-    If you simply use this project via the JsonSchema\Validator class there are no issues.
-
-
-1.3.7 - 24 Aug 2014
-
-    #106 Fix UriRetriever::combineRelativePathWithBasePath() does not qualify UriResolverException
-    #104 Constraint::check() uses wrong indefinite article in error message to express the type constraint
-    #101 replace invalid filesystem dependent directory separator references
-    #107 Added PHP 5.6 and HHVM to travis.yml
-    #99 Use mb_strlen instead of strlen when mbstring extension is available.
-    #98 Fix constraint errors getter
-    #100 minor fix of BasicTypeTests
-    #103 Fix required property validation
-
-
-1.3.6 - 5 Mar 2014
-
-    #92 added configurable maximum recursion depth
-    #95 Fix a case of 2 invalid oneOf were considered valid
-    #94 Add support for additionalProperties set to true
-
-
-1.3.5 - 13 Dec 2013
-
-    #86 - add specific php version 5.3.3 to travis build to validate issue #84
-    #85 - remove abstract declaration of 'retrieve' which duplicated interface declaration
-
-
-1.3.4 - 8 Dec 2013
-
-    #54 - Fix UriRetriever test
-    #60 - bugfix: JsonDecodingException message
-    #73 - Ignore mime type on json-schema.org
-    #72 - show path info in invalid-schema exception
-    #74 - Cache schemas
-    #75 - Fix for #62, #63, #64: automatically detect schema URL
-    #78 - Add *Of properties to RefResolver
-    #79 - fixed "empty array"-bug
-    #83 - Validation with oneOf, allOf and anyOf only if property is set
-    #68 - Add Sphinx Doc and PHPDocumentor to Travis-CI
-
-
-1.3.3 - 22 Jul 2013 
-
-1.3.2 - 10 Jun 2013
-
-1.3.1 - 21 Feb 2013
-
-1.3.0 - 18 Feb 2013
-
-1.2.4 - 31 Jan 2013
-
-1.2.3 - 29 Jan 2013
-
-1.2.2 - 29 Nov 2012
-
-1.2.1 - 18 Aug 2012
-
-1.2.0 - 20 Jul 2012
-
-1.1.1 - 6 May 2012
-
-1.1.0 - 2 Jan 2012
diff -pruN 6.4.1-1/dist/schema/json-schema-draft-06.json 6.6.0-1/dist/schema/json-schema-draft-06.json
--- 6.4.1-1/dist/schema/json-schema-draft-06.json	1970-01-01 00:00:00.000000000 +0000
+++ 6.6.0-1/dist/schema/json-schema-draft-06.json	2025-10-10 11:34:09.000000000 +0000
@@ -0,0 +1,155 @@
+{
+    "$schema": "http://json-schema.org/draft-06/schema#",
+    "$id": "http://json-schema.org/draft-06/schema#",
+    "title": "Core schema meta-schema",
+    "definitions": {
+        "schemaArray": {
+            "type": "array",
+            "minItems": 1,
+            "items": { "$ref": "#" }
+        },
+        "nonNegativeInteger": {
+            "type": "integer",
+            "minimum": 0
+        },
+        "nonNegativeIntegerDefault0": {
+            "allOf": [
+                { "$ref": "#/definitions/nonNegativeInteger" },
+                { "default": 0 }
+            ]
+        },
+        "simpleTypes": {
+            "enum": [
+                "array",
+                "boolean",
+                "integer",
+                "null",
+                "number",
+                "object",
+                "string"
+            ]
+        },
+        "stringArray": {
+            "type": "array",
+            "items": { "type": "string" },
+            "uniqueItems": true,
+            "default": []
+        }
+    },
+    "type": ["object", "boolean"],
+    "properties": {
+        "$id": {
+            "type": "string",
+            "format": "uri-reference"
+        },
+        "$schema": {
+            "type": "string",
+            "format": "uri"
+        },
+        "$ref": {
+            "type": "string",
+            "format": "uri-reference"
+        },
+        "title": {
+            "type": "string"
+        },
+        "description": {
+            "type": "string"
+        },
+        "default": {},
+        "examples": {
+            "type": "array",
+            "items": {}
+        },
+        "multipleOf": {
+            "type": "number",
+            "exclusiveMinimum": 0
+        },
+        "maximum": {
+            "type": "number"
+        },
+        "exclusiveMaximum": {
+            "type": "number"
+        },
+        "minimum": {
+            "type": "number"
+        },
+        "exclusiveMinimum": {
+            "type": "number"
+        },
+        "maxLength": { "$ref": "#/definitions/nonNegativeInteger" },
+        "minLength": { "$ref": "#/definitions/nonNegativeIntegerDefault0" },
+        "pattern": {
+            "type": "string",
+            "format": "regex"
+        },
+        "additionalItems": { "$ref": "#" },
+        "items": {
+            "anyOf": [
+                { "$ref": "#" },
+                { "$ref": "#/definitions/schemaArray" }
+            ],
+            "default": {}
+        },
+        "maxItems": { "$ref": "#/definitions/nonNegativeInteger" },
+        "minItems": { "$ref": "#/definitions/nonNegativeIntegerDefault0" },
+        "uniqueItems": {
+            "type": "boolean",
+            "default": false
+        },
+        "contains": { "$ref": "#" },
+        "maxProperties": { "$ref": "#/definitions/nonNegativeInteger" },
+        "minProperties": { "$ref": "#/definitions/nonNegativeIntegerDefault0" },
+        "required": { "$ref": "#/definitions/stringArray" },
+        "additionalProperties": { "$ref": "#" },
+        "definitions": {
+            "type": "object",
+            "additionalProperties": { "$ref": "#" },
+            "default": {}
+        },
+        "properties": {
+            "type": "object",
+            "additionalProperties": { "$ref": "#" },
+            "default": {}
+        },
+        "patternProperties": {
+            "type": "object",
+            "additionalProperties": { "$ref": "#" },
+            "propertyNames": { "format": "regex" },
+            "default": {}
+        },
+        "dependencies": {
+            "type": "object",
+            "additionalProperties": {
+                "anyOf": [
+                    { "$ref": "#" },
+                    { "$ref": "#/definitions/stringArray" }
+                ]
+            }
+        },
+        "propertyNames": { "$ref": "#" },
+        "const": {},
+        "enum": {
+            "type": "array",
+            "minItems": 1,
+            "uniqueItems": true
+        },
+        "type": {
+            "anyOf": [
+                { "$ref": "#/definitions/simpleTypes" },
+                {
+                    "type": "array",
+                    "items": { "$ref": "#/definitions/simpleTypes" },
+                    "minItems": 1,
+                    "uniqueItems": true
+                }
+            ]
+        },
+        "format": { "type": "string" },
+        "allOf": { "$ref": "#/definitions/schemaArray" },
+        "anyOf": { "$ref": "#/definitions/schemaArray" },
+        "oneOf": { "$ref": "#/definitions/schemaArray" },
+        "not": { "$ref": "#" }
+    },
+    "default": {}
+}
diff -pruN 6.4.1-1/phpstan-baseline.neon 6.6.0-1/phpstan-baseline.neon
--- 6.4.1-1/phpstan-baseline.neon	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/phpstan-baseline.neon	2025-10-10 11:34:09.000000000 +0000
@@ -41,21 +41,6 @@ parameters:
 			path: src/JsonSchema/Constraints/CollectionConstraint.php
 
 		-
-			message: "#^Method JsonSchema\\\\Constraints\\\\Constraint\\:\\:checkObject\\(\\) has parameter \\$appliedDefaults with no type specified\\.$#"
-			count: 1
-			path: src/JsonSchema/Constraints/Constraint.php
-
-		-
-			message: "#^Method JsonSchema\\\\Constraints\\\\Constraint\\:\\:checkUndefined\\(\\) has parameter \\$fromDefault with no type specified\\.$#"
-			count: 1
-			path: src/JsonSchema/Constraints/Constraint.php
-
-		-
-			message: "#^Property JsonSchema\\\\Constraints\\\\Constraint\\:\\:\\$inlineSchemaProperty has no type specified\\.$#"
-			count: 1
-			path: src/JsonSchema/Constraints/Constraint.php
-
-		-
 			message: "#^Method JsonSchema\\\\Constraints\\\\ConstraintInterface\\:\\:addError\\(\\) has parameter \\$more with no value type specified in iterable type array\\.$#"
 			count: 1
 			path: src/JsonSchema/Constraints/ConstraintInterface.php
@@ -81,17 +66,12 @@ parameters:
 			path: src/JsonSchema/Constraints/Factory.php
 
 		-
-			message: "#^Method JsonSchema\\\\Constraints\\\\Factory\\:\\:getConfig\\(\\) should return int\\<0, 511\\> but returns int\\.$#"
-			count: 1
-			path: src/JsonSchema/Constraints/Factory.php
-
-		-
-			message: "#^Method JsonSchema\\\\Constraints\\\\Factory\\:\\:getErrorContext\\(\\) should return 1\\|2 but returns int\\.$#"
+			message: "#^Method JsonSchema\\\\Constraints\\\\Factory\\:\\:getConfig\\(\\) should return int\\<0, 1023\\> but returns int\\.$#"
 			count: 1
 			path: src/JsonSchema/Constraints/Factory.php
 
 		-
-			message: "#^Property JsonSchema\\\\Constraints\\\\Factory\\:\\:\\$checkMode \\(int\\<0, 511\\>\\) does not accept int\\.$#"
+			message: "#^Property JsonSchema\\\\Constraints\\\\Factory\\:\\:\\$checkMode \\(int\\<0, 1023\\>\\) does not accept int\\.$#"
 			count: 2
 			path: src/JsonSchema/Constraints/Factory.php
 
@@ -206,11 +186,6 @@ parameters:
 			path: src/JsonSchema/Constraints/ObjectConstraint.php
 
 		-
-			message: "#^Method JsonSchema\\\\Constraints\\\\ObjectConstraint\\:\\:check\\(\\) has parameter \\$appliedDefaults with no type specified\\.$#"
-			count: 1
-			path: src/JsonSchema/Constraints/ObjectConstraint.php
-
-		-
 			message: "#^Method JsonSchema\\\\Constraints\\\\ObjectConstraint\\:\\:check\\(\\) has parameter \\$patternProperties with no type specified\\.$#"
 			count: 1
 			path: src/JsonSchema/Constraints/ObjectConstraint.php
@@ -256,11 +231,6 @@ parameters:
 			path: src/JsonSchema/Constraints/ObjectConstraint.php
 
 		-
-			message: "#^Property JsonSchema\\\\Constraints\\\\ObjectConstraint\\:\\:\\$appliedDefaults type has no value type specified in iterable type array\\.$#"
-			count: 1
-			path: src/JsonSchema/Constraints/ObjectConstraint.php
-
-		-
 			message: "#^Method JsonSchema\\\\Constraints\\\\StringConstraint\\:\\:strlen\\(\\) has no return type specified\\.$#"
 			count: 1
 			path: src/JsonSchema/Constraints/StringConstraint.php
@@ -566,11 +536,6 @@ parameters:
 			path: src/JsonSchema/Constraints/TypeConstraint.php
 
 		-
-			message: "#^Method JsonSchema\\\\Constraints\\\\UndefinedConstraint\\:\\:check\\(\\) has parameter \\$fromDefault with no type specified\\.$#"
-			count: 1
-			path: src/JsonSchema/Constraints/UndefinedConstraint.php
-
-		-
 			message: "#^Method JsonSchema\\\\Constraints\\\\UndefinedConstraint\\:\\:shouldApplyDefaultValue\\(\\) has parameter \\$name with no type specified\\.$#"
 			count: 1
 			path: src/JsonSchema/Constraints/UndefinedConstraint.php
@@ -611,21 +576,11 @@ parameters:
 			path: src/JsonSchema/Constraints/UndefinedConstraint.php
 
 		-
-			message: "#^Property JsonSchema\\\\Constraints\\\\UndefinedConstraint\\:\\:\\$appliedDefaults type has no value type specified in iterable type array\\.$#"
-			count: 1
-			path: src/JsonSchema/Constraints/UndefinedConstraint.php
-
-		-
 			message: "#^Method JsonSchema\\\\Entity\\\\JsonPointer\\:\\:encodePropertyPaths\\(\\) return type has no value type specified in iterable type array\\.$#"
 			count: 1
 			path: src/JsonSchema/Entity/JsonPointer.php
 
 		-
-			message: "#^Method JsonSchema\\\\Entity\\\\JsonPointer\\:\\:setFromDefault\\(\\) has no return type specified\\.$#"
-			count: 1
-			path: src/JsonSchema/Entity/JsonPointer.php
-
-		-
 			message: "#^Method JsonSchema\\\\Entity\\\\JsonPointer\\:\\:withPropertyPaths\\(\\) has parameter \\$propertyPaths with no value type specified in iterable type array\\.$#"
 			count: 1
 			path: src/JsonSchema/Entity/JsonPointer.php
@@ -671,37 +626,22 @@ parameters:
 			path: src/JsonSchema/Iterator/ObjectIterator.php
 
 		-
-			message: "#^Offset 4 does not exist on array\\{0\\: string, 1\\: non\\-falsy\\-string, 2\\: string, 3\\: non\\-falsy\\-string, 4\\?\\: string, 5\\?\\: non\\-falsy\\-string&numeric\\-string\\}\\.$#"
-			count: 1
-			path: src/JsonSchema/Rfc3339.php
-
-		-
-			message: "#^Offset 5 does not exist on array\\{0\\: string, 1\\: non\\-falsy\\-string, 2\\: string, 3\\: non\\-falsy\\-string, 4\\?\\: string, 5\\?\\: non\\-falsy\\-string&numeric\\-string\\}\\.$#"
-			count: 1
-			path: src/JsonSchema/Rfc3339.php
-
-		-
 			message: "#^Access to an undefined property object\\:\\:\\$properties\\.$#"
 			count: 3
 			path: src/JsonSchema/SchemaStorage.php
 
 		-
-			message: "#^Argument of an invalid type object supplied for foreach, only iterables are supported\\.$#"
-			count: 1
-			path: src/JsonSchema/SchemaStorage.php
-
-		-
-			message: "#^Call to function is_array\\(\\) with object will always evaluate to false\\.$#"
+			message: "#^Argument of an invalid type array\\|stdClass supplied for foreach, only iterables are supported\\.$#"
 			count: 1
 			path: src/JsonSchema/SchemaStorage.php
 
 		-
-			message: "#^Method JsonSchema\\\\SchemaStorage\\:\\:addSchema\\(\\) has no return type specified\\.$#"
+			message: "#^Argument of an invalid type object supplied for foreach, only iterables are supported\\.$#"
 			count: 1
 			path: src/JsonSchema/SchemaStorage.php
 
 		-
-			message: "#^Method JsonSchema\\\\SchemaStorage\\:\\:expandRefs\\(\\) has no return type specified\\.$#"
+			message: "#^Call to function is_array\\(\\) with bool|object will always evaluate to false\\.$#"
 			count: 1
 			path: src/JsonSchema/SchemaStorage.php
 
@@ -736,11 +676,6 @@ parameters:
 			path: src/JsonSchema/SchemaStorage.php
 
 		-
-			message: "#^Method JsonSchema\\\\SchemaStorageInterface\\:\\:addSchema\\(\\) has no return type specified\\.$#"
-			count: 1
-			path: src/JsonSchema/SchemaStorageInterface.php
-
-		-
 			message: "#^Method JsonSchema\\\\Uri\\\\Retrievers\\\\Curl\\:\\:fetchMessageBody\\(\\) has no return type specified\\.$#"
 			count: 1
 			path: src/JsonSchema/Uri/Retrievers/Curl.php
diff -pruN 6.4.1-1/phpunit.xml.dist 6.6.0-1/phpunit.xml.dist
--- 6.4.1-1/phpunit.xml.dist	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/phpunit.xml.dist	2025-10-10 11:34:09.000000000 +0000
@@ -24,4 +24,8 @@
             <directory>./src/JsonSchema/</directory>
         </whitelist>
     </filter>
+
+    <php>
+        <ini name="memory_limit" value="-1"/>
+    </php>
 </phpunit>
diff -pruN 6.4.1-1/src/JsonSchema/ConstraintError.php 6.6.0-1/src/JsonSchema/ConstraintError.php
--- 6.4.1-1/src/JsonSchema/ConstraintError.php	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/src/JsonSchema/ConstraintError.php	2025-10-10 11:34:09.000000000 +0000
@@ -17,8 +17,10 @@ class ConstraintError extends Enum
     public const DIVISIBLE_BY = 'divisibleBy';
     public const ENUM = 'enum';
     public const CONSTANT = 'const';
+    public const CONTAINS = 'contains';
     public const EXCLUSIVE_MINIMUM = 'exclusiveMinimum';
     public const EXCLUSIVE_MAXIMUM = 'exclusiveMaximum';
+    public const FALSE = 'false';
     public const FORMAT_COLOR = 'colorFormat';
     public const FORMAT_DATE = 'dateFormat';
     public const FORMAT_DATE_TIME = 'dateTimeFormat';
@@ -26,10 +28,12 @@ class ConstraintError extends Enum
     public const FORMAT_EMAIL = 'emailFormat';
     public const FORMAT_HOSTNAME = 'styleHostName';
     public const FORMAT_IP = 'ipFormat';
+    public const FORMAT_JSON_POINTER = 'jsonPointerFormat';
     public const FORMAT_PHONE = 'phoneFormat';
     public const FORMAT_REGEX= 'regexFormat';
     public const FORMAT_STYLE = 'styleFormat';
     public const FORMAT_TIME = 'timeFormat';
+    public const FORMAT_URI_TEMPLATE = 'uriTemplateFormat';
     public const FORMAT_URL = 'urlFormat';
     public const FORMAT_URL_REF = 'urlRefFormat';
     public const INVALID_SCHEMA = 'invalidSchema';
@@ -51,6 +55,7 @@ class ConstraintError extends Enum
     public const PREGEX_INVALID = 'pregrex';
     public const PROPERTIES_MIN = 'minProperties';
     public const PROPERTIES_MAX = 'maxProperties';
+    public const PROPERTY_NAMES = 'propertyNames';
     public const TYPE = 'type';
     public const UNIQUE_ITEMS = 'uniqueItems';
 
@@ -70,8 +75,10 @@ class ConstraintError extends Enum
             self::DIVISIBLE_BY => 'Is not divisible by %d',
             self::ENUM => 'Does not have a value in the enumeration %s',
             self::CONSTANT => 'Does not have a value equal to %s',
+            self::CONTAINS => 'Does not have a value valid to contains schema',
             self::EXCLUSIVE_MINIMUM => 'Must have a minimum value greater than %d',
             self::EXCLUSIVE_MAXIMUM => 'Must have a maximum value less than %d',
+            self::FALSE => 'Boolean schema false',
             self::FORMAT_COLOR => 'Invalid color',
             self::FORMAT_DATE => 'Invalid date %s, expected format YYYY-MM-DD',
             self::FORMAT_DATE_TIME => 'Invalid date-time %s, expected format YYYY-MM-DDThh:mm:ssZ or YYYY-MM-DDThh:mm:ss+hh:mm',
@@ -79,10 +86,12 @@ class ConstraintError extends Enum
             self::FORMAT_EMAIL => 'Invalid email',
             self::FORMAT_HOSTNAME => 'Invalid hostname',
             self::FORMAT_IP => 'Invalid IP address',
+            self::FORMAT_JSON_POINTER => 'Invalid JSON pointer',
             self::FORMAT_PHONE => 'Invalid phone number',
             self::FORMAT_REGEX=> 'Invalid regex format %s',
             self::FORMAT_STYLE => 'Invalid style',
             self::FORMAT_TIME => 'Invalid time %s, expected format hh:mm:ss',
+            self::FORMAT_URI_TEMPLATE => 'Invalid URI template format',
             self::FORMAT_URL => 'Invalid URL format',
             self::FORMAT_URL_REF => 'Invalid URL reference format',
             self::LENGTH_MAX => 'Must be at most %d characters long',
@@ -104,6 +113,7 @@ class ConstraintError extends Enum
             self::PREGEX_INVALID => 'The pattern %s is invalid',
             self::PROPERTIES_MIN => 'Must contain a minimum of %d properties',
             self::PROPERTIES_MAX => 'Must contain no more than %d properties',
+            self::PROPERTY_NAMES => 'Property name %s is invalid',
             self::TYPE => '%s value found, but %s is required',
             self::UNIQUE_ITEMS => 'There are no duplicates allowed in the array'
         ];
diff -pruN 6.4.1-1/src/JsonSchema/Constraints/BaseConstraint.php 6.6.0-1/src/JsonSchema/Constraints/BaseConstraint.php
--- 6.4.1-1/src/JsonSchema/Constraints/BaseConstraint.php	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/src/JsonSchema/Constraints/BaseConstraint.php	2025-10-10 11:34:09.000000000 +0000
@@ -2,15 +2,9 @@
 
 declare(strict_types=1);
 
-/*
- * This file is part of the JsonSchema package.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
 namespace JsonSchema\Constraints;
 
+use const JSON_ERROR_NONE;
 use JsonSchema\ConstraintError;
 use JsonSchema\Entity\JsonPointer;
 use JsonSchema\Exception\InvalidArgumentException;
@@ -50,8 +44,8 @@ class BaseConstraint
         $name = $constraint->getValue();
         $error = [
             'property' => $this->convertJsonPointerIntoPropertyPath($path ?: new JsonPointer('')),
-            'pointer' => ltrim(strval($path ?: new JsonPointer('')), '#'),
-            'message' => ucfirst(vsprintf($message, array_map(function ($val) {
+            'pointer' => ltrim((string) ($path ?: new JsonPointer('')), '#'),
+            'message' => ucfirst(vsprintf($message, array_map(static function ($val) {
                 if (is_scalar($val)) {
                     return is_bool($val) ? var_export($val, true) : $val;
                 }
@@ -78,7 +72,7 @@ class BaseConstraint
         if ($errors) {
             $this->errors = array_merge($this->errors, $errors);
             $errorMask = &$this->errorMask;
-            array_walk($errors, function ($error) use (&$errorMask) {
+            array_walk($errors, static function ($error) use (&$errorMask) {
                 if (isset($error['context'])) {
                     $errorMask |= $error['context'];
                 }
@@ -95,10 +89,8 @@ class BaseConstraint
             return $this->errors;
         }
 
-        return array_filter($this->errors, function ($error) use ($errorContext) {
-            if ($errorContext & $error['context']) {
-                return true;
-            }
+        return array_filter($this->errors, static function ($error) use ($errorContext) {
+            return (bool) ($errorContext & $error['context']);
         });
     }
 
@@ -120,7 +112,7 @@ class BaseConstraint
     }
 
     /**
-     * Clears any reported errors.  Should be used between
+     * Clears any reported errors. Should be used between
      * multiple validation checks.
      */
     public function reset(): void
@@ -145,7 +137,7 @@ class BaseConstraint
     public static function arrayToObjectRecursive(array $array): object
     {
         $json = json_encode($array);
-        if (json_last_error() !== \JSON_ERROR_NONE) {
+        if (json_last_error() !== JSON_ERROR_NONE) {
             $message = 'Unable to encode schema array as JSON';
             if (function_exists('json_last_error_msg')) {
                 $message .= ': ' . json_last_error_msg();
@@ -153,7 +145,7 @@ class BaseConstraint
             throw new InvalidArgumentException($message);
         }
 
-        return (object) json_decode($json);
+        return (object) json_decode($json, false);
     }
 
     /**
@@ -164,13 +156,10 @@ class BaseConstraint
         return '~' . str_replace('~', '\\~', $pattern) . '~u';
     }
 
-    /**
-     * @return string property path
-     */
     protected function convertJsonPointerIntoPropertyPath(JsonPointer $pointer): string
     {
         $result = array_map(
-            function ($path) {
+            static function ($path) {
                 return sprintf(is_numeric($path) ? '[%d]' : '.%s', $path);
             },
             $pointer->getPropertyPaths()
diff -pruN 6.4.1-1/src/JsonSchema/Constraints/CollectionConstraint.php 6.6.0-1/src/JsonSchema/Constraints/CollectionConstraint.php
--- 6.4.1-1/src/JsonSchema/Constraints/CollectionConstraint.php	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/src/JsonSchema/Constraints/CollectionConstraint.php	2025-10-10 11:34:09.000000000 +0000
@@ -13,6 +13,7 @@ namespace JsonSchema\Constraints;
 
 use JsonSchema\ConstraintError;
 use JsonSchema\Entity\JsonPointer;
+use JsonSchema\Tool\DeepComparer;
 
 /**
  * The CollectionConstraint Constraints, validates an array against a given schema
@@ -39,14 +40,14 @@ class CollectionConstraint extends Const
 
         // Verify uniqueItems
         if (isset($schema->uniqueItems) && $schema->uniqueItems) {
-            $unique = $value;
-            if (is_array($value) && count($value)) {
-                $unique = array_map(function ($e) {
-                    return var_export($e, true);
-                }, $value);
-            }
-            if (count(array_unique($unique)) != count($value)) {
-                $this->addError(ConstraintError::UNIQUE_ITEMS(), $path);
+            $count = count($value);
+            for ($x = 0; $x < $count - 1; $x++) {
+                for ($y = $x + 1; $y < $count; $y++) {
+                    if (DeepComparer::isEqual($value[$x], $value[$y])) {
+                        $this->addError(ConstraintError::UNIQUE_ITEMS(), $path);
+                        break 2;
+                    }
+                }
             }
         }
 
diff -pruN 6.4.1-1/src/JsonSchema/Constraints/Constraint.php 6.6.0-1/src/JsonSchema/Constraints/Constraint.php
--- 6.4.1-1/src/JsonSchema/Constraints/Constraint.php	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/src/JsonSchema/Constraints/Constraint.php	2025-10-10 11:34:09.000000000 +0000
@@ -2,25 +2,13 @@
 
 declare(strict_types=1);
 
-/*
- * This file is part of the JsonSchema package.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
 namespace JsonSchema\Constraints;
 
 use JsonSchema\Entity\JsonPointer;
 
-/**
- * The Base Constraints, all Validators should extend this class
- *
- * @author Robert Schönthal <seroscho@googlemail.com>
- * @author Bruno Prieto Reis <bruno.p.reis@gmail.com>
- */
 abstract class Constraint extends BaseConstraint implements ConstraintInterface
 {
+    /** @var string */
     protected $inlineSchemaProperty = '$schema';
 
     public const CHECK_MODE_NONE =             0x00000000;
@@ -33,6 +21,7 @@ abstract class Constraint extends BaseCo
     public const CHECK_MODE_EARLY_COERCE =     0x00000040;
     public const CHECK_MODE_ONLY_REQUIRED_DEFAULTS   = 0x00000080;
     public const CHECK_MODE_VALIDATE_SCHEMA =  0x00000100;
+    public const CHECK_MODE_STRICT =  0x00000200;
 
     /**
      * Bubble down the path
@@ -48,14 +37,12 @@ abstract class Constraint extends BaseCo
             return $path;
         }
 
-        $path = $path->withPropertyPaths(
+        return $path->withPropertyPaths(
             array_merge(
                 $path->getPropertyPaths(),
                 [$i]
             )
         );
-
-        return $path;
     }
 
     /**
@@ -76,15 +63,22 @@ abstract class Constraint extends BaseCo
     /**
      * Validates an object
      *
-     * @param mixed $value
-     * @param mixed $schema
-     * @param mixed $properties
-     * @param mixed $additionalProperties
-     * @param mixed $patternProperties
+     * @param mixed         $value
+     * @param mixed         $schema
+     * @param mixed         $properties
+     * @param mixed         $additionalProperties
+     * @param mixed         $patternProperties
+     * @param array<string> $appliedDefaults
      */
-    protected function checkObject(&$value, $schema = null, ?JsonPointer $path = null, $properties = null,
-        $additionalProperties = null, $patternProperties = null, $appliedDefaults = []): void
-    {
+    protected function checkObject(
+        &$value,
+        $schema = null,
+        ?JsonPointer $path = null,
+        $properties = null,
+        $additionalProperties = null,
+        $patternProperties = null,
+        array $appliedDefaults = []
+    ): void {
         /** @var ObjectConstraint $validator */
         $validator = $this->factory->createInstanceFor('object');
         $validator->check($value, $schema, $path, $properties, $additionalProperties, $patternProperties, $appliedDefaults);
@@ -93,7 +87,7 @@ abstract class Constraint extends BaseCo
     }
 
     /**
-     * Validates the type of a property
+     * Validates the type of the value
      *
      * @param mixed $value
      * @param mixed $schema
@@ -114,7 +108,7 @@ abstract class Constraint extends BaseCo
      * @param mixed $schema
      * @param mixed $i
      */
-    protected function checkUndefined(&$value, $schema = null, ?JsonPointer $path = null, $i = null, $fromDefault = false): void
+    protected function checkUndefined(&$value, $schema = null, ?JsonPointer $path = null, $i = null, bool $fromDefault = false): void
     {
         /** @var UndefinedConstraint $validator */
         $validator = $this->factory->createInstanceFor('undefined');
diff -pruN 6.4.1-1/src/JsonSchema/Constraints/Drafts/Draft06/AdditionalItemsConstraint.php 6.6.0-1/src/JsonSchema/Constraints/Drafts/Draft06/AdditionalItemsConstraint.php
--- 6.4.1-1/src/JsonSchema/Constraints/Drafts/Draft06/AdditionalItemsConstraint.php	1970-01-01 00:00:00.000000000 +0000
+++ 6.6.0-1/src/JsonSchema/Constraints/Drafts/Draft06/AdditionalItemsConstraint.php	2025-10-10 11:34:09.000000000 +0000
@@ -0,0 +1,61 @@
+<?php
+
+declare(strict_types=1);
+
+namespace JsonSchema\Constraints\Drafts\Draft06;
+
+use JsonSchema\ConstraintError;
+use JsonSchema\Constraints\ConstraintInterface;
+use JsonSchema\Entity\ErrorBagProxy;
+use JsonSchema\Entity\JsonPointer;
+
+class AdditionalItemsConstraint implements ConstraintInterface
+{
+    use ErrorBagProxy;
+
+    /** @var Factory */
+    private $factory;
+
+    public function __construct(?Factory $factory = null)
+    {
+        $this->factory = $factory ?: new Factory();
+        $this->initialiseErrorBag($this->factory);
+    }
+
+    public function check(&$value, $schema = null, ?JsonPointer $path = null, $i = null): void
+    {
+        if (!property_exists($schema, 'additionalItems')) {
+            return;
+        }
+
+        if ($schema->additionalItems === true) {
+            return;
+        }
+        if ($schema->additionalItems === false && !property_exists($schema, 'items')) {
+            return;
+        }
+
+        if (!is_array($value)) {
+            return;
+        }
+        if (!property_exists($schema, 'items')) {
+            return;
+        }
+        if (property_exists($schema, 'items') && is_object($schema->items)) {
+            return;
+        }
+
+        $additionalItems = array_diff_key($value, property_exists($schema, 'items') ? $schema->items : []);
+
+        foreach ($additionalItems as $propertyName => $propertyValue) {
+            $schemaConstraint = $this->factory->createInstanceFor('schema');
+            $schemaConstraint->check($propertyValue, $schema->additionalItems, $path, $i);
+
+            if ($schemaConstraint->isValid()) {
+                continue;
+            }
+
+            $this->addError(ConstraintError::ADDITIONAL_ITEMS(), $path, ['item' => $i, 'property' => $propertyName, 'additionalItems' => $schema->additionalItems]);
+        }
+    }
+}
diff -pruN 6.4.1-1/src/JsonSchema/Constraints/Drafts/Draft06/AdditionalPropertiesConstraint.php 6.6.0-1/src/JsonSchema/Constraints/Drafts/Draft06/AdditionalPropertiesConstraint.php
--- 6.4.1-1/src/JsonSchema/Constraints/Drafts/Draft06/AdditionalPropertiesConstraint.php	1970-01-01 00:00:00.000000000 +0000
+++ 6.6.0-1/src/JsonSchema/Constraints/Drafts/Draft06/AdditionalPropertiesConstraint.php	2025-10-10 11:34:09.000000000 +0000
@@ -0,0 +1,93 @@
+<?php
+
+declare(strict_types=1);
+
+namespace JsonSchema\Constraints\Drafts\Draft06;
+
+use JsonSchema\ConstraintError;
+use JsonSchema\Constraints\ConstraintInterface;
+use JsonSchema\Entity\ErrorBagProxy;
+use JsonSchema\Entity\JsonPointer;
+
+class AdditionalPropertiesConstraint implements ConstraintInterface
+{
+    use ErrorBagProxy;
+
+    /** @var Factory */
+    private $factory;
+
+    public function __construct(?Factory $factory = null)
+    {
+        $this->factory = $factory ?: new Factory();
+        $this->initialiseErrorBag($this->factory);
+    }
+
+    public function check(&$value, $schema = null, ?JsonPointer $path = null, $i = null): void
+    {
+        if (!property_exists($schema, 'additionalProperties')) {
+            return;
+        }
+
+        if ($schema->additionalProperties === true) {
+            return;
+        }
+
+        if (!is_object($value)) {
+            return;
+        }
+
+        $additionalProperties = get_object_vars($value);
+
+        if (isset($schema->properties)) {
+            $additionalProperties = array_diff_key($additionalProperties, (array) $schema->properties);
+        }
+
+        if (isset($schema->patternProperties)) {
+            $patterns = array_keys(get_object_vars($schema->patternProperties));
+
+            foreach ($additionalProperties as $key => $_) {
+                foreach ($patterns as $pattern) {
+                    if (preg_match($this->createPregMatchPattern($pattern), (string) $key)) {
+                        unset($additionalProperties[$key]);
+                        break;
+                    }
+                }
+            }
+        }
+
+        if (is_object($schema->additionalProperties)) {
+            foreach ($additionalProperties as $key => $additionalPropertiesValue) {
+                $schemaConstraint = $this->factory->createInstanceFor('schema');
+                $schemaConstraint->check($additionalPropertiesValue, $schema->additionalProperties, $path, $i); // @todo increment path
+                if ($schemaConstraint->isValid()) {
+                    unset($additionalProperties[$key]);
+                }
+            }
+        }
+
+        foreach ($additionalProperties as $key => $additionalPropertiesValue) {
+            $this->addError(ConstraintError::ADDITIONAL_PROPERTIES(), $path, ['found' => $additionalPropertiesValue]);
+        }
+    }
+
+    private function createPregMatchPattern(string $pattern): string
+    {
+        $replacements = [
+//            '\D' => '[^0-9]',
+//            '\d' => '[0-9]',
+            '\p{digit}' => '\p{Nd}',
+//            '\w' => '[A-Za-z0-9_]',
+//            '\W' => '[^A-Za-z0-9_]',
+//            '\s' => '[\s\x{200B}]' // Explicitly include zero width white space,
+            '\p{Letter}' => '\p{L}', // Map ECMA long property name to PHP (PCRE) Unicode property abbreviations
+        ];
+
+        $pattern = str_replace(
+            array_keys($replacements),
+            array_values($replacements),
+            $pattern
+        );
+
+        return '/' . str_replace('/', '\/', $pattern) . '/u';
+    }
+}
diff -pruN 6.4.1-1/src/JsonSchema/Constraints/Drafts/Draft06/AllOfConstraint.php 6.6.0-1/src/JsonSchema/Constraints/Drafts/Draft06/AllOfConstraint.php
--- 6.4.1-1/src/JsonSchema/Constraints/Drafts/Draft06/AllOfConstraint.php	1970-01-01 00:00:00.000000000 +0000
+++ 6.6.0-1/src/JsonSchema/Constraints/Drafts/Draft06/AllOfConstraint.php	2025-10-10 11:34:09.000000000 +0000
@@ -0,0 +1,42 @@
+<?php
+
+declare(strict_types=1);
+
+namespace JsonSchema\Constraints\Drafts\Draft06;
+
+use JsonSchema\ConstraintError;
+use JsonSchema\Constraints\ConstraintInterface;
+use JsonSchema\Entity\ErrorBagProxy;
+use JsonSchema\Entity\JsonPointer;
+
+class AllOfConstraint implements ConstraintInterface
+{
+    use ErrorBagProxy;
+
+    /** @var Factory */
+    private $factory;
+
+    public function __construct(?Factory $factory = null)
+    {
+        $this->factory = $factory ?: new Factory();
+        $this->initialiseErrorBag($this->factory);
+    }
+
+    public function check(&$value, $schema = null, ?JsonPointer $path = null, $i = null): void
+    {
+        if (!property_exists($schema, 'allOf')) {
+            return;
+        }
+
+        foreach ($schema->allOf as $allOfSchema) {
+            $schemaConstraint = $this->factory->createInstanceFor('schema');
+            $schemaConstraint->check($value, $allOfSchema, $path, $i);
+
+            if ($schemaConstraint->isValid()) {
+                continue;
+            }
+            $this->addError(ConstraintError::ALL_OF(), $path);
+            $this->addErrors($schemaConstraint->getErrors());
+        }
+    }
+}
diff -pruN 6.4.1-1/src/JsonSchema/Constraints/Drafts/Draft06/AnyOfConstraint.php 6.6.0-1/src/JsonSchema/Constraints/Drafts/Draft06/AnyOfConstraint.php
--- 6.4.1-1/src/JsonSchema/Constraints/Drafts/Draft06/AnyOfConstraint.php	1970-01-01 00:00:00.000000000 +0000
+++ 6.6.0-1/src/JsonSchema/Constraints/Drafts/Draft06/AnyOfConstraint.php	2025-10-10 11:34:09.000000000 +0000
@@ -0,0 +1,51 @@
+<?php
+
+declare(strict_types=1);
+
+namespace JsonSchema\Constraints\Drafts\Draft06;
+
+use JsonSchema\ConstraintError;
+use JsonSchema\Constraints\ConstraintInterface;
+use JsonSchema\Entity\ErrorBagProxy;
+use JsonSchema\Entity\JsonPointer;
+use JsonSchema\Exception\ValidationException;
+
+class AnyOfConstraint implements ConstraintInterface
+{
+    use ErrorBagProxy;
+
+    /** @var Factory */
+    private $factory;
+
+    public function __construct(?Factory $factory = null)
+    {
+        $this->factory = $factory ?: new Factory();
+        $this->initialiseErrorBag($this->factory);
+    }
+
+    public function check(&$value, $schema = null, ?JsonPointer $path = null, $i = null): void
+    {
+        if (!property_exists($schema, 'anyOf')) {
+            return;
+        }
+
+        foreach ($schema->anyOf as $anyOfSchema) {
+            $schemaConstraint = $this->factory->createInstanceFor('schema');
+
+            try {
+                $schemaConstraint->check($value, $anyOfSchema, $path, $i);
+
+                if ($schemaConstraint->isValid()) {
+                    $this->errorBag()->reset();
+
+                    return;
+                }
+
+                $this->addErrors($schemaConstraint->getErrors());
+            } catch (ValidationException $e) {
+            }
+        }
+
+        $this->addError(ConstraintError::ANY_OF(), $path);
+    }
+}
diff -pruN 6.4.1-1/src/JsonSchema/Constraints/Drafts/Draft06/ConstConstraint.php 6.6.0-1/src/JsonSchema/Constraints/Drafts/Draft06/ConstConstraint.php
--- 6.4.1-1/src/JsonSchema/Constraints/Drafts/Draft06/ConstConstraint.php	1970-01-01 00:00:00.000000000 +0000
+++ 6.6.0-1/src/JsonSchema/Constraints/Drafts/Draft06/ConstConstraint.php	2025-10-10 11:34:09.000000000 +0000
@@ -0,0 +1,35 @@
+<?php
+
+declare(strict_types=1);
+
+namespace JsonSchema\Constraints\Drafts\Draft06;
+
+use JsonSchema\ConstraintError;
+use JsonSchema\Constraints\ConstraintInterface;
+use JsonSchema\Constraints\Factory;
+use JsonSchema\Entity\ErrorBagProxy;
+use JsonSchema\Entity\JsonPointer;
+use JsonSchema\Tool\DeepComparer;
+
+class ConstConstraint implements ConstraintInterface
+{
+    use ErrorBagProxy;
+
+    public function __construct(?Factory $factory = null)
+    {
+        $this->initialiseErrorBag($factory ?: new Factory());
+    }
+
+    public function check(&$value, $schema = null, ?JsonPointer $path = null, $i = null): void
+    {
+        if (!property_exists($schema, 'const')) {
+            return;
+        }
+
+        if (DeepComparer::isEqual($value, $schema->const)) {
+            return;
+        }
+
+        $this->addError(ConstraintError::CONSTANT(), $path, ['const' => $schema->const]);
+    }
+}
diff -pruN 6.4.1-1/src/JsonSchema/Constraints/Drafts/Draft06/ContainsConstraint.php 6.6.0-1/src/JsonSchema/Constraints/Drafts/Draft06/ContainsConstraint.php
--- 6.4.1-1/src/JsonSchema/Constraints/Drafts/Draft06/ContainsConstraint.php	1970-01-01 00:00:00.000000000 +0000
+++ 6.6.0-1/src/JsonSchema/Constraints/Drafts/Draft06/ContainsConstraint.php	2025-10-10 11:34:09.000000000 +0000
@@ -0,0 +1,47 @@
+<?php
+
+declare(strict_types=1);
+
+namespace JsonSchema\Constraints\Drafts\Draft06;
+
+use JsonSchema\ConstraintError;
+use JsonSchema\Constraints\ConstraintInterface;
+use JsonSchema\Entity\ErrorBagProxy;
+use JsonSchema\Entity\JsonPointer;
+
+class ContainsConstraint implements ConstraintInterface
+{
+    use ErrorBagProxy;
+
+    /** @var Factory */
+    private $factory;
+
+    public function __construct(?Factory $factory = null)
+    {
+        $this->factory = $factory ?: new Factory();
+        $this->initialiseErrorBag($this->factory);
+    }
+
+    public function check(&$value, $schema = null, ?JsonPointer $path = null, $i = null): void
+    {
+        if (!property_exists($schema, 'contains')) {
+            return;
+        }
+
+        $properties = [];
+        if (!is_array($value)) {
+            return;
+        }
+
+        foreach ($value as $propertyName => $propertyValue) {
+            $schemaConstraint = $this->factory->createInstanceFor('schema');
+
+            $schemaConstraint->check($propertyValue, $schema->contains, $path, $i);
+            if ($schemaConstraint->isValid()) {
+                return;
+            }
+        }
+
+        $this->addError(ConstraintError::CONTAINS(), $path, ['contains' => $schema->contains]);
+    }
+}
diff -pruN 6.4.1-1/src/JsonSchema/Constraints/Drafts/Draft06/DependenciesConstraint.php 6.6.0-1/src/JsonSchema/Constraints/Drafts/Draft06/DependenciesConstraint.php
--- 6.4.1-1/src/JsonSchema/Constraints/Drafts/Draft06/DependenciesConstraint.php	1970-01-01 00:00:00.000000000 +0000
+++ 6.6.0-1/src/JsonSchema/Constraints/Drafts/Draft06/DependenciesConstraint.php	2025-10-10 11:34:09.000000000 +0000
@@ -0,0 +1,64 @@
+<?php
+
+declare(strict_types=1);
+
+namespace JsonSchema\Constraints\Drafts\Draft06;
+
+use JsonSchema\ConstraintError;
+use JsonSchema\Constraints\ConstraintInterface;
+use JsonSchema\Entity\ErrorBagProxy;
+use JsonSchema\Entity\JsonPointer;
+
+class DependenciesConstraint implements ConstraintInterface
+{
+    use ErrorBagProxy;
+
+    /** @var Factory */
+    private $factory;
+
+    public function __construct(?Factory $factory = null)
+    {
+        $this->factory = $factory ?: new Factory();
+        $this->initialiseErrorBag($this->factory);
+    }
+
+    public function check(&$value, $schema = null, ?JsonPointer $path = null, $i = null): void
+    {
+        if (!property_exists($schema, 'dependencies')) {
+            return;
+        }
+
+        if (!is_object($value)) {
+            return;
+        }
+
+        foreach ($schema->dependencies as $dependant => $dependencies) {
+            if (!property_exists($value, $dependant)) {
+                continue;
+            }
+            if ($dependencies === true) {
+                continue;
+            }
+            if ($dependencies === false) {
+                $this->addError(ConstraintError::FALSE(), $path, ['dependant' => $dependant]);
+                continue;
+            }
+
+            if (is_array($dependencies)) {
+                foreach ($dependencies as $dependency) {
+                    if (property_exists($value, $dependant) && !property_exists($value, $dependency)) {
+                        $this->addError(ConstraintError::DEPENDENCIES(), $path, ['dependant' => $dependant, 'dependency' => $dependency]);
+                    }
+                }
+            }
+
+            if (is_object($dependencies)) {
+                $schemaConstraint = $this->factory->createInstanceFor('schema');
+                $schemaConstraint->check($value, $dependencies, $path, $i);
+                if (!$schemaConstraint->isValid()) {
+                    $this->addErrors($schemaConstraint->getErrors());
+                }
+            }
+        }
+    }
+}
diff -pruN 6.4.1-1/src/JsonSchema/Constraints/Drafts/Draft06/Draft06Constraint.php 6.6.0-1/src/JsonSchema/Constraints/Drafts/Draft06/Draft06Constraint.php
--- 6.4.1-1/src/JsonSchema/Constraints/Drafts/Draft06/Draft06Constraint.php	1970-01-01 00:00:00.000000000 +0000
+++ 6.6.0-1/src/JsonSchema/Constraints/Drafts/Draft06/Draft06Constraint.php	2025-10-10 11:34:09.000000000 +0000
@@ -0,0 +1,81 @@
+<?php
+
+declare(strict_types=1);
+
+namespace JsonSchema\Constraints\Drafts\Draft06;
+
+use JsonSchema\ConstraintError;
+use JsonSchema\Constraints\Constraint;
+use JsonSchema\Entity\JsonPointer;
+use JsonSchema\SchemaStorage;
+use JsonSchema\Uri\UriRetriever;
+
+class Draft06Constraint extends Constraint
+{
+    public function __construct(?\JsonSchema\Constraints\Factory $factory = null)
+    {
+        parent::__construct(new Factory(
+            $factory ? $factory->getSchemaStorage() : new SchemaStorage(),
+            $factory ? $factory->getUriRetriever() : new UriRetriever(),
+            $factory ? $factory->getConfig() : Constraint::CHECK_MODE_NORMAL
+        ));
+    }
+
+    public function check(&$value, $schema = null, ?JsonPointer $path = null, $i = null): void
+    {
+        if (is_bool($schema)) {
+            if ($schema === false) {
+                $this->addError(ConstraintError::FALSE(), $path, []);
+            }
+
+            return;
+        }
+
+        // Apply defaults
+        $this->checkForKeyword('ref', $value, $schema, $path, $i);
+        $this->checkForKeyword('required', $value, $schema, $path, $i);
+        $this->checkForKeyword('contains', $value, $schema, $path, $i);
+        $this->checkForKeyword('properties', $value, $schema, $path, $i);
+        $this->checkForKeyword('propertyNames', $value, $schema, $path, $i);
+        $this->checkForKeyword('patternProperties', $value, $schema, $path, $i);
+        $this->checkForKeyword('type', $value, $schema, $path, $i);
+        $this->checkForKeyword('not', $value, $schema, $path, $i);
+        $this->checkForKeyword('dependencies', $value, $schema, $path, $i);
+        $this->checkForKeyword('allOf', $value, $schema, $path, $i);
+        $this->checkForKeyword('anyOf', $value, $schema, $path, $i);
+        $this->checkForKeyword('oneOf', $value, $schema, $path, $i);
+
+        $this->checkForKeyword('additionalProperties', $value, $schema, $path, $i);
+        $this->checkForKeyword('items', $value, $schema, $path, $i);
+        $this->checkForKeyword('additionalItems', $value, $schema, $path, $i);
+        $this->checkForKeyword('uniqueItems', $value, $schema, $path, $i);
+        $this->checkForKeyword('minItems', $value, $schema, $path, $i);
+        $this->checkForKeyword('minProperties', $value, $schema, $path, $i);
+        $this->checkForKeyword('maxProperties', $value, $schema, $path, $i);
+        $this->checkForKeyword('minimum', $value, $schema, $path, $i);
+        $this->checkForKeyword('maximum', $value, $schema, $path, $i);
+        $this->checkForKeyword('minLength', $value, $schema, $path, $i);
+        $this->checkForKeyword('exclusiveMinimum', $value, $schema, $path, $i);
+        $this->checkForKeyword('maxItems', $value, $schema, $path, $i);
+        $this->checkForKeyword('maxLength', $value, $schema, $path, $i);
+        $this->checkForKeyword('exclusiveMaximum', $value, $schema, $path, $i);
+        $this->checkForKeyword('enum', $value, $schema, $path, $i);
+        $this->checkForKeyword('const', $value, $schema, $path, $i);
+        $this->checkForKeyword('multipleOf', $value, $schema, $path, $i);
+        $this->checkForKeyword('format', $value, $schema, $path, $i);
+        $this->checkForKeyword('pattern', $value, $schema, $path, $i);
+    }
+
+    /**
+     * @param mixed $value
+     * @param mixed $schema
+     * @param mixed $i
+     */
+    protected function checkForKeyword(string $keyword, $value, $schema = null, ?JsonPointer $path = null, $i = null): void
+    {
+        $validator = $this->factory->createInstanceFor($keyword);
+        $validator->check($value, $schema, $path, $i);
+
+        $this->addErrors($validator->getErrors());
+    }
+}
diff -pruN 6.4.1-1/src/JsonSchema/Constraints/Drafts/Draft06/EnumConstraint.php 6.6.0-1/src/JsonSchema/Constraints/Drafts/Draft06/EnumConstraint.php
--- 6.4.1-1/src/JsonSchema/Constraints/Drafts/Draft06/EnumConstraint.php	1970-01-01 00:00:00.000000000 +0000
+++ 6.6.0-1/src/JsonSchema/Constraints/Drafts/Draft06/EnumConstraint.php	2025-10-10 11:34:09.000000000 +0000
@@ -0,0 +1,41 @@
+<?php
+
+declare(strict_types=1);
+
+namespace JsonSchema\Constraints\Drafts\Draft06;
+
+use JsonSchema\ConstraintError;
+use JsonSchema\Constraints\ConstraintInterface;
+use JsonSchema\Constraints\Factory;
+use JsonSchema\Entity\ErrorBagProxy;
+use JsonSchema\Entity\JsonPointer;
+use JsonSchema\Tool\DeepComparer;
+
+class EnumConstraint implements ConstraintInterface
+{
+    use ErrorBagProxy;
+
+    public function __construct(?Factory $factory = null)
+    {
+        $this->initialiseErrorBag($factory ?: new Factory());
+    }
+
+    public function check(&$value, $schema = null, ?JsonPointer $path = null, $i = null): void
+    {
+        if (!property_exists($schema, 'enum')) {
+            return;
+        }
+
+        foreach ($schema->enum as $enumCase) {
+            if (DeepComparer::isEqual($value, $enumCase)) {
+                return;
+            }
+
+            if (is_numeric($value) && is_numeric($enumCase) && DeepComparer::isEqual((float) $value, (float) $enumCase)) {
+                return;
+            }
+        }
+
+        $this->addError(ConstraintError::ENUM(), $path, ['enum' => $schema->enum]);
+    }
+}
diff -pruN 6.4.1-1/src/JsonSchema/Constraints/Drafts/Draft06/ExclusiveMaximumConstraint.php 6.6.0-1/src/JsonSchema/Constraints/Drafts/Draft06/ExclusiveMaximumConstraint.php
--- 6.4.1-1/src/JsonSchema/Constraints/Drafts/Draft06/ExclusiveMaximumConstraint.php	1970-01-01 00:00:00.000000000 +0000
+++ 6.6.0-1/src/JsonSchema/Constraints/Drafts/Draft06/ExclusiveMaximumConstraint.php	2025-10-10 11:34:09.000000000 +0000
@@ -0,0 +1,38 @@
+<?php
+
+declare(strict_types=1);
+
+namespace JsonSchema\Constraints\Drafts\Draft06;
+
+use JsonSchema\ConstraintError;
+use JsonSchema\Constraints\ConstraintInterface;
+use JsonSchema\Constraints\Factory;
+use JsonSchema\Entity\ErrorBagProxy;
+use JsonSchema\Entity\JsonPointer;
+
+class ExclusiveMaximumConstraint implements ConstraintInterface
+{
+    use ErrorBagProxy;
+
+    public function __construct(?Factory $factory = null)
+    {
+        $this->initialiseErrorBag($factory ?: new Factory());
+    }
+
+    public function check(&$value, $schema = null, ?JsonPointer $path = null, $i = null): void
+    {
+        if (!property_exists($schema, 'exclusiveMaximum')) {
+            return;
+        }
+
+        if (!is_numeric($value)) {
+            return;
+        }
+
+        if ($value < $schema->exclusiveMaximum) {
+            return;
+        }
+
+        $this->addError(ConstraintError::EXCLUSIVE_MAXIMUM(), $path, ['exclusiveMaximum' => $schema->exclusiveMaximum, 'found' => $value]);
+    }
+}
diff -pruN 6.4.1-1/src/JsonSchema/Constraints/Drafts/Draft06/ExclusiveMinimumConstraint.php 6.6.0-1/src/JsonSchema/Constraints/Drafts/Draft06/ExclusiveMinimumConstraint.php
--- 6.4.1-1/src/JsonSchema/Constraints/Drafts/Draft06/ExclusiveMinimumConstraint.php	1970-01-01 00:00:00.000000000 +0000
+++ 6.6.0-1/src/JsonSchema/Constraints/Drafts/Draft06/ExclusiveMinimumConstraint.php	2025-10-10 11:34:09.000000000 +0000
@@ -0,0 +1,38 @@
+<?php
+
+declare(strict_types=1);
+
+namespace JsonSchema\Constraints\Drafts\Draft06;
+
+use JsonSchema\ConstraintError;
+use JsonSchema\Constraints\ConstraintInterface;
+use JsonSchema\Constraints\Factory;
+use JsonSchema\Entity\ErrorBagProxy;
+use JsonSchema\Entity\JsonPointer;
+
+class ExclusiveMinimumConstraint implements ConstraintInterface
+{
+    use ErrorBagProxy;
+
+    public function __construct(?Factory $factory = null)
+    {
+        $this->initialiseErrorBag($factory ?: new Factory());
+    }
+
+    public function check(&$value, $schema = null, ?JsonPointer $path = null, $i = null): void
+    {
+        if (!property_exists($schema, 'exclusiveMinimum')) {
+            return;
+        }
+
+        if (!is_numeric($value)) {
+            return;
+        }
+
+        if ($value > $schema->exclusiveMinimum) {
+            return;
+        }
+
+        $this->addError(ConstraintError::EXCLUSIVE_MINIMUM(), $path, ['exclusiveMinimum' => $schema->exclusiveMinimum, 'found' => $value]);
+    }
+}
diff -pruN 6.4.1-1/src/JsonSchema/Constraints/Drafts/Draft06/Factory.php 6.6.0-1/src/JsonSchema/Constraints/Drafts/Draft06/Factory.php
--- 6.4.1-1/src/JsonSchema/Constraints/Drafts/Draft06/Factory.php	1970-01-01 00:00:00.000000000 +0000
+++ 6.6.0-1/src/JsonSchema/Constraints/Drafts/Draft06/Factory.php	2025-10-10 11:34:09.000000000 +0000
@@ -0,0 +1,46 @@
+<?php
+
+declare(strict_types=1);
+
+namespace JsonSchema\Constraints\Drafts\Draft06;
+
+class Factory extends \JsonSchema\Constraints\Factory
+{
+    /**
+     * @var array<string, class-string>
+     */
+    protected $constraintMap = [
+        'schema' => Draft06Constraint::class,
+        'additionalProperties' => AdditionalPropertiesConstraint::class,
+        'additionalItems' => AdditionalItemsConstraint::class,
+        'dependencies' => DependenciesConstraint::class,
+        'type' => TypeConstraint::class,
+        'const' => ConstConstraint::class,
+        'enum' => EnumConstraint::class,
+        'uniqueItems' => UniqueItemsConstraint::class,
+        'minItems' => MinItemsConstraint::class,
+        'minProperties' => MinPropertiesConstraint::class,
+        'maxProperties' => MaxPropertiesConstraint::class,
+        'minimum' => MinimumConstraint::class,
+        'maximum' => MaximumConstraint::class,
+        'exclusiveMinimum' => ExclusiveMinimumConstraint::class,
+        'minLength' => MinLengthConstraint::class,
+        'maxLength' => MaxLengthConstraint::class,
+        'maxItems' => MaxItemsConstraint::class,
+        'exclusiveMaximum' => ExclusiveMaximumConstraint::class,
+        'multipleOf' => MultipleOfConstraint::class,
+        'required' => RequiredConstraint::class,
+        'format' => FormatConstraint::class,
+        'anyOf' => AnyOfConstraint::class,
+        'allOf' => AllOfConstraint::class,
+        'oneOf' => OneOfConstraint::class,
+        'not' => NotConstraint::class,
+        'contains' => ContainsConstraint::class,
+        'propertyNames' => PropertiesNamesConstraint::class,
+        'patternProperties' => PatternPropertiesConstraint::class,
+        'pattern' => PatternConstraint::class,
+        'properties' => PropertiesConstraint::class,
+        'items' => ItemsConstraint::class,
+        'ref' => RefConstraint::class,
+    ];
+}
diff -pruN 6.4.1-1/src/JsonSchema/Constraints/Drafts/Draft06/FormatConstraint.php 6.6.0-1/src/JsonSchema/Constraints/Drafts/Draft06/FormatConstraint.php
--- 6.4.1-1/src/JsonSchema/Constraints/Drafts/Draft06/FormatConstraint.php	1970-01-01 00:00:00.000000000 +0000
+++ 6.6.0-1/src/JsonSchema/Constraints/Drafts/Draft06/FormatConstraint.php	2025-10-10 11:34:09.000000000 +0000
@@ -0,0 +1,220 @@
+<?php
+
+declare(strict_types=1);
+
+namespace JsonSchema\Constraints\Drafts\Draft06;
+
+use JsonSchema\ConstraintError;
+use JsonSchema\Constraints\ConstraintInterface;
+use JsonSchema\Constraints\Factory;
+use JsonSchema\Entity\ErrorBagProxy;
+use JsonSchema\Entity\JsonPointer;
+use JsonSchema\Rfc3339;
+use JsonSchema\Tool\Validator\RelativeReferenceValidator;
+use JsonSchema\Tool\Validator\UriValidator;
+
+class FormatConstraint implements ConstraintInterface
+{
+    use ErrorBagProxy;
+
+    public function __construct(?Factory $factory = null)
+    {
+        $this->initialiseErrorBag($factory ?: new Factory());
+    }
+
+    public function check(&$value, $schema = null, ?JsonPointer $path = null, $i = null): void
+    {
+        if (!property_exists($schema, 'format')) {
+            return;
+        }
+
+        if (!is_string($value)) {
+            return;
+        }
+
+        switch ($schema->format) {
+            case 'date':
+                if (!$this->validateDateTime($value, 'Y-m-d')) {
+                    $this->addError(ConstraintError::FORMAT_DATE(), $path, ['date' => $value, 'format' => $schema->format]);
+                }
+                break;
+            case 'time':
+                if (!$this->validateDateTime($value, 'H:i:s')) {
+                    $this->addError(ConstraintError::FORMAT_TIME(), $path, ['time' => $value, 'format' => $schema->format]);
+                }
+                break;
+            case 'date-time':
+                if (!$this->validateRfc3339DateTime($value)) {
+                    $this->addError(ConstraintError::FORMAT_DATE_TIME(), $path, ['dateTime' => $value, 'format' => $schema->format]);
+                }
+                break;
+            case 'utc-millisec':
+                if (!$this->validateDateTime($value, 'U')) {
+                    $this->addError(ConstraintError::FORMAT_DATE_UTC(), $path, ['value' => $value, 'format' => $schema->format]);
+                }
+                break;
+            case 'regex':
+                if (!$this->validateRegex($value)) {
+                    $this->addError(ConstraintError::FORMAT_REGEX(), $path, ['value' => $value, 'format' => $schema->format]);
+                }
+                break;
+            case 'ip-address':
+            case 'ipv4':
+                if (filter_var($value, FILTER_VALIDATE_IP, FILTER_NULL_ON_FAILURE | FILTER_FLAG_IPV4) === null) {
+                    $this->addError(ConstraintError::FORMAT_IP(), $path, ['format' => $schema->format]);
+                }
+                break;
+            case 'ipv6':
+                if (filter_var($value, FILTER_VALIDATE_IP, FILTER_NULL_ON_FAILURE | FILTER_FLAG_IPV6) === null) {
+                    $this->addError(ConstraintError::FORMAT_IP(), $path, ['format' => $schema->format]);
+                }
+                break;
+            case 'color':
+                if (!$this->validateColor($value)) {
+                    $this->addError(ConstraintError::FORMAT_COLOR(), $path, ['format' => $schema->format]);
+                }
+                break;
+            case 'style':
+                if (!$this->validateStyle($value)) {
+                    $this->addError(ConstraintError::FORMAT_STYLE(), $path, ['format' => $schema->format]);
+                }
+                break;
+            case 'phone':
+                if (!$this->validatePhone($value)) {
+                    $this->addError(ConstraintError::FORMAT_PHONE(), $path, ['format' => $schema->format]);
+                }
+                break;
+            case 'uri':
+                if (!UriValidator::isValid($value)) {
+                    $this->addError(ConstraintError::FORMAT_URL(), $path, ['format' => $schema->format]);
+                }
+                break;
+
+            case 'uriref':
+            case 'uri-reference':
+                if (!(UriValidator::isValid($value) || RelativeReferenceValidator::isValid($value))) {
+                    $this->addError(ConstraintError::FORMAT_URL(), $path, ['format' => $schema->format]);
+                }
+                break;
+            case 'uri-template':
+                if (!$this->validateUriTemplate($value)) {
+                    $this->addError(ConstraintError::FORMAT_URI_TEMPLATE(), $path, ['format' => $schema->format]);
+                }
+                break;
+
+            case 'email':
+                if (filter_var($value, FILTER_VALIDATE_EMAIL, FILTER_NULL_ON_FAILURE | FILTER_FLAG_EMAIL_UNICODE) === null) {
+                    $this->addError(ConstraintError::FORMAT_EMAIL(), $path, ['format' => $schema->format]);
+                }
+                break;
+            case 'host-name':
+            case 'hostname':
+                if (!$this->validateHostname($value)) {
+                    $this->addError(ConstraintError::FORMAT_HOSTNAME(), $path, ['format' => $schema->format]);
+                }
+                break;
+            case 'json-pointer':
+                if (!$this->validateJsonPointer($value)) {
+                    $this->addError(ConstraintError::FORMAT_JSON_POINTER(), $path, ['format' => $schema->format]);
+                }
+                break;
+            default:
+                break;
+        }
+    }
+
+    private function validateDateTime(string $datetime, string $format): bool
+    {
+        $dt = \DateTime::createFromFormat($format, $datetime);
+
+        if (!$dt) {
+            return false;
+        }
+
+        return $datetime === $dt->format($format);
+    }
+
+    private function validateRegex(string $regex): bool
+    {
+        return preg_match(self::jsonPatternToPhpRegex($regex), '') !== false;
+    }
+
+    /**
+     * Transform a JSON pattern into a PCRE regex
+     */
+    private static function jsonPatternToPhpRegex(string $pattern): string
+    {
+        return '~' . str_replace('~', '\\~', $pattern) . '~u';
+    }
+
+    private function validateColor(string $color): bool
+    {
+        if (in_array(strtolower($color), ['aqua', 'black', 'blue', 'fuchsia',
+            'gray', 'green', 'lime', 'maroon', 'navy', 'olive', 'orange', 'purple',
+            'red', 'silver', 'teal', 'white', 'yellow'])) {
+            return true;
+        }
+
+        return preg_match('/^#([a-f0-9]{3}|[a-f0-9]{6})$/i', $color) !== false;
+    }
+
+    private function validateStyle(string $style): bool
+    {
+        $properties     = explode(';', rtrim($style, ';'));
+        $invalidEntries = preg_grep('/^\s*[-a-z]+\s*:\s*.+$/i', $properties, PREG_GREP_INVERT);
+
+        return empty($invalidEntries);
+    }
+
+    private function validatePhone(string $phone): bool
+    {
+        return preg_match('/^\+?(\(\d{3}\)|\d{3}) \d{3} \d{4}$/', $phone) !== false;
+    }
+
+    private function validateHostname(string $host): bool
+    {
+        $hostnameRegex = '/^(?!-)(?!.*?[^A-Za-z0-9\-\.])(?:(?!-)[A-Za-z0-9](?:[A-Za-z0-9\-]{0,61}[A-Za-z0-9])?\.)*(?!-)[A-Za-z0-9](?:[A-Za-z0-9\-]{0,61}[A-Za-z0-9])?$/';
+
+        return preg_match($hostnameRegex, $host) === 1;
+    }
+
+    private function validateJsonPointer(string $value): bool
+    {
+        // Must be empty or start with a forward slash
+        if ($value !== '' && $value[0] !== '/') {
+            return false;
+        }
+
+        // Split into reference tokens and check for invalid escape sequences
+        $tokens = explode('/', $value);
+        array_shift($tokens); // remove leading empty part due to leading slash
+
+        foreach ($tokens as $token) {
+            // "~" must only be followed by "0" or "1"
+            if (preg_match('/~(?![01])/', $token)) {
+                return false;
+            }
+        }
+
+        return true;
+    }
+
+    private function validateRfc3339DateTime(string $value): bool
+    {
+        $dateTime = Rfc3339::createFromString($value);
+        if (is_null($dateTime)) {
+            return false;
+        }
+
+        // Compare value and date result to be equal
+        return true;
+    }
+
+    private function validateUriTemplate(string $value): bool
+    {
+        return preg_match(
+            '/^(?:[^\{\}]*|\{[a-zA-Z0-9_:%\/\.~\-\+\*]+\})*$/',
+            $value
+        ) === 1;
+    }
+}
diff -pruN 6.4.1-1/src/JsonSchema/Constraints/Drafts/Draft06/ItemsConstraint.php 6.6.0-1/src/JsonSchema/Constraints/Drafts/Draft06/ItemsConstraint.php
--- 6.4.1-1/src/JsonSchema/Constraints/Drafts/Draft06/ItemsConstraint.php	1970-01-01 00:00:00.000000000 +0000
+++ 6.6.0-1/src/JsonSchema/Constraints/Drafts/Draft06/ItemsConstraint.php	2025-10-10 11:34:09.000000000 +0000
@@ -0,0 +1,52 @@
+<?php
+
+declare(strict_types=1);
+
+namespace JsonSchema\Constraints\Drafts\Draft06;
+
+use JsonSchema\Constraints\ConstraintInterface;
+use JsonSchema\Entity\ErrorBagProxy;
+use JsonSchema\Entity\JsonPointer;
+
+class ItemsConstraint implements ConstraintInterface
+{
+    use ErrorBagProxy;
+
+    /** @var Factory */
+    private $factory;
+
+    public function __construct(?Factory $factory = null)
+    {
+        $this->factory = $factory ?: new Factory();
+        $this->initialiseErrorBag($this->factory);
+    }
+
+    public function check(&$value, $schema = null, ?JsonPointer $path = null, $i = null): void
+    {
+        if (!property_exists($schema, 'items')) {
+            return;
+        }
+
+        if (!is_array($value)) {
+            return;
+        }
+
+        foreach ($value as $propertyName => $propertyValue) {
+            $itemSchema = $schema->items;
+            if (is_array($itemSchema)) {
+                if (!array_key_exists($propertyName, $itemSchema)) {
+                    continue;
+                }
+
+                $itemSchema  = $itemSchema[$propertyName];
+            }
+            $schemaConstraint = $this->factory->createInstanceFor('schema');
+            $schemaConstraint->check($propertyValue, $itemSchema, $path, $i);
+            if ($schemaConstraint->isValid()) {
+                continue;
+            }
+
+            $this->addErrors($schemaConstraint->getErrors());
+        }
+    }
+}
diff -pruN 6.4.1-1/src/JsonSchema/Constraints/Drafts/Draft06/MaxItemsConstraint.php 6.6.0-1/src/JsonSchema/Constraints/Drafts/Draft06/MaxItemsConstraint.php
--- 6.4.1-1/src/JsonSchema/Constraints/Drafts/Draft06/MaxItemsConstraint.php	1970-01-01 00:00:00.000000000 +0000
+++ 6.6.0-1/src/JsonSchema/Constraints/Drafts/Draft06/MaxItemsConstraint.php	2025-10-10 11:34:09.000000000 +0000
@@ -0,0 +1,39 @@
+<?php
+
+declare(strict_types=1);
+
+namespace JsonSchema\Constraints\Drafts\Draft06;
+
+use JsonSchema\ConstraintError;
+use JsonSchema\Constraints\ConstraintInterface;
+use JsonSchema\Constraints\Factory;
+use JsonSchema\Entity\ErrorBagProxy;
+use JsonSchema\Entity\JsonPointer;
+
+class MaxItemsConstraint implements ConstraintInterface
+{
+    use ErrorBagProxy;
+
+    public function __construct(?Factory $factory = null)
+    {
+        $this->initialiseErrorBag($factory ?: new Factory());
+    }
+
+    public function check(&$value, $schema = null, ?JsonPointer $path = null, $i = null): void
+    {
+        if (!property_exists($schema, 'maxItems')) {
+            return;
+        }
+
+        if (!is_array($value)) {
+            return;
+        }
+
+        $count = count($value);
+        if ($count <= $schema->maxItems) {
+            return;
+        }
+
+        $this->addError(ConstraintError::MAX_ITEMS(), $path, ['maxItems' => $schema->maxItems, 'found' => $count]);
+    }
+}
diff -pruN 6.4.1-1/src/JsonSchema/Constraints/Drafts/Draft06/MaxLengthConstraint.php 6.6.0-1/src/JsonSchema/Constraints/Drafts/Draft06/MaxLengthConstraint.php
--- 6.4.1-1/src/JsonSchema/Constraints/Drafts/Draft06/MaxLengthConstraint.php	1970-01-01 00:00:00.000000000 +0000
+++ 6.6.0-1/src/JsonSchema/Constraints/Drafts/Draft06/MaxLengthConstraint.php	2025-10-10 11:34:09.000000000 +0000
@@ -0,0 +1,39 @@
+<?php
+
+declare(strict_types=1);
+
+namespace JsonSchema\Constraints\Drafts\Draft06;
+
+use JsonSchema\ConstraintError;
+use JsonSchema\Constraints\ConstraintInterface;
+use JsonSchema\Constraints\Factory;
+use JsonSchema\Entity\ErrorBagProxy;
+use JsonSchema\Entity\JsonPointer;
+
+class MaxLengthConstraint implements ConstraintInterface
+{
+    use ErrorBagProxy;
+
+    public function __construct(?Factory $factory = null)
+    {
+        $this->initialiseErrorBag($factory ?: new Factory());
+    }
+
+    public function check(&$value, $schema = null, ?JsonPointer $path = null, $i = null): void
+    {
+        if (!property_exists($schema, 'maxLength')) {
+            return;
+        }
+
+        if (!is_string($value)) {
+            return;
+        }
+
+        $length = mb_strlen($value);
+        if ($length <= $schema->maxLength) {
+            return;
+        }
+
+        $this->addError(ConstraintError::LENGTH_MAX(), $path, ['maxLength' => $schema->maxLength, 'found' => $length]);
+    }
+}
diff -pruN 6.4.1-1/src/JsonSchema/Constraints/Drafts/Draft06/MaxPropertiesConstraint.php 6.6.0-1/src/JsonSchema/Constraints/Drafts/Draft06/MaxPropertiesConstraint.php
--- 6.4.1-1/src/JsonSchema/Constraints/Drafts/Draft06/MaxPropertiesConstraint.php	1970-01-01 00:00:00.000000000 +0000
+++ 6.6.0-1/src/JsonSchema/Constraints/Drafts/Draft06/MaxPropertiesConstraint.php	2025-10-10 11:34:09.000000000 +0000
@@ -0,0 +1,39 @@
+<?php
+
+declare(strict_types=1);
+
+namespace JsonSchema\Constraints\Drafts\Draft06;
+
+use JsonSchema\ConstraintError;
+use JsonSchema\Constraints\ConstraintInterface;
+use JsonSchema\Constraints\Factory;
+use JsonSchema\Entity\ErrorBagProxy;
+use JsonSchema\Entity\JsonPointer;
+
+class MaxPropertiesConstraint implements ConstraintInterface
+{
+    use ErrorBagProxy;
+
+    public function __construct(?Factory $factory = null)
+    {
+        $this->initialiseErrorBag($factory ?: new Factory());
+    }
+
+    public function check(&$value, $schema = null, ?JsonPointer $path = null, $i = null): void
+    {
+        if (!property_exists($schema, 'maxProperties')) {
+            return;
+        }
+
+        if (!is_object($value)) {
+            return;
+        }
+
+        $count = count(get_object_vars($value));
+        if ($count <= $schema->maxProperties) {
+            return;
+        }
+
+        $this->addError(ConstraintError::PROPERTIES_MAX(), $path, ['maxProperties' => $schema->maxProperties, 'found' => $count]);
+    }
+}
diff -pruN 6.4.1-1/src/JsonSchema/Constraints/Drafts/Draft06/MaximumConstraint.php 6.6.0-1/src/JsonSchema/Constraints/Drafts/Draft06/MaximumConstraint.php
--- 6.4.1-1/src/JsonSchema/Constraints/Drafts/Draft06/MaximumConstraint.php	1970-01-01 00:00:00.000000000 +0000
+++ 6.6.0-1/src/JsonSchema/Constraints/Drafts/Draft06/MaximumConstraint.php	2025-10-10 11:34:09.000000000 +0000
@@ -0,0 +1,38 @@
+<?php
+
+declare(strict_types=1);
+
+namespace JsonSchema\Constraints\Drafts\Draft06;
+
+use JsonSchema\ConstraintError;
+use JsonSchema\Constraints\ConstraintInterface;
+use JsonSchema\Constraints\Factory;
+use JsonSchema\Entity\ErrorBagProxy;
+use JsonSchema\Entity\JsonPointer;
+
+class MaximumConstraint implements ConstraintInterface
+{
+    use ErrorBagProxy;
+
+    public function __construct(?Factory $factory = null)
+    {
+        $this->initialiseErrorBag($factory ?: new Factory());
+    }
+
+    public function check(&$value, $schema = null, ?JsonPointer $path = null, $i = null): void
+    {
+        if (!property_exists($schema, 'maximum')) {
+            return;
+        }
+
+        if (!is_numeric($value)) {
+            return;
+        }
+
+        if ($value <= $schema->maximum) {
+            return;
+        }
+
+        $this->addError(ConstraintError::MAXIMUM(), $path, ['maximum' => $schema->maximum, 'found' => $value]);
+    }
+}
diff -pruN 6.4.1-1/src/JsonSchema/Constraints/Drafts/Draft06/MinItemsConstraint.php 6.6.0-1/src/JsonSchema/Constraints/Drafts/Draft06/MinItemsConstraint.php
--- 6.4.1-1/src/JsonSchema/Constraints/Drafts/Draft06/MinItemsConstraint.php	1970-01-01 00:00:00.000000000 +0000
+++ 6.6.0-1/src/JsonSchema/Constraints/Drafts/Draft06/MinItemsConstraint.php	2025-10-10 11:34:09.000000000 +0000
@@ -0,0 +1,39 @@
+<?php
+
+declare(strict_types=1);
+
+namespace JsonSchema\Constraints\Drafts\Draft06;
+
+use JsonSchema\ConstraintError;
+use JsonSchema\Constraints\ConstraintInterface;
+use JsonSchema\Constraints\Factory;
+use JsonSchema\Entity\ErrorBagProxy;
+use JsonSchema\Entity\JsonPointer;
+
+class MinItemsConstraint implements ConstraintInterface
+{
+    use ErrorBagProxy;
+
+    public function __construct(?Factory $factory = null)
+    {
+        $this->initialiseErrorBag($factory ?: new Factory());
+    }
+
+    public function check(&$value, $schema = null, ?JsonPointer $path = null, $i = null): void
+    {
+        if (!property_exists($schema, 'minItems')) {
+            return;
+        }
+
+        if (!is_array($value)) {
+            return;
+        }
+
+        $count = count($value);
+        if ($count >= $schema->minItems) {
+            return;
+        }
+
+        $this->addError(ConstraintError::MIN_ITEMS(), $path, ['minItems' => $schema->minItems, 'found' => $count]);
+    }
+}
diff -pruN 6.4.1-1/src/JsonSchema/Constraints/Drafts/Draft06/MinLengthConstraint.php 6.6.0-1/src/JsonSchema/Constraints/Drafts/Draft06/MinLengthConstraint.php
--- 6.4.1-1/src/JsonSchema/Constraints/Drafts/Draft06/MinLengthConstraint.php	1970-01-01 00:00:00.000000000 +0000
+++ 6.6.0-1/src/JsonSchema/Constraints/Drafts/Draft06/MinLengthConstraint.php	2025-10-10 11:34:09.000000000 +0000
@@ -0,0 +1,39 @@
+<?php
+
+declare(strict_types=1);
+
+namespace JsonSchema\Constraints\Drafts\Draft06;
+
+use JsonSchema\ConstraintError;
+use JsonSchema\Constraints\ConstraintInterface;
+use JsonSchema\Constraints\Factory;
+use JsonSchema\Entity\ErrorBagProxy;
+use JsonSchema\Entity\JsonPointer;
+
+class MinLengthConstraint implements ConstraintInterface
+{
+    use ErrorBagProxy;
+
+    public function __construct(?Factory $factory = null)
+    {
+        $this->initialiseErrorBag($factory ?: new Factory());
+    }
+
+    public function check(&$value, $schema = null, ?JsonPointer $path = null, $i = null): void
+    {
+        if (!property_exists($schema, 'minLength')) {
+            return;
+        }
+
+        if (!is_string($value)) {
+            return;
+        }
+
+        $length = mb_strlen($value);
+        if ($length >= $schema->minLength) {
+            return;
+        }
+
+        $this->addError(ConstraintError::LENGTH_MIN(), $path, ['minLength' => $schema->minLength, 'found' => $length]);
+    }
+}
diff -pruN 6.4.1-1/src/JsonSchema/Constraints/Drafts/Draft06/MinPropertiesConstraint.php 6.6.0-1/src/JsonSchema/Constraints/Drafts/Draft06/MinPropertiesConstraint.php
--- 6.4.1-1/src/JsonSchema/Constraints/Drafts/Draft06/MinPropertiesConstraint.php	1970-01-01 00:00:00.000000000 +0000
+++ 6.6.0-1/src/JsonSchema/Constraints/Drafts/Draft06/MinPropertiesConstraint.php	2025-10-10 11:34:09.000000000 +0000
@@ -0,0 +1,39 @@
+<?php
+
+declare(strict_types=1);
+
+namespace JsonSchema\Constraints\Drafts\Draft06;
+
+use JsonSchema\ConstraintError;
+use JsonSchema\Constraints\ConstraintInterface;
+use JsonSchema\Constraints\Factory;
+use JsonSchema\Entity\ErrorBagProxy;
+use JsonSchema\Entity\JsonPointer;
+
+class MinPropertiesConstraint implements ConstraintInterface
+{
+    use ErrorBagProxy;
+
+    public function __construct(?Factory $factory = null)
+    {
+        $this->initialiseErrorBag($factory ?: new Factory());
+    }
+
+    public function check(&$value, $schema = null, ?JsonPointer $path = null, $i = null): void
+    {
+        if (!property_exists($schema, 'minProperties')) {
+            return;
+        }
+
+        if (!is_object($value)) {
+            return;
+        }
+
+        $count = count(get_object_vars($value));
+        if ($count >= $schema->minProperties) {
+            return;
+        }
+
+        $this->addError(ConstraintError::PROPERTIES_MIN(), $path, ['minProperties' => $schema->minProperties, 'found' => $count]);
+    }
+}
diff -pruN 6.4.1-1/src/JsonSchema/Constraints/Drafts/Draft06/MinimumConstraint.php 6.6.0-1/src/JsonSchema/Constraints/Drafts/Draft06/MinimumConstraint.php
--- 6.4.1-1/src/JsonSchema/Constraints/Drafts/Draft06/MinimumConstraint.php	1970-01-01 00:00:00.000000000 +0000
+++ 6.6.0-1/src/JsonSchema/Constraints/Drafts/Draft06/MinimumConstraint.php	2025-10-10 11:34:09.000000000 +0000
@@ -0,0 +1,38 @@
+<?php
+
+declare(strict_types=1);
+
+namespace JsonSchema\Constraints\Drafts\Draft06;
+
+use JsonSchema\ConstraintError;
+use JsonSchema\Constraints\ConstraintInterface;
+use JsonSchema\Constraints\Factory;
+use JsonSchema\Entity\ErrorBagProxy;
+use JsonSchema\Entity\JsonPointer;
+
+class MinimumConstraint implements ConstraintInterface
+{
+    use ErrorBagProxy;
+
+    public function __construct(?Factory $factory = null)
+    {
+        $this->initialiseErrorBag($factory ?: new Factory());
+    }
+
+    public function check(&$value, $schema = null, ?JsonPointer $path = null, $i = null): void
+    {
+        if (!property_exists($schema, 'minimum')) {
+            return;
+        }
+
+        if (!is_numeric($value)) {
+            return;
+        }
+
+        if ($value >= $schema->minimum) {
+            return;
+        }
+
+        $this->addError(ConstraintError::MINIMUM(), $path, ['minimum' => $schema->minimum, 'found' => $value]);
+    }
+}
diff -pruN 6.4.1-1/src/JsonSchema/Constraints/Drafts/Draft06/MultipleOfConstraint.php 6.6.0-1/src/JsonSchema/Constraints/Drafts/Draft06/MultipleOfConstraint.php
--- 6.4.1-1/src/JsonSchema/Constraints/Drafts/Draft06/MultipleOfConstraint.php	1970-01-01 00:00:00.000000000 +0000
+++ 6.6.0-1/src/JsonSchema/Constraints/Drafts/Draft06/MultipleOfConstraint.php	2025-10-10 11:34:09.000000000 +0000
@@ -0,0 +1,54 @@
+<?php
+
+declare(strict_types=1);
+
+namespace JsonSchema\Constraints\Drafts\Draft06;
+
+use JsonSchema\ConstraintError;
+use JsonSchema\Constraints\ConstraintInterface;
+use JsonSchema\Constraints\Factory;
+use JsonSchema\Entity\ErrorBagProxy;
+use JsonSchema\Entity\JsonPointer;
+
+class MultipleOfConstraint implements ConstraintInterface
+{
+    use ErrorBagProxy;
+
+    public function __construct(?Factory $factory = null)
+    {
+        $this->initialiseErrorBag($factory ?: new Factory());
+    }
+
+    public function check(&$value, $schema = null, ?JsonPointer $path = null, $i = null): void
+    {
+        if (!property_exists($schema, 'multipleOf')) {
+            return;
+        }
+
+        if (!is_int($schema->multipleOf) && !is_float($schema->multipleOf) && $schema->multipleOf <= 0.0) {
+            return;
+        }
+
+        if (!is_int($value) && !is_float($value)) {
+            return;
+        }
+
+        if ($this->isMultipleOf($value, $schema->multipleOf)) {
+            return;
+        }
+
+        $this->addError(ConstraintError::MULTIPLE_OF(), $path, ['multipleOf' => $schema->multipleOf, 'found' => $value]);
+    }
+
+    /**
+     * @param int|float $number1
+     * @param int|float $number2
+     */
+    private function isMultipleOf($number1, $number2): bool
+    {
+        $modulus = ($number1 - round($number1 / $number2) * $number2);
+        $precision = 0.0000000001;
+
+        return -$precision < $modulus && $modulus < $precision;
+    }
+}
diff -pruN 6.4.1-1/src/JsonSchema/Constraints/Drafts/Draft06/NotConstraint.php 6.6.0-1/src/JsonSchema/Constraints/Drafts/Draft06/NotConstraint.php
--- 6.4.1-1/src/JsonSchema/Constraints/Drafts/Draft06/NotConstraint.php	1970-01-01 00:00:00.000000000 +0000
+++ 6.6.0-1/src/JsonSchema/Constraints/Drafts/Draft06/NotConstraint.php	2025-10-10 11:34:09.000000000 +0000
@@ -0,0 +1,40 @@
+<?php
+
+declare(strict_types=1);
+
+namespace JsonSchema\Constraints\Drafts\Draft06;
+
+use JsonSchema\ConstraintError;
+use JsonSchema\Constraints\ConstraintInterface;
+use JsonSchema\Entity\ErrorBagProxy;
+use JsonSchema\Entity\JsonPointer;
+
+class NotConstraint implements ConstraintInterface
+{
+    use ErrorBagProxy;
+
+    /** @var Factory */
+    private $factory;
+
+    public function __construct(?Factory $factory = null)
+    {
+        $this->factory = $factory ?: new Factory();
+        $this->initialiseErrorBag($this->factory);
+    }
+
+    public function check(&$value, $schema = null, ?JsonPointer $path = null, $i = null): void
+    {
+        if (!property_exists($schema, 'not')) {
+            return;
+        }
+
+        $schemaConstraint = $this->factory->createInstanceFor('schema');
+        $schemaConstraint->check($value, $schema->not, $path, $i);
+
+        if (!$schemaConstraint->isValid()) {
+            return;
+        }
+
+        $this->addError(ConstraintError::NOT(), $path);
+    }
+}
diff -pruN 6.4.1-1/src/JsonSchema/Constraints/Drafts/Draft06/OneOfConstraint.php 6.6.0-1/src/JsonSchema/Constraints/Drafts/Draft06/OneOfConstraint.php
--- 6.4.1-1/src/JsonSchema/Constraints/Drafts/Draft06/OneOfConstraint.php	1970-01-01 00:00:00.000000000 +0000
+++ 6.6.0-1/src/JsonSchema/Constraints/Drafts/Draft06/OneOfConstraint.php	2025-10-10 11:34:09.000000000 +0000
@@ -0,0 +1,50 @@
+<?php
+
+declare(strict_types=1);
+
+namespace JsonSchema\Constraints\Drafts\Draft06;
+
+use JsonSchema\ConstraintError;
+use JsonSchema\Constraints\ConstraintInterface;
+use JsonSchema\Entity\ErrorBagProxy;
+use JsonSchema\Entity\JsonPointer;
+
+class OneOfConstraint implements ConstraintInterface
+{
+    use ErrorBagProxy;
+
+    /** @var Factory */
+    private $factory;
+
+    public function __construct(?Factory $factory = null)
+    {
+        $this->factory = $factory ?: new Factory();
+        $this->initialiseErrorBag($this->factory);
+    }
+
+    public function check(&$value, $schema = null, ?JsonPointer $path = null, $i = null): void
+    {
+        if (!property_exists($schema, 'oneOf')) {
+            return;
+        }
+
+        $matchedSchema = 0;
+        foreach ($schema->oneOf as $oneOfSchema) {
+            $schemaConstraint = $this->factory->createInstanceFor('schema');
+            $schemaConstraint->check($value, $oneOfSchema, $path, $i);
+
+            if ($schemaConstraint->isValid()) {
+                $matchedSchema++;
+                continue;
+            }
+
+            $this->addErrors($schemaConstraint->getErrors());
+        }
+
+        if ($matchedSchema !== 1) {
+            $this->addError(ConstraintError::ONE_OF(), $path);
+        } else {
+            $this->errorBag()->reset();
+        }
+    }
+}
diff -pruN 6.4.1-1/src/JsonSchema/Constraints/Drafts/Draft06/PatternConstraint.php 6.6.0-1/src/JsonSchema/Constraints/Drafts/Draft06/PatternConstraint.php
--- 6.4.1-1/src/JsonSchema/Constraints/Drafts/Draft06/PatternConstraint.php	1970-01-01 00:00:00.000000000 +0000
+++ 6.6.0-1/src/JsonSchema/Constraints/Drafts/Draft06/PatternConstraint.php	2025-10-10 11:34:09.000000000 +0000
@@ -0,0 +1,63 @@
+<?php
+
+declare(strict_types=1);
+
+namespace JsonSchema\Constraints\Drafts\Draft06;
+
+use JsonSchema\ConstraintError;
+use JsonSchema\Constraints\ConstraintInterface;
+use JsonSchema\Entity\ErrorBagProxy;
+use JsonSchema\Entity\JsonPointer;
+
+class PatternConstraint implements ConstraintInterface
+{
+    use ErrorBagProxy;
+
+    /** @var Factory */
+    private $factory;
+
+    public function __construct(?Factory $factory = null)
+    {
+        $this->factory = $factory ?: new Factory();
+        $this->initialiseErrorBag($this->factory);
+    }
+
+    public function check(&$value, $schema = null, ?JsonPointer $path = null, $i = null): void
+    {
+        if (!property_exists($schema, 'pattern')) {
+            return;
+        }
+
+        if (!is_string($value)) {
+            return;
+        }
+
+        $matchPattern = $this->createPregMatchPattern($schema->pattern);
+        if (preg_match($matchPattern, $value) === 1) {
+            return;
+        }
+
+        $this->addError(ConstraintError::PATTERN(), $path, ['found' => $value, 'pattern' => $schema->pattern]);
+    }
+
+    private function createPregMatchPattern(string $pattern): string
+    {
+        $replacements = [
+            '\D' => '[^0-9]',
+            '\d' => '[0-9]',
+            '\p{digit}' => '[0-9]',
+            '\w' => '[A-Za-z0-9_]',
+            '\W' => '[^A-Za-z0-9_]',
+            '\s' => '[\s\x{200B}]', // Explicitly include zero width white space
+            '\p{Letter}' => '\p{L}', // Map ECMA long property name to PHP (PCRE) Unicode property abbreviations
+        ];
+
+        $pattern = str_replace(
+            array_keys($replacements),
+            array_values($replacements),
+            $pattern
+        );
+
+        return '/' . str_replace('/', '\/', $pattern) . '/u';
+    }
+}
diff -pruN 6.4.1-1/src/JsonSchema/Constraints/Drafts/Draft06/PatternPropertiesConstraint.php 6.6.0-1/src/JsonSchema/Constraints/Drafts/Draft06/PatternPropertiesConstraint.php
--- 6.4.1-1/src/JsonSchema/Constraints/Drafts/Draft06/PatternPropertiesConstraint.php	1970-01-01 00:00:00.000000000 +0000
+++ 6.6.0-1/src/JsonSchema/Constraints/Drafts/Draft06/PatternPropertiesConstraint.php	2025-10-10 11:34:09.000000000 +0000
@@ -0,0 +1,72 @@
+<?php
+
+declare(strict_types=1);
+
+namespace JsonSchema\Constraints\Drafts\Draft06;
+
+use JsonSchema\Constraints\ConstraintInterface;
+use JsonSchema\Entity\ErrorBagProxy;
+use JsonSchema\Entity\JsonPointer;
+
+class PatternPropertiesConstraint implements ConstraintInterface
+{
+    use ErrorBagProxy;
+
+    /** @var Factory */
+    private $factory;
+
+    public function __construct(?Factory $factory = null)
+    {
+        $this->factory = $factory ?: new Factory();
+        $this->initialiseErrorBag($this->factory);
+    }
+
+    public function check(&$value, $schema = null, ?JsonPointer $path = null, $i = null): void
+    {
+        if (!property_exists($schema, 'patternProperties')) {
+            return;
+        }
+
+        if (!is_object($value)) {
+            return;
+        }
+
+        $properties = get_object_vars($value);
+
+        foreach ($properties as $propertyName => $propertyValue) {
+            foreach ($schema->patternProperties as $patternPropertyRegex => $patternPropertySchema) {
+                $matchPattern = $this->createPregMatchPattern($patternPropertyRegex);
+                if (preg_match($matchPattern, (string) $propertyName)) {
+                    $schemaConstraint = $this->factory->createInstanceFor('schema');
+                    $schemaConstraint->check($propertyValue, $patternPropertySchema, $path, $i);
+                    if ($schemaConstraint->isValid()) {
+                        continue;
+                    }
+
+                    $this->addErrors($schemaConstraint->getErrors());
+                }
+            }
+        }
+    }
+
+    private function createPregMatchPattern(string $pattern): string
+    {
+        $replacements = [
+//            '\D' => '[^0-9]',
+            '\d' => '[0-9]',
+            '\p{digit}' => '[0-9]',
+//            '\w' => '[A-Za-z0-9_]',
+//            '\W' => '[^A-Za-z0-9_]',
+//            '\s' => '[\s\x{200B}]' // Explicitly include zero width white space
+            '\p{Letter}' => '\p{L}', // Map ECMA long property name to PHP (PCRE) Unicode property abbreviations
+        ];
+
+        $pattern = str_replace(
+            array_keys($replacements),
+            array_values($replacements),
+            $pattern
+        );
+
+        return '/' . str_replace('/', '\/', $pattern) . '/u';
+    }
+}
diff -pruN 6.4.1-1/src/JsonSchema/Constraints/Drafts/Draft06/PropertiesConstraint.php 6.6.0-1/src/JsonSchema/Constraints/Drafts/Draft06/PropertiesConstraint.php
--- 6.4.1-1/src/JsonSchema/Constraints/Drafts/Draft06/PropertiesConstraint.php	1970-01-01 00:00:00.000000000 +0000
+++ 6.6.0-1/src/JsonSchema/Constraints/Drafts/Draft06/PropertiesConstraint.php	2025-10-10 11:34:09.000000000 +0000
@@ -0,0 +1,48 @@
+<?php
+
+declare(strict_types=1);
+
+namespace JsonSchema\Constraints\Drafts\Draft06;
+
+use JsonSchema\Constraints\ConstraintInterface;
+use JsonSchema\Entity\ErrorBagProxy;
+use JsonSchema\Entity\JsonPointer;
+
+class PropertiesConstraint implements ConstraintInterface
+{
+    use ErrorBagProxy;
+
+    /** @var Factory */
+    private $factory;
+
+    public function __construct(?Factory $factory = null)
+    {
+        $this->factory = $factory ?: new Factory();
+        $this->initialiseErrorBag($this->factory);
+    }
+
+    public function check(&$value, $schema = null, ?JsonPointer $path = null, $i = null): void
+    {
+        if (!property_exists($schema, 'properties')) {
+            return;
+        }
+
+        if (!is_object($value)) {
+            return;
+        }
+
+        foreach ($schema->properties as $propertyName => $propertySchema) {
+            $schemaConstraint = $this->factory->createInstanceFor('schema');
+            if (!property_exists($value, $propertyName)) {
+                continue;
+            }
+
+            $schemaConstraint->check($value->{$propertyName}, $propertySchema, $path, $i);
+            if ($schemaConstraint->isValid()) {
+                continue;
+            }
+
+            $this->addErrors($schemaConstraint->getErrors());
+        }
+    }
+}
diff -pruN 6.4.1-1/src/JsonSchema/Constraints/Drafts/Draft06/PropertiesNamesConstraint.php 6.6.0-1/src/JsonSchema/Constraints/Drafts/Draft06/PropertiesNamesConstraint.php
--- 6.4.1-1/src/JsonSchema/Constraints/Drafts/Draft06/PropertiesNamesConstraint.php	1970-01-01 00:00:00.000000000 +0000
+++ 6.6.0-1/src/JsonSchema/Constraints/Drafts/Draft06/PropertiesNamesConstraint.php	2025-10-10 11:34:09.000000000 +0000
@@ -0,0 +1,65 @@
+<?php
+
+declare(strict_types=1);
+
+namespace JsonSchema\Constraints\Drafts\Draft06;
+
+use JsonSchema\ConstraintError;
+use JsonSchema\Constraints\ConstraintInterface;
+use JsonSchema\Entity\ErrorBagProxy;
+use JsonSchema\Entity\JsonPointer;
+
+class PropertiesNamesConstraint implements ConstraintInterface
+{
+    use ErrorBagProxy;
+
+    /** @var Factory */
+    private $factory;
+
+    public function __construct(?Factory $factory = null)
+    {
+        $this->factory = $factory ?: new Factory();
+        $this->initialiseErrorBag($this->factory);
+    }
+
+    public function check(&$value, $schema = null, ?JsonPointer $path = null, $i = null): void
+    {
+        if (!property_exists($schema, 'propertyNames')) {
+            return;
+        }
+
+        if (!is_object($value)) {
+            return;
+        }
+        if ($schema->propertyNames === true) {
+            return;
+        }
+
+        $propertyNames = get_object_vars($value);
+
+        if ($schema->propertyNames === false) {
+            foreach ($propertyNames as $propertyName => $_) {
+                $this->addError(ConstraintError::PROPERTY_NAMES(), $path, ['propertyNames' => $schema->propertyNames, 'violating' => 'false', 'name' => $propertyName]);
+            }
+
+            return;
+        }
+
+        if (property_exists($schema->propertyNames, 'maxLength')) {
+            foreach ($propertyNames as $propertyName => $_) {
+                $length = mb_strlen($propertyName);
+                if ($length > $schema->propertyNames->maxLength) {
+                    $this->addError(ConstraintError::PROPERTY_NAMES(), $path, ['propertyNames' => $schema->propertyNames, 'violating' => 'maxLength', 'length' => $length, 'name' => $propertyName]);
+                }
+            }
+        }
+
+        if (property_exists($schema->propertyNames, 'pattern')) {
+            foreach ($propertyNames as $propertyName => $_) {
+                if (!preg_match('/' . str_replace('/', '\/', $schema->propertyNames->pattern) . '/', $propertyName)) {
+                    $this->addError(ConstraintError::PROPERTY_NAMES(), $path, ['propertyNames' => $schema->propertyNames, 'violating' => 'pattern', 'name' => $propertyName]);
+                }
+            }
+        }
+    }
+}
diff -pruN 6.4.1-1/src/JsonSchema/Constraints/Drafts/Draft06/RefConstraint.php 6.6.0-1/src/JsonSchema/Constraints/Drafts/Draft06/RefConstraint.php
--- 6.4.1-1/src/JsonSchema/Constraints/Drafts/Draft06/RefConstraint.php	1970-01-01 00:00:00.000000000 +0000
+++ 6.6.0-1/src/JsonSchema/Constraints/Drafts/Draft06/RefConstraint.php	2025-10-10 11:34:09.000000000 +0000
@@ -0,0 +1,45 @@
+<?php
+
+declare(strict_types=1);
+
+namespace JsonSchema\Constraints\Drafts\Draft06;
+
+use JsonSchema\Constraints\ConstraintInterface;
+use JsonSchema\Entity\ErrorBagProxy;
+use JsonSchema\Entity\JsonPointer;
+
+class RefConstraint implements ConstraintInterface
+{
+    use ErrorBagProxy;
+
+    /** @var Factory */
+    private $factory;
+
+    public function __construct(?Factory $factory = null)
+    {
+        $this->factory = $factory ?: new Factory();
+        $this->initialiseErrorBag($this->factory);
+    }
+
+    public function check(&$value, $schema = null, ?JsonPointer $path = null, $i = null): void
+    {
+        if (!property_exists($schema, '$ref')) {
+            return;
+        }
+
+        try {
+            $refSchema = $this->factory->getSchemaStorage()->resolveRefSchema($schema);
+        } catch (\Exception $e) {
+            return;
+        }
+
+        $schemaConstraint = $this->factory->createInstanceFor('schema');
+        $schemaConstraint->check($value, $refSchema, $path, $i);
+
+        if ($schemaConstraint->isValid()) {
+            return;
+        }
+
+        $this->addErrors($schemaConstraint->getErrors());
+    }
+}
diff -pruN 6.4.1-1/src/JsonSchema/Constraints/Drafts/Draft06/RequiredConstraint.php 6.6.0-1/src/JsonSchema/Constraints/Drafts/Draft06/RequiredConstraint.php
--- 6.4.1-1/src/JsonSchema/Constraints/Drafts/Draft06/RequiredConstraint.php	1970-01-01 00:00:00.000000000 +0000
+++ 6.6.0-1/src/JsonSchema/Constraints/Drafts/Draft06/RequiredConstraint.php	2025-10-10 11:34:09.000000000 +0000
@@ -0,0 +1,58 @@
+<?php
+
+declare(strict_types=1);
+
+namespace JsonSchema\Constraints\Drafts\Draft06;
+
+use JsonSchema\ConstraintError;
+use JsonSchema\Constraints\ConstraintInterface;
+use JsonSchema\Constraints\Factory;
+use JsonSchema\Entity\ErrorBagProxy;
+use JsonSchema\Entity\JsonPointer;
+
+class RequiredConstraint implements ConstraintInterface
+{
+    use ErrorBagProxy;
+
+    public function __construct(?Factory $factory = null)
+    {
+        $this->initialiseErrorBag($factory ?: new Factory());
+    }
+
+    public function check(&$value, $schema = null, ?JsonPointer $path = null, $i = null): void
+    {
+        if (!property_exists($schema, 'required')) {
+            return;
+        }
+
+        if (!is_object($value)) {
+            return;
+        }
+
+        foreach ($schema->required as $required) {
+            if (property_exists($value, $required)) {
+                continue;
+            }
+
+            $this->addError(ConstraintError::REQUIRED(), $this->incrementPath($path, $required), ['property' => $required]);
+        }
+    }
+
+    /**
+     * @todo refactor as this was only copied from UndefinedConstraint
+     * Bubble down the path
+     *
+     * @param JsonPointer|null $path Current path
+     * @param mixed            $i    What to append to the path
+     */
+    protected function incrementPath(?JsonPointer $path, $i): JsonPointer
+    {
+        $path = $path ?? new JsonPointer('');
+
+        if ($i === null || $i === '') {
+            return $path;
+        }
+
+        return $path->withPropertyPaths(array_merge($path->getPropertyPaths(), [$i]));
+    }
+}
diff -pruN 6.4.1-1/src/JsonSchema/Constraints/Drafts/Draft06/TypeConstraint.php 6.6.0-1/src/JsonSchema/Constraints/Drafts/Draft06/TypeConstraint.php
--- 6.4.1-1/src/JsonSchema/Constraints/Drafts/Draft06/TypeConstraint.php	1970-01-01 00:00:00.000000000 +0000
+++ 6.6.0-1/src/JsonSchema/Constraints/Drafts/Draft06/TypeConstraint.php	2025-10-10 11:34:09.000000000 +0000
@@ -0,0 +1,50 @@
+<?php
+
+declare(strict_types=1);
+
+namespace JsonSchema\Constraints\Drafts\Draft06;
+
+use JsonSchema\ConstraintError;
+use JsonSchema\Constraints\ConstraintInterface;
+use JsonSchema\Constraints\Factory;
+use JsonSchema\Entity\ErrorBagProxy;
+use JsonSchema\Entity\JsonPointer;
+
+class TypeConstraint implements ConstraintInterface
+{
+    use ErrorBagProxy;
+
+    public function __construct(?Factory $factory = null)
+    {
+        $this->initialiseErrorBag($factory ?: new Factory());
+    }
+
+    public function check(&$value, $schema = null, ?JsonPointer $path = null, $i = null): void
+    {
+        if (!property_exists($schema, 'type')) {
+            return;
+        }
+
+        $schemaTypes = (array) $schema->type;
+        $valueType = strtolower(gettype($value));
+        // All specific number types are a number
+        $valueIsNumber = $valueType === 'double' ||  $valueType === 'integer';
+        // A float with zero fractional part is an integer
+        $isInteger = $valueIsNumber && fmod($value, 1.0) === 0.0;
+
+        foreach ($schemaTypes as $type) {
+            if ($valueType === $type) {
+                return;
+            }
+
+            if ($type === 'number' && $valueIsNumber) {
+                return;
+            }
+            if ($type === 'integer' && $isInteger) {
+                return;
+            }
+        }
+
+        $this->addError(ConstraintError::TYPE(), $path, ['found' => $valueType, 'expected' => implode(', ', $schemaTypes)]);
+    }
+}
diff -pruN 6.4.1-1/src/JsonSchema/Constraints/Drafts/Draft06/UniqueItemsConstraint.php 6.6.0-1/src/JsonSchema/Constraints/Drafts/Draft06/UniqueItemsConstraint.php
--- 6.4.1-1/src/JsonSchema/Constraints/Drafts/Draft06/UniqueItemsConstraint.php	1970-01-01 00:00:00.000000000 +0000
+++ 6.6.0-1/src/JsonSchema/Constraints/Drafts/Draft06/UniqueItemsConstraint.php	2025-10-10 11:34:09.000000000 +0000
@@ -0,0 +1,48 @@
+<?php
+
+declare(strict_types=1);
+
+namespace JsonSchema\Constraints\Drafts\Draft06;
+
+use JsonSchema\ConstraintError;
+use JsonSchema\Constraints\ConstraintInterface;
+use JsonSchema\Constraints\Factory;
+use JsonSchema\Entity\ErrorBagProxy;
+use JsonSchema\Entity\JsonPointer;
+use JsonSchema\Tool\DeepComparer;
+
+class UniqueItemsConstraint implements ConstraintInterface
+{
+    use ErrorBagProxy;
+
+    public function __construct(?Factory $factory = null)
+    {
+        $this->initialiseErrorBag($factory ?: new Factory());
+    }
+
+    public function check(&$value, $schema = null, ?JsonPointer $path = null, $i = null): void
+    {
+        if (!property_exists($schema, 'uniqueItems')) {
+            return;
+        }
+        if (!is_array($value)) {
+            return;
+        }
+
+        if ($schema->uniqueItems !== true) {
+            // If unique items not is true duplicates are allowed.
+            return;
+        }
+
+        $count = count($value);
+        for ($x = 0; $x < $count - 1; $x++) {
+            for ($y = $x + 1; $y < $count; $y++) {
+                if (DeepComparer::isEqual($value[$x], $value[$y])) {
+                    $this->addError(ConstraintError::UNIQUE_ITEMS(), $path);
+
+                    return;
+                }
+            }
+        }
+    }
+}
diff -pruN 6.4.1-1/src/JsonSchema/Constraints/Factory.php 6.6.0-1/src/JsonSchema/Constraints/Factory.php
--- 6.4.1-1/src/JsonSchema/Constraints/Factory.php	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/src/JsonSchema/Constraints/Factory.php	2025-10-10 11:34:09.000000000 +0000
@@ -11,6 +11,7 @@ declare(strict_types=1);
 
 namespace JsonSchema\Constraints;
 
+use JsonSchema\DraftIdentifiers;
 use JsonSchema\Exception\InvalidArgumentException;
 use JsonSchema\SchemaStorage;
 use JsonSchema\SchemaStorageInterface;
@@ -46,11 +47,18 @@ class Factory
     private $typeCheck = [];
 
     /**
-     * @var int Validation context
+     * @var int-mask-of<Validator::ERROR_*> Validation context
      */
     protected $errorContext = Validator::ERROR_DOCUMENT_VALIDATION;
 
     /**
+     * The default dialect used for strict mode (Constraint::CHECK_MODE_STRICT) when the schema is without a schema property
+     *
+     * @var string
+     */
+    private $defaultDialect = DraftIdentifiers::DRAFT_6;
+
+    /**
      * @var array
      */
     protected $constraintMap = [
@@ -65,7 +73,8 @@ class Factory
         'const' => 'JsonSchema\Constraints\ConstConstraint',
         'format' => 'JsonSchema\Constraints\FormatConstraint',
         'schema' => 'JsonSchema\Constraints\SchemaConstraint',
-        'validator' => 'JsonSchema\Validator'
+        'validator' => 'JsonSchema\Validator',
+        'draft06' => Drafts\Draft06\Draft06Constraint::class,
     ];
 
     /**
@@ -198,7 +207,7 @@ class Factory
     /**
      * Get the error context
      *
-     * @phpstan-return Validator::ERROR_DOCUMENT_VALIDATION|Validator::ERROR_SCHEMA_VALIDATION
+     * @return int-mask-of<Validator::ERROR_*>
      */
     public function getErrorContext(): int
     {
@@ -208,10 +217,20 @@ class Factory
     /**
      * Set the error context
      *
-     * @phpstan-param Validator::ERROR_DOCUMENT_VALIDATION|Validator::ERROR_SCHEMA_VALIDATION $errorContext
+     * @param int-mask-of<Validator::ERROR_*> $errorContext
      */
     public function setErrorContext(int $errorContext): void
     {
         $this->errorContext = $errorContext;
     }
+
+    public function getDefaultDialect(): string
+    {
+        return $this->defaultDialect;
+    }
+
+    public function setDefaultDialect(string $defaultDialect): void
+    {
+        $this->defaultDialect = $defaultDialect;
+    }
 }
diff -pruN 6.4.1-1/src/JsonSchema/Constraints/ObjectConstraint.php 6.6.0-1/src/JsonSchema/Constraints/ObjectConstraint.php
--- 6.4.1-1/src/JsonSchema/Constraints/ObjectConstraint.php	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/src/JsonSchema/Constraints/ObjectConstraint.php	2025-10-10 11:34:09.000000000 +0000
@@ -2,37 +2,32 @@
 
 declare(strict_types=1);
 
-/*
- * This file is part of the JsonSchema package.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
 namespace JsonSchema\Constraints;
 
 use JsonSchema\ConstraintError;
 use JsonSchema\Entity\JsonPointer;
 
-/**
- * The ObjectConstraint Constraints, validates an object against a given schema
- *
- * @author Robert Schönthal <seroscho@googlemail.com>
- * @author Bruno Prieto Reis <bruno.p.reis@gmail.com>
- */
 class ObjectConstraint extends Constraint
 {
     /**
-     * @var array List of properties to which a default value has been applied
+     * @var list<string> List of properties to which a default value has been applied
      */
     protected $appliedDefaults = [];
 
     /**
      * {@inheritdoc}
+     *
+     * @param list<string> $appliedDefaults
      */
-    public function check(&$element, $schema = null, ?JsonPointer $path = null, $properties = null,
-        $additionalProp = null, $patternProperties = null, $appliedDefaults = []): void
-    {
+    public function check(
+        &$element,
+        $schema = null,
+        ?JsonPointer $path = null,
+        $properties = null,
+        $additionalProp = null,
+        $patternProperties = null,
+        $appliedDefaults = []
+    ): void {
         if ($element instanceof UndefinedConstraint) {
             return;
         }
diff -pruN 6.4.1-1/src/JsonSchema/Constraints/SchemaConstraint.php 6.6.0-1/src/JsonSchema/Constraints/SchemaConstraint.php
--- 6.4.1-1/src/JsonSchema/Constraints/SchemaConstraint.php	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/src/JsonSchema/Constraints/SchemaConstraint.php	2025-10-10 11:34:09.000000000 +0000
@@ -12,6 +12,7 @@ declare(strict_types=1);
 namespace JsonSchema\Constraints;
 
 use JsonSchema\ConstraintError;
+use JsonSchema\DraftIdentifiers;
 use JsonSchema\Entity\JsonPointer;
 use JsonSchema\Exception\InvalidArgumentException;
 use JsonSchema\Exception\InvalidSchemaException;
@@ -26,7 +27,7 @@ use JsonSchema\Validator;
  */
 class SchemaConstraint extends Constraint
 {
-    private const DEFAULT_SCHEMA_SPEC = 'http://json-schema.org/draft-04/schema#';
+    private const DEFAULT_SCHEMA_SPEC = DraftIdentifiers::DRAFT_4;
 
     /**
      * {@inheritdoc}
diff -pruN 6.4.1-1/src/JsonSchema/Constraints/UndefinedConstraint.php 6.6.0-1/src/JsonSchema/Constraints/UndefinedConstraint.php
--- 6.4.1-1/src/JsonSchema/Constraints/UndefinedConstraint.php	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/src/JsonSchema/Constraints/UndefinedConstraint.php	2025-10-10 11:34:09.000000000 +0000
@@ -2,13 +2,6 @@
 
 declare(strict_types=1);
 
-/*
- * This file is part of the JsonSchema package.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
 namespace JsonSchema\Constraints;
 
 use JsonSchema\ConstraintError;
@@ -18,24 +11,18 @@ use JsonSchema\Exception\ValidationExcep
 use JsonSchema\Tool\DeepCopy;
 use JsonSchema\Uri\UriResolver;
 
-/**
- * The UndefinedConstraint Constraints
- *
- * @author Robert Schönthal <seroscho@googlemail.com>
- * @author Bruno Prieto Reis <bruno.p.reis@gmail.com>
- */
 #[\AllowDynamicProperties]
 class UndefinedConstraint extends Constraint
 {
     /**
-     * @var array List of properties to which a default value has been applied
+     * @var list<string> List of properties to which a default value has been applied
      */
     protected $appliedDefaults = [];
 
     /**
      * {@inheritdoc}
-     */
-    public function check(&$value, $schema = null, ?JsonPointer $path = null, $i = null, $fromDefault = false): void
+     * */
+    public function check(&$value, $schema = null, ?JsonPointer $path = null, $i = null, bool $fromDefault = false): void
     {
         if (is_null($schema) || !is_object($schema)) {
             return;
@@ -72,9 +59,10 @@ class UndefinedConstraint extends Constr
         }
 
         // check object
-        if (LooseTypeCheck::isObject($value)) { // object processing should always be run on assoc arrays,
-                                                // so use LooseTypeCheck here even if CHECK_MODE_TYPE_CAST
-                                                // is not set (i.e. don't use $this->getTypeCheck() here).
+        if (LooseTypeCheck::isObject($value)) {
+            // object processing should always be run on assoc arrays,
+            // so use LooseTypeCheck here even if CHECK_MODE_TYPE_CAST
+            // is not set (i.e. don't use $this->getTypeCheck() here).
             $this->checkObject(
                 $value,
                 $schema,
@@ -251,12 +239,19 @@ class UndefinedConstraint extends Constr
             return;
         }
 
+        if (is_bool($schema)) {
+            return;
+        }
+
         // apply defaults if appropriate
         $requiredOnly = (bool) $this->factory->getConfig(self::CHECK_MODE_ONLY_REQUIRED_DEFAULTS);
         if (isset($schema->properties) && LooseTypeCheck::isObject($value)) {
             // $value is an object or assoc array, and properties are defined - treat as an object
             foreach ($schema->properties as $currentProperty => $propertyDefinition) {
                 $propertyDefinition = $this->factory->getSchemaStorage()->resolveRefSchema($propertyDefinition);
+                if (is_bool($propertyDefinition)) {
+                    continue;
+                }
                 if (
                     !LooseTypeCheck::propertyExists($value, $currentProperty)
                     && property_exists($propertyDefinition, 'default')
@@ -281,6 +276,10 @@ class UndefinedConstraint extends Constr
             // $value is an array, and items are defined - treat as plain array
             foreach ($items as $currentItem => $itemDefinition) {
                 $itemDefinition = $this->factory->getSchemaStorage()->resolveRefSchema($itemDefinition);
+                if (is_bool($itemDefinition)) {
+                    continue;
+                }
+
                 if (
                     !array_key_exists($currentItem, $value)
                     && property_exists($itemDefinition, 'default')
diff -pruN 6.4.1-1/src/JsonSchema/DraftIdentifiers.php 6.6.0-1/src/JsonSchema/DraftIdentifiers.php
--- 6.4.1-1/src/JsonSchema/DraftIdentifiers.php	1970-01-01 00:00:00.000000000 +0000
+++ 6.6.0-1/src/JsonSchema/DraftIdentifiers.php	2025-10-10 11:34:09.000000000 +0000
@@ -0,0 +1,48 @@
+<?php
+
+declare(strict_types=1);
+
+namespace JsonSchema;
+
+/**
+ * @method static DraftIdentifiers DRAFT_3()
+ * @method static DraftIdentifiers DRAFT_4()
+ * @method static DraftIdentifiers DRAFT_6()
+ * @method static DraftIdentifiers DRAFT_7()
+ * @method static DraftIdentifiers DRAFT_2019_09()
+ * @method static DraftIdentifiers DRAFT_2020_12()
+ */
+class DraftIdentifiers extends Enum
+{
+    public const DRAFT_3 = 'http://json-schema.org/draft-03/schema#';
+    public const DRAFT_4 = 'http://json-schema.org/draft-04/schema#';
+    public const DRAFT_6 = 'http://json-schema.org/draft-06/schema#';
+    public const DRAFT_7 = 'http://json-schema.org/draft-07/schema#';
+    public const DRAFT_2019_09 = 'https://json-schema.org/draft/2019-09/schema';
+    public const DRAFT_2020_12 = 'https://json-schema.org/draft/2020-12/schema';
+
+    public function toConstraintName(): string
+    {
+        switch ($this->getValue()) {
+            case self::DRAFT_3:
+                return 'draft03';
+            case self::DRAFT_4:
+                return 'draft04';
+            case self::DRAFT_6:
+                return 'draft06';
+            case self::DRAFT_7:
+                return 'draft07';
+            case self::DRAFT_2019_09:
+                return 'draft2019-09';
+            case self::DRAFT_2020_12:
+                return 'draft2020-12';
+            default:
+                throw new \Exception('Unsupported schema URI: ' . $this->getValue());
+        }
+    }
+
+    public function withoutFragment(): string
+    {
+        return rtrim($this->getValue(), '#');
+    }
+}
diff -pruN 6.4.1-1/src/JsonSchema/Entity/ErrorBag.php 6.6.0-1/src/JsonSchema/Entity/ErrorBag.php
--- 6.4.1-1/src/JsonSchema/Entity/ErrorBag.php	1970-01-01 00:00:00.000000000 +0000
+++ 6.6.0-1/src/JsonSchema/Entity/ErrorBag.php	2025-10-10 11:34:09.000000000 +0000
@@ -0,0 +1,109 @@
+<?php
+
+declare(strict_types=1);
+
+namespace JsonSchema\Entity;
+
+use JsonSchema\ConstraintError;
+use JsonSchema\Constraints\Constraint;
+use JsonSchema\Constraints\Factory;
+use JsonSchema\Exception\ValidationException;
+use JsonSchema\Validator;
+
+/**
+ * @phpstan-type Error array{
+ *     "property": string,
+ *     "pointer": string,
+ *     "message": string,
+ *     "constraint": array{"name": string, "params": array<string, mixed>},
+ *     "context": int-mask-of<Validator::ERROR_*>
+ * }
+ * @phpstan-type ErrorList list<Error>
+ */
+class ErrorBag
+{
+    /** @var Factory */
+    private $factory;
+
+    /** @var ErrorList */
+    private $errors = [];
+
+    /**
+     * @var int-mask-of<Validator::ERROR_*> All error types that have occurred
+     */
+    protected $errorMask = Validator::ERROR_NONE;
+
+    public function __construct(Factory $factory)
+    {
+        $this->factory = $factory;
+    }
+
+    public function reset(): void
+    {
+        $this->errors = [];
+        $this->errorMask = Validator::ERROR_NONE;
+    }
+
+    /** @return ErrorList */
+    public function getErrors(): array
+    {
+        return $this->errors;
+    }
+
+    /** @param array<string, mixed> $more */
+    public function addError(ConstraintError $constraint, ?JsonPointer $path = null, array $more = []): void
+    {
+        $message = $constraint->getMessage();
+        $name = $constraint->getValue();
+        /** @var Error $error */
+        $error = [
+            'property' => $this->convertJsonPointerIntoPropertyPath($path ?: new JsonPointer('')),
+            'pointer' => ltrim((string) ($path ?: new JsonPointer('')), '#'),
+            'message' => ucfirst(vsprintf($message, array_map(static function ($val) {
+                if (is_scalar($val)) {
+                    return is_bool($val) ? var_export($val, true) : $val;
+                }
+
+                return json_encode($val);
+            }, array_values($more)))),
+            'constraint' => [
+                'name' => $name,
+                'params' => $more
+            ],
+            'context' => $this->factory->getErrorContext(),
+        ];
+
+        if ($this->factory->getConfig(Constraint::CHECK_MODE_EXCEPTIONS)) {
+            throw new ValidationException(sprintf('Error validating %s: %s', $error['pointer'], $error['message']));
+        }
+        $this->errors[] = $error;
+        /* @see https://github.com/phpstan/phpstan/issues/9384 */
+        $this->errorMask |= $error['context']; // @phpstan-ignore assign.propertyType
+    }
+
+    /** @param ErrorList $errors */
+    public function addErrors(array $errors): void
+    {
+        if (!$errors) {
+            return;
+        }
+
+        $this->errors = array_merge($this->errors, $errors);
+        $errorMask = &$this->errorMask;
+        array_walk($errors, static function ($error) use (&$errorMask) {
+            $errorMask |= $error['context'];
+        });
+    }
+
+    private function convertJsonPointerIntoPropertyPath(JsonPointer $pointer): string
+    {
+        $result = array_map(
+            static function ($path) {
+                return sprintf(is_numeric($path) ? '[%d]' : '.%s', $path);
+            },
+            $pointer->getPropertyPaths()
+        );
+
+        return trim(implode('', $result), '.');
+    }
+}
diff -pruN 6.4.1-1/src/JsonSchema/Entity/ErrorBagProxy.php 6.6.0-1/src/JsonSchema/Entity/ErrorBagProxy.php
--- 6.4.1-1/src/JsonSchema/Entity/ErrorBagProxy.php	1970-01-01 00:00:00.000000000 +0000
+++ 6.6.0-1/src/JsonSchema/Entity/ErrorBagProxy.php	2025-10-10 11:34:09.000000000 +0000
@@ -0,0 +1,66 @@
+<?php
+
+declare(strict_types=1);
+
+namespace JsonSchema\Entity;
+
+use JsonSchema\ConstraintError;
+use JsonSchema\Constraints\Factory;
+
+/**
+ * @phpstan-import-type Error from ErrorBag
+ * @phpstan-import-type ErrorList from ErrorBag
+ */
+trait ErrorBagProxy
+{
+    /** @var ?ErrorBag */
+    protected $errorBag = null;
+
+    /** @return ErrorList */
+    public function getErrors(): array
+    {
+        return $this->errorBag()->getErrors();
+    }
+
+    /** @param ErrorList $errors */
+    public function addErrors(array $errors): void
+    {
+        $this->errorBag()->addErrors($errors);
+    }
+
+    /**
+     * @param array<string, mixed> $more more array elements to add to the error
+     */
+    public function addError(ConstraintError $constraint, ?JsonPointer $path = null, array $more = []): void
+    {
+        $this->errorBag()->addError($constraint, $path, $more);
+    }
+
+    public function isValid(): bool
+    {
+        return $this->errorBag()->getErrors() === [];
+    }
+
+    protected function initialiseErrorBag(Factory $factory): ErrorBag
+    {
+        if (is_null($this->errorBag)) {
+            $this->errorBag = new ErrorBag($factory);
+        }
+
+        return $this->errorBag;
+    }
+
+    protected function errorBag(): ErrorBag
+    {
+        if (is_null($this->errorBag)) {
+            throw new \RuntimeException('ErrorBag not initialized');
+        }
+
+        return $this->errorBag;
+    }
+
+    public function __clone()
+    {
+        $this->errorBag()->reset();
+    }
+}
diff -pruN 6.4.1-1/src/JsonSchema/Entity/JsonPointer.php 6.6.0-1/src/JsonSchema/Entity/JsonPointer.php
--- 6.4.1-1/src/JsonSchema/Entity/JsonPointer.php	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/src/JsonSchema/Entity/JsonPointer.php	2025-10-10 11:34:09.000000000 +0000
@@ -146,7 +146,7 @@ class JsonPointer
     /**
      * Mark the value at this path as being set from a schema default
      */
-    public function setFromDefault()
+    public function setFromDefault(): void
     {
         $this->fromDefault = true;
     }
diff -pruN 6.4.1-1/src/JsonSchema/Rfc3339.php 6.6.0-1/src/JsonSchema/Rfc3339.php
--- 6.4.1-1/src/JsonSchema/Rfc3339.php	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/src/JsonSchema/Rfc3339.php	2025-10-10 11:34:09.000000000 +0000
@@ -6,27 +6,55 @@ namespace JsonSchema;
 
 class Rfc3339
 {
-    private const REGEX = '/^(\d{4}-\d{2}-\d{2}[T ]{1}\d{2}:\d{2}:\d{2})(\.\d+)?(Z|([+-]\d{2}):?(\d{2}))$/';
+    private const REGEX = '/^(\d{4}-\d{2}-\d{2}[T ](0[0-9]|1[0-9]|2[0-3]):([0-5][0-9]):((?:[0-5][0-9]|60)))(\.\d+)?(Z|([+-](0[0-9]|1[0-9]|2[0-3]))(:)?([0-5][0-9]))$/';
 
     /**
      * Try creating a DateTime instance
      *
-     * @param string $string
+     * @param string $input
      *
      * @return \DateTime|null
      */
-    public static function createFromString($string)
+    public static function createFromString($input): ?\DateTime
     {
-        if (!preg_match(self::REGEX, strtoupper($string), $matches)) {
+        if (!preg_match(self::REGEX, strtoupper($input), $matches)) {
             return null;
         }
 
+        $input = strtoupper($input); // Cleanup for lowercase t and z
+        $inputHasTSeparator = strpos($input, 'T');
+
         $dateAndTime = $matches[1];
-        $microseconds = $matches[2] ?: '.000000';
-        $timeZone = 'Z' !== $matches[3] ? $matches[4] . ':' . $matches[5] : '+00:00';
-        $dateFormat = strpos($dateAndTime, 'T') === false ? 'Y-m-d H:i:s.uP' : 'Y-m-d\TH:i:s.uP';
-        $dateTime = \DateTime::createFromFormat($dateFormat, $dateAndTime . $microseconds . $timeZone, new \DateTimeZone('UTC'));
+        $microseconds = $matches[5] ?: '.000000';
+        $timeZone = 'Z' !== $matches[6] ? $matches[6] : '+00:00';
+        $dateFormat = $inputHasTSeparator === false ? 'Y-m-d H:i:s.uP' : 'Y-m-d\TH:i:s.uP';
+        $dateTime = \DateTimeImmutable::createFromFormat($dateFormat, $dateAndTime . $microseconds . $timeZone, new \DateTimeZone('UTC'));
+
+        if ($dateTime === false) {
+            return null;
+        }
+
+        $utcDateTime = $dateTime->setTimezone(new \DateTimeZone('+00:00'));
+        $oneSecond = new \DateInterval('PT1S');
+
+        // handle leap seconds
+        if ($matches[4] === '60' && $utcDateTime->sub($oneSecond)->format('H:i:s') === '23:59:59') {
+            $dateTime = $dateTime->sub($oneSecond);
+            $matches[1] = str_replace(':60', ':59', $matches[1]);
+        }
+
+        // Ensure we still have the same year, month, day, hour, minutes and seconds to ensure no rollover took place.
+        if ($dateTime->format($inputHasTSeparator ? 'Y-m-d\TH:i:s' : 'Y-m-d H:i:s') !== $matches[1]) {
+            return null;
+        }
+
+        $mutable = \DateTime::createFromFormat('U.u', $dateTime->format('U.u'));
+        if ($mutable === false) {
+            throw new \RuntimeException('Unable to create DateTime from DateTimeImmutable');
+        }
+
+        $mutable->setTimezone($dateTime->getTimezone());
 
-        return $dateTime ?: null;
+        return $mutable;
     }
 }
diff -pruN 6.4.1-1/src/JsonSchema/SchemaStorage.php 6.6.0-1/src/JsonSchema/SchemaStorage.php
--- 6.4.1-1/src/JsonSchema/SchemaStorage.php	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/src/JsonSchema/SchemaStorage.php	2025-10-10 11:34:09.000000000 +0000
@@ -45,7 +45,7 @@ class SchemaStorage implements SchemaSto
     /**
      * {@inheritdoc}
      */
-    public function addSchema($id, $schema = null)
+    public function addSchema(string $id, $schema = null): void
     {
         if (is_null($schema) && $id !== self::INTERNAL_PROVIDED_SCHEMA_URI) {
             // if the schema was user-provided to Validator and is still null, then assume this is
@@ -62,14 +62,16 @@ class SchemaStorage implements SchemaSto
         // workaround for bug in draft-03 & draft-04 meta-schemas (id & $ref defined with incorrect format)
         // see https://github.com/json-schema-org/JSON-Schema-Test-Suite/issues/177#issuecomment-293051367
         if (is_object($schema) && property_exists($schema, 'id')) {
-            if ($schema->id == 'http://json-schema.org/draft-04/schema#') {
+            if ($schema->id === DraftIdentifiers::DRAFT_4) {
                 $schema->properties->id->format = 'uri-reference';
-            } elseif ($schema->id == 'http://json-schema.org/draft-03/schema#') {
+            } elseif ($schema->id === DraftIdentifiers::DRAFT_3) {
                 $schema->properties->id->format = 'uri-reference';
                 $schema->properties->{'$ref'}->format = 'uri-reference';
             }
         }
 
+        $this->scanForSubschemas($schema, $id);
+
         // resolve references
         $this->expandRefs($schema, $id);
 
@@ -79,39 +81,45 @@ class SchemaStorage implements SchemaSto
     /**
      * Recursively resolve all references against the provided base
      *
-     * @param mixed  $schema
-     * @param string $base
+     * @param mixed $schema
      */
-    private function expandRefs(&$schema, $base = null)
+    private function expandRefs(&$schema, ?string $parentId = null): void
     {
         if (!is_object($schema)) {
             if (is_array($schema)) {
                 foreach ($schema as &$member) {
-                    $this->expandRefs($member, $base);
+                    $this->expandRefs($member, $parentId);
                 }
             }
 
             return;
         }
 
-        if (property_exists($schema, 'id') && is_string($schema->id) && $base != $schema->id) {
-            $base = $this->uriResolver->resolve($schema->id, $base);
-        }
-
         if (property_exists($schema, '$ref') && is_string($schema->{'$ref'})) {
-            $refPointer = new JsonPointer($this->uriResolver->resolve($schema->{'$ref'}, $base));
+            $refPointer = new JsonPointer($this->uriResolver->resolve($schema->{'$ref'}, $parentId));
             $schema->{'$ref'} = (string) $refPointer;
         }
 
-        foreach ($schema as &$member) {
-            $this->expandRefs($member, $base);
+        foreach ($schema as $propertyName => &$member) {
+            if (in_array($propertyName, ['enum', 'const'])) {
+                // Enum and const don't allow $ref as a keyword, see https://github.com/json-schema-org/JSON-Schema-Test-Suite/pull/445
+                continue;
+            }
+
+            $schemaId = $this->findSchemaIdInObject($schema);
+            $childId = $parentId;
+            if (is_string($schemaId) && $childId !== $schemaId) {
+                $childId = $this->uriResolver->resolve($schemaId, $childId);
+            }
+
+            $this->expandRefs($member, $childId);
         }
     }
 
     /**
      * {@inheritdoc}
      */
-    public function getSchema($id)
+    public function getSchema(string $id)
     {
         if (!array_key_exists($id, $this->schemas)) {
             $this->addSchema($id);
@@ -123,7 +131,7 @@ class SchemaStorage implements SchemaSto
     /**
      * {@inheritdoc}
      */
-    public function resolveRef($ref, $resolveStack = [])
+    public function resolveRef(string $ref, $resolveStack = [])
     {
         $jsonPointer = new JsonPointer($ref);
 
@@ -139,6 +147,7 @@ class SchemaStorage implements SchemaSto
         // get & process the schema
         $refSchema = $this->getSchema($fileName);
         foreach ($jsonPointer->getPropertyPaths() as $path) {
+            $path = urldecode($path);
             if (is_object($refSchema) && property_exists($refSchema, $path)) {
                 $refSchema = $this->resolveRefSchema($refSchema->{$path}, $resolveStack);
             } elseif (is_array($refSchema) && array_key_exists($path, $refSchema)) {
@@ -172,6 +181,56 @@ class SchemaStorage implements SchemaSto
             return $this->resolveRef($refSchema->{'$ref'}, $resolveStack);
         }
 
+        if (is_object($refSchema) && array_keys(get_object_vars($refSchema)) === ['']) {
+            $refSchema = get_object_vars($refSchema)[''];
+        }
+
         return $refSchema;
     }
+
+    /**
+     * @param mixed $schema
+     */
+    private function scanForSubschemas($schema, string $parentId): void
+    {
+        if (!$schema instanceof \stdClass  && !is_array($schema)) {
+            return;
+        }
+
+        foreach ($schema as $propertyName => $potentialSubSchema) {
+            if (!is_object($potentialSubSchema)) {
+                continue;
+            }
+
+            $potentialSubSchemaId = $this->findSchemaIdInObject($potentialSubSchema);
+            if (is_string($potentialSubSchemaId) && property_exists($potentialSubSchema, 'type')) {
+                // Enum and const don't allow id as a keyword, see https://github.com/json-schema-org/JSON-Schema-Test-Suite/pull/471
+                if (in_array($propertyName, ['enum', 'const'])) {
+                    continue;
+                }
+
+                // $id in unknow keywords is not valid
+                if (in_array($propertyName, [])) {
+                    continue;
+                }
+
+                // Found sub schema
+                $this->addSchema($this->uriResolver->resolve($potentialSubSchemaId, $parentId), $potentialSubSchema);
+            }
+
+            $this->scanForSubschemas($potentialSubSchema, $parentId);
+        }
+    }
+
+    private function findSchemaIdInObject(object $schema): ?string
+    {
+        if (property_exists($schema, 'id') && is_string($schema->id)) {
+            return $schema->id;
+        }
+        if (property_exists($schema, '$id') && is_string($schema->{'$id'})) {
+            return $schema->{'$id'};
+        }
+
+        return null;
+    }
 }
diff -pruN 6.4.1-1/src/JsonSchema/SchemaStorageInterface.php 6.6.0-1/src/JsonSchema/SchemaStorageInterface.php
--- 6.4.1-1/src/JsonSchema/SchemaStorageInterface.php	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/src/JsonSchema/SchemaStorageInterface.php	2025-10-10 11:34:09.000000000 +0000
@@ -9,35 +9,30 @@ interface SchemaStorageInterface
     /**
      * Adds schema with given identifier
      *
-     * @param string $id
-     * @param object $schema
+     * @param object|bool $schema
      */
-    public function addSchema($id, $schema = null);
+    public function addSchema(string $id, $schema = null): void;
 
     /**
      * Returns schema for given identifier, or null if it does not exist
      *
-     * @param string $id
-     *
-     * @return object
+     * @return object|bool
      */
-    public function getSchema($id);
+    public function getSchema(string $id);
 
     /**
      * Returns schema for given reference with all sub-references resolved
      *
-     * @param string $ref
-     *
-     * @return object
+     * @return object|bool
      */
-    public function resolveRef($ref);
+    public function resolveRef(string $ref);
 
     /**
      * Returns schema referenced by '$ref' property
      *
      * @param mixed $refSchema
      *
-     * @return object
+     * @return object|bool
      */
     public function resolveRefSchema($refSchema);
 }
diff -pruN 6.4.1-1/src/JsonSchema/Tool/Validator/RelativeReferenceValidator.php 6.6.0-1/src/JsonSchema/Tool/Validator/RelativeReferenceValidator.php
--- 6.4.1-1/src/JsonSchema/Tool/Validator/RelativeReferenceValidator.php	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/src/JsonSchema/Tool/Validator/RelativeReferenceValidator.php	2025-10-10 11:34:09.000000000 +0000
@@ -16,6 +16,10 @@ class RelativeReferenceValidator
         }
 
         // Additional checks for invalid cases
+        if (strpos($ref, '\\') !== false) {
+            return false; // Backslashes are not allowed in URI references
+        }
+
         if (preg_match('/^(http|https):\/\//', $ref)) {
             return false; // Absolute URI
         }
diff -pruN 6.4.1-1/src/JsonSchema/Tool/Validator/UriValidator.php 6.6.0-1/src/JsonSchema/Tool/Validator/UriValidator.php
--- 6.4.1-1/src/JsonSchema/Tool/Validator/UriValidator.php	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/src/JsonSchema/Tool/Validator/UriValidator.php	2025-10-10 11:34:09.000000000 +0000
@@ -19,12 +19,16 @@ class UriValidator
             (\#(.*))?                                # Optional fragment
         $/ix';
 
-        // RFC 3986: Non-Hierarchical URIs (mailto, data, urn)
+        // RFC 3986: Non-Hierarchical URIs (mailto, data, urn, news)
         $nonHierarchicalPattern = '/^
-            (mailto|data|urn):                        # Only allow known non-hierarchical schemes
-            (.+)                                      # Must contain at least one character after scheme
+                (mailto|data|urn|news|tel):          # Only allow known non-hierarchical schemes
+                (.+)                                 # Must contain at least one character after scheme
         $/ix';
 
+        // Validation for newsgroup name (alphanumeric + dots, no empty segments)
+        $newsGroupPattern = '/^[a-z0-9]+(\.[a-z0-9]+)*$/i';
+        $telPattern = '/^\+?[0-9.\-() ]+$/'; // Allows +, digits, separators
+
         // RFC 5322-compliant email validation for `mailto:` URIs
         $emailPattern = '/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/';
 
@@ -40,7 +44,7 @@ class UriValidator
                 return false;
             }
 
-            // Validate path (reject illegal characters: < > { } | \ ^ `)
+            // Validate the path (reject illegal characters: < > { } | \ ^ `)
             if (!empty($matches[6]) && preg_match('/[<>{}|\\\^`]/', $matches[6])) {
                 return false;
             }
@@ -57,6 +61,14 @@ class UriValidator
                 return preg_match($emailPattern, $matches[2]) === 1;
             }
 
+            if ($scheme === 'news') {
+                return preg_match($newsGroupPattern, $matches[2]) === 1;
+            }
+
+            if ($scheme === 'tel') {
+                return preg_match($telPattern, $matches[2]) === 1;
+            }
+
             return true; // Valid non-hierarchical URI
         }
 
diff -pruN 6.4.1-1/src/JsonSchema/Uri/Retrievers/Curl.php 6.6.0-1/src/JsonSchema/Uri/Retrievers/Curl.php
--- 6.4.1-1/src/JsonSchema/Uri/Retrievers/Curl.php	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/src/JsonSchema/Uri/Retrievers/Curl.php	2025-10-10 11:34:09.000000000 +0000
@@ -53,7 +53,9 @@ class Curl extends AbstractRetriever
         $this->fetchMessageBody($response);
         $this->fetchContentType($response);
 
-        curl_close($ch);
+        if (PHP_VERSION_ID < 80000) {
+            curl_close($ch);
+        }
 
         return $this->messageBody;
     }
diff -pruN 6.4.1-1/src/JsonSchema/Uri/Retrievers/FileGetContents.php 6.6.0-1/src/JsonSchema/Uri/Retrievers/FileGetContents.php
--- 6.4.1-1/src/JsonSchema/Uri/Retrievers/FileGetContents.php	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/src/JsonSchema/Uri/Retrievers/FileGetContents.php	2025-10-10 11:34:09.000000000 +0000
@@ -29,6 +29,10 @@ class FileGetContents extends AbstractRe
      */
     public function retrieve($uri)
     {
+        if (function_exists('http_clear_last_response_headers')) {
+            http_clear_last_response_headers();
+        }
+
         $errorMessage = null;
         set_error_handler(function ($errno, $errstr) use (&$errorMessage) {
             $errorMessage = $errstr;
@@ -51,12 +55,19 @@ class FileGetContents extends AbstractRe
         }
 
         $this->messageBody = $response;
-        if (!empty($http_response_header)) {
-            // $http_response_header cannot be tested, because it's defined in the method's local scope
-            // See http://php.net/manual/en/reserved.variables.httpresponseheader.php for more info.
-            $this->fetchContentType($http_response_header); // @codeCoverageIgnore
-        } else {                                            // @codeCoverageIgnore
-            // Could be a "file://" url or something else - fake up the response
+
+        if (function_exists('http_get_last_response_headers')) {
+            // Use http_get_last_response_headers() for compatibility with PHP 8.5+
+            // where $http_response_header is deprecated.
+            $httpResponseHeaders = http_get_last_response_headers();
+        } else {
+            /** @phpstan-ignore nullCoalesce.variable ($http_response_header can non-existing when no http request was done) */
+            $httpResponseHeaders = $http_response_header ?? [];
+        }
+
+        if (!empty($httpResponseHeaders)) {
+            $this->fetchContentType($httpResponseHeaders);
+        } else {
             $this->contentType = null;
         }
 
@@ -68,7 +79,7 @@ class FileGetContents extends AbstractRe
      *
      * @return bool Whether the Content-Type header was found or not
      */
-    private function fetchContentType(array $headers)
+    private function fetchContentType(array $headers): bool
     {
         foreach (array_reverse($headers) as $header) {
             if ($this->contentType = self::getContentTypeMatchInHeader($header)) {
diff -pruN 6.4.1-1/src/JsonSchema/Uri/UriRetriever.php 6.6.0-1/src/JsonSchema/Uri/UriRetriever.php
--- 6.4.1-1/src/JsonSchema/Uri/UriRetriever.php	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/src/JsonSchema/Uri/UriRetriever.php	2025-10-10 11:34:09.000000000 +0000
@@ -31,7 +31,7 @@ class UriRetriever implements BaseUriRet
      */
     protected $translationMap = [
         // use local copies of the spec schemas
-        '|^https?://json-schema.org/draft-(0[34])/schema#?|' => 'package://dist/schema/json-schema-draft-$1.json'
+        '|^https?://json-schema.org/draft-(0[346])/schema#?|' => 'package://dist/schema/json-schema-draft-$1.json'
     ];
 
     /**
diff -pruN 6.4.1-1/src/JsonSchema/Validator.php 6.6.0-1/src/JsonSchema/Validator.php
--- 6.4.1-1/src/JsonSchema/Validator.php	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/src/JsonSchema/Validator.php	2025-10-10 11:34:09.000000000 +0000
@@ -61,13 +61,35 @@ class Validator extends BaseConstraint
         if (LooseTypeCheck::propertyExists($schema, 'id')) {
             $schemaURI = LooseTypeCheck::propertyGet($schema, 'id');
         }
+        if (LooseTypeCheck::propertyExists($schema, '$id')) {
+            $schemaURI = LooseTypeCheck::propertyGet($schema, '$id');
+        }
         $this->factory->getSchemaStorage()->addSchema($schemaURI, $schema);
 
         $validator = $this->factory->createInstanceFor('schema');
-        $validator->check(
-            $value,
-            $this->factory->getSchemaStorage()->getSchema($schemaURI)
-        );
+        $schema = $this->factory->getSchemaStorage()->getSchema($schemaURI);
+
+        // Boolean schema requires no further validation
+        if (is_bool($schema)) {
+            if ($schema === false) {
+                $this->addError(ConstraintError::FALSE());
+            }
+
+            return $this->getErrorMask();
+        }
+
+        if ($this->factory->getConfig(Constraint::CHECK_MODE_STRICT)) {
+            $dialect = $this->factory->getDefaultDialect();
+            if (property_exists($schema, '$schema')) {
+                $dialect = $schema->{'$schema'};
+            }
+
+            $validator = $this->factory->createInstanceFor(
+                DraftIdentifiers::byValue($dialect)->toConstraintName()
+            );
+        }
+
+        $validator->check($value, $schema);
 
         $this->factory->setConfig($initialCheckMode);
 
diff -pruN 6.4.1-1/tests/ConstraintErrorTest.php 6.6.0-1/tests/ConstraintErrorTest.php
--- 6.4.1-1/tests/ConstraintErrorTest.php	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/tests/ConstraintErrorTest.php	2025-10-10 11:34:09.000000000 +0000
@@ -1,11 +1,6 @@
 <?php
 
-/*
- * This file is part of the JsonSchema package.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+declare(strict_types=1);
 
 namespace JsonSchema\Tests;
 
@@ -24,7 +19,7 @@ class ConstraintErrorTest extends TestCa
     {
         $e = ConstraintError::MISSING_ERROR();
 
-        $this->expectException('\JsonSchema\Exception\InvalidArgumentException');
+        $this->expectException(\JsonSchema\Exception\InvalidArgumentException::class);
         $this->expectExceptionMessage('Missing error message for missingError');
 
         $e->getMessage();
diff -pruN 6.4.1-1/tests/Constraints/AdditionalPropertiesTest.php 6.6.0-1/tests/Constraints/AdditionalPropertiesTest.php
--- 6.4.1-1/tests/Constraints/AdditionalPropertiesTest.php	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/tests/Constraints/AdditionalPropertiesTest.php	2025-10-10 11:34:09.000000000 +0000
@@ -1,11 +1,6 @@
 <?php
 
-/*
- * This file is part of the JsonSchema package.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+declare(strict_types=1);
 
 namespace JsonSchema\Tests\Constraints;
 
@@ -15,10 +10,9 @@ class AdditionalPropertiesTest extends B
 {
     protected $validateSchema = true;
 
-    public function getInvalidTests(): array
+    public function getInvalidTests(): \Generator
     {
-        return [
-            [
+        yield [
                 '{
                   "prop":"1",
                   "patternProp":"3",
@@ -49,8 +43,8 @@ class AdditionalPropertiesTest extends B
                         'context' => Validator::ERROR_DOCUMENT_VALIDATION
                     ]
                 ]
-            ],
-            [
+            ];
+        yield [
                 '{
                   "prop":"1",
                   "additionalProp":"2"
@@ -62,8 +56,8 @@ class AdditionalPropertiesTest extends B
                   },
                   "additionalProperties": false
                 }'
-            ],
-            [
+            ];
+        yield [
                 '{
                   "prop":"1",
                   "additionalProp":2
@@ -75,8 +69,8 @@ class AdditionalPropertiesTest extends B
                   },
                   "additionalProperties": {"type":"string"}
                 }'
-            ],
-            [
+            ];
+        yield [
                 '{
                   "prop":"1",
                   "additionalProp":2
@@ -88,8 +82,8 @@ class AdditionalPropertiesTest extends B
                   },
                   "additionalProperties": {"type":"string"}
                 }'
-            ],
-            [
+            ];
+        yield [
                 '{
                   "prop1": "a",
                   "prop2": "b"
@@ -100,8 +94,8 @@ class AdditionalPropertiesTest extends B
                     "type": "boolean"
                   }
                 }'
-            ],
-            [
+            ];
+        yield [
                 '{
                   "prop1": "a",
                   "prop2": "b"
@@ -110,14 +104,12 @@ class AdditionalPropertiesTest extends B
                   "type": "object",
                   "additionalProperties": false
                 }'
-            ],
-        ];
+            ];
     }
 
-    public function getValidTests(): array
+    public function getValidTests(): \Generator
     {
-        return [
-            [
+        yield [
                 '{
                   "prop":"1",
                   "additionalProp":"2"
@@ -128,8 +120,8 @@ class AdditionalPropertiesTest extends B
                     "prop":{"type":"string"}
                   }
                 }'
-            ],
-            [
+            ];
+        yield [
                 '{
                   "prop":"1",
                   "additionalProp":"2"
@@ -140,8 +132,8 @@ class AdditionalPropertiesTest extends B
                     "prop":{"type":"string"}
                   }
                 }'
-            ],
-            [
+        ];
+        yield [
                 '{
                   "prop":"1",
                   "additionalProp":"2"
@@ -153,8 +145,8 @@ class AdditionalPropertiesTest extends B
                   },
                   "additionalProperties": {"type":"string"}
                 }'
-            ],
-            [
+        ];
+        yield [
                 '{
                   "prop":"1",
                   "additionalProp":[]
@@ -166,8 +158,8 @@ class AdditionalPropertiesTest extends B
                   },
                   "additionalProperties": true
                 }'
-            ],
-            [
+        ];
+        yield [
                 '{
                   "prop1": "a",
                   "prop2": "b"
@@ -178,8 +170,8 @@ class AdditionalPropertiesTest extends B
                     "type": "string"
                   }
                 }'
-            ],
-            [
+        ];
+        yield [
                 '{
                   "prop1": "a",
                   "prop2": "b"
@@ -188,8 +180,8 @@ class AdditionalPropertiesTest extends B
                   "type": "object",
                   "additionalProperties": true
                 }'
-            ],
-            'additional property casted into int when actually is numeric string (#784)' => [
+        ];
+        yield 'additional property casted into int when actually is numeric string (#784)' => [
                 '{
                     "prop1": {
                         "123": "a"
@@ -206,7 +198,6 @@ class AdditionalPropertiesTest extends B
                         }
                     }
                 }'
-            ],
-        ];
+            ];
     }
 }
diff -pruN 6.4.1-1/tests/Constraints/ArraysTest.php 6.6.0-1/tests/Constraints/ArraysTest.php
--- 6.4.1-1/tests/Constraints/ArraysTest.php	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/tests/Constraints/ArraysTest.php	2025-10-10 11:34:09.000000000 +0000
@@ -1,22 +1,17 @@
 <?php
 
-/*
- * This file is part of the JsonSchema package.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+declare(strict_types=1);
 
 namespace JsonSchema\Tests\Constraints;
 
 class ArraysTest extends BaseTestCase
 {
+    /** @var bool */
     protected $validateSchema = true;
 
-    public function getInvalidTests(): array
+    public function getInvalidTests(): \Generator
     {
-        return [
-            [
+        yield [
                 '{
                   "array":[1,2,"a"]
                 }',
@@ -29,8 +24,8 @@ class ArraysTest extends BaseTestCase
                     }
                   }
                 }'
-            ],
-            [
+            ];
+        yield [
                 '{
                   "array":[1,2,"a"]
                 }',
@@ -44,8 +39,8 @@ class ArraysTest extends BaseTestCase
                     }
                   }
                 }'
-            ],
-            [
+        ];
+        yield [
                 '{
                   "array":[1,2,null]
                 }',
@@ -58,8 +53,8 @@ class ArraysTest extends BaseTestCase
                     }
                   }
                 }'
-            ],
-            [
+        ];
+        yield [
                 '{"data": [1, 2, 3, "foo"]}',
                 '{
                     "type": "object",
@@ -71,8 +66,8 @@ class ArraysTest extends BaseTestCase
                         }
                     }
                 }'
-            ],
-            [ // Test array items.enum where type string fail validation if value(s) is/are not in items.enum
+        ];
+        yield 'Test array items.enum where type string fail validation if value(s) is/are not in items.enum' => [
                 '{"data": ["a", "b"]}',
                 '{
                     "type": "object",
@@ -86,8 +81,8 @@ class ArraysTest extends BaseTestCase
                         }
                     }
                 }'
-            ],
-            [ // Test array items.enum where type integer fail validation if value(s) is/are not in items.enum
+        ];
+        yield 'Test array items.enum where type integer fail validation if value(s) is/are not in items.enum' => [
                 '{"data": [1, 2]}',
                 '{
                     "type": "object",
@@ -101,8 +96,8 @@ class ArraysTest extends BaseTestCase
                         }
                     }
                 }'
-            ],
-            [ // Test array items.enum where type number fail validation if value(s) is/are not in items.enum
+        ];
+        yield 'Test array items.enum where type number fail validation if value(s) is/are not in items.enum' => [
                 '{"data": [1.25, 2.25]}',
                 '{
                     "type": "object",
@@ -116,8 +111,8 @@ class ArraysTest extends BaseTestCase
                         }
                     }
                 }'
-            ],
-            [
+        ];
+        yield [
                 '{"data": [{"not_a_string_but_object":"string_but_in_object"}]}',
                 '{
                     "type": "object",
@@ -129,14 +124,12 @@ class ArraysTest extends BaseTestCase
                         }
                     }
                 }'
-            ]
-        ];
+            ];
     }
 
-    public function getValidTests(): array
+    public function getValidTests(): \Generator
     {
-        return [
-            [
+        yield [
                 '{
                   "array":[1,2,"a"]
                 }',
@@ -146,8 +139,8 @@ class ArraysTest extends BaseTestCase
                     "array":{"type":"array"}
                   }
                 }'
-            ],
-            [
+        ];
+        yield [
                 '{
                   "array":[1,2,"a"]
                 }',
@@ -161,8 +154,8 @@ class ArraysTest extends BaseTestCase
                     }
                   }
                 }'
-            ],
-            [
+        ];
+        yield [
                 '{"data": [1, 2, 3, 4]}',
                 '{
                     "type": "object",
@@ -174,8 +167,8 @@ class ArraysTest extends BaseTestCase
                         }
                     }
                 }'
-            ],
-            [
+        ];
+        yield [
                 '{"data": [1, "foo", false]}',
                 '{
                     "type": "object",
@@ -186,8 +179,8 @@ class ArraysTest extends BaseTestCase
                         }
                     }
                 }'
-            ],
-            [
+        ];
+        yield [
                 '{"data": [1, "foo", false]}',
                 '{
                     "type": "object",
@@ -198,8 +191,8 @@ class ArraysTest extends BaseTestCase
                         }
                     }
                 }'
-            ],
-            [
+        ];
+        yield [
                 '{"data": [1, 2, 3, 4, 5]}',
                 '{
                     "type": "object",
@@ -210,8 +203,8 @@ class ArraysTest extends BaseTestCase
                         }
                     }
                 }'
-            ],
-            [ // test more schema items than array items
+        ];
+        yield 'test more schema items than array items' => [
                 '{"data": [1, 2]}',
                 '{
                     "type": "object",
@@ -226,8 +219,8 @@ class ArraysTest extends BaseTestCase
                         }
                     }
                 }'
-            ],
-            [ // Test array items.enum where type string passes validation if value(s) is/are in items.enum
+        ];
+        yield 'Test array items.enum where type string passes validation if value(s) is/are in items.enum' => [
                 '{"data": ["c", "c", "b"]}',
                 '{
                     "type": "object",
@@ -241,8 +234,8 @@ class ArraysTest extends BaseTestCase
                         }
                     }
                 }'
-            ],
-            [ // Test array items.enum where type integer passes validation if value(s) is/are in items.enum
+        ];
+        yield 'Test array items.enum where type integer passes validation if value(s) is/are in items.enum' => [
                 '{"data": [1, 1, 2]}',
                 '{
                     "type": "object",
@@ -256,8 +249,8 @@ class ArraysTest extends BaseTestCase
                         }
                     }
                 }'
-            ],
-            [ // Test array items.enum where type number passes validation if value(s) is/are in items.enum
+        ];
+        yield 'Test array items.enum where type number passes validation if value(s) is/are in items.enum' => [
                 '{"data": [1.25, 1.25, 2.25]}',
                 '{
                     "type": "object",
@@ -271,17 +264,6 @@ class ArraysTest extends BaseTestCase
                         }
                     }
                 }'
-            ],
-            'items: true passes validation' => [
-                'input' => <<<JSON
-                    [1, 1.2, "12"]
-JSON
-                ,
-                'schema' => <<<JSON
-                    { "type": "array", "items": true }
-JSON
-                ,
-            ],
         ];
     }
 }
diff -pruN 6.4.1-1/tests/Constraints/BaseTestCase.php 6.6.0-1/tests/Constraints/BaseTestCase.php
--- 6.4.1-1/tests/Constraints/BaseTestCase.php	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/tests/Constraints/BaseTestCase.php	2025-10-10 11:34:09.000000000 +0000
@@ -1,49 +1,46 @@
 <?php
 
-/*
- * This file is part of the JsonSchema package.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+declare(strict_types=1);
 
 namespace JsonSchema\Tests\Constraints;
 
+use Generator;
 use JsonSchema\Constraints\Constraint;
 use JsonSchema\Constraints\Factory;
+use JsonSchema\DraftIdentifiers;
 use JsonSchema\SchemaStorage;
 use JsonSchema\Uri\UriResolver;
 use JsonSchema\Validator;
 
-/**
- * @package JsonSchema\Tests\Constraints
- */
 abstract class BaseTestCase extends VeryBaseTestCase
 {
-    protected $schemaSpec = 'http://json-schema.org/draft-04/schema#';
+    protected $schemaSpec = DraftIdentifiers::DRAFT_4;
     protected $validateSchema = false;
 
     /**
      * @dataProvider getInvalidTests
+     *
+     * @param ?int-mask-of<Constraint::CHECK_MODE_*> $checkMode
      */
-    public function testInvalidCases($input, $schema, $checkMode = Constraint::CHECK_MODE_NORMAL, $errors = []): void
+    public function testInvalidCases(string $input, string $schema, ?int $checkMode = Constraint::CHECK_MODE_NORMAL, array $errors = []): void
     {
-        $checkMode = $checkMode === null ? Constraint::CHECK_MODE_NORMAL : $checkMode;
+        $checkMode = $checkMode ?? Constraint::CHECK_MODE_NORMAL;
         if ($this->validateSchema) {
             $checkMode |= Constraint::CHECK_MODE_VALIDATE_SCHEMA;
         }
 
-        $schemaStorage = new SchemaStorage($this->getUriRetrieverMock(json_decode($schema)));
-        $schema = $schemaStorage->getSchema('http://www.my-domain.com/schema.json');
+        $schema = json_decode($schema, false);
+        $schemaStorage = new SchemaStorage($this->getUriRetrieverMock($schema));
+        $schema = $schemaStorage->getSchema($schema->id ?? 'http://www.my-domain.com/schema.json');
         if (is_object($schema) && !isset($schema->{'$schema'})) {
             $schema->{'$schema'} = $this->schemaSpec;
         }
 
         $validator = new Validator(new Factory($schemaStorage, null, $checkMode));
-        $checkValue = json_decode($input);
+        $checkValue = json_decode($input, false);
         $errorMask = $validator->validate($checkValue, $schema);
 
-        $this->assertTrue((bool) ($errorMask & Validator::ERROR_DOCUMENT_VALIDATION));
+        $this->assertTrue((bool) ($errorMask & Validator::ERROR_DOCUMENT_VALIDATION), 'Document is invalid');
         $this->assertGreaterThan(0, $validator->numErrors());
 
         if ([] !== $errors) {
@@ -54,10 +51,12 @@ abstract class BaseTestCase extends Very
 
     /**
      * @dataProvider getInvalidForAssocTests
+     *
+     * @param ?int-mask-of<Constraint::CHECK_MODE_*> $checkMode
      */
-    public function testInvalidCasesUsingAssoc($input, $schema, $checkMode = Constraint::CHECK_MODE_TYPE_CAST, $errors = []): void
+    public function testInvalidCasesUsingAssoc(string $input, string $schema, ?int $checkMode = Constraint::CHECK_MODE_TYPE_CAST, array $errors = []): void
     {
-        $checkMode = $checkMode === null ? Constraint::CHECK_MODE_TYPE_CAST : $checkMode;
+        $checkMode = $checkMode ?? Constraint::CHECK_MODE_TYPE_CAST;
         if ($this->validateSchema) {
             $checkMode |= Constraint::CHECK_MODE_VALIDATE_SCHEMA;
         }
@@ -65,8 +64,9 @@ abstract class BaseTestCase extends Very
             $this->markTestSkipped('Test indicates that it is not for "CHECK_MODE_TYPE_CAST"');
         }
 
-        $schemaStorage = new SchemaStorage($this->getUriRetrieverMock(json_decode($schema)));
-        $schema = $schemaStorage->getSchema('http://www.my-domain.com/schema.json');
+        $schema = json_decode($schema, false);
+        $schemaStorage = new SchemaStorage($this->getUriRetrieverMock($schema));
+        $schema = $schemaStorage->getSchema($schema->id ?? 'http://www.my-domain.com/schema.json');
         if (is_object($schema) && !isset($schema->{'$schema'})) {
             $schema->{'$schema'} = $this->schemaSpec;
         }
@@ -86,20 +86,24 @@ abstract class BaseTestCase extends Very
 
     /**
      * @dataProvider getValidTests
+     *
+     * @param ?int-mask-of<Constraint::CHECK_MODE_*> $checkMode
      */
-    public function testValidCases($input, $schema, $checkMode = Constraint::CHECK_MODE_NORMAL): void
+    public function testValidCases(string $input, string $schema, int $checkMode = Constraint::CHECK_MODE_NORMAL): void
     {
         if ($this->validateSchema) {
             $checkMode |= Constraint::CHECK_MODE_VALIDATE_SCHEMA;
         }
-        $schemaStorage = new SchemaStorage($this->getUriRetrieverMock(json_decode($schema)));
-        $schema = $schemaStorage->getSchema('http://www.my-domain.com/schema.json');
+
+        $schema = json_decode($schema, false);
+        $schemaStorage = new SchemaStorage($this->getUriRetrieverMock($schema));
+        $schema = $schemaStorage->getSchema($schema->id ?? 'http://www.my-domain.com/schema.json');
         if (is_object($schema) && !isset($schema->{'$schema'})) {
             $schema->{'$schema'} = $this->schemaSpec;
         }
 
         $validator = new Validator(new Factory($schemaStorage, null, $checkMode));
-        $checkValue = json_decode($input);
+        $checkValue = json_decode($input, false);
         $errorMask = $validator->validate($checkValue, $schema);
         $this->assertEquals(0, $errorMask);
 
@@ -108,8 +112,10 @@ abstract class BaseTestCase extends Very
 
     /**
      * @dataProvider getValidForAssocTests
+     *
+     * @param ?int-mask-of<Constraint::CHECK_MODE_*> $checkMode
      */
-    public function testValidCasesUsingAssoc($input, $schema, $checkMode = Constraint::CHECK_MODE_TYPE_CAST): void
+    public function testValidCasesUsingAssoc(string $input, string $schema, ?int $checkMode = Constraint::CHECK_MODE_TYPE_CAST): void
     {
         if ($this->validateSchema) {
             $checkMode |= Constraint::CHECK_MODE_VALIDATE_SCHEMA;
@@ -118,9 +124,9 @@ abstract class BaseTestCase extends Very
             $this->markTestSkipped('Test indicates that it is not for "CHECK_MODE_TYPE_CAST"');
         }
 
-        $schema = json_decode($schema);
+        $schema = json_decode($schema, false);
         $schemaStorage = new SchemaStorage($this->getUriRetrieverMock($schema), new UriResolver());
-        $schema = $schemaStorage->getSchema('http://www.my-domain.com/schema.json');
+        $schema = $schemaStorage->getSchema($schema->id ?? 'http://www.my-domain.com/schema.json');
         if (is_object($schema) && !isset($schema->{'$schema'})) {
             $schema->{'$schema'} = $this->schemaSpec;
         }
@@ -129,21 +135,31 @@ abstract class BaseTestCase extends Very
         $validator = new Validator(new Factory($schemaStorage, null, $checkMode));
 
         $errorMask = $validator->validate($value, $schema);
-        $this->assertEquals(0, $errorMask);
+        $this->assertEquals(0, $errorMask, $this->validatorErrorsToString($validator));
         $this->assertTrue($validator->isValid(), print_r($validator->getErrors(), true));
     }
 
-    abstract public function getValidTests(): array;
+    abstract public function getValidTests(): Generator;
 
-    public function getValidForAssocTests(): array
+    public function getValidForAssocTests(): Generator
     {
-        return $this->getValidTests();
+        yield from $this->getValidTests();
     }
 
-    abstract public function getInvalidTests(): array;
+    abstract public function getInvalidTests(): Generator;
+
+    public function getInvalidForAssocTests(): Generator
+    {
+        yield from $this->getInvalidTests();
+    }
 
-    public function getInvalidForAssocTests(): array
+    protected function validatorErrorsToString(Validator $validator): string
     {
-        return $this->getInvalidTests();
+        return implode(
+            ', ',
+            array_map(
+                static function (array $error) { return $error['message']; }, $validator->getErrors()
+            )
+        );
     }
 }
diff -pruN 6.4.1-1/tests/Constraints/BasicTypesTest.php 6.6.0-1/tests/Constraints/BasicTypesTest.php
--- 6.4.1-1/tests/Constraints/BasicTypesTest.php	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/tests/Constraints/BasicTypesTest.php	2025-10-10 11:34:09.000000000 +0000
@@ -1,150 +1,145 @@
 <?php
 
-/*
- * This file is part of the JsonSchema package.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+declare(strict_types=1);
 
 namespace JsonSchema\Tests\Constraints;
 
+use JsonSchema\DraftIdentifiers;
+
 class BasicTypesTest extends BaseTestCase
 {
-    protected $schemaSpec = 'http://json-schema.org/draft-03/schema#';
+    /** @var string */
+    protected $schemaSpec = DraftIdentifiers::DRAFT_3;
+    /** @var bool */
     protected $validateSchema = true;
 
-    public function getInvalidTests(): array
+    public function getInvalidTests(): \Generator
     {
-        return [
-            [
-                '{
-                  "string":null
-                }',
-                '{
-                  "type":"object",
-                  "properties": {
-                    "string":{"type":"string"}
-                  },
-                  "additionalProperties":false
-                }'
-            ],
-            [
-                '{
-                  "number":null
-                }',
-                '{
-                  "type":"object",
-                  "properties": {
-                    "number":{"type":"number"}
-                  },
-                  "additionalProperties":false
-                }'
-            ],
-            [
-                '{
-                  "integer":null
-                }',
-                '{
-                  "type":"object",
-                  "properties": {
-                    "integer":{"type":"integer"}
-                  },
-                  "additionalProperties":false
-                }'
-            ],
-            [
-                '{
-                  "boolean":null
-                }',
-                '{
-                  "type":"object",
-                  "properties": {
-                    "boolean":{"type":"boolean"}
-                  },
-                  "additionalProperties":false
-                }'
-            ],
-            [
-                '{
-                  "object":null
-                }',
-                '{
-                  "type":"object",
-                  "properties": {
-                    "object":{"type":"object"}
-                  },
-                  "additionalProperties":false
-                }'
-            ],
-            [
-                '{
-                  "array":null
-                }',
-                '{
-                  "type":"object",
-                  "properties": {
-                    "array":{"type":"array"}
-                  },
-                  "additionalProperties":false
-                }'
-            ],
-            [
-                '{
-                  "null":1
-                }',
-                '{
-                  "type":"object",
-                  "properties": {
-                    "null":{"type":"null"}
-                  },
-                  "additionalProperties":false
-                }'
-            ]
+        yield [
+            '{
+              "string":null
+            }',
+            '{
+              "type":"object",
+              "properties": {
+                "string":{"type":"string"}
+              },
+              "additionalProperties":false
+            }'
+        ];
+        yield [
+            '{
+              "number":null
+            }',
+            '{
+              "type":"object",
+              "properties": {
+                "number":{"type":"number"}
+              },
+              "additionalProperties":false
+            }'
+        ];
+        yield [
+            '{
+              "integer":null
+            }',
+            '{
+              "type":"object",
+              "properties": {
+                "integer":{"type":"integer"}
+              },
+              "additionalProperties":false
+            }'
+        ];
+        yield [
+            '{
+              "boolean":null
+            }',
+            '{
+              "type":"object",
+              "properties": {
+                "boolean":{"type":"boolean"}
+              },
+              "additionalProperties":false
+            }'
+        ];
+        yield [
+            '{
+              "object":null
+            }',
+            '{
+              "type":"object",
+              "properties": {
+                "object":{"type":"object"}
+              },
+              "additionalProperties":false
+            }'
+        ];
+        yield [
+            '{
+              "array":null
+            }',
+            '{
+              "type":"object",
+              "properties": {
+                "array":{"type":"array"}
+              },
+              "additionalProperties":false
+            }'
         ];
+        yield [
+            '{
+              "null":1
+            }',
+            '{
+              "type":"object",
+              "properties": {
+                "null":{"type":"null"}
+              },
+              "additionalProperties":false
+            }'
+            ];
     }
 
-    public function getValidTests(): array
+    public function getValidTests(): \Generator
     {
-        return [
-            [
-                '{
-                  "string":"string test",
-                  "number":1,
-                  "integer":1,
-                  "boolean":true,
-                  "object":{},
-                  "array":[],
-                  "null":null,
-                  "any": "string",
-                  "any1": 2.6,
-                  "any2": 4,
-                  "any3": false,
-                  "any4": {},
-                  "any5": [],
-                  "any6": null
-                }',
-                '{
-                  "type":"object",
-                  "properties":{
-                    "string":{"type":"string"},
-                    "number":{"type":"number"},
-                    "integer":{"type":"integer"},
-                    "boolean":{"type":"boolean"},
-                    "object":{"type":"object"},
-                    "array":{"type":"array"},
-                    "null":{"type":"null"},
-                    "any": {"type":"any"},
-                    "any1": {"type":"any"},
-                    "any2": {"type":"any"},
-                    "any3": {"type":"any"},
-                    "any4": {"type":"any"},
-                    "any5": {"type":"any"},
-                    "any6": {"type":"any"}
-                  },
-                  "additionalProperties":false
-                }'
-            ]
+        yield [
+            '{
+              "string":"string test",
+              "number":1,
+              "integer":1,
+              "boolean":true,
+              "object":{},
+              "array":[],
+              "null":null,
+              "any": "string",
+              "any1": 2.6,
+              "any2": 4,
+              "any3": false,
+              "any4": {},
+              "any5": [],
+              "any6": null
+            }',
+            '{
+              "type":"object",
+              "properties":{
+                "string":{"type":"string"},
+                "number":{"type":"number"},
+                "integer":{"type":"integer"},
+                "boolean":{"type":"boolean"},
+                "object":{"type":"object"},
+                "array":{"type":"array"},
+                "null":{"type":"null"},
+                "any": {"type":"any"},
+                "any1": {"type":"any"},
+                "any2": {"type":"any"},
+                "any3": {"type":"any"},
+                "any4": {"type":"any"},
+                "any5": {"type":"any"},
+                "any6": {"type":"any"}
+              },
+              "additionalProperties":false
+            }'
         ];
     }
 }
diff -pruN 6.4.1-1/tests/Constraints/CoerciveTest.php 6.6.0-1/tests/Constraints/CoerciveTest.php
--- 6.4.1-1/tests/Constraints/CoerciveTest.php	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/tests/Constraints/CoerciveTest.php	2025-10-10 11:34:09.000000000 +0000
@@ -1,11 +1,6 @@
 <?php
 
-/*
- * This file is part of the JsonSchema package.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+declare(strict_types=1);
 
 namespace JsonSchema\Tests\Constraints;
 
diff -pruN 6.4.1-1/tests/Constraints/ConstTest.php 6.6.0-1/tests/Constraints/ConstTest.php
--- 6.4.1-1/tests/Constraints/ConstTest.php	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/tests/Constraints/ConstTest.php	2025-10-10 11:34:09.000000000 +0000
@@ -1,53 +1,51 @@
 <?php
 
-/*
- * This file is part of the JsonSchema package.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+declare(strict_types=1);
 
 namespace JsonSchema\Tests\Constraints;
 
+use JsonSchema\DraftIdentifiers;
+
 class ConstTest extends BaseTestCase
 {
-    protected $schemaSpec = 'http://json-schema.org/draft-06/schema#';
+    /** @var string */
+    protected $schemaSpec = DraftIdentifiers::DRAFT_6;
+    /** @var bool */
     protected $validateSchema = true;
 
-    public function getInvalidTests(): array
+    public function getInvalidTests(): \Generator
     {
-        return [
-            'Object with inner string value' => [
-                '{"value":"foo"}',
-                '{
-                  "type":"object",
-                  "properties":{
-                    "value":{"type":"string","const":"bar"}
-                  },
-                  "additionalProperties":false
-                }'
-            ],
-            'Object with inner integer value' => [
-                '{"value":5}',
-                '{
-                  "type":"object",
-                  "properties":{
-                    "value":{"type":"integer","const":6}
-                  },
-                  "additionalProperties":false
-                }'
-            ],
-            'Object with inner boolean value' => [
-                '{"value":false}',
-                '{
-                  "type":"object",
-                  "properties":{
-                    "value":{"type":"boolean","const":true}
-                  },
-                  "additionalProperties":false
-                }'
-            ],
-            'Object with inner numerical string value' => [
+        yield 'Object with inner string value' => [
+            '{"value":"foo"}',
+            '{
+              "type":"object",
+              "properties":{
+                "value":{"type":"string","const":"bar"}
+              },
+              "additionalProperties":false
+            }'
+        ];
+        yield 'Object with inner integer value' => [
+            '{"value":5}',
+            '{
+              "type":"object",
+              "properties":{
+                "value":{"type":"integer","const":6}
+              },
+              "additionalProperties":false
+            }'
+        ];
+        yield 'Object with inner boolean value' => [
+            '{"value":false}',
+            '{
+              "type":"object",
+              "properties":{
+                "value":{"type":"boolean","const":true}
+              },
+              "additionalProperties":false
+            }'
+        ];
+        yield 'Object with inner numerical string value' => [
                 '{
                     "value": {
                         "foo": "12"
@@ -64,54 +62,52 @@ class ConstTest extends BaseTestCase
                         }
                     }
                 }'
-            ]
-        ];
+            ];
     }
 
-    public function getValidTests(): array
+    public function getValidTests(): \Generator
     {
-        return [
-            'String value' => [
-                '{"value":"bar"}',
-                '{
-                  "type":"object",
-                  "properties":{
-                    "value":{"type":"string","const":"bar"}
-                  },
-                  "additionalProperties":false
-                }'
-            ],
-            'Boolean(false) value' => [
-                '{"value":false}',
-                '{
-                  "type":"object",
-                  "properties":{
-                    "value":{"type":"boolean","const":false}
-                  },
-                  "additionalProperties":false
-                }'
-            ],
-            'Boolean(true) value' => [
-                '{"value":true}',
-                '{
-                  "type":"object",
-                  "properties":{
-                    "value":{"type":"boolean","const":true}
-                  },
-                  "additionalProperties":false
-                }'
-            ],
-            'Integer value' => [
-                '{"value":5}',
-                '{
-                  "type":"object",
-                  "properties":{
-                    "value":{"type":"integer","const":5}
-                  },
-                  "additionalProperties":false
-                }'
-            ],
-            'Object with inner integer value' => [
+        yield 'String value' => [
+            '{"value":"bar"}',
+            '{
+              "type":"object",
+              "properties":{
+                "value":{"type":"string","const":"bar"}
+              },
+              "additionalProperties":false
+            }'
+        ];
+        yield 'Boolean(false) value' => [
+            '{"value":false}',
+            '{
+              "type":"object",
+              "properties":{
+                "value":{"type":"boolean","const":false}
+              },
+              "additionalProperties":false
+            }'
+        ];
+        yield 'Boolean(true) value' => [
+            '{"value":true}',
+            '{
+              "type":"object",
+              "properties":{
+                "value":{"type":"boolean","const":true}
+              },
+              "additionalProperties":false
+            }'
+        ];
+        yield 'Integer value' => [
+            '{"value":5}',
+            '{
+              "type":"object",
+              "properties":{
+                "value":{"type":"integer","const":5}
+              },
+              "additionalProperties":false
+            }'
+        ];
+        yield 'Object with inner integer value' => [
                 '{
                     "value": {
                         "foo": 12
@@ -121,14 +117,13 @@ class ConstTest extends BaseTestCase
                     "type": "object",
                     "properties": {
                         "value": {
-                            "type": "any", 
+                            "type": "object",
                             "const": {
                                     "foo": 12
                             }
                         }
                     }
                 }'
-            ]
-        ];
+            ];
     }
 }
diff -pruN 6.4.1-1/tests/Constraints/DefaultPropertiesTest.php 6.6.0-1/tests/Constraints/DefaultPropertiesTest.php
--- 6.4.1-1/tests/Constraints/DefaultPropertiesTest.php	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/tests/Constraints/DefaultPropertiesTest.php	2025-10-10 11:34:09.000000000 +0000
@@ -1,11 +1,6 @@
 <?php
 
-/*
- * This file is part of the JsonSchema package.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+declare(strict_types=1);
 
 namespace JsonSchema\Tests\Constraints;
 
diff -pruN 6.4.1-1/tests/Constraints/DependenciesTest.php 6.6.0-1/tests/Constraints/DependenciesTest.php
--- 6.4.1-1/tests/Constraints/DependenciesTest.php	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/tests/Constraints/DependenciesTest.php	2025-10-10 11:34:09.000000000 +0000
@@ -1,151 +1,146 @@
 <?php
 
-/*
- * This file is part of the JsonSchema package.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+declare(strict_types=1);
 
 namespace JsonSchema\Tests\Constraints;
 
+use JsonSchema\DraftIdentifiers;
+
 class DependenciesTest extends BaseTestCase
 {
-    protected $schemaSpec = 'http://json-schema.org/draft-03/schema#';
+    /** @var string */
+    protected $schemaSpec = DraftIdentifiers::DRAFT_3;
+    /** @var bool */
     protected $validateSchema = true;
 
-    public function getInvalidTests(): array
+    public function getInvalidTests(): \Generator
     {
-        return [
-            [
-                '{"bar": 1}',
-                '{
-                    "dependencies": {"bar": "foo"}
-                }'
-            ],
-            [
-                '{"bar": 1}',
-                '{
-                    "dependencies": {"bar": ["foo"]}
-                }'
-            ],
-            [
-                '{"bar": 1, "foo": 1}',
-                '{
-                    "dependencies": {"bar": ["foo", "baz"]}
-                }'
-            ],
-            [
-                '{"bar": 1, "foo": 1}',
-                '{
-                    "dependencies": {"bar": {
-                        "properties": {
-                            "foo": {"type": "string"}
-                        }
-                    }}
-                }'
-            ],
-            [
-                '{"bar": 1}',
-                '{
-                    "dependencies": {"bar": {
-                        "properties": {
-                            "foo": {"type": "integer", "required": true}
-                        }
-                    }}
-                }'
-            ],
-            [
-                '{"bar": 1}',
-                '{
-                    "dependencies": {"bar": {
-                        "properties": {
-                            "foo": {"type": "integer"}
-                        },
-                        "required": ["foo"]
-                    }}
-                }'
-            ],
-            [
-                '{"bar": true, "foo": "ick"}',
-                '{
-                    "dependencies": {"bar": {
-                        "properties": {
-                            "bar": {"type": "integer"},
-                            "foo": {"type": "integer"}
-                        }
-                    }}
-                }'
-            ]
+        yield [
+            '{"bar": 1}',
+            '{
+                "dependencies": {"bar": "foo"}
+            }'
+        ];
+        yield [
+            '{"bar": 1}',
+            '{
+                "dependencies": {"bar": ["foo"]}
+            }'
+        ];
+        yield [
+            '{"bar": 1, "foo": 1}',
+            '{
+                "dependencies": {"bar": ["foo", "baz"]}
+            }'
+        ];
+        yield [
+            '{"bar": 1, "foo": 1}',
+            '{
+                "dependencies": {"bar": {
+                    "properties": {
+                        "foo": {"type": "string"}
+                    }
+                }}
+            }'
+        ];
+        yield [
+            '{"bar": 1}',
+            '{
+                "dependencies": {"bar": {
+                    "properties": {
+                        "foo": {"type": "integer", "required": true}
+                    }
+                }}
+            }'
+        ];
+        yield [
+            '{"bar": 1}',
+            '{
+                "dependencies": {"bar": {
+                    "properties": {
+                        "foo": {"type": "integer"}
+                    },
+                    "required": ["foo"]
+                }}
+            }'
+        ];
+        yield [
+            '{"bar": true, "foo": "ick"}',
+            '{
+                "dependencies": {"bar": {
+                    "properties": {
+                        "bar": {"type": "integer"},
+                        "foo": {"type": "integer"}
+                    }
+                }}
+            }'
         ];
     }
 
-    public function getValidTests(): array
+    public function getValidTests(): \Generator
     {
-        return [
-            [
-                '{}',
-                '{
-                    "dependencies": {"bar": "foo"}
-                }'
-            ],
-            [
-                '{"foo": 1}',
-                '{
-                    "dependencies": {"bar": "foo"}
-                }'
-            ],
-            [
-                '"foo"',
-                '{
-                    "dependencies": {"bar": "foo"}
-                }'
-            ],
-            [
-                '{"bar": 1, "foo": 1}',
-                '{
-                    "dependencies": {"bar": "foo"}
-                }'
-            ],
-            [
-                '{"bar": 1, "foo": 1, "baz": 1}',
-                '{
-                    "dependencies": {"bar": ["foo", "baz"]}
-                }'
-            ],
-            [
-                '{}',
-                '{
-                    "dependencies": {"bar": ["foo", "baz"]}
-                }'
-            ],
-            [
-                '{"foo": 1, "baz": 1}',
-                '{
-                    "dependencies": {"bar": ["foo", "baz"]}
-                }'
-            ],
-            [
-                '{"bar": 1}',
-                '{
-                    "dependencies": {"bar": {
-                        "properties": {
-                            "foo": {"type": "integer"}
-                        }
-                    }}
-                }'
-            ],
-            [
-                '{"bar": 1, "foo": 1}',
-                '{
-                    "dependencies": {"bar": {
-                        "properties": {
-                            "bar": {"type": "integer"},
-                            "foo": {"type": "integer"}
-                        }
-                    }}
-                }'
-            ]
+        yield [
+            '{}',
+            '{
+                "dependencies": {"bar": "foo"}
+            }'
+        ];
+        yield [
+            '{"foo": 1}',
+            '{
+                "dependencies": {"bar": "foo"}
+            }'
+        ];
+        yield [
+            '"foo"',
+            '{
+                "dependencies": {"bar": "foo"}
+            }'
+        ];
+        yield [
+            '{"bar": 1, "foo": 1}',
+            '{
+                "dependencies": {"bar": "foo"}
+            }'
+        ];
+        yield [
+            '{"bar": 1, "foo": 1, "baz": 1}',
+            '{
+                "dependencies": {"bar": ["foo", "baz"]}
+            }'
+        ];
+        yield [
+            '{}',
+            '{
+                "dependencies": {"bar": ["foo", "baz"]}
+            }'
+        ];
+        yield [
+            '{"foo": 1, "baz": 1}',
+            '{
+                "dependencies": {"bar": ["foo", "baz"]}
+            }'
+        ];
+        yield [
+            '{"bar": 1}',
+            '{
+                "dependencies": {"bar": {
+                    "properties": {
+                        "foo": {"type": "integer"}
+                    }
+                }}
+            }'
+        ];
+        yield [
+            '{"bar": 1, "foo": 1}',
+            '{
+                "dependencies": {"bar": {
+                    "properties": {
+                        "bar": {"type": "integer"},
+                        "foo": {"type": "integer"}
+                    }
+                }}
+            }'
         ];
     }
 }
diff -pruN 6.4.1-1/tests/Constraints/DisallowTest.php 6.6.0-1/tests/Constraints/DisallowTest.php
--- 6.4.1-1/tests/Constraints/DisallowTest.php	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/tests/Constraints/DisallowTest.php	2025-10-10 11:34:09.000000000 +0000
@@ -1,170 +1,165 @@
 <?php
 
-/*
- * This file is part of the JsonSchema package.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+declare(strict_types=1);
 
 namespace JsonSchema\Tests\Constraints;
 
+use JsonSchema\DraftIdentifiers;
+
+/**
+ * Schemas in these tests look like draft-03, but the 'disallow' patterns provided are in
+ * violation of the spec - 'disallow' as defined in draft-03 accepts the same values as the
+ * 'type' option, and cannot take arbitrary patterns. The implementation in this library is
+ * probably deliberate, but noting that it's invalid, schema validation has been disabled
+ * for these tests. The 'disallow' option was removed permanently in draft-04.
+ */
 class DisallowTest extends BaseTestCase
 {
-    // schemas in these tests look like draft-03, but the 'disallow' patterns provided are in
-    // violation of the spec - 'disallow' as defined in draft-03 accepts the same values as the
-    // 'type' option, and cannot take arbitrary patterns. The implementation in this library is
-    // probably deliberate, but noting that it's invalid, schema validation has been disabled
-    // for these tests. The 'disallow' option was removed permanently in draft-04.
-    protected $schemaSpec = 'http://json-schema.org/draft-03/schema#';
-    protected $validateSchema = false;
+    /** @var string */
+    protected $schemaSpec = DraftIdentifiers::DRAFT_3;
 
-    public function getInvalidTests(): array
+    public function getInvalidTests(): \Generator
     {
-        return [
-            [
-                '{
-                  "value":"The xpto is weird"
-                }',
-                '{
-                  "type":"object",
-                  "properties":{
-                    "value":{
-                      "type":"any",
-                      "disallow":{"type":"string","pattern":"xpto"}
-                    }
-                  }
-                }'
-            ],
-            [
-                '{
-                  "value":null
-                }',
-                '{
-                  "type":"object",
-                  "properties":{
-                    "value":{
-                      "type":"any",
-                      "disallow":{"type":"null"}
-                    }
-                  }
-                }'
-            ],
-            [
-                '{"value": 1}',
-                '{
-                    "type": "object",
-                    "properties": {
-                        "value": {"type": "any", "disallow": "integer"}
-                    }
-                }'
-            ],
-            [
-                '{"value": true}',
-                '{
-                    "type": "object",
-                    "properties": {
-                        "value": {"type": "any", "disallow": ["integer", "boolean"]}
-                    }
-                }'
-            ],
-            [
-                '{"value": "foo"}',
-                '{
-                    "type": "object",
-                    "properties": {
-                        "value": {
-                            "type": "any",
-                            "disallow":
-                                ["string", {
-                                    "type": "object",
-                                    "properties": {
-                                        "foo": {"type": "string"}
-                                    }
-                                }]
-                        }
+        yield [
+            '{
+              "value":"The xpto is weird"
+            }',
+            '{
+              "type":"object",
+              "properties":{
+                "value":{
+                  "type":"any",
+                  "disallow":{"type":"string","pattern":"xpto"}
+                }
+              }
+            }'
+        ];
+        yield [
+            '{
+              "value":null
+            }',
+            '{
+              "type":"object",
+              "properties":{
+                "value":{
+                  "type":"any",
+                  "disallow":{"type":"null"}
+                }
+              }
+            }'
+        ];
+        yield [
+            '{"value": 1}',
+            '{
+                "type": "object",
+                "properties": {
+                    "value": {"type": "any", "disallow": "integer"}
+                }
+            }'
+        ];
+        yield [
+            '{"value": true}',
+            '{
+                "type": "object",
+                "properties": {
+                    "value": {"type": "any", "disallow": ["integer", "boolean"]}
+                }
+            }'
+        ];
+        yield [
+            '{"value": "foo"}',
+            '{
+                "type": "object",
+                "properties": {
+                    "value": {
+                        "type": "any",
+                        "disallow":
+                            ["string", {
+                                "type": "object",
+                                "properties": {
+                                    "foo": {"type": "string"}
+                                }
+                            }]
                     }
-                }'
-            ],
-            [
-                '{"value": {"foo": "bar"}}',
-                '{
-                    "type": "object",
-                    "properties": {
-                        "value": {
-                            "type": "any",
-                            "disallow":
-                                ["string", {
-                                    "type": "object",
-                                    "properties": {
-                                        "foo": {"type": "string"}
-                                    }
-                                }]
-                        }
+                }
+            }'
+        ];
+        yield [
+            '{"value": {"foo": "bar"}}',
+            '{
+                "type": "object",
+                "properties": {
+                    "value": {
+                        "type": "any",
+                        "disallow":
+                            ["string", {
+                                "type": "object",
+                                "properties": {
+                                    "foo": {"type": "string"}
+                                }
+                            }]
                     }
-                }'
-            ]
+                }
+            }'
         ];
     }
 
-    public function getValidTests(): array
+    public function getValidTests(): \Generator
     {
-        return [
-            [
-                '{
-                  "value":"The xpto is weird"
-                }',
-                '{
-                  "type":"object",
-                  "properties":{
-                    "value":{
-                      "type":"any",
-                      "disallow":{"type":"string","pattern":"^xpto"}
-                    }
-                  }
-                }'
-            ],
-            [
-                '{
-                  "value":1
-                }',
-                '{
-                  "type":"object",
-                  "properties":{
-                    "value":{
-                      "type":"any",
-                      "disallow":{"type":"null"}
-                    }
-                  }
-                }'
-            ],
-            [
-                '{"value": {"foo": 1}}',
-                '{
-                    "type": "object",
-                    "properties": {
-                        "value": {
-                            "type": "any",
-                            "disallow":
-                                ["string", {
-                                    "type": "object",
-                                    "properties": {
-                                        "foo": {"type": "string"}
-                                    }
-                                }]
-                        }
-                    }
-                }'
-            ],
-            [
-                '{"value": true}',
-                '{
-                    "type": "object",
-                    "properties": {
-                        "value": {"type": "any", "disallow": "string"}
+        yield [
+            '{
+              "value":"The xpto is weird"
+            }',
+            '{
+              "type":"object",
+              "properties":{
+                "value":{
+                  "type":"any",
+                  "disallow":{"type":"string","pattern":"^xpto"}
+                }
+              }
+            }'
+        ];
+        yield [
+            '{
+              "value":1
+            }',
+            '{
+              "type":"object",
+              "properties":{
+                "value":{
+                  "type":"any",
+                  "disallow":{"type":"null"}
+                }
+              }
+            }'
+        ];
+        yield [
+            '{"value": {"foo": 1}}',
+            '{
+                "type": "object",
+                "properties": {
+                    "value": {
+                        "type": "any",
+                        "disallow":
+                            ["string", {
+                                "type": "object",
+                                "properties": {
+                                    "foo": {"type": "string"}
+                                }
+                            }]
                     }
-                }'
-            ]
+                }
+            }'
+        ];
+        yield [
+            '{"value": true}',
+            '{
+                "type": "object",
+                "properties": {
+                    "value": {"type": "any", "disallow": "string"}
+                }
+            }'
         ];
     }
 }
diff -pruN 6.4.1-1/tests/Constraints/DivisibleByTest.php 6.6.0-1/tests/Constraints/DivisibleByTest.php
--- 6.4.1-1/tests/Constraints/DivisibleByTest.php	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/tests/Constraints/DivisibleByTest.php	2025-10-10 11:34:09.000000000 +0000
@@ -1,97 +1,89 @@
 <?php
 
-/*
- * This file is part of the JsonSchema package.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+declare(strict_types=1);
 
 namespace JsonSchema\Tests\Constraints;
 
 class DivisibleByTest extends BaseTestCase
 {
+    /** @var bool */
     protected $validateSchema = true;
 
-    public function getInvalidTests(): array
+    public function getInvalidTests(): \Generator
     {
-        return [
-            [
-                '{"value": 5.6333}',
-                '{
-                  "type":"object",
-                  "properties":{
-                    "value":{"type":"number","divisibleBy":3}
-                  }
-                }'
-            ],
-            [
-                '{"value": 35}',
-                '{
-                    "type": "object",
-                    "properties": {
-                        "value": {"type": "integer", "divisibleBy": 1.5}
-                    }
-                }'
-            ],
-            [
-                '{"value": 0.00751}',
-                '{
-                    "type": "object",
-                    "properties": {
-                        "value": {"type": "number", "divisibleBy": 0.0001}
-                    }
-                }'
-            ],
-            [
-                '{"value": 7}',
-                '{
-                    "type": "object",
-                    "properties": {
-                        "value": {"type": "integer", "divisibleBy": 2}
-                    }
-                }'
-            ]
+        yield [
+            '{"value": 5.6333}',
+            '{
+              "type":"object",
+              "properties":{
+                "value":{"type":"number","divisibleBy":3}
+              }
+            }'
+        ];
+        yield [
+            '{"value": 35}',
+            '{
+                "type": "object",
+                "properties": {
+                    "value": {"type": "integer", "divisibleBy": 1.5}
+                }
+            }'
+        ];
+        yield [
+            '{"value": 0.00751}',
+            '{
+                "type": "object",
+                "properties": {
+                    "value": {"type": "number", "divisibleBy": 0.0001}
+                }
+            }'
+        ];
+        yield [
+            '{"value": 7}',
+            '{
+                "type": "object",
+                "properties": {
+                    "value": {"type": "integer", "divisibleBy": 2}
+                }
+            }'
         ];
     }
 
-    public function getValidTests(): array
+    public function getValidTests(): \Generator
     {
-        return [
-            [
-                '{"value": 6}',
-                '{
-                  "type":"object",
-                  "properties":{
-                    "value":{"type":"number","divisibleBy":3}
-                  }
-                }'
-            ],
-            [
-                '{"value": 4.5}',
-                '{
-                    "type": "object",
-                    "properties": {
-                        "value": {"type": "number", "divisibleBy": 1.5}
-                    }
-                }'
-            ],
-            [
-                '{"value": 0.0075}',
-                '{
-                    "properties": {
-                        "value": {"type": "number", "divisibleBy": 0.0001}
-                    }
-                }'
-            ],
-            [
-                '{"value": 1}',
-                '{
-                    "properties": {
-                        "value": {"type": "number", "divisibleBy": 0.02}
-                    }
-                }'
-            ]
+        yield [
+            '{"value": 6}',
+            '{
+              "type":"object",
+              "properties":{
+                "value":{"type":"number","divisibleBy":3}
+              }
+            }'
+        ];
+        yield [
+            '{"value": 4.5}',
+            '{
+                "type": "object",
+                "properties": {
+                    "value": {"type": "number", "divisibleBy": 1.5}
+                }
+            }'
+        ];
+        yield [
+            '{"value": 0.0075}',
+            '{
+                "properties": {
+                    "value": {"type": "number", "divisibleBy": 0.0001}
+                }
+            }'
+        ];
+        yield [
+            '{"value": 1}',
+            '{
+                "properties": {
+                    "value": {"type": "number", "divisibleBy": 0.02}
+                }
+            }'
         ];
     }
 }
diff -pruN 6.4.1-1/tests/Constraints/EnumTest.php 6.6.0-1/tests/Constraints/EnumTest.php
--- 6.4.1-1/tests/Constraints/EnumTest.php	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/tests/Constraints/EnumTest.php	2025-10-10 11:34:09.000000000 +0000
@@ -1,198 +1,193 @@
 <?php
 
-/*
- * This file is part of the JsonSchema package.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+declare(strict_types=1);
 
 namespace JsonSchema\Tests\Constraints;
 
+use JsonSchema\DraftIdentifiers;
+
 class EnumTest extends BaseTestCase
 {
-    protected $schemaSpec = 'http://json-schema.org/draft-03/schema#';
+    /** @var string */
+    protected $schemaSpec = DraftIdentifiers::DRAFT_3;
+    /** @var bool */
     protected $validateSchema = true;
 
-    public function getInvalidTests(): array
+    public function getInvalidTests(): \Generator
     {
-        return [
-            [
-                '{
-                  "value":"Morango"
-                }',
-                '{
-                  "type":"object",
-                  "properties":{
-                    "value":{"type":"string","enum":["Abacate","Manga","Pitanga"]}
-                  },
-                  "additionalProperties":false
-                }'
-            ],
-            [
-                '{}',
-                '{
-                  "type":"object",
-                  "properties":{
-                    "value":{
-                      "type":"string",
-                      "enum":["Abacate","Manga","Pitanga"],
-                      "required":true
+        yield [
+            '{
+              "value":"Morango"
+            }',
+            '{
+              "type":"object",
+              "properties":{
+                "value":{"type":"string","enum":["Abacate","Manga","Pitanga"]}
+              },
+              "additionalProperties":false
+            }'
+        ];
+        yield [
+            '{}',
+            '{
+              "type":"object",
+              "properties":{
+                "value":{
+                  "type":"string",
+                  "enum":["Abacate","Manga","Pitanga"],
+                  "required":true
+                }
+              },
+              "additionalProperties":false
+            }'
+        ];
+        yield [
+            '{"value": "4"}',
+            '{
+                "type": "object",
+                "properties": {
+                    "value": {
+                        "type": "integer", "enum": [1, 2, 3]
                     }
-                  },
-                  "additionalProperties":false
-                }'
-            ],
-            [
-                '{"value": "4"}',
-                '{
-                    "type": "object",
-                    "properties": {
-                        "value": {
-                            "type": "integer", "enum": [1, 2, 3]
-                        }
-                    },
-                    "additionalProperties": false
-                }'
-            ],
-            [
-                '{"value": {"foo": false}}',
-                '{
-                    "type": "object",
-                    "properties": {
-                        "value": {
-                            "type": "any", "enum": [6, "foo", [], true, {"foo": 12}]
-                        }
-                    },
-                    "additionalProperties": false
-                }'
-            ],
-            [
-                '{
+                },
+                "additionalProperties": false
+            }'
+        ];
+        yield [
+            '{"value": {"foo": false}}',
+            '{
+                "type": "object",
+                "properties": {
                     "value": {
-                        "foo": "12"
+                        "type": "any", "enum": [6, "foo", [], true, {"foo": 12}]
                     }
-                }',
-                '{
-                    "type": "object",
-                    "properties": {
-                        "value": {
-                            "type": "any", 
-                            "enum": [
-                                6, 
-                                "foo", 
-                                [], 
-                                true, 
-                                {
-                                    "foo": 12
-                                }
-                            ]
-                        }
+                },
+                "additionalProperties": false
+            }'
+        ];
+        yield [
+            '{
+                "value": {
+                    "foo": "12"
+                }
+            }',
+            '{
+                "type": "object",
+                "properties": {
+                    "value": {
+                        "type": "any", 
+                        "enum": [
+                            6, 
+                            "foo", 
+                            [], 
+                            true, 
+                            {
+                                "foo": 12
+                            }
+                        ]
                     }
-                }'
-            ]
+                }
+            }'
         ];
     }
 
-    public function getValidTests(): array
+    public function getValidTests(): \Generator
     {
-        return [
-            [
-                '{
-                  "value":"Abacate"
-                }',
-                '{
-                  "type":"object",
-                  "properties":{
-                    "value":{"type":"string","enum":["Abacate","Manga","Pitanga"]}
-                  },
-                  "additionalProperties":false
-                }'
-            ],
-            [
-                '{}',
-                '{
-                  "type":"object",
-                  "properties":{
-                    "value":{"type":"string","enum":["Abacate","Manga","Pitanga"]}
-                  },
-                  "additionalProperties":false
-                }'
-            ],
-            [
-                '{}',
-                '{
-                  "type":"object",
-                  "properties":{
-                    "value":{
-                      "type":"string",
-                      "enum":["Abacate","Manga","Pitanga"],
-                      "required":false
-                    }
-                  },
-                  "additionalProperties":false
-                }'
-            ],
-            [
-                '{"value": 1}',
-                '{
-                    "type": "object",
-                    "properties": {
-                        "value": {"type": "integer", "enum": [1, 2, 3]}
-                    }
-                }'
-            ],
-            [
-                '{"value": []}',
-                '{
-                    "type": "object",
-                    "properties": {
-                        "value": {"type": "any", "enum": [6, "foo", [], true, {"foo": 12}]}
-                    },
-                    "additionalProperties": false
-                }'
-            ],
-            [
-                '{
+        yield [
+            '{
+              "value":"Abacate"
+            }',
+            '{
+              "type":"object",
+              "properties":{
+                "value":{"type":"string","enum":["Abacate","Manga","Pitanga"]}
+              },
+              "additionalProperties":false
+            }'
+        ];
+        yield [
+            '{}',
+            '{
+              "type":"object",
+              "properties":{
+                "value":{"type":"string","enum":["Abacate","Manga","Pitanga"]}
+              },
+              "additionalProperties":false
+            }'
+        ];
+        yield [
+            '{}',
+            '{
+              "type":"object",
+              "properties":{
+                "value":{
+                  "type":"string",
+                  "enum":["Abacate","Manga","Pitanga"],
+                  "required":false
+                }
+              },
+              "additionalProperties":false
+            }'
+        ];
+        yield [
+            '{"value": 1}',
+            '{
+                "type": "object",
+                "properties": {
+                    "value": {"type": "integer", "enum": [1, 2, 3]}
+                }
+            }'
+        ];
+        yield [
+            '{"value": []}',
+            '{
+                "type": "object",
+                "properties": {
+                    "value": {"type": "any", "enum": [6, "foo", [], true, {"foo": 12}]}
+                },
+                "additionalProperties": false
+            }'
+        ];
+        yield [
+            '{
+                "value": {
+                    "foo": 12
+                }
+            }',
+            '{
+                "type": "object",
+                "properties": {
                     "value": {
-                        "foo": 12
-                    }
-                }',
-                '{
-                    "type": "object",
-                    "properties": {
-                        "value": {
-                            "type": "any",
-                            "enum": [
-                                6,
-                                "foo",
-                                [],
-                                true,
-                                {
-                                    "foo": 12
-                                }
-                            ]
-                        }
+                        "type": "any",
+                        "enum": [
+                            6,
+                            "foo",
+                            [],
+                            true,
+                            {
+                                "foo": 12
+                            }
+                        ]
                     }
-                }'
-            ],
-            'Number values with mathematical equality are considered valid' => [
-                'data' => '12',
-                'schema' => '{
-                    "type": "any",
-                    "enum": [
-                        12.0
-                    ]
-                }'
-            ],
-            'Array with number values with mathematical equality are considered valid' => [
-                'input' => '[ 0.0 ]',
-                'schema' => '{
-                    "enum": [
-                        [ 0 ]
-                    ]
-                }',
-            ]
+                }
+            }'
+        ];
+        yield 'Number values with mathematical equality are considered valid' => [
+            'data' => '12',
+            'schema' => '{
+                "type": "any",
+                "enum": [
+                    12.0
+                ]
+            }'
+        ];
+        yield 'Array with number values with mathematical equality are considered valid' => [
+            'input' => '[ 0.0 ]',
+            'schema' => '{
+                "enum": [
+                    [ 0 ]
+                ]
+            }',
         ];
     }
 }
diff -pruN 6.4.1-1/tests/Constraints/ExtendsTest.php 6.6.0-1/tests/Constraints/ExtendsTest.php
--- 6.4.1-1/tests/Constraints/ExtendsTest.php	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/tests/Constraints/ExtendsTest.php	2025-10-10 11:34:09.000000000 +0000
@@ -1,154 +1,149 @@
 <?php
 
-/*
- * This file is part of the JsonSchema package.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+declare(strict_types=1);
 
 namespace JsonSchema\Tests\Constraints;
 
+use JsonSchema\DraftIdentifiers;
+
 class ExtendsTest extends BaseTestCase
 {
-    protected $schemaSpec = 'http://json-schema.org/draft-03/schema#';
+    /** @var string */
+    protected $schemaSpec = DraftIdentifiers::DRAFT_3;
+    /** @var bool */
     protected $validateSchema = true;
 
-    public function getInvalidTests(): array
+    public function getInvalidTests(): \Generator
     {
-        return [
-            [
-                '{
-                  "name":"bruno",
-                  "age":50
-                }',
-                '{
+        yield [
+            '{
+              "name":"bruno",
+              "age":50
+            }',
+            '{
+                "properties": {
+                    "name": {"type": "string"},
+                    "age": {
+                        "type": "integer",
+                        "maximum": 120
+                    }
+                },
+                "extends": {
                     "properties": {
-                        "name": {"type": "string"},
-                        "age": {
-                            "type": "integer",
-                            "maximum": 120
-                        }
-                    },
-                    "extends": {
-                        "properties": {
-                            "age": {"minimum": 70}
-                        }
+                        "age": {"minimum": 70}
+                    }
+                }
+            }'
+        ];
+        yield [
+            '{
+              "name":"bruno",
+              "age":180
+            }',
+            '{
+                "properties": {
+                    "name": {"type": "string"},
+                    "age": {
+                        "type": "integer",
+                        "maximum": 120
                     }
-                }'
-            ],
-            [
-                '{
-                  "name":"bruno",
-                  "age":180
-                }',
-                '{
+                },
+                "extends": {
                     "properties": {
-                        "name": {"type": "string"},
-                        "age": {
-                            "type": "integer",
-                            "maximum": 120
-                        }
-                    },
-                    "extends": {
-                        "properties": {
-                            "age": {"minimum":70}
-                        }
+                        "age": {"minimum":70}
                     }
-                }'
-            ],
-            [
-                '{"foo": 2, "bar": "baz"}',
-                '{
+                }
+            }'
+        ];
+        yield [
+            '{"foo": 2, "bar": "baz"}',
+            '{
+                "properties": {
+                    "bar": {"type": "integer", "required": true}
+                },
+                "extends": {
                     "properties": {
-                        "bar": {"type": "integer", "required": true}
-                    },
-                    "extends": {
+                        "foo": {"type": "string", "required": true}
+                    }
+                }
+            }'
+        ];
+        yield [
+            '{"bar": 2}',
+            '{
+                "properties": {
+                    "bar": {"type": "integer", "required": true}
+                },
+                "extends" : [
+                    {
                         "properties": {
                             "foo": {"type": "string", "required": true}
                         }
-                    }
-                }'
-            ],
-            [
-                '{"bar": 2}',
-                '{
-                    "properties": {
-                        "bar": {"type": "integer", "required": true}
                     },
-                    "extends" : [
-                        {
-                            "properties": {
-                                "foo": {"type": "string", "required": true}
-                            }
-                        },
-                        {
-                            "properties": {
-                                "baz": {"type": "null", "required": true}
-                            }
+                    {
+                        "properties": {
+                            "baz": {"type": "null", "required": true}
                         }
-                    ]
-                }'
-            ]
+                    }
+                ]
+            }'
         ];
     }
 
-    public function getValidTests(): array
+    public function getValidTests(): \Generator
     {
-        return [
-            [
-                '{
-                  "name":"bruno",
-                  "age":80
-                }',
-                '{
+        yield [
+            '{
+              "name":"bruno",
+              "age":80
+            }',
+            '{
+                "properties": {
+                    "name": {"type": "string"},
+                    "age": {
+                        "type": "integer",
+                        "maximum": 120
+                    }
+                },
+                "extends": {
                     "properties": {
-                        "name": {"type": "string"},
-                        "age": {
-                            "type": "integer",
-                            "maximum": 120
-                        }
-                    },
-                    "extends": {
-                        "properties": {
-                            "age": {"minimum": 70}
-                        }
+                        "age": {"minimum": 70}
                     }
-                }'
-            ],
-            [
-                '{"foo": "baz", "bar": 2}',
-                '{
+                }
+            }'
+        ];
+        yield [
+            '{"foo": "baz", "bar": 2}',
+            '{
+                "properties": {
+                    "bar": {"type": "integer", "required": true}
+                },
+                "extends": {
                     "properties": {
-                        "bar": {"type": "integer", "required": true}
-                    },
-                    "extends": {
+                        "foo": {"type": "string", "required": true}
+                    }
+                }
+            }'
+        ];
+        yield [
+            '{"foo": "ick", "bar": 2, "baz": null}',
+            '{
+                "properties": {
+                    "bar": {"type": "integer", "required": true}
+                },
+                "extends" : [
+                    {
                         "properties": {
                             "foo": {"type": "string", "required": true}
                         }
-                    }
-                }'
-            ],
-            [
-                '{"foo": "ick", "bar": 2, "baz": null}',
-                '{
-                    "properties": {
-                        "bar": {"type": "integer", "required": true}
                     },
-                    "extends" : [
-                        {
-                            "properties": {
-                                "foo": {"type": "string", "required": true}
-                            }
-                        },
-                        {
-                            "properties": {
-                                "baz": {"type": "null", "required": true}
-                            }
+                    {
+                        "properties": {
+                            "baz": {"type": "null", "required": true}
                         }
-                    ]
-                }'
-            ]
+                    }
+                ]
+            }'
         ];
     }
 }
diff -pruN 6.4.1-1/tests/Constraints/FactoryTest.php 6.6.0-1/tests/Constraints/FactoryTest.php
--- 6.4.1-1/tests/Constraints/FactoryTest.php	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/tests/Constraints/FactoryTest.php	2025-10-10 11:34:09.000000000 +0000
@@ -1,12 +1,5 @@
 <?php
 
-/*
- * This file is part of the JsonSchema package.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
 declare(strict_types=1);
 
 namespace JsonSchema\Tests\Constraints;
diff -pruN 6.4.1-1/tests/Constraints/FormatTest.php 6.6.0-1/tests/Constraints/FormatTest.php
--- 6.4.1-1/tests/Constraints/FormatTest.php	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/tests/Constraints/FormatTest.php	2025-10-10 11:34:09.000000000 +0000
@@ -1,11 +1,6 @@
 <?php
 
-/*
- * This file is part of the JsonSchema package.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+declare(strict_types=1);
 
 namespace JsonSchema\Tests\Constraints;
 
@@ -15,6 +10,7 @@ use JsonSchema\Constraints\FormatConstra
 
 class FormatTest extends BaseTestCase
 {
+    /** @var bool */
     protected $validateSchema = true;
 
     public function setUp(): void
@@ -95,204 +91,197 @@ class FormatTest extends BaseTestCase
         $this->assertEmpty($validator->getErrors());
     }
 
-    public function getValidFormats(): array
+    public function getValidFormats(): \Generator
     {
-        return [
-            ['2001-01-23', 'date'],
-            ['2000-02-29', 'date'],
-            [42, 'date'],
-            [4.2, 'date'],
-
-            ['12:22:01', 'time'],
-            ['00:00:00', 'time'],
-            ['23:59:59', 'time'],
-            [42, 'time'],
-            [4.2, 'time'],
-
-            ['2000-05-01T12:12:12Z', 'date-time'],
-            ['2000-05-01T12:12:12+0100', 'date-time'],
-            ['2000-05-01T12:12:12+01:00', 'date-time'],
-            ['2000-05-01T12:12:12.123456Z', 'date-time'],
-            ['2000-05-01T12:12:12.123Z', 'date-time'],
-            ['2000-05-01T12:12:12.123000Z', 'date-time'],
-            ['2000-05-01T12:12:12.0Z', 'date-time'],
-            ['2000-05-01T12:12:12.000Z', 'date-time'],
-            ['2000-05-01T12:12:12.000000Z', 'date-time'],
-            [42, 'date-time'],
-            [4.2, 'date-time'],
-
-            ['0', 'utc-millisec'],
-
-            ['aqua', 'color'],
-            ['black', 'color'],
-            ['blue', 'color'],
-            ['fuchsia', 'color'],
-            ['gray', 'color'],
-            ['green', 'color'],
-            ['lime', 'color'],
-            ['maroon', 'color'],
-            ['navy', 'color'],
-            ['olive', 'color'],
-            ['orange', 'color'],
-            ['purple', 'color'],
-            ['red', 'color'],
-            ['silver', 'color'],
-            ['teal', 'color'],
-            ['white', 'color'],
-            ['yellow', 'color'],
-            ['#fff', 'color'],
-            ['#00cc00', 'color'],
-            [42, 'color'],
-            [4.2, 'color'],
-
-            ['background: blue', 'style'],
-            ['color: #000;', 'style'],
-
-            ['555 320 1212', 'phone'],
-
-            ['http://bluebox.org', 'uri'],
-            ['//bluebox.org', 'uri-reference'],
-            ['/absolutePathReference/', 'uri-reference'],
-            ['./relativePathReference/', 'uri-reference'],
-            ['./relative:PathReference/', 'uri-reference'],
-            ['relativePathReference/', 'uri-reference'],
-            ['relative/Path:Reference/', 'uri-reference'],
-            [42, 'uri-reference'],
-            [4.2, 'uri-reference'],
-
-            ['info@something.edu', 'email'],
-            [42, 'email'],
-            [4.2, 'email'],
-
-            ['10.10.10.10', 'ip-address'],
-            ['127.0.0.1', 'ip-address'],
-            [42, 'ip-address'],
-            [4.2, 'ip-address'],
-
-            ['127.0.0.1', 'ipv4'],
-            [42, 'ipv4'],
-            [4.2, 'ipv4'],
-
-            ['::ff', 'ipv6'],
-            [42, 'ipv6'],
-            [4.2, 'ipv6'],
-
-            ['www.example.com', 'host-name'],
-            ['3v4l.org', 'host-name'],
-            ['a-valid-host.com', 'host-name'],
-            ['localhost', 'host-name'],
-            [42, 'host-name'],
-            [4.2, 'host-name'],
-
-            ['www.example.com', 'hostname'],
-            ['3v4l.org', 'hostname'],
-            ['a-valid-host.com', 'hostname'],
-            ['localhost', 'hostname'],
-            [42, 'hostname'],
-            [4.2, 'hostname'],
+        yield ['2001-01-23', 'date'];
+        yield ['2000-02-29', 'date'];
+        yield [42, 'date'];
+        yield [4.2, 'date'];
+
+        yield ['12:22:01', 'time'];
+        yield ['00:00:00', 'time'];
+        yield ['23:59:59', 'time'];
+        yield [42, 'time'];
+        yield [4.2, 'time'];
+
+        yield ['2000-05-01T12:12:12Z', 'date-time'];
+        yield ['2000-05-01T12:12:12+0100', 'date-time'];
+        yield ['2000-05-01T12:12:12+01:00', 'date-time'];
+        yield ['2000-05-01T12:12:12.123456Z', 'date-time'];
+        yield ['2000-05-01T12:12:12.123Z', 'date-time'];
+        yield ['2000-05-01T12:12:12.123000Z', 'date-time'];
+        yield ['2000-05-01T12:12:12.0Z', 'date-time'];
+        yield ['2000-05-01T12:12:12.000Z', 'date-time'];
+        yield ['2000-05-01T12:12:12.000000Z', 'date-time'];
+        yield [42, 'date-time'];
+        yield [4.2, 'date-time'];
+
+        yield ['0', 'utc-millisec'];
+
+        yield ['aqua', 'color'];
+        yield ['black', 'color'];
+        yield ['blue', 'color'];
+        yield ['fuchsia', 'color'];
+        yield ['gray', 'color'];
+        yield ['green', 'color'];
+        yield ['lime', 'color'];
+        yield ['maroon', 'color'];
+        yield ['navy', 'color'];
+        yield ['olive', 'color'];
+        yield ['orange', 'color'];
+        yield ['purple', 'color'];
+        yield ['red', 'color'];
+        yield ['silver', 'color'];
+        yield ['teal', 'color'];
+        yield ['white', 'color'];
+        yield ['yellow', 'color'];
+        yield ['#fff', 'color'];
+        yield ['#00cc00', 'color'];
+        yield [42, 'color'];
+        yield [4.2, 'color'];
+
+        yield ['background: blue', 'style'];
+        yield ['color: #000;', 'style'];
+
+        yield ['555 320 1212', 'phone'];
+
+        yield ['http://bluebox.org', 'uri'];
+        yield ['//bluebox.org', 'uri-reference'];
+        yield ['/absolutePathReference/', 'uri-reference'];
+        yield ['./relativePathReference/', 'uri-reference'];
+        yield ['./relative:PathReference/', 'uri-reference'];
+        yield ['relativePathReference/', 'uri-reference'];
+        yield ['relative/Path:Reference/', 'uri-reference'];
+        yield [42, 'uri-reference'];
+        yield [4.2, 'uri-reference'];
+
+        yield ['info@something.edu', 'email'];
+        yield [42, 'email'];
+        yield [4.2, 'email'];
+
+        yield ['10.10.10.10', 'ip-address'];
+        yield ['127.0.0.1', 'ip-address'];
+        yield [42, 'ip-address'];
+        yield [4.2, 'ip-address'];
+
+        yield ['127.0.0.1', 'ipv4'];
+        yield [42, 'ipv4'];
+        yield [4.2, 'ipv4'];
+
+        yield ['::ff', 'ipv6'];
+        yield [42, 'ipv6'];
+        yield [4.2, 'ipv6'];
+
+        yield ['www.example.com', 'host-name'];
+        yield ['3v4l.org', 'host-name'];
+        yield ['a-valid-host.com', 'host-name'];
+        yield ['localhost', 'host-name'];
+        yield [42, 'host-name'];
+        yield [4.2, 'host-name'];
+
+        yield ['www.example.com', 'hostname'];
+        yield ['3v4l.org', 'hostname'];
+        yield ['a-valid-host.com', 'hostname'];
+        yield ['localhost', 'hostname'];
+        yield [42, 'hostname'];
+        yield [4.2, 'hostname'];
 
-            ['anything', '*'],
-            ['unknown', '*'],
-        ];
+        yield ['anything', '*'];
+        yield ['unknown', '*'];
     }
 
-    public function getInvalidFormats(): array
+    public function getInvalidFormats(): \Generator
     {
-        return [
-            ['January 1st, 1910', 'date'],
-            ['199-01-1', 'date'],
-            ['2012-0-11', 'date'],
-            ['2012-10-1', 'date'],
-
-            ['24:01:00', 'time'],
-            ['00:00:60', 'time'],
-            ['25:00:00', 'time'],
-
-            ['invalid_value_2000-05-01T12:12:12Z', 'date-time'],
-            ['2000-05-01T12:12:12Z_invalid_value', 'date-time'],
-            ['1999-1-11T00:00:00Z', 'date-time'],
-            ['1999-01-11T00:00:00+100', 'date-time'],
-            ['1999-01-11T00:00:00+1:00', 'date-time'],
-            ['1999.000Z-01-11T00:00:00+1:00', 'date-time'],
-
-            [PHP_INT_MAX, 'utc-millisec'],
-
-            ['grey', 'color'],
-            ['#HHH', 'color'],
-            ['#000a', 'color'],
-            ['#aa', 'color'],
-
-            ['background; blue', 'style'],
-
-            ['1 123 4424', 'phone'],
-
-            ['htt:/bluebox.org', 'uri'],
-            ['.relative:path/reference/', 'uri'],
-            ['', 'uri'],
-            ['//bluebox.org', 'uri'],
-            ['/absolutePathReference/', 'uri'],
-            ['./relativePathReference/', 'uri'],
-            ['./relative:PathReference/', 'uri'],
-            ['relativePathReference/', 'uri'],
-            ['relative/Path:Reference/', 'uri'],
+        yield ['January 1st, 1910', 'date'];
+        yield ['199-01-1', 'date'];
+        yield ['2012-0-11', 'date'];
+        yield ['2012-10-1', 'date'];
+
+        yield ['24:01:00', 'time'];
+        yield ['00:00:60', 'time'];
+        yield ['25:00:00', 'time'];
+
+        yield ['invalid_value_2000-05-01T12:12:12Z', 'date-time'];
+        yield ['2000-05-01T12:12:12Z_invalid_value', 'date-time'];
+        yield ['1999-1-11T00:00:00Z', 'date-time'];
+        yield ['1999-01-11T00:00:00+100', 'date-time'];
+        yield ['1999-01-11T00:00:00+1:00', 'date-time'];
+        yield ['1999.000Z-01-11T00:00:00+1:00', 'date-time'];
+
+        yield [PHP_INT_MAX, 'utc-millisec'];
+
+        yield ['grey', 'color'];
+        yield ['#HHH', 'color'];
+        yield ['#000a', 'color'];
+        yield ['#aa', 'color'];
+
+        yield ['background; blue', 'style'];
+
+        yield ['1 123 4424', 'phone'];
+
+        yield ['htt:/bluebox.org', 'uri'];
+        yield ['.relative:path/reference/', 'uri'];
+        yield ['', 'uri'];
+        yield ['//bluebox.org', 'uri'];
+        yield ['/absolutePathReference/', 'uri'];
+        yield ['./relativePathReference/', 'uri'];
+        yield ['./relative:PathReference/', 'uri'];
+        yield ['relativePathReference/', 'uri'];
+        yield ['relative/Path:Reference/', 'uri'];
 
-            ['info@somewhere', 'email'],
+        yield ['info@somewhere', 'email'];
 
-            ['256.2.2.2', 'ip-address'],
+        yield ['256.2.2.2', 'ip-address'];
 
-            [':::ff', 'ipv6'],
+        yield [':::ff', 'ipv6'];
 
-            ['@localhost', 'host-name'],
-            ['..nohost', 'host-name'],
-        ];
+        yield ['@localhost', 'host-name'];
+        yield ['..nohost', 'host-name'];
     }
 
-    public function getValidTests(): array
+    public function getValidTests(): \Generator
     {
-        return [
-            [
-                '{ "counter": "10" }',
-                '{
-                    "type": "object",
-                    "properties": {
-                        "counter": {
-                            "type": "string",
-                            "format": "regex",
-                            "pattern": "[0-9]+"
-                        }
+        yield [
+            '{ "counter": "10" }',
+            '{
+                "type": "object",
+                "properties": {
+                    "counter": {
+                        "type": "string",
+                        "format": "regex",
+                        "pattern": "[0-9]+"
                     }
-                }'],
+                }
+            }'
         ];
     }
 
-    public function getInvalidTests(): array
+    public function getInvalidTests(): \Generator
     {
-        return [
-            [
-                '{ "counter": "blue" }',
-                '{
-                    "type": "object",
-                    "properties": {
-                        "counter": {
-                            "type": "string",
-                            "format": "regex",
-                            "pattern": "[0-9]+"
-                        }
+        yield [
+            '{ "counter": "blue" }',
+            '{
+                "type": "object",
+                "properties": {
+                    "counter": {
+                        "type": "string",
+                        "format": "regex",
+                        "pattern": "[0-9]+"
                     }
-                }'
-            ],
-            [
-                '{ "color": "blueberry" }',
-                '{
-                    "type": "object",
-                    "properties": {
-                        "color": {
-                            "type": "string",
-                            "format": "color"
-                        }
+                }
+            }'
+        ];
+        yield [
+            '{ "color": "blueberry" }',
+            '{
+                "type": "object",
+                "properties": {
+                    "color": {
+                        "type": "string",
+                        "format": "color"
                     }
-                }'
-            ]
+                }
+            }'
         ];
     }
 }
diff -pruN 6.4.1-1/tests/Constraints/LongArraysTest.php 6.6.0-1/tests/Constraints/LongArraysTest.php
--- 6.4.1-1/tests/Constraints/LongArraysTest.php	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/tests/Constraints/LongArraysTest.php	2025-10-10 11:34:09.000000000 +0000
@@ -1,11 +1,6 @@
 <?php
 
-/*
- * This file is part of the JsonSchema package.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+declare(strict_types=1);
 
 namespace JsonSchema\Tests\Constraints;
 
@@ -60,7 +55,7 @@ class LongArraysTest extends VeryBaseTes
 
         $tmp = new \stdClass();
         $tmp->p_array = array_map(function ($i) {
-            return rand(1, 1000) / 1000.0;
+            return random_int(1, 1000) / 1000.0;
         }, range(1, 100000));
         $input = json_encode($tmp);
 
diff -pruN 6.4.1-1/tests/Constraints/MinItemsMaxItemsTest.php 6.6.0-1/tests/Constraints/MinItemsMaxItemsTest.php
--- 6.4.1-1/tests/Constraints/MinItemsMaxItemsTest.php	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/tests/Constraints/MinItemsMaxItemsTest.php	2025-10-10 11:34:09.000000000 +0000
@@ -1,11 +1,6 @@
 <?php
 
-/*
- * This file is part of the JsonSchema package.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+declare(strict_types=1);
 
 namespace JsonSchema\Tests\Constraints;
 
@@ -13,89 +8,86 @@ use JsonSchema\Constraints\Constraint;
 
 class MinItemsMaxItemsTest extends BaseTestCase
 {
+    /** @var bool */
     protected $validateSchema = true;
 
-    public function getInvalidTests(): array
+    public function getInvalidTests(): \Generator
     {
-        return [
-            'Input violating minItems constraint' => [
-                'input' => '{
-                  "value":[2]
-                }',
-                'schema' => '{
-                  "type":"object",
-                  "properties":{
-                    "value":{"type":"array","minItems":2,"maxItems":4}
-                  }
-                }',
-                'checkMode' => Constraint::CHECK_MODE_NORMAL,
-                [[
-                    'property' => 'value',
-                    'pointer' => '/value',
-                    'message' => 'There must be a minimum of 2 items in the array, 1 found',
-                    'constraint' => [
-                        'name' => 'minItems',
-                        'params' => [
-                            'minItems' => 2,
-                            'found' => 1
-                        ]
-                    ],
-                    'context' => 1
-                ]]
-            ],
-            'Input violating maxItems constraint' => [
-                'input' => '{
-                  "value":[2,2,5,8,5]
-                }',
-                'schema' => '{
-                  "type":"object",
-                  "properties":{
-                    "value":{"type":"array","minItems":2,"maxItems":4}
-                  }
-                }',
-                'checkMode' => Constraint::CHECK_MODE_NORMAL,
-                [[
-                    'property' => 'value',
-                    'pointer' => '/value',
-                    'message' => 'There must be a maximum of 4 items in the array, 5 found',
-                    'constraint' => [
-                        'name' => 'maxItems',
-                        'params' => [
-                            'maxItems' => 4,
-                            'found' => 5
-                        ]
-                    ],
-                    'context' => 1
-                ]]
-            ]
+        yield 'Input violating minItems constraint' => [
+            'input' => '{
+              "value":[2]
+            }',
+            'schema' => '{
+              "type":"object",
+              "properties":{
+                "value":{"type":"array","minItems":2,"maxItems":4}
+              }
+            }',
+            'checkMode' => Constraint::CHECK_MODE_NORMAL,
+            [[
+                'property' => 'value',
+                'pointer' => '/value',
+                'message' => 'There must be a minimum of 2 items in the array, 1 found',
+                'constraint' => [
+                    'name' => 'minItems',
+                    'params' => [
+                        'minItems' => 2,
+                        'found' => 1
+                    ]
+                ],
+                'context' => 1
+            ]]
+        ];
+        yield 'Input violating maxItems constraint' => [
+            'input' => '{
+              "value":[2,2,5,8,5]
+            }',
+            'schema' => '{
+              "type":"object",
+              "properties":{
+                "value":{"type":"array","minItems":2,"maxItems":4}
+              }
+            }',
+            'checkMode' => Constraint::CHECK_MODE_NORMAL,
+            [[
+                'property' => 'value',
+                'pointer' => '/value',
+                'message' => 'There must be a maximum of 4 items in the array, 5 found',
+                'constraint' => [
+                    'name' => 'maxItems',
+                    'params' => [
+                        'maxItems' => 4,
+                        'found' => 5
+                    ]
+                ],
+                'context' => 1
+            ]]
         ];
     }
 
-    public function getValidTests(): array
+    public function getValidTests(): \Generator
     {
-        return [
-            [
-                '{
-                  "value":[2,2]
-                }',
-                '{
-                  "type":"object",
-                  "properties":{
-                    "value":{"type":"array","minItems":2,"maxItems":4}
-                  }
-                }'
-            ],
-            [
-                '{
-                  "value":[2,2,5,8]
-                }',
-                '{
-                  "type":"object",
-                  "properties":{
-                    "value":{"type":"array","minItems":2,"maxItems":4}
-                  }
-                }'
-            ]
+        yield [
+            '{
+              "value":[2,2]
+            }',
+            '{
+              "type":"object",
+              "properties":{
+                "value":{"type":"array","minItems":2,"maxItems":4}
+              }
+            }'
+        ];
+        yield [
+            '{
+              "value":[2,2,5,8]
+            }',
+            '{
+              "type":"object",
+              "properties":{
+                "value":{"type":"array","minItems":2,"maxItems":4}
+              }
+            }'
         ];
     }
 }
diff -pruN 6.4.1-1/tests/Constraints/MinLengthMaxLengthMultiByteTest.php 6.6.0-1/tests/Constraints/MinLengthMaxLengthMultiByteTest.php
--- 6.4.1-1/tests/Constraints/MinLengthMaxLengthMultiByteTest.php	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/tests/Constraints/MinLengthMaxLengthMultiByteTest.php	2025-10-10 11:34:09.000000000 +0000
@@ -1,16 +1,12 @@
 <?php
 
-/*
- * This file is part of the JsonSchema package.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+declare(strict_types=1);
 
 namespace JsonSchema\Tests\Constraints;
 
 class MinLengthMaxLengthMultiByteTest extends BaseTestCase
 {
+    /** @var bool */
     protected $validateSchema = true;
 
     protected function setUp(): void
@@ -20,59 +16,55 @@ class MinLengthMaxLengthMultiByteTest ex
         }
     }
 
-    public function getInvalidTests(): array
+    public function getInvalidTests(): \Generator
     {
-        return [
-            [
-                '{
-                  "value":"☀"
-                }',
-                '{
-                  "type":"object",
-                  "properties":{
-                    "value":{"type":"string","minLength":2,"maxLength":4}
-                  }
-                }'
-            ],
-            [
-                '{
-                  "value":"☀☁☂☃☺"
-                }',
-                '{
-                  "type":"object",
-                  "properties":{
-                    "value":{"type":"string","minLength":2,"maxLength":4}
-                  }
-                }'
-            ]
+        yield [
+            '{
+              "value":"☀"
+            }',
+            '{
+              "type":"object",
+              "properties":{
+                "value":{"type":"string","minLength":2,"maxLength":4}
+              }
+            }'
+        ];
+        yield [
+            '{
+              "value":"☀☁☂☃☺"
+            }',
+            '{
+              "type":"object",
+              "properties":{
+                "value":{"type":"string","minLength":2,"maxLength":4}
+              }
+            }'
         ];
     }
 
-    public function getValidTests(): array
+    public function getValidTests(): \Generator
     {
-        return [
-            [
-                '{
-                  "value":"☀☁"
-                }',
-                '{
-                  "type":"object",
-                  "properties":{
-                    "value":{"type":"string","minLength":2,"maxLength":4}
-                  }
-                }'
-            ],
-            [
-                '{
-                  "value":"☀☁☂☃"
-                }',
-                '{
-                  "type":"object",
-                  "properties":{
-                    "value":{"type":"string","minLength":2,"maxLength":4}
-                  }
-                }'
-            ]
+        yield [
+            '{
+              "value":"☀☁"
+            }',
+            '{
+              "type":"object",
+              "properties":{
+                "value":{"type":"string","minLength":2,"maxLength":4}
+              }
+            }'
+        ];
+        yield [
+            '{
+              "value":"☀☁☂☃"
+            }',
+            '{
+              "type":"object",
+              "properties":{
+                "value":{"type":"string","minLength":2,"maxLength":4}
+              }
+            }'
         ];
     }
 }
diff -pruN 6.4.1-1/tests/Constraints/MinLengthMaxLengthTest.php 6.6.0-1/tests/Constraints/MinLengthMaxLengthTest.php
--- 6.4.1-1/tests/Constraints/MinLengthMaxLengthTest.php	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/tests/Constraints/MinLengthMaxLengthTest.php	2025-10-10 11:34:09.000000000 +0000
@@ -1,71 +1,63 @@
 <?php
 
-/*
- * This file is part of the JsonSchema package.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+declare(strict_types=1);
 
 namespace JsonSchema\Tests\Constraints;
 
 class MinLengthMaxLengthTest extends BaseTestCase
 {
+    /** @var bool */
     protected $validateSchema = true;
 
-    public function getInvalidTests(): array
+    public function getInvalidTests(): \Generator
     {
-        return [
-            [
-                '{
-                  "value":"w"
-                }',
-                '{
-                  "type":"object",
-                  "properties":{
-                    "value":{"type":"string","minLength":2,"maxLength":4}
-                  }
-                }'
-            ],
-            [
-                '{
-                  "value":"wo7us"
-                }',
-                '{
-                  "type":"object",
-                  "properties":{
-                    "value":{"type":"string","minLength":2,"maxLength":4}
-                  }
-                }'
-            ]
+        yield [
+            '{
+              "value":"w"
+            }',
+            '{
+              "type":"object",
+              "properties":{
+                "value":{"type":"string","minLength":2,"maxLength":4}
+              }
+            }'
+        ];
+        yield [
+            '{
+              "value":"wo7us"
+            }',
+            '{
+              "type":"object",
+              "properties":{
+                "value":{"type":"string","minLength":2,"maxLength":4}
+              }
+            }'
         ];
     }
 
-    public function getValidTests(): array
+    public function getValidTests(): \Generator
     {
-        return [
-            [
-                '{
-                  "value":"wo"
-                }',
-                '{
-                  "type":"object",
-                  "properties":{
-                    "value":{"type":"string","minLength":2,"maxLength":4}
-                  }
-                }'
-            ],
-            [
-                '{
-                  "value":"wo7u"
-                }',
-                '{
-                  "type":"object",
-                  "properties":{
-                    "value":{"type":"string","minLength":2,"maxLength":4}
-                  }
-                }'
-            ],
+        yield [
+            '{
+              "value":"wo"
+            }',
+            '{
+              "type":"object",
+              "properties":{
+                "value":{"type":"string","minLength":2,"maxLength":4}
+              }
+            }'
+        ];
+        yield [
+            '{
+              "value":"wo7u"
+            }',
+            '{
+              "type":"object",
+              "properties":{
+                "value":{"type":"string","minLength":2,"maxLength":4}
+              }
+            }'
         ];
     }
 }
diff -pruN 6.4.1-1/tests/Constraints/MinMaxPropertiesTest.php 6.6.0-1/tests/Constraints/MinMaxPropertiesTest.php
--- 6.4.1-1/tests/Constraints/MinMaxPropertiesTest.php	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/tests/Constraints/MinMaxPropertiesTest.php	2025-10-10 11:34:09.000000000 +0000
@@ -1,11 +1,6 @@
 <?php
 
-/*
- * This file is part of the JsonSchema package.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+declare(strict_types=1);
 
 namespace JsonSchema\Tests\Constraints;
 
@@ -13,139 +8,130 @@ use JsonSchema\Constraints\Constraint;
 
 class MinMaxPropertiesTest extends BaseTestCase
 {
+    /** @var bool */
     protected $validateSchema = true;
 
-    /**
-     * {@inheritdoc}
-     */
-    public function getValidTests(): array
+    public function getValidTests(): \Generator
     {
-        return [
-            'Empty object with minProperties: 0' => [
-                'input' => '{
-                  "value": {}
-                }',
-                'schema' => '{
-                  "type": "object",
-                  "properties": {
-                    "value": {"type": "object", "minProperties": 0}
-                  }
-                }'
-            ],
-            'Empty object with maxProperties: 1' => [
-                'input' => '{
-                  "value": {}
-                }',
-                'schema' => '{
-                  "type": "object",
-                  "properties": {
-                    "value": {"type": "object", "maxProperties": 1}
-                  }
-                }'
-            ],
-            'Empty object with minProperties: 0 and maxProperties: 1' => [
-                'input' => '{
-                  "value": {}
-                }',
-                'schema' => '{
-                  "type": "object",
-                  "properties": {
-                    "value": {"type": "object", "minProperties": 0,"maxProperties": 1}
-                  }
-                }'
-            ],
-            'Object with two properties with minProperties: 1 and maxProperties: 2' => [
-                'input' => '{
-                  "value": {"foo": 1, "bar": 2}
-                }',
-                'schema' => '{
-                  "type": "object",
-                  "properties": {
-                    "value": {"type": "object", "minProperties": 1,"maxProperties": 2}
-                  }
-                }'
-            ],
-            'Empty array with minProperties: 1 and maxProperties: 2' => [
-                'input' => '{
-                  "value": []
-                }',
-                'schema' => '{
-                  "properties": {
-                    "value": {"minProperties": 1,"maxProperties": 2}
-                  }
-                }',
-                'checkMode' => Constraint::CHECK_MODE_NORMAL,
-            ],
-            'Array with two items with maxProperties: 1' => [
-                'input' => '{
-                  "value": [1, 2]
-                }',
-                'schema' => '{
-                  "properties": {
-                    "value": {"maxProperties": 1}
-                  }
-                }'
-            ],
+        yield 'Empty object with minProperties: 0' => [
+            'input' => '{
+              "value": {}
+            }',
+            'schema' => '{
+              "type": "object",
+              "properties": {
+                "value": {"type": "object", "minProperties": 0}
+              }
+            }'
+        ];
+        yield 'Empty object with maxProperties: 1' => [
+            'input' => '{
+              "value": {}
+            }',
+            'schema' => '{
+              "type": "object",
+              "properties": {
+                "value": {"type": "object", "maxProperties": 1}
+              }
+            }'
+        ];
+        yield 'Empty object with minProperties: 0 and maxProperties: 1' => [
+            'input' => '{
+              "value": {}
+            }',
+            'schema' => '{
+              "type": "object",
+              "properties": {
+                "value": {"type": "object", "minProperties": 0,"maxProperties": 1}
+              }
+            }'
+        ];
+        yield 'Object with two properties with minProperties: 1 and maxProperties: 2' => [
+            'input' => '{
+              "value": {"foo": 1, "bar": 2}
+            }',
+            'schema' => '{
+              "type": "object",
+              "properties": {
+                "value": {"type": "object", "minProperties": 1,"maxProperties": 2}
+              }
+            }'
+        ];
+        yield 'Empty array with minProperties: 1 and maxProperties: 2' => [
+            'input' => '{
+              "value": []
+            }',
+            'schema' => '{
+              "properties": {
+                "value": {"minProperties": 1,"maxProperties": 2}
+              }
+            }',
+            'checkMode' => Constraint::CHECK_MODE_NORMAL,
+        ];
+        yield 'Array with two items with maxProperties: 1' => [
+            'input' => '{
+              "value": [1, 2]
+            }',
+            'schema' => '{
+              "properties": {
+                "value": {"maxProperties": 1}
+              }
+            }'
         ];
     }
 
-    /**
-     * {@inheritdoc}
-     */
-    public function getInvalidTests(): array
+    public function getInvalidTests(): \Generator
     {
-        return [
-            'Empty object with minProperties: 1' => [
-                'input' => '{
-                  "value": {}
-                }',
-                'schema' => '{
-                  "type": "object",
-                  "properties": {
-                    "value": {"type": "object", "minProperties": 1}
-                  }
-                }'
-            ],
-            'Empty object with minProperties' => [
-                'input' => '{}',
-                'schema' => '{
-                  "type": "object",
-                  "properties": {
-                    "propertyOne": {
-                      "type": "string"
-                    },
-                    "propertyTwo": {
-                      "type": "string"
-                    }
-                  },
-                  "minProperties": 1
-                }'
-            ],
-            'Object with two properties with maxProperties: 1' => [
-                'input' => '{
-                  "value": {
-                    "propertyOne": "valueOne",
-                    "propertyTwo": "valueTwo"
-                  }
-                }',
-                'schema' => '{
-                  "type": "object",
-                  "properties": {
-                    "value": {"type": "object", "maxProperties": 1}
-                  }
-                }'
-            ],
-            'Object with two properties with minProperties: 1 and maxProperties: 2' => [
-                'input' => '{
-                  "value": {"foo": 1, "bar": 2, "baz": 3}
-                }',
-                'schema' => '{
-                  "type": "object",
-                  "properties": {
-                    "value": {"type": "object", "minProperties": 1,"maxProperties": 2}
-                  }
-                }'
-            ],
+        yield 'Empty object with minProperties: 1' => [
+            'input' => '{
+              "value": {}
+            }',
+            'schema' => '{
+              "type": "object",
+              "properties": {
+                "value": {"type": "object", "minProperties": 1}
+              }
+            }'
+        ];
+        yield 'Empty object with minProperties' => [
+            'input' => '{}',
+            'schema' => '{
+              "type": "object",
+              "properties": {
+                "propertyOne": {
+                  "type": "string"
+                },
+                "propertyTwo": {
+                  "type": "string"
+                }
+              },
+              "minProperties": 1
+            }'
+        ];
+        yield 'Object with two properties with maxProperties: 1' => [
+            'input' => '{
+              "value": {
+                "propertyOne": "valueOne",
+                "propertyTwo": "valueTwo"
+              }
+            }',
+            'schema' => '{
+              "type": "object",
+              "properties": {
+                "value": {"type": "object", "maxProperties": 1}
+              }
+            }'
+        ];
+        yield 'Object with two properties with minProperties: 1 and maxProperties: 2' => [
+            'input' => '{
+              "value": {"foo": 1, "bar": 2, "baz": 3}
+            }',
+            'schema' => '{
+              "type": "object",
+              "properties": {
+                "value": {"type": "object", "minProperties": 1,"maxProperties": 2}
+              }
+            }'
         ];
     }
 }
diff -pruN 6.4.1-1/tests/Constraints/MinimumMaximumTest.php 6.6.0-1/tests/Constraints/MinimumMaximumTest.php
--- 6.4.1-1/tests/Constraints/MinimumMaximumTest.php	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/tests/Constraints/MinimumMaximumTest.php	2025-10-10 11:34:09.000000000 +0000
@@ -1,176 +1,168 @@
 <?php
 
-/*
- * This file is part of the JsonSchema package.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+declare(strict_types=1);
 
 namespace JsonSchema\Tests\Constraints;
 
 class MinimumMaximumTest extends BaseTestCase
 {
+    /** @var bool */
     protected $validateSchema = true;
 
-    public function getInvalidTests(): array
+    public function getInvalidTests(): \Generator
     {
-        return [
-            [
-                '{
-                  "value":2
-                }',
-                '{
-                  "type":"object",
-                  "properties":{
-                    "value":{"type":"integer","minimum":4}
-                  }
-                }'
-            ],
-            [
-                '{"value": 3}',
-                '{
-                    "type": "object",
-                    "properties": {
-                        "value": {"type": "integer", "minimum": 3, "exclusiveMinimum": true}
-                    }
-                }'
-            ],
-            [
-                '{
-                  "value":16
-                }',
-                '{
-                  "type":"object",
-                  "properties":{
-                    "value":{"type":"integer","maximum":8}
-                  }
-                }'
-            ],
-            [
-                '{"value": 8}',
-                '{
-                    "type": "object",
-                    "properties": {
-                        "value": {"type": "integer", "maximum": 8, "exclusiveMaximum": true}
-                    }
-                }'
-            ],
-            [
-                '{"value": 4}',
-                '{
-                    "type": "object",
-                    "properties": {
-                        "value": {"type": "integer", "exclusiveMinimum": true}
-                    }
-                }'
-            ],
-            [
-                '{"value": 4}',
-                '{
-                    "type": "object",
-                    "properties": {
-                        "value": {"type": "integer", "exclusiveMaximum": true}
-                    }
-                }'
-            ],
-            [
-                '{"value": 4}',
-                '{
-                    "type": "object",
-                    "properties": {
-                        "value": {"type": "integer", "minimum": 5, "exclusiveMinimum": false}
-                    }
-                }'
-            ],
-            [
-                '{"value": 4}',
-                '{
-                    "properties": {
-                        "value": {"type": "integer", "maximum": 3, "exclusiveMaximum": false}
-                    }
-                }'
-            ],
-            [
-                '{"value": 0.00}',
-                '{
-                    "properties": {
-                        "value": {"type": "number", "minimum": 0, "exclusiveMinimum": true}
-                    }
-                }'
-            ],
-            [
-                '{"value": 0.00}',
-                '{
-                    "properties": {
-                        "value": {"type": "number", "maximum": 0, "exclusiveMaximum": true}
-                    }
-                }'
-            ]
+        yield [
+            '{
+              "value":2
+            }',
+            '{
+              "type":"object",
+              "properties":{
+                "value":{"type":"integer","minimum":4}
+              }
+            }'
+        ];
+        yield [
+            '{"value": 3}',
+            '{
+                "type": "object",
+                "properties": {
+                    "value": {"type": "integer", "minimum": 3, "exclusiveMinimum": true}
+                }
+            }'
+        ];
+        yield [
+            '{
+              "value":16
+            }',
+            '{
+              "type":"object",
+              "properties":{
+                "value":{"type":"integer","maximum":8}
+              }
+            }'
+        ];
+        yield [
+            '{"value": 8}',
+            '{
+                "type": "object",
+                "properties": {
+                    "value": {"type": "integer", "maximum": 8, "exclusiveMaximum": true}
+                }
+            }'
+        ];
+        yield [
+            '{"value": 4}',
+            '{
+                "type": "object",
+                "properties": {
+                    "value": {"type": "integer", "exclusiveMinimum": true}
+                }
+            }'
+        ];
+        yield [
+            '{"value": 4}',
+            '{
+                "type": "object",
+                "properties": {
+                    "value": {"type": "integer", "exclusiveMaximum": true}
+                }
+            }'
+        ];
+        yield [
+            '{"value": 4}',
+            '{
+                "type": "object",
+                "properties": {
+                    "value": {"type": "integer", "minimum": 5, "exclusiveMinimum": false}
+                }
+            }'
+        ];
+        yield [
+            '{"value": 4}',
+            '{
+                "properties": {
+                    "value": {"type": "integer", "maximum": 3, "exclusiveMaximum": false}
+                }
+            }'
+        ];
+        yield [
+            '{"value": 0.00}',
+            '{
+                "properties": {
+                    "value": {"type": "number", "minimum": 0, "exclusiveMinimum": true}
+                }
+            }'
+        ];
+        yield [
+            '{"value": 0.00}',
+            '{
+                "properties": {
+                    "value": {"type": "number", "maximum": 0, "exclusiveMaximum": true}
+                }
+            }'
         ];
     }
 
-    public function getValidTests(): array
+    public function getValidTests(): \Generator
     {
-        return [
-            [
-                '{
-                  "value":6
-                }',
-                '{
-                  "type":"object",
-                  "properties":{
-                    "value":{"type":"integer","minimum":4}
-                  }
-                }'
-            ],
-            [
-                '{
-                  "value":6
-                }',
-                '{
-                  "type":"object",
-                  "properties":{
-                    "value":{"type":"integer","maximum":8}
-                  }
-                }'
-            ],
-            [
-                '{"value": 6}',
-                '{
-                    "type": "object",
-                    "properties": {
-                        "value": {"type": "integer", "minimum": 6, "exclusiveMinimum": false}
-                    }
-                }'
-            ],
-            [
-                '{"value": 6}',
-                '{
-                    "type": "object",
-                    "properties": {
-                        "value": {"type": "integer", "maximum": 6, "exclusiveMaximum": false}
-                    }
-                }'
-            ],
-            [
-                '{"value": 6}',
-                '{
-                    "type": "object",
-                    "properties": {
-                        "value": {"type": "integer", "minimum": 6}
-                    }
-                }'
-            ],
-            [
-                '{"value": 6}',
-                '{
-                    "type": "object",
-                    "properties": {
-                        "value": {"type": "integer", "maximum": 6}
-                    }
-                }'
-            ]
+        yield [
+            '{
+              "value":6
+            }',
+            '{
+              "type":"object",
+              "properties":{
+                "value":{"type":"integer","minimum":4}
+              }
+            }'
+        ];
+        yield [
+            '{
+              "value":6
+            }',
+            '{
+              "type":"object",
+              "properties":{
+                "value":{"type":"integer","maximum":8}
+              }
+            }'
+        ];
+        yield [
+            '{"value": 6}',
+            '{
+                "type": "object",
+                "properties": {
+                    "value": {"type": "integer", "minimum": 6, "exclusiveMinimum": false}
+                }
+            }'
+        ];
+        yield [
+            '{"value": 6}',
+            '{
+                "type": "object",
+                "properties": {
+                    "value": {"type": "integer", "maximum": 6, "exclusiveMaximum": false}
+                }
+            }'
+        ];
+        yield [
+            '{"value": 6}',
+            '{
+                "type": "object",
+                "properties": {
+                    "value": {"type": "integer", "minimum": 6}
+                }
+            }'
+        ];
+        yield [
+            '{"value": 6}',
+            '{
+                "type": "object",
+                "properties": {
+                    "value": {"type": "integer", "maximum": 6}
+                }
+            }'
         ];
     }
 }
diff -pruN 6.4.1-1/tests/Constraints/NotTest.php 6.6.0-1/tests/Constraints/NotTest.php
--- 6.4.1-1/tests/Constraints/NotTest.php	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/tests/Constraints/NotTest.php	2025-10-10 11:34:09.000000000 +0000
@@ -1,102 +1,94 @@
 <?php
 
-/*
- * This file is part of the JsonSchema package.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+declare(strict_types=1);
 
 namespace JsonSchema\Tests\Constraints;
 
 class NotTest extends BaseTestCase
 {
+    /** @var bool */
     protected $validateSchema = true;
 
-    public function getInvalidTests(): array
+    public function getInvalidTests(): \Generator
     {
-        return [
-            [
-                '{
-                    "x": [1, 2]
-                }',
-                '{
-                    "properties": {
-                        "x": {
-                            "not": {
-                                "type": "array",
-                                "items": {"type": "integer"},
-                                "minItems": 2
-                            }
+        yield [
+            '{
+                "x": [1, 2]
+            }',
+            '{
+                "properties": {
+                    "x": {
+                        "not": {
+                            "type": "array",
+                            "items": {"type": "integer"},
+                            "minItems": 2
                         }
                     }
-                }'
-            ],
-            [ // check that a missing, required property is correctly validated
-                '{"y": "foo"}',
-                '{
-                    "type": "object",
-                    "required": ["x"],
-                    "properties": {
-                        "x": {
-                            "not": {
-                                "type": "null"
-                            }
+                }
+            }'
+        ];
+        yield 'check that a missing, required property is correctly validated' => [
+            '{"y": "foo"}',
+            '{
+                "type": "object",
+                "required": ["x"],
+                "properties": {
+                    "x": {
+                        "not": {
+                            "type": "null"
                         }
                     }
-                }'
-            ]
+                }
+            }'
         ];
     }
 
-    public function getValidTests(): array
+    public function getValidTests(): \Generator
     {
-        return [
-            [
-                '{
-                    "x": [1]
-                }',
-                '{
-                    "properties": {
-                        "x": {
-                            "not": {
-                                "type": "array",
-                                "items": {"type": "integer"},
-                                "minItems": 2
-                            }
+        yield [
+            '{
+                "x": [1]
+            }',
+            '{
+                "properties": {
+                    "x": {
+                        "not": {
+                            "type": "array",
+                            "items": {"type": "integer"},
+                            "minItems": 2
                         }
                     }
-                }'
-            ],
-            [
-                '{
-                    "x": ["foo", 2]
-                }',
-                '{
-                    "properties": {
-                        "x": {
-                            "not": {
-                                "type": "array",
-                                "items": {"type": "integer"},
-                                "minItems": 2
-                            }
+                }
+            }'
+        ];
+        yield [
+            '{
+                "x": ["foo", 2]
+            }',
+            '{
+                "properties": {
+                    "x": {
+                        "not": {
+                            "type": "array",
+                            "items": {"type": "integer"},
+                            "minItems": 2
                         }
                     }
-                }'
-            ],
-            [ // check that a missing, non-required property isn't validated
-                '{"y": "foo"}',
-                '{
-                    "type": "object",
-                    "properties": {
-                        "x": {
-                            "not": {
-                                "type": "null"
-                            }
+                }
+            }'
+        ];
+        yield "check that a missing, non-required property isn't validated" => [
+            '{"y": "foo"}',
+            '{
+                "type": "object",
+                "properties": {
+                    "x": {
+                        "not": {
+                            "type": "null"
                         }
                     }
-                }'
-            ]
+                }
+            }'
         ];
     }
 }
diff -pruN 6.4.1-1/tests/Constraints/NumberAndIntegerTypesTest.php 6.6.0-1/tests/Constraints/NumberAndIntegerTypesTest.php
--- 6.4.1-1/tests/Constraints/NumberAndIntegerTypesTest.php	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/tests/Constraints/NumberAndIntegerTypesTest.php	2025-10-10 11:34:09.000000000 +0000
@@ -1,118 +1,104 @@
 <?php
 
-/*
- * This file is part of the JsonSchema package.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+declare(strict_types=1);
 
 namespace JsonSchema\Tests\Constraints;
 
 class NumberAndIntegerTypesTest extends BaseTestCase
 {
+    /** @var bool */
     protected $validateSchema = true;
 
-    public function getInvalidTests(): array
+    public function getInvalidTests(): \Generator
     {
-        return [
-            [
-                '{
-                  "integer": 1.4
-                }',
-                '{
-                  "type":"object",
-                  "properties":{
-                    "integer":{"type":"integer"}
-                  }
-                }'
-            ],
-            [
-                '{"integer": 1.001}',
-                '{
-                    "type": "object",
-                    "properties": {
-                        "integer": {"type": "integer"}
-                    }
-                }'
-            ],
-            [
-                '{"integer": true}',
-                '{
-                    "type": "object",
-                    "properties": {
-                        "integer": {"type": "integer"}
-                    }
-                }'
-            ],
-            [
-                '{"number": "x"}',
-                '{
-                    "type": "object",
-                    "properties": {
-                        "number": {"type": "number"}
-                    }
-                }'
-            ]
+        yield [
+            'input' => '{ "integer": 1.4 }',
+            'schema' => '{
+              "type":"object",
+              "properties":{
+                "integer":{"type":"integer"}
+              }
+            }'
+        ];
+        yield [
+            'input' => '{"integer": 1.001}',
+            'schema' => '{
+                "type": "object",
+                "properties": {
+                    "integer": {"type": "integer"}
+                }
+            }'
+        ];
+        yield [
+            'input' => '{"integer": true}',
+            'schema' => '{
+                "type": "object",
+                "properties": {
+                    "integer": {"type": "integer"}
+                }
+            }'
+        ];
+        yield [
+            'input' => '{"number": "x"}',
+            'schema' => '{
+                "type": "object",
+                "properties": {
+                    "number": {"type": "number"}
+                }
+            }'
         ];
     }
 
-    public function getValidTests(): array
+    public function getValidTests(): \Generator
     {
-        return [
-            [
-                '{
-                  "integer": 1
-                }',
-                '{
-                  "type":"object",
-                  "properties":{
-                    "integer":{"type":"integer"}
-                  }
-                }'
-            ],
-            [
-                '{
-                  "number": 1.4
-                }',
-                '{
-                  "type":"object",
-                  "properties":{
-                    "number":{"type":"number"}
-                  }
-                }'
-            ],
-            [
-                '{"number": 1e5}',
-                '{
-                    "type": "object",
-                    "properties": {
-                        "number": {"type": "number"}
-                    }
-                }'
-            ],
-            [
-                '{"number": 1}',
-                '{
-                    "type": "object",
-                    "properties": {
-                        "number": {"type": "number"}
+        yield [
+            'input' => '{ "integer": 1 }',
+            'schema' => '{
+              "type":"object",
+              "properties":{
+                "integer":{"type":"integer"}
+              }
+            }'
+        ];
+        yield [
+            'input' => '{ "number": 1.4 }',
+            'schema' => '{
+              "type":"object",
+              "properties":{
+                "number":{"type":"number"}
+              }
+            }'
+        ];
+        yield [
+            'input' => '{"number": 1e5}',
+            'schema' => '{
+                "type": "object",
+                "properties": {
+                    "number": {"type": "number"}
+                }
+            }'
+        ];
+        yield [
+            'input' => '{"number": 1}',
+            'schema' => '{
+                "type": "object",
+                "properties": {
+                    "number": {"type": "number"}
 
+                }
+            }'
+        ];
+        yield [
+            'input' => '{"number": -49.89}',
+            'schema' => '{
+                "type": "object",
+                "properties": {
+                    "number": {
+                      "type": "number",
+                      "multipleOf": 0.01
                     }
-                }'
-            ],
-            [
-                '{"number": -49.89}',
-                '{
-                    "type": "object",
-                    "properties": {
-                        "number": {
-                          "type": "number",
-                          "multipleOf": 0.01
-                        }
-                    }
-                }'
-            ]
+                }
+            }'
         ];
     }
 }
diff -pruN 6.4.1-1/tests/Constraints/OfPropertiesTest.php 6.6.0-1/tests/Constraints/OfPropertiesTest.php
--- 6.4.1-1/tests/Constraints/OfPropertiesTest.php	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/tests/Constraints/OfPropertiesTest.php	2025-10-10 11:34:09.000000000 +0000
@@ -1,240 +1,231 @@
 <?php
-/*
- * This file is part of the JsonSchema package.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+
+declare(strict_types=1);
 
 namespace JsonSchema\Tests\Constraints;
 
 use JsonSchema\Constraints\Constraint;
 use JsonSchema\Validator;
 
-/**
- * Class OfPropertiesTest
- */
 class OfPropertiesTest extends BaseTestCase
 {
+    /** @var bool */
     protected $validateSchema = true;
 
-    public function getValidTests(): array
+    public function getValidTests(): \Generator
     {
-        return [
-            [
-                '{"prop1": "abc"}',
-                '{
-                  "type": "object",
-                  "properties": {
-                    "prop1": {"type": "string"},
-                    "prop2": {
-                      "oneOf": [
-                        {"type": "number"},
-                        {"type": "string"}
-                      ]
-                    }
-                  },
-                  "required": ["prop1"]
-                }'
-            ],
-            [
-                '{"prop1": "abc", "prop2": 23}',
-                '{
-                  "type": "object",
-                  "properties": {
-                    "prop1": {"type": "string"},
-                    "prop2": {
-                      "oneOf": [
-                        {"type": "number"},
-                        {"type": "string"}
-                      ]
-                    }
-                  },
-                  "required": ["prop1"]
-                }'
-            ],
+        yield [
+            '{"prop1": "abc"}',
+            '{
+              "type": "object",
+              "properties": {
+                "prop1": {"type": "string"},
+                "prop2": {
+                  "oneOf": [
+                    {"type": "number"},
+                    {"type": "string"}
+                  ]
+                }
+              },
+              "required": ["prop1"]
+            }'
+        ];
+        yield [
+            '{"prop1": "abc", "prop2": 23}',
+            '{
+              "type": "object",
+              "properties": {
+                "prop1": {"type": "string"},
+                "prop2": {
+                  "oneOf": [
+                    {"type": "number"},
+                    {"type": "string"}
+                  ]
+                }
+              },
+              "required": ["prop1"]
+            }'
         ];
     }
 
-    public function getInvalidTests(): array
+    public function getInvalidTests(): \Generator
     {
-        return [
+        yield [
+            '{"prop1": "abc", "prop2": []}',
+            '{
+              "type": "object",
+              "properties": {
+                "prop1": {"type": "string"},
+                "prop2": {
+                  "oneOf": [
+                    {"type": "number"},
+                    {"type": "string"}
+                  ]
+                }
+              },
+              "required": ["prop1"]
+            }',
+            null,
             [
-                '{"prop1": "abc", "prop2": []}',
-                '{
-                  "type": "object",
-                  "properties": {
-                    "prop1": {"type": "string"},
-                    "prop2": {
-                      "oneOf": [
-                        {"type": "number"},
-                        {"type": "string"}
-                      ]
-                    }
-                  },
-                  "required": ["prop1"]
-                }',
-                null,
                 [
-                    [
-                        'property'   => 'prop2',
-                        'pointer'    => '/prop2',
-                        'message'    => 'Array value found, but a string is required',
-                        'constraint' => [
-                            'name' => 'type',
-                            'params' => [
-                                'expected'   => 'a string',
-                                'found'      => 'array'
-                            ]
-                        ],
-                        'context'    => Validator::ERROR_DOCUMENT_VALIDATION
+                    'property'   => 'prop2',
+                    'pointer'    => '/prop2',
+                    'message'    => 'Array value found, but a string is required',
+                    'constraint' => [
+                        'name' => 'type',
+                        'params' => [
+                            'expected'   => 'a string',
+                            'found'      => 'array'
+                        ]
                     ],
-                    [
-                        'property'   => 'prop2',
-                        'pointer'    => '/prop2',
-                        'message'    => 'Array value found, but a number is required',
-                        'constraint' => [
-                            'name' => 'type',
-                            'params' => [
-                                'expected'   => 'a number',
-                                'found'      => 'array'
-                            ]
-                        ],
-                        'context'    => Validator::ERROR_DOCUMENT_VALIDATION
+                    'context'    => Validator::ERROR_DOCUMENT_VALIDATION
+                ],
+                [
+                    'property'   => 'prop2',
+                    'pointer'    => '/prop2',
+                    'message'    => 'Array value found, but a number is required',
+                    'constraint' => [
+                        'name' => 'type',
+                        'params' => [
+                            'expected'   => 'a number',
+                            'found'      => 'array'
+                        ]
                     ],
-                    [
-                        'property'   => 'prop2',
-                        'pointer'    => '/prop2',
-                        'message'    => 'Failed to match exactly one schema',
-                        'constraint' => [
-                            'name' => 'oneOf',
-                            'params' => []
-                        ],
-                        'context'    => Validator::ERROR_DOCUMENT_VALIDATION
+                    'context'    => Validator::ERROR_DOCUMENT_VALIDATION
+                ],
+                [
+                    'property'   => 'prop2',
+                    'pointer'    => '/prop2',
+                    'message'    => 'Failed to match exactly one schema',
+                    'constraint' => [
+                        'name' => 'oneOf',
+                        'params' => []
                     ],
+                    'context'    => Validator::ERROR_DOCUMENT_VALIDATION
                 ],
             ],
-            [
-                '{"prop1": [1,2]}',
-                '{
-                  "type": "object",
-                  "properties": {
-                    "prop1": {
-                      "oneOf": [
-                        {
-                          "type": "string",
-                          "pattern": "^[a-z]*$"
-                        },
-                        {
-                          "type": "string",
-                          "pattern": "^[A-Z]*$"
-                        }
-                      ]
+        ];
+        yield [
+            '{"prop1": [1,2]}',
+            '{
+              "type": "object",
+              "properties": {
+                "prop1": {
+                  "oneOf": [
+                    {
+                      "type": "string",
+                      "pattern": "^[a-z]*$"
+                    },
+                    {
+                      "type": "string",
+                      "pattern": "^[A-Z]*$"
                     }
-                  }
-                }'
-            ],
-            [
-                '{"prop1": [1,2]}',
-                '{
-                  "type": "object",
-                  "properties": {
-                    "prop1": {
-                      "anyOf": [
-                        {
-                          "type": "string",
-                          "pattern": "^[A-Z]*$"
-                        }
-                      ]
+                  ]
+                }
+              }
+            }'
+        ];
+        yield [
+            '{"prop1": [1,2]}',
+            '{
+              "type": "object",
+              "properties": {
+                "prop1": {
+                  "anyOf": [
+                    {
+                      "type": "string",
+                      "pattern": "^[A-Z]*$"
                     }
-                  }
-                }'
-            ],
-            [
-                '{"prop1": [1,2]}',
-                '{
-                  "type": "object",
-                  "properties": {
-                    "prop1": {
-                      "anyOf": [
-                        {
-                          "type": "number"
-                        },
-                        {
-                          "type": "string",
-                          "pattern": "^[A-Z]*$"
-                        }
-                      ]
+                  ]
+                }
+              }
+            }'
+        ];
+        yield [
+            '{"prop1": [1,2]}',
+            '{
+              "type": "object",
+              "properties": {
+                "prop1": {
+                  "anyOf": [
+                    {
+                      "type": "number"
+                    },
+                    {
+                      "type": "string",
+                      "pattern": "^[A-Z]*$"
                     }
-                  }
-                }'
-            ],
-            [
-                '{"prop1": [1,2]}',
-                '{
-                  "type": "object",
-                  "properties": {
-                    "prop1": {
-                      "anyOf": [
-                        {
-                          "type": "string"
-                        },
-                        {
-                          "type": "string",
-                          "pattern": "^[A-Z]*$"
-                        }
-                      ]
+                  ]
+                }
+              }
+            }'
+        ];
+        yield [
+            '{"prop1": [1,2]}',
+            '{
+              "type": "object",
+              "properties": {
+                "prop1": {
+                  "anyOf": [
+                    {
+                      "type": "string"
+                    },
+                    {
+                      "type": "string",
+                      "pattern": "^[A-Z]*$"
                     }
-                  }
-                }'
-            ],
-            [
-                '{"prop1": [1,2]}',
-                '{
-                  "type": "object",
-                  "properties": {
-                    "prop1": {
-                      "anyOf": [
-                        {
-                          "type": "string",
-                          "pattern": "^[a-z]*$"
-                        },
-                        {
-                          "type": "string",
-                          "pattern": "^[A-Z]*$"
-                        }
-                      ]
+                  ]
+                }
+              }
+            }'
+        ];
+        yield [
+            '{"prop1": [1,2]}',
+            '{
+              "type": "object",
+              "properties": {
+                "prop1": {
+                  "anyOf": [
+                    {
+                      "type": "string",
+                      "pattern": "^[a-z]*$"
+                    },
+                    {
+                      "type": "string",
+                      "pattern": "^[A-Z]*$"
                     }
-                  }
-                }'
-            ],
-            [
-                '{"prop1": [1,2]}',
-                '{
-                  "type": "object",
-                  "properties": {
-                    "prop1": {
-                      "anyOf": [
-                        {
-                          "type": "number"
-                        },
-                        {
-                          "type": "string"
-                        },
-                        {
-                          "type": "string"
-                        }
-                      ]
+                  ]
+                }
+              }
+            }'
+        ];
+        yield [
+            '{"prop1": [1,2]}',
+            '{
+              "type": "object",
+              "properties": {
+                "prop1": {
+                  "anyOf": [
+                    {
+                      "type": "number"
+                    },
+                    {
+                      "type": "string"
+                    },
+                    {
+                      "type": "string"
                     }
-                  }
-                }'
-            ]
+                  ]
+                }
+              }
+            }'
         ];
     }
 
     public function testNoPrematureAnyOfException(): void
     {
-        $schema = json_decode('{
+        $schema = json_decode(
+            '{
             "type": "object",
             "properties": {
                 "propertyOne": {
@@ -244,8 +235,10 @@ class OfPropertiesTest extends BaseTestC
                     ]
                 }
             }
-        }');
-        $data = json_decode('{"propertyOne":"ABC"}');
+        }',
+            false
+        );
+        $data = json_decode('{"propertyOne":"ABC"}', false);
 
         $v = new Validator();
         $v->validate($data, $schema, Constraint::CHECK_MODE_EXCEPTIONS);
@@ -254,7 +247,8 @@ class OfPropertiesTest extends BaseTestC
 
     public function testNoPrematureOneOfException(): void
     {
-        $schema = json_decode('{
+        $schema = json_decode(
+            '{
             "type": "object",
             "properties": {
                 "propertyOne": {
@@ -264,8 +258,10 @@ class OfPropertiesTest extends BaseTestC
                     ]
                 }
             }
-        }');
-        $data = json_decode('{"propertyOne":"ABC"}');
+        }',
+            false
+        );
+        $data = json_decode('{"propertyOne":"ABC"}', false);
 
         $v = new Validator();
         $v->validate($data, $schema, Constraint::CHECK_MODE_EXCEPTIONS);
diff -pruN 6.4.1-1/tests/Constraints/PatternPropertiesTest.php 6.6.0-1/tests/Constraints/PatternPropertiesTest.php
--- 6.4.1-1/tests/Constraints/PatternPropertiesTest.php	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/tests/Constraints/PatternPropertiesTest.php	2025-10-10 11:34:09.000000000 +0000
@@ -1,214 +1,200 @@
 <?php
 
-/*
- * This file is part of the JsonSchema package.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+declare(strict_types=1);
 
 namespace JsonSchema\Tests\Constraints;
 
 class PatternPropertiesTest extends BaseTestCase
 {
+    /** @var bool */
     protected $validateSchema = true;
 
-    public function getInvalidTests(): array
+    public function getInvalidTests(): \Generator
     {
-        return [
-            // matches pattern but invalid schema for object
-            [
-                json_encode([
-                    'someobject' => [
-                        'foobar' => 'foo',
-                        'barfoo' => 'bar',
+        yield 'matches pattern but invalid schema for object' => [
+            json_encode([
+                'someobject' => [
+                    'foobar' => 'foo',
+                    'barfoo' => 'bar',
+                ]
+            ]),
+            json_encode([
+                'type' => 'object',
+                'patternProperties' => [
+                    '^someobject$' => [
+                        'type' => 'object',
+                        'additionalProperties' => false,
+                        'properties' => [
+                            'barfoo' => [
+                                'type' => 'string',
+                            ],
+                        ]
                     ]
-                ]),
-                json_encode([
-                    'type' => 'object',
-                    'patternProperties' => [
-                        '^someobject$' => [
-                            'type' => 'object',
-                            'additionalProperties' => false,
-                            'properties' => [
-                                'barfoo' => [
-                                    'type' => 'string',
-                                ],
-                            ]
-                        ]
-                    ]
-                ])
-            ],
-            // Does not match pattern
-            [
-                json_encode([
-                        'regex_us' => false,
-                ]),
-                json_encode([
-                        'type' => 'object',
-                        'patternProperties' => [
-                            '^[a-z]+_(jp|de)$' => [
-                                'type' => ['boolean']
-                            ]
-                        ],
-                        'additionalProperties' => false
-                ])
-            ],
-            // Does not match pattern with unicode
-            [
-                json_encode([
-                        '猡猡獛' => false,
-                ]),
-                json_encode([
-                        'type' => 'object',
-                        'patternProperties' => [
-                            '^[\\x{0080}-\\x{006FFF}]+$' => [
-                                'type' => ['boolean']
-                            ]
-                        ],
-                        'additionalProperties' => false
-                ])
-            ],
-            // An invalid regular expression pattern
-            [
-                json_encode([
-                        'regex_us' => false,
-                ]),
-                json_encode([
-                        'type' => 'object',
-                        'patternProperties' => [
-                            '^[a-z+_jp|de)$' => [
-                                'type' => ['boolean']
-                            ]
-                        ],
-                        'additionalProperties' => false
-                ])
-            ],
+                ]
+            ])
+        ];
+        yield 'Does not match pattern' => [
+            json_encode([
+                    'regex_us' => false,
+            ]),
+            json_encode([
+                'type' => 'object',
+                'patternProperties' => [
+                    '^[a-z]+_(jp|de)$' => [
+                        'type' => ['boolean']
+                    ]
+                ],
+                'additionalProperties' => false
+            ])
+        ];
+        yield 'Does not match pattern with unicode' => [
+            json_encode([
+                '猡猡獛' => false,
+            ]),
+            json_encode([
+                'type' => 'object',
+                'patternProperties' => [
+                    '^[\\x{0080}-\\x{006FFF}]+$' => [
+                        'type' => ['boolean']
+                    ]
+                ],
+                'additionalProperties' => false
+            ])
+        ];
+        yield 'An invalid regular expression pattern' => [
+            json_encode([
+                    'regex_us' => false,
+            ]),
+            json_encode([
+                'type' => 'object',
+                'patternProperties' => [
+                    '^[a-z+_jp|de)$' => [
+                        'type' => ['boolean']
+                    ]
+                ],
+                'additionalProperties' => false
+            ])
         ];
     }
 
-    public function getValidTests(): array
+    public function getValidTests(): \Generator
     {
-        return [
-            [
-                // validates pattern schema
-                json_encode([
-                    'someobject' => [
-                        'foobar' => 'foo',
-                        'barfoo' => 'bar',
+        yield 'validates pattern schema' => [
+            json_encode([
+                'someobject' => [
+                    'foobar' => 'foo',
+                    'barfoo' => 'bar',
+                ],
+                'someotherobject' => [
+                    'foobar' => 1234,
+                ],
+                '/products' => [
+                    'get' => []
+                ],
+                '#products' => [
+                    'get' => []
+                ],
+                '+products' => [
+                    'get' => []
+                ],
+                '~products' => [
+                    'get' => []
+                ],
+                '*products' => [
+                    'get' => []
+                ],
+                '%products' => [
+                    'get' => []
+                ]
+            ]),
+            json_encode([
+                'type' => 'object',
+                'additionalProperties' => false,
+                'patternProperties' => [
+                    '^someobject$' => [
+                        'type' => 'object',
+                        'properties' => [
+                            'foobar' => ['type' => 'string'],
+                            'barfoo' => ['type' => 'string'],
+                        ],
                     ],
-                    'someotherobject' => [
-                        'foobar' => 1234,
+                    '^someotherobject$' => [
+                        'type' => 'object',
+                        'properties' => [
+                            'foobar' => ['type' => 'number'],
+                        ],
                     ],
-                    '/products' => [
-                        'get' => []
+                    '^/' => [
+                        'type' => 'object',
+                        'properties' => [
+                            'get' => ['type' => 'array']
+                        ]
                     ],
-                    '#products' => [
-                        'get' => []
+                    '^#' => [
+                        'type' => 'object',
+                        'properties' => [
+                            'get' => ['type' => 'array']
+                        ]
                     ],
-                    '+products' => [
-                        'get' => []
+                    '^\+' => [
+                        'type' => 'object',
+                        'properties' => [
+                            'get' => ['type' => 'array']
+                        ]
                     ],
-                    '~products' => [
-                        'get' => []
+                    '^~' => [
+                        'type' => 'object',
+                        'properties' => [
+                            'get' => ['type' => 'array']
+                        ]
                     ],
-                    '*products' => [
-                        'get' => []
+                    '^\*' => [
+                        'type' => 'object',
+                        'properties' => [
+                            'get' => ['type' => 'array']
+                        ]
                     ],
-                    '%products' => [
-                        'get' => []
-                    ]
-                ]),
-                json_encode([
-                    'type' => 'object',
-                    'additionalProperties' => false,
-                    'patternProperties' => [
-                        '^someobject$' => [
-                            'type' => 'object',
-                            'properties' => [
-                                'foobar' => ['type' => 'string'],
-                                'barfoo' => ['type' => 'string'],
-                            ],
-                        ],
-                        '^someotherobject$' => [
-                            'type' => 'object',
-                            'properties' => [
-                                'foobar' => ['type' => 'number'],
-                            ],
-                        ],
-                        '^/' => [
-                            'type' => 'object',
-                            'properties' => [
-                                'get' => ['type' => 'array']
-                            ]
-                        ],
-                        '^#' => [
-                            'type' => 'object',
-                            'properties' => [
-                                'get' => ['type' => 'array']
-                            ]
-                        ],
-                        '^\+' => [
-                            'type' => 'object',
-                            'properties' => [
-                                'get' => ['type' => 'array']
-                            ]
-                        ],
-                        '^~' => [
-                            'type' => 'object',
-                            'properties' => [
-                                'get' => ['type' => 'array']
-                            ]
-                        ],
-                        '^\*' => [
-                            'type' => 'object',
-                            'properties' => [
-                                'get' => ['type' => 'array']
-                            ]
-                        ],
-                        '^%' => [
-                            'type' => 'object',
-                            'properties' => [
-                                'get' => ['type' => 'array']
-                            ]
-                        ]
-                    ]
-                ])
-            ],
-            [
-                json_encode([
-                        'foobar' => true,
-                        'regex_us' => 'foo',
-                        'regex_de' => 1234
-                ]),
-                json_encode([
+                    '^%' => [
                         'type' => 'object',
                         'properties' => [
-                            'foobar' => ['type' => 'boolean']
-                        ],
-                        'patternProperties' => [
-                            '^[a-z]+_(us|de)$' => [
-                                'type' => ['string', 'integer']
-                            ]
-                        ],
-                        'additionalProperties' => false
-                ])
-            ],
-            // Does match pattern with unicode
-            [
-                json_encode([
-                    'ðæſ' => 'unicode',
-                ]),
-                json_encode([
+                            'get' => ['type' => 'array']
+                        ]
+                    ]
+                ]
+            ])
+        ];
+        yield [
+            json_encode([
+                    'foobar' => true,
+                    'regex_us' => 'foo',
+                    'regex_de' => 1234
+            ]),
+            json_encode([
                     'type' => 'object',
+                    'properties' => [
+                        'foobar' => ['type' => 'boolean']
+                    ],
                     'patternProperties' => [
-                        '^[\\x{0080}-\\x{10FFFF}]+$' => [
-                            'type' => ['string']
+                        '^[a-z]+_(us|de)$' => [
+                            'type' => ['string', 'integer']
                         ]
                     ],
                     'additionalProperties' => false
-                ])
-            ],
+            ])
+        ];
+        yield 'Does match pattern with unicode' => [
+            json_encode([
+                'ðæſ' => 'unicode',
+            ]),
+            json_encode([
+                'type' => 'object',
+                'patternProperties' => [
+                    '^[\\x{0080}-\\x{10FFFF}]+$' => [
+                        'type' => ['string']
+                    ]
+                ],
+                'additionalProperties' => false
+            ])
         ];
     }
 }
diff -pruN 6.4.1-1/tests/Constraints/PatternTest.php 6.6.0-1/tests/Constraints/PatternTest.php
--- 6.4.1-1/tests/Constraints/PatternTest.php	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/tests/Constraints/PatternTest.php	2025-10-10 11:34:09.000000000 +0000
@@ -1,103 +1,95 @@
 <?php
 
-/*
- * This file is part of the JsonSchema package.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+declare(strict_types=1);
 
 namespace JsonSchema\Tests\Constraints;
 
 class PatternTest extends BaseTestCase
 {
+    /** @var bool */
     protected $validateSchema = true;
 
-    public function getInvalidTests(): array
+    public function getInvalidTests(): \Generator
     {
-        return [
-            [
-                '{
-                  "value":"Abacates"
-                }',
-                '{
-                  "type":"object",
-                  "properties":{
-                    "value":{"type":"string","pattern":"^cat"}
-                  },
-                  "additionalProperties":false
-                }'
-            ],
-            [
-                '{"value": "abc"}',
-                '{
-                    "type": "object",
-                    "properties": {
-                        "value": {"type": "string", "pattern": "^a*$"}
-                    },
-                    "additionalProperties": false
-                }'
-            ],
-            [
-                '{"value": "Ã¼"}',
-                '{
-                    "type": "object",
-                    "properties": {
-                        "value": {"type": "string", "pattern": "^ü$"}
-                    },
-                    "additionalProperties": false
-                }'
-            ],
+        yield [
+            '{
+              "value":"Abacates"
+            }',
+            '{
+              "type":"object",
+              "properties":{
+                "value":{"type":"string","pattern":"^cat"}
+              },
+              "additionalProperties":false
+            }'
+        ];
+        yield [
+            '{"value": "abc"}',
+            '{
+                "type": "object",
+                "properties": {
+                    "value": {"type": "string", "pattern": "^a*$"}
+                },
+                "additionalProperties": false
+            }'
+        ];
+        yield [
+            '{"value": "Ã¼"}',
+            '{
+                "type": "object",
+                "properties": {
+                    "value": {"type": "string", "pattern": "^ü$"}
+                },
+                "additionalProperties": false
+            }'
         ];
     }
 
-    public function getValidTests(): array
+    public function getValidTests(): \Generator
     {
-        return [
-            [
-                '{
-                  "value":"Abacates"
-                }',
-                '{
-                  "type":"object",
-                  "properties":{
-                    "value":{"type":"string","pattern":"tes$"}
-                  },
-                  "additionalProperties":false
-                }'
-            ],
-            [
-                '{
-                  "value":"Abacates"
-                }',
-                '{
-                  "type":"object",
-                  "properties":{
-                    "value":{"type":"string","pattern":"cat"}
-                  },
-                  "additionalProperties":false
-                }'
-            ],
-            [
-                '{"value": "aaa"}',
-                '{
-                    "type": "object",
-                    "properties": {
-                        "value": {"type": "string", "pattern": "^a*$"}
-                    },
-                    "additionalProperties": false
-                }'
-            ],
-            [
-                '{"value": "↓æ→"}',
-                '{
-                    "type": "object",
-                    "properties": {
-                        "value": {"type": "string", "pattern": "^↓æ.$"}
-                    },
-                    "additionalProperties": false
-                }'
-            ]
+        yield [
+            '{
+              "value":"Abacates"
+            }',
+            '{
+              "type":"object",
+              "properties":{
+                "value":{"type":"string","pattern":"tes$"}
+              },
+              "additionalProperties":false
+            }'
+        ];
+        yield [
+            '{
+              "value":"Abacates"
+            }',
+            '{
+              "type":"object",
+              "properties":{
+                "value":{"type":"string","pattern":"cat"}
+              },
+              "additionalProperties":false
+            }'
+        ];
+        yield [
+            '{"value": "aaa"}',
+            '{
+                "type": "object",
+                "properties": {
+                    "value": {"type": "string", "pattern": "^a*$"}
+                },
+                "additionalProperties": false
+            }'
+        ];
+        yield [
+            '{"value": "↓æ→"}',
+            '{
+                "type": "object",
+                "properties": {
+                    "value": {"type": "string", "pattern": "^↓æ.$"}
+                },
+                "additionalProperties": false
+            }'
         ];
     }
 }
diff -pruN 6.4.1-1/tests/Constraints/PointerTest.php 6.6.0-1/tests/Constraints/PointerTest.php
--- 6.4.1-1/tests/Constraints/PointerTest.php	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/tests/Constraints/PointerTest.php	2025-10-10 11:34:09.000000000 +0000
@@ -1,11 +1,6 @@
 <?php
 
-/*
- * This file is part of the JsonSchema package.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+declare(strict_types=1);
 
 namespace JsonSchema\Tests\Constraints;
 
diff -pruN 6.4.1-1/tests/Constraints/ReadOnlyTest.php 6.6.0-1/tests/Constraints/ReadOnlyTest.php
--- 6.4.1-1/tests/Constraints/ReadOnlyTest.php	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/tests/Constraints/ReadOnlyTest.php	2025-10-10 11:34:09.000000000 +0000
@@ -1,48 +1,39 @@
 <?php
 
-/*
- * This file is part of the JsonSchema package.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+declare(strict_types=1);
 
 namespace JsonSchema\Tests\Constraints;
 
 class ReadOnlyTest extends BaseTestCase
 {
+    /** @var bool */
     protected $validateSchema = true;
 
-    public function getInvalidTests(): array
+    public function getInvalidTests(): \Generator
     {
-        //is readonly really required?
-        return [
-            [
-                '{ "number": [] }',
-                '{
-                  "type":"object",
-                  "properties":{
-                    "number":{"type":"string","readonly":true}
-                  }
-                }'
-            ]
+        yield 'is readonly really required?' => [
+            '{ "number": [] }',
+            '{
+              "type":"object",
+              "properties":{
+                "number":{"type":"string","readonly":true}
+              }
+            }'
         ];
     }
 
-    public function getValidTests(): array
+    public function getValidTests(): \Generator
     {
-        return [
-            [
-                '{
-                  "number": "1.4"
-                }',
-                '{
-                  "type":"object",
-                  "properties":{
-                    "number":{"type":"string","readonly":true}
-                  }
-                }'
-            ]
+        yield [
+            '{
+              "number": "1.4"
+            }',
+            '{
+              "type":"object",
+              "properties":{
+                "number":{"type":"string","readonly":true}
+              }
+            }'
         ];
     }
 }
diff -pruN 6.4.1-1/tests/Constraints/RequireTest.php 6.6.0-1/tests/Constraints/RequireTest.php
--- 6.4.1-1/tests/Constraints/RequireTest.php	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/tests/Constraints/RequireTest.php	2025-10-10 11:34:09.000000000 +0000
@@ -1,52 +1,44 @@
 <?php
 
-/*
- * This file is part of the JsonSchema package.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+declare(strict_types=1);
 
 namespace JsonSchema\Tests\Constraints;
 
 class RequireTest extends BaseTestCase
 {
+    /** @var bool */
     protected $validateSchema = true;
 
-    public function getInvalidTests(): array
+    public function getInvalidTests(): \Generator
     {
-        return [
-            [
-                '{
-                  "state":"DF"
-                }',
-                '{
-                  "type":"object",
-                  "properties":{
-                    "state":{"type":"string","requires":"city"},
-                    "city":{"type":"string"}
-                  }
-                }'
-            ]
+        yield [
+            '{
+              "state":"DF"
+            }',
+            '{
+              "type":"object",
+              "properties":{
+                "state":{"type":"string","requires":"city"},
+                "city":{"type":"string"}
+              }
+            }'
         ];
     }
 
-    public function getValidTests(): array
+    public function getValidTests(): \Generator
     {
-        return [
-            [
-                '{
-                  "state":"DF",
-                  "city":"Brasília"
-                }',
-                '{
-                  "type":"object",
-                  "properties":{
-                    "state":{"type":"string","requires":"city"},
-                    "city":{"type":"string"}
-                  }
-                }'
-            ]
+        yield [
+            '{
+              "state":"DF",
+              "city":"Brasília"
+            }',
+            '{
+              "type":"object",
+              "properties":{
+                "state":{"type":"string","requires":"city"},
+                "city":{"type":"string"}
+              }
+            }'
         ];
     }
 }
diff -pruN 6.4.1-1/tests/Constraints/RequiredPropertyTest.php 6.6.0-1/tests/Constraints/RequiredPropertyTest.php
--- 6.4.1-1/tests/Constraints/RequiredPropertyTest.php	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/tests/Constraints/RequiredPropertyTest.php	2025-10-10 11:34:09.000000000 +0000
@@ -1,42 +1,38 @@
 <?php
 
-/*
- * This file is part of the JsonSchema package.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+declare(strict_types=1);
 
 namespace JsonSchema\Tests\Constraints;
 
 use JsonSchema\Constraints\Constraint;
 use JsonSchema\Constraints\UndefinedConstraint;
+use JsonSchema\DraftIdentifiers;
 
 class RequiredPropertyTest extends BaseTestCase
 {
-    // Most tests are draft-03 compliant, but some tests are draft-04, or mix draft-03 and
-    // draft-04 syntax within the same schema. Unfortunately, draft-03 and draft-04 required
-    // definitions are incompatible, so disabling schema validation for these tests.
-    protected $schemaSpec = 'http://json-schema.org/draft-03/schema#';
-    protected $validateSchema = false;
+    /**
+     * Most tests are draft-03 compliant, but some tests are draft-04, or mix draft-03 and
+     * draft-04 syntax within the same schema. Unfortunately, draft-03 and draft-04 required
+     * definitions are incompatible, so disabling schema validation for these tests.
+     *
+     * @var string
+     * */
+    protected $schemaSpec = DraftIdentifiers::DRAFT_3;
 
     public function testErrorPropertyIsPopulatedForRequiredIfMissingInInput(): void
     {
         $validator = new UndefinedConstraint();
-        $document = json_decode(
-            '{
-            "bar": 42
-        }'
-        );
+        $document = json_decode('{ "bar": 42 }', false);
         $schema = json_decode(
             '{
-            "type": "object",
-            "properties": {
-                "foo": {"type": "number"},
-                "bar": {"type": "number"}
-            },
-            "required": ["foo"]
-        }'
+                "type": "object",
+                "properties": {
+                    "foo": {"type": "number"},
+                    "bar": {"type": "number"}
+                },
+                "required": ["foo"]
+            }',
+            false
         );
 
         $validator->check($document, $schema);
@@ -47,11 +43,7 @@ class RequiredPropertyTest extends BaseT
     public function testPathErrorPropertyIsPopulatedForRequiredIfMissingInInput(): void
     {
         $validator = new UndefinedConstraint();
-        $document = json_decode(
-            '{
-                "foo": [{"baz": 1.5}]
-            }'
-        );
+        $document = json_decode('{ "foo": [{"baz": 1.5}] }', false);
         $schema = json_decode(
             '{
                 "type": "object",
@@ -69,7 +61,8 @@ class RequiredPropertyTest extends BaseT
                     }
                 },
                 "required": ["foo"]
-            }'
+            }',
+            false
         );
 
         $validator->check($document, $schema);
@@ -80,21 +73,17 @@ class RequiredPropertyTest extends BaseT
     public function testErrorPropertyIsPopulatedForRequiredIfEmptyValueInInput(): void
     {
         $validator = new UndefinedConstraint();
-        $document = json_decode(
-            '{
-            "bar": 42,
-            "foo": null
-        }'
-        );
+        $document = json_decode('{ "bar": 42, "foo": null }', false);
         $schema = json_decode(
             '{
-            "type": "object",
-            "properties": {
-                "foo": {"type": "number"},
-                "bar": {"type": "number"}
-            },
-            "required": ["foo"]
-        }'
+                "type": "object",
+                "properties": {
+                    "foo": {"type": "number"},
+                    "bar": {"type": "number"}
+                },
+                "required": ["foo"]
+            }',
+            false
         );
 
         $validator->check($document, $schema);
@@ -113,329 +102,325 @@ class RequiredPropertyTest extends BaseT
         $this->assertEquals($propertyValue, $error[0]['property']);
     }
 
-    public function getInvalidTests(): array
+    public function getInvalidTests(): \Generator
     {
-        return [
-            [
-                '{}',
-                '{
-                  "type":"object",
-                  "properties":{
-                    "number":{"type":"number","required":true}
-                  }
-                }'
-            ],
-            [
-                '{}',
-                '{
-                    "type": "object",
-                    "properties": {
-                        "number": {"type": "number"}
-                    },
-                    "required": ["number"]
-                }'
-            ],
-            [
-                '{
-                    "foo": {}
-                }',
-                '{
-                    "type": "object",
-                    "properties": {
-                        "foo": {
-                            "type": "object",
-                            "properties": {
-                                "bar": {"type": "number"}
-                            },
-                            "required": ["bar"]
-                        }
-                    }
-                }'
-            ],
-            [
-                '{
-                    "bar": 1.4
-                 }',
-                '{
-                    "type": "object",
-                    "properties": {
-                        "foo": {"type": "string", "required": true},
-                        "bar": {"type": "number"}
-                    },
-                    "required": ["bar"]
-                }'
-            ],
-            [
-                '{}',
-                '{
-                    "required": ["foo"]
-                }'
-            ],
-            [
-                '{
-                }',
-                '{
-                    "type": "object",
-                    "properties": {
-                        "foo": { "required": true }
+        yield [
+            '{}',
+            '{
+              "type":"object",
+              "properties":{
+                "number":{"type":"number","required":true}
+              }
+            }'
+        ];
+        yield [
+            '{}',
+            '{
+                "type": "object",
+                "properties": {
+                    "number": {"type": "number"}
+                },
+                "required": ["number"]
+            }'
+        ];
+        yield [
+            '{
+                "foo": {}
+            }',
+            '{
+                "type": "object",
+                "properties": {
+                    "foo": {
+                        "type": "object",
+                        "properties": {
+                            "bar": {"type": "number"}
+                        },
+                        "required": ["bar"]
                     }
-                }'
-            ],
-            [
-                '{
-                  "string":{}
-                }',
-                '{
-                  "type":"object",
-                  "properties": {
-                    "string":{"type":"string", "required": true}
-                  }
-                }'
-            ],
-            [
-                '{
-                  "number":{}
-                }',
-                '{
-                  "type":"object",
-                  "properties": {
-                    "number":{"type":"number", "required": true}
-                  }
-                }'
-            ],
-            [
-                '{
-                  "integer":{}
-                }',
-                '{
-                  "type":"object",
-                  "properties": {
-                    "integer":{"type":"integer", "required": true}
-                  }
-                }'
-            ],
-            [
-                '{
-                  "boolean":{}
-                }',
-                '{
-                  "type":"object",
-                  "properties": {
-                    "boolean":{"type":"boolean", "required": true}
-                  }
-                }'
-            ],
-            [
-                '{
-                  "array":{}
-                }',
-                '{
-                  "type":"object",
-                  "properties": {
-                    "array":{"type":"array", "required": true}
-                  }
-                }',
-                Constraint::CHECK_MODE_NORMAL
-            ],
-            [
-                '{
-                  "null":{}
-                }',
-                '{
-                  "type":"object",
-                  "properties": {
-                    "null":{"type":"null", "required": true}
-                  }
-                }'
-            ],
-            [
-                '{
-                  "foo": {"baz": 1.5}
-                }',
-                '{
+                }
+            }'
+        ];
+        yield [
+            '{
+                "bar": 1.4
+             }',
+            '{
+                "type": "object",
+                "properties": {
+                    "foo": {"type": "string", "required": true},
+                    "bar": {"type": "number"}
+                },
+                "required": ["bar"]
+            }'
+        ];
+        yield [
+            '{}',
+            '{
+                "required": ["foo"]
+            }'
+        ];
+        yield [
+            '{
+            }',
+            '{
+                "type": "object",
+                "properties": {
+                    "foo": { "required": true }
+                }
+            }'
+        ];
+        yield [
+            '{
+              "string":{}
+            }',
+            '{
+              "type":"object",
+              "properties": {
+                "string":{"type":"string", "required": true}
+              }
+            }'
+        ];
+        yield [
+            '{
+              "number":{}
+            }',
+            '{
+              "type":"object",
+              "properties": {
+                "number":{"type":"number", "required": true}
+              }
+            }'
+        ];
+        yield [
+            '{
+              "integer":{}
+            }',
+            '{
+              "type":"object",
+              "properties": {
+                "integer":{"type":"integer", "required": true}
+              }
+            }'
+        ];
+        yield [
+            '{
+                "boolean":{}
+            }',
+            '{
+              "type":"object",
+              "properties": {
+                "boolean":{"type":"boolean", "required": true}
+              }
+            }'
+        ];
+        yield [
+            '{
+              "array":{}
+            }',
+            '{
+              "type":"object",
+              "properties": {
+                "array":{"type":"array", "required": true}
+              }
+            }',
+            Constraint::CHECK_MODE_NORMAL
+        ];
+        yield [
+            '{
+              "null":{}
+            }',
+            '{
+              "type":"object",
+              "properties": {
+                "null":{"type":"null", "required": true}
+              }
+            }'
+        ];
+        yield [
+            '{
+              "foo": {"baz": 1.5}
+            }',
+            '{
+              "type": "object",
+              "properties": {
+                "foo": {
                   "type": "object",
                   "properties": {
-                    "foo": {
-                      "type": "object",
-                      "properties": {
-                        "bar": {"type": "number"}
-                      },
-                      "required": ["bar"]
-                    }
-                  }
-                }'
-            ],
-            [
-                '{
-                  "foo": {"baz": 1.5}
-                }',
-                '{
+                    "bar": {"type": "number"}
+                  },
+                  "required": ["bar"]
+                }
+              }
+            }'
+        ];
+        yield [
+            '{
+              "foo": {"baz": 1.5}
+            }',
+            '{
+              "type": "object",
+              "properties": {
+                "foo": {
                   "type": "object",
                   "properties": {
-                    "foo": {
-                      "type": "object",
-                      "properties": {
-                        "bar": {"type": "number", "required": true}
-                      }
-                    }
+                    "bar": {"type": "number", "required": true}
                   }
-                }'
-            ],
+                }
+              }
+            }'
         ];
     }
 
-    public function getValidTests(): array
+    public function getValidTests(): \Generator
     {
-        return [
-            [
-                '{
-                  "number": 1.4
-                }',
-                '{
-                  "type":"object",
-                  "properties":{
-                    "number":{"type":"number","required":true}
-                  }
-                }'
-            ],
-            [
-                '{}',
-                '{
-                  "type":"object",
-                  "properties":{
-                    "number":{"type":"number"}
-                  }
-                }'
-            ],
-            [
-                '{}',
-                '{
-                  "type":"object",
-                  "properties":{
-                    "number":{"type":"number","required":false}
-                  }
-                }'
-            ],
-            [
-                '{
-                  "number": 0
-                }',
-                '{
-                  "type":"object",
-                  "properties":{
-                    "number":{"type":"integer","required":true}
-                  }
-                }'
-            ],
-            [
-                '{
-                  "is_active": false
-                }',
-                '{
-                  "type":"object",
-                  "properties":{
-                    "is_active":{"type":"boolean","required":true}
-                  }
-                }'
-            ],
-            [
-                '{
-                  "status": null
-                }',
-                '{
-                  "type":"object",
-                  "properties":{
-                    "status":{"type":"null","required":true}
-                  }
-                }'
-            ],
-            [
-                '{
-                  "users": []
-                }',
-                '{
-                  "type":"object",
-                  "properties":{
-                    "users":{"type":"array","required":true}
-                  }
-                }'
-            ],
-            [
-                '{
-                    "foo": "foo",
-                    "bar": 1.4
-                 }',
-                '{
-                    "type": "object",
-                    "properties": {
-                        "foo": {"type": "string", "required": true},
-                        "bar": {"type": "number"}
-                    },
-                    "required": ["bar"]
-                }'
-            ],
-            [
-                '{
-                    "foo": {"bar": 1.5}
-                }',
-                '{
-                    "type": "object",
-                    "properties": {
-                        "foo": {
-                            "type": "object",
-                            "properties": {
-                                "bar": {"type": "number"}
-                            },
-                            "required": ["bar"]
-                        }
-                    },
-                    "required": ["foo"]
-                }'
-            ],
-            [
-                '{
-                    "foo": {}
-                }',
-                '{
-                    "type": "object",
-                    "properties": {
-                        "foo": { "required": true }
+        yield [
+            '{
+              "number": 1.4
+            }',
+            '{
+              "type":"object",
+              "properties":{
+                "number":{"type":"number","required":true}
+              }
+            }'
+        ];
+        yield [
+            '{}',
+            '{
+              "type":"object",
+              "properties":{
+                "number":{"type":"number"}
+              }
+            }'
+        ];
+        yield [
+            '{}',
+            '{
+              "type":"object",
+              "properties":{
+                "number":{"type":"number","required":false}
+              }
+            }'
+        ];
+        yield [
+            '{
+              "number": 0
+            }',
+            '{
+              "type":"object",
+              "properties":{
+                "number":{"type":"integer","required":true}
+              }
+            }'
+        ];
+        yield [
+            '{
+              "is_active": false
+            }',
+            '{
+              "type":"object",
+              "properties":{
+                "is_active":{"type":"boolean","required":true}
+              }
+            }'
+        ];
+        yield [
+            '{
+              "status": null
+            }',
+            '{
+              "type":"object",
+              "properties":{
+                "status":{"type":"null","required":true}
+              }
+            }'
+        ];
+        yield [
+            '{
+              "users": []
+            }',
+            '{
+              "type":"object",
+              "properties":{
+                "users":{"type":"array","required":true}
+              }
+            }'
+        ];
+        yield [
+            '{
+                "foo": "foo",
+                "bar": 1.4
+             }',
+            '{
+                "type": "object",
+                "properties": {
+                    "foo": {"type": "string", "required": true},
+                    "bar": {"type": "number"}
+                },
+                "required": ["bar"]
+            }'
+        ];
+        yield [
+            '{
+                "foo": {"bar": 1.5}
+            }',
+            '{
+                "type": "object",
+                "properties": {
+                    "foo": {
+                        "type": "object",
+                        "properties": {
+                            "bar": {"type": "number"}
+                        },
+                        "required": ["bar"]
                     }
-                }'
-            ],
-            [
-                '{
-                  "boo": {"bar": 1.5}
-                }',
-                '{
+                },
+                "required": ["foo"]
+            }'
+        ];
+        yield [
+            '{
+                "foo": {}
+            }',
+            '{
+                "type": "object",
+                "properties": {
+                    "foo": { "required": true }
+                }
+            }'
+        ];
+        yield [
+            '{
+              "boo": {"bar": 1.5}
+            }',
+            '{
+              "type": "object",
+              "properties": {
+                "foo": {
                   "type": "object",
                   "properties": {
-                    "foo": {
-                      "type": "object",
-                      "properties": {
-                        "bar": {"type": "number"}
-                      },
-                      "required": ["bar"]
-                    }
-                  }
-                }'
-            ],
-            [
-                '{
-                  "boo": {"bar": 1.5}
-                }',
-                '{
+                    "bar": {"type": "number"}
+                  },
+                  "required": ["bar"]
+                }
+              }
+            }'
+        ];
+        yield [
+            '{
+              "boo": {"bar": 1.5}
+            }',
+            '{
+              "type": "object",
+              "properties": {
+                "foo": {
                   "type": "object",
                   "properties": {
-                    "foo": {
-                      "type": "object",
-                      "properties": {
-                        "bar": {"type": "number", "required": true}
-                      }
-                    }
+                    "bar": {"type": "number", "required": true}
                   }
-                }'
-            ],
+                }
+              }
+            }'
         ];
     }
 }
diff -pruN 6.4.1-1/tests/Constraints/SchemaValidationTest.php 6.6.0-1/tests/Constraints/SchemaValidationTest.php
--- 6.4.1-1/tests/Constraints/SchemaValidationTest.php	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/tests/Constraints/SchemaValidationTest.php	2025-10-10 11:34:09.000000000 +0000
@@ -1,11 +1,6 @@
 <?php
 
-/*
- * This file is part of the JsonSchema package.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+declare(strict_types=1);
 
 namespace JsonSchema\Tests\Constraints;
 
@@ -102,7 +97,7 @@ class SchemaValidationTest extends TestC
 
     public function testNonObjectSchema(): void
     {
-        $this->expectException('\JsonSchema\Exception\RuntimeException');
+        $this->expectException(\JsonSchema\Exception\RuntimeException::class);
         $this->expectExceptionMessage('Cannot validate the schema of a non-object');
 
         $this->testValidCases('"notAnObject"');
@@ -110,7 +105,7 @@ class SchemaValidationTest extends TestC
 
     public function testInvalidSchemaException(): void
     {
-        $this->expectException('\JsonSchema\Exception\InvalidSchemaException');
+        $this->expectException(\JsonSchema\Exception\InvalidSchemaException::class);
         $this->expectExceptionMessage('Schema did not pass validation');
 
         $input = json_decode('{}');
diff -pruN 6.4.1-1/tests/Constraints/SelfDefinedSchemaTest.php 6.6.0-1/tests/Constraints/SelfDefinedSchemaTest.php
--- 6.4.1-1/tests/Constraints/SelfDefinedSchemaTest.php	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/tests/Constraints/SelfDefinedSchemaTest.php	2025-10-10 11:34:09.000000000 +0000
@@ -1,80 +1,74 @@
 <?php
 
-/*
- * This file is part of the JsonSchema package.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+declare(strict_types=1);
 
 namespace JsonSchema\Tests\Constraints;
 
+use JsonSchema\Exception\InvalidArgumentException;
 use JsonSchema\Validator;
+use stdClass;
 
 class SelfDefinedSchemaTest extends BaseTestCase
 {
+    /** @var bool */
     protected $validateSchema = true;
 
-    public function getInvalidTests(): array
+    public function getInvalidTests(): \Generator
     {
-        return [
-            [
-                '{
-                    "$schema": {
-                        "$schema": "http://json-schema.org/draft-04/schema#",
-                        "properties": {
-                            "name": {
-                                "type": "string"
-                            },
-                            "age" : {
-                                "type": "integer",
-                                "maximum": 25
-                            }
+        yield [
+            '{
+                "$schema": {
+                    "$schema": "http://json-schema.org/draft-04/schema#",
+                    "properties": {
+                        "name": {
+                            "type": "string"
+                        },
+                        "age" : {
+                            "type": "integer",
+                            "maximum": 25
                         }
-                    },
-                    "name" : "John Doe",
-                    "age" : 30,
-                    "type" : "object"
-                }',
-                ''
-            ]
+                    }
+                },
+                "name" : "John Doe",
+                "age" : 30,
+                "type" : "object"
+            }',
+            ''
         ];
     }
 
-    public function getValidTests(): array
+    public function getValidTests(): \Generator
     {
-        return [
-            [
-                '{
-                    "$schema": {
-                        "$schema": "http://json-schema.org/draft-04/schema#",
-                        "properties": {
-                            "name": {
-                                "type": "string"
-                            },
-                            "age" : {
-                                "type": "integer",
-                                "maximum": 125
-                            }
+        yield [
+            '{
+                "$schema": {
+                    "$schema": "http://json-schema.org/draft-04/schema#",
+                    "properties": {
+                        "name": {
+                            "type": "string"
+                        },
+                        "age" : {
+                            "type": "integer",
+                            "maximum": 125
                         }
-                    },
-                    "name" : "John Doe",
-                    "age" : 30,
-                    "type" : "object"
-                }',
-                ''
-            ]
+                    }
+                },
+                "name" : "John Doe",
+                "age" : 30,
+                "type" : "object"
+            }',
+            ''
         ];
     }
 
     public function testInvalidArgumentException(): void
     {
-        $value = json_decode('{}');
-        $schema = json_decode('');
+        $value = new stdClass();
+        $schema = null;
 
         $v = new Validator();
 
-        $this->expectException('\JsonSchema\Exception\InvalidArgumentException');
+        $this->expectException(InvalidArgumentException::class);
 
         $v->validate($value, $schema);
     }
diff -pruN 6.4.1-1/tests/Constraints/TupleTypingTest.php 6.6.0-1/tests/Constraints/TupleTypingTest.php
--- 6.4.1-1/tests/Constraints/TupleTypingTest.php	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/tests/Constraints/TupleTypingTest.php	2025-10-10 11:34:09.000000000 +0000
@@ -1,140 +1,132 @@
 <?php
 
-/*
- * This file is part of the JsonSchema package.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+declare(strict_types=1);
 
 namespace JsonSchema\Tests\Constraints;
 
 class TupleTypingTest extends BaseTestCase
 {
+    /** @var bool */
     protected $validateSchema = true;
 
-    public function getInvalidTests(): array
+    public function getInvalidTests(): \Generator
     {
-        return [
-            [
-                '{
-                  "tupleTyping":[2,"a"]
-                }',
-                '{
-                  "type":"object",
-                  "properties":{
-                    "tupleTyping":{
-                      "type":"array",
-                      "items":[
-                        {"type":"string"},
-                        {"type":"number"}
-                      ]
-                    }
-                  }
-                }'
-            ],
-            [
-                '{
-                  "tupleTyping":["2",2,true]
-                }',
-                '{
-                  "type":"object",
-                  "properties":{
-                    "tupleTyping":{
-                      "type":"array",
-                      "items":[
-                        {"type":"string"},
-                        {"type":"number"}
-                      ] ,
-                      "additionalItems":false
-                    }
-                  }
-                }'
-            ],
-            [
-                '{
-                  "tupleTyping":["2",2,3]
-                }',
-                '{
-                  "type":"object",
-                  "properties":{
-                    "tupleTyping":{
-                      "type":"array",
-                      "items":[
-                        {"type":"string"},
-                        {"type":"number"}
-                      ] ,
-                      "additionalItems":{"type":"string"}
-                    }
-                  }
-                }'
-            ],
-            [
-                '{"data": [1, "foo", true, 1.5]}',
-                '{
-                    "type": "object",
-                    "properties": {
-                        "data": {
-                            "type": "array",
-                            "items": [{}, {}, {}],
-                            "additionalItems": false
-                        }
+        yield [
+            '{
+              "tupleTyping":[2,"a"]
+            }',
+            '{
+              "type":"object",
+              "properties":{
+                "tupleTyping":{
+                  "type":"array",
+                  "items":[
+                    {"type":"string"},
+                    {"type":"number"}
+                  ]
+                }
+              }
+            }'
+        ];
+        yield [
+            '{
+              "tupleTyping":["2",2,true]
+            }',
+            '{
+              "type":"object",
+              "properties":{
+                "tupleTyping":{
+                  "type":"array",
+                  "items":[
+                    {"type":"string"},
+                    {"type":"number"}
+                  ] ,
+                  "additionalItems":false
+                }
+              }
+            }'
+        ];
+        yield [
+            '{
+              "tupleTyping":["2",2,3]
+            }',
+            '{
+              "type":"object",
+              "properties":{
+                "tupleTyping":{
+                  "type":"array",
+                  "items":[
+                    {"type":"string"},
+                    {"type":"number"}
+                  ] ,
+                  "additionalItems":{"type":"string"}
+                }
+              }
+            }'
+        ];
+        yield [
+            '{"data": [1, "foo", true, 1.5]}',
+            '{
+                "type": "object",
+                "properties": {
+                    "data": {
+                        "type": "array",
+                        "items": [{}, {}, {}],
+                        "additionalItems": false
                     }
-                }'
-            ]
+                }
+            }'
         ];
     }
 
-    public function getValidTests(): array
+    public function getValidTests(): \Generator
     {
-        return [
-            [
-                '{
-                  "tupleTyping":["2", 1]
-                }',
-                '{
-                  "type":"object",
-                  "properties":{
-                    "tupleTyping":{
-                      "type":"array",
-                      "items":[
-                        {"type":"string"},
-                        {"type":"number"}
-                      ]
-                    }
-                  }
-                }'
-            ],
-            [
-                '{
-                  "tupleTyping":["2",2,3]
-                }',
-                '{
-                  "type":"object",
-                  "properties":{
-                    "tupleTyping":{
-                      "type":"array",
-                      "items":[
-                        {"type":"string"},
-                        {"type":"number"}
-                      ]
-                    }
-                  }
-                }'
-            ],
-            [
-                '{"data": [1, "foo", true]}',
-                '{
-                    "type": "object",
-                    "properties": {
-                        "data": {
-                            "type": "array",
-                            "items": [{}, {}, {}],
-                            "additionalItems": false
-                        }
+        yield [
+            '{
+              "tupleTyping":["2", 1]
+            }',
+            '{
+              "type":"object",
+              "properties":{
+                "tupleTyping":{
+                  "type":"array",
+                  "items":[
+                    {"type":"string"},
+                    {"type":"number"}
+                  ]
+                }
+              }
+            }'
+        ];
+        yield [
+            '{
+              "tupleTyping":["2",2,3]
+            }',
+            '{
+              "type":"object",
+              "properties":{
+                "tupleTyping":{
+                  "type":"array",
+                  "items":[
+                    {"type":"string"},
+                    {"type":"number"}
+                  ]
+                }
+              }
+            }'
+        ];
+        yield [
+            '{"data": [1, "foo", true]}',
+            '{
+                "type": "object",
+                "properties": {
+                    "data": {
+                        "type": "array",
+                        "items": [{}, {}, {}],
+                        "additionalItems": false
                     }
-                }'
-            ]
+                }
+            }'
         ];
     }
 }
diff -pruN 6.4.1-1/tests/Constraints/TypeTest.php 6.6.0-1/tests/Constraints/TypeTest.php
--- 6.4.1-1/tests/Constraints/TypeTest.php	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/tests/Constraints/TypeTest.php	2025-10-10 11:34:09.000000000 +0000
@@ -1,11 +1,6 @@
 <?php
 
-/*
- * This file is part of the JsonSchema package.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+declare(strict_types=1);
 
 namespace JsonSchema\Tests\Constraints;
 
@@ -13,13 +8,6 @@ use JsonSchema\Constraints\TypeCheck\Loo
 use JsonSchema\Constraints\TypeConstraint;
 use PHPUnit\Framework\TestCase;
 
-/**
- * Class TypeTest
- *
- * @package JsonSchema\Tests\Constraints
- *
- * @author hakre <https://github.com/hakre>
- */
 class TypeTest extends TestCase
 {
     /**
@@ -108,7 +96,9 @@ class TypeTest extends TestCase
         $t = new TypeConstraint();
         $r = new \ReflectionObject($t);
         $m = $r->getMethod('validateTypeNameWording');
-        $m->setAccessible(true);
+        if (PHP_VERSION_ID < 80100) {
+            $m->setAccessible(true);
+        }
 
         $m->invoke($t, $nameWording);
         $this->expectNotToPerformAssertions();
@@ -119,7 +109,9 @@ class TypeTest extends TestCase
         $t = new TypeConstraint();
         $r = new \ReflectionObject($t);
         $m = $r->getMethod('validateTypeNameWording');
-        $m->setAccessible(true);
+        if (PHP_VERSION_ID < 80100) {
+            $m->setAccessible(true);
+        }
 
         $this->expectException('\UnexpectedValueException');
         $this->expectExceptionMessage("No wording for 'notAValidTypeName' available, expected wordings are: [an integer, a number, a boolean, an object, an array, a string, a null]");
@@ -133,7 +125,7 @@ class TypeTest extends TestCase
         $data = new \stdClass();
         $schema = json_decode('{"type": "notAValidTypeName"}');
 
-        $this->expectException('JsonSchema\Exception\InvalidArgumentException');
+        $this->expectException(\JsonSchema\Exception\InvalidArgumentException::class);
         $this->expectExceptionMessage('object is an invalid type for notAValidTypeName');
 
         $t->check($data, $schema);
diff -pruN 6.4.1-1/tests/Constraints/UndefinedConstraintTest.php 6.6.0-1/tests/Constraints/UndefinedConstraintTest.php
--- 6.4.1-1/tests/Constraints/UndefinedConstraintTest.php	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/tests/Constraints/UndefinedConstraintTest.php	2025-10-10 11:34:09.000000000 +0000
@@ -8,162 +8,134 @@ use JsonSchema\Constraints\Constraint;
 
 class UndefinedConstraintTest extends BaseTestCase
 {
-    /**
-     * @return array{}
-     */
-    public function getInvalidTests(): array
+    public function getInvalidTests(): \Generator
     {
-        return [];
+        yield from [];
     }
 
-    /**
-     * @return array<string, array{input: string, schema: string, checkMode?: int}>
-     */
-    public function getValidTests(): array
+    public function getValidTests(): \Generator
     {
-        return [
-            'oneOf with type coercion should not affect value passed to each sub schema (#790)' => [
-                'input' => <<<JSON
+        yield 'oneOf with type coercion should not affect value passed to each sub schema (#790)' => [
+            'input' => '{
+                "id": "LOC1",
+                "related_locations": [
                     {
-                        "id": "LOC1",
-                        "related_locations": [
-                            {
-                                "latitude": "51.047598",
-                                "longitude": "3.729943"
-                            }
-                        ]
+                        "latitude": "51.047598",
+                        "longitude": "3.729943"
                     }
-JSON
-                ,
-                'schema' => <<<JSON
-                    {
-                        "title": "Location",
-                        "type": "object",
-                        "properties": {
-                            "id": {
-                                "type": "string"
+                ]
+            }',
+            'schema' => '{
+                "title": "Location",
+                "type": "object",
+                "properties": {
+                    "id": {
+                        "type": "string"
+                    },
+                    "related_locations": {
+                        "oneOf": [
+                            {
+                                "type": "null"
                             },
-                            "related_locations": {
-                                "oneOf": [
-                                    {
-                                        "type": "null"
-                                    },
-                                    {
-                                        "type": "array",
-                                        "items": {
-                                            "type": "object",
-                                            "properties": {
-                                                "latitude": {
-                                                    "type": "string"
-                                                },
-                                                "longitude": {
-                                                    "type": "string"
-                                                }
-                                            }
+                            {
+                                "type": "array",
+                                "items": {
+                                    "type": "object",
+                                    "properties": {
+                                        "latitude": {
+                                            "type": "string"
+                                        },
+                                        "longitude": {
+                                            "type": "string"
                                         }
                                     }
-                                ]
+                                }
                             }
-                        }
+                        ]
                     }
-JSON
-                ,
-                'checkMode' => Constraint::CHECK_MODE_COERCE_TYPES
-            ],
-            'oneOf with apply defaults should not affect value passed to each sub schema (#510)' => [
-                'input' => <<<JSON
-                    {"foo": {"name": "bar"}}
-JSON
-                ,
-                'schema' => <<<JSON
+                }
+            }',
+            'checkMode' => Constraint::CHECK_MODE_COERCE_TYPES
+        ];
+        yield 'oneOf with apply defaults should not affect value passed to each sub schema (#510)' => [
+            'input' => '{"foo": {"name": "bar"}}',
+            'schema' => '{
+                "oneOf": [
                     {
-                        "oneOf": [
-                            {
+                        "type": "object",
+                        "properties": {
+                            "foo": {
                                 "type": "object",
                                 "properties": {
-                                    "foo": {
-                                        "type": "object",
-                                        "properties": {
-                                            "name": {"enum":["baz"],"default":"baz"},
-                                            "meta": {"enum":["baz"],"default":"baz"}
-                                        }
-                                    }
+                                    "name": {"enum":["baz"],"default":"baz"},
+                                    "meta": {"enum":["baz"],"default":"baz"}
                                 }
-                            },
-                            {
+                            }
+                        }
+                    },
+                    {
+                        "type": "object",
+                        "properties": {
+                            "foo": {
                                 "type": "object",
                                 "properties": {
-                                    "foo": {
-                                        "type": "object",
-                                        "properties": {
-                                            "name": {"enum":["bar"],"default":"bar"},
-                                            "meta": {"enum":["bar"],"default":"bar"}
-                                        }
-                                    }
+                                    "name": {"enum":["bar"],"default":"bar"},
+                                    "meta": {"enum":["bar"],"default":"bar"}
                                 }
-                            },
-                            {
+                            }
+                        }
+                    },
+                    {
+                        "type": "object",
+                        "properties": {
+                            "foo": {
                                 "type": "object",
                                 "properties": {
-                                    "foo": {
-                                        "type": "object",
-                                        "properties": {
-                                            "name": {"enum":["zip"],"default":"zip"},
-                                            "meta": {"enum":["zip"],"default":"zip"}
-                                        }
-                                    }
+                                    "name": {"enum":["zip"],"default":"zip"},
+                                    "meta": {"enum":["zip"],"default":"zip"}
                                 }
                             }
-                        ]
+                        }
                     }
-JSON
-                ,
-                'checkMode' => Constraint::CHECK_MODE_APPLY_DEFAULTS
-            ],
-            'anyOf with apply defaults should not affect value passed to each sub schema (#711)' => [
-                'input' => <<<JSON
-                    {
-                        "b": 2
+                ]
+            }',
+            'checkMode' => Constraint::CHECK_MODE_APPLY_DEFAULTS
+        ];
+        yield 'anyOf with apply defaults should not affect value passed to each sub schema (#711)' => [
+            'input' => '{ "b": 2 }',
+            'schema' => '{
+              "anyOf": [
+                {
+                  "required": [ "a" ],
+                  "pro": {
+                    "a": {
+                      "type": "integer"
+                    },
+                    "aDefault": {
+                      "type": "integer",
+                      "default": 1
                     }
-JSON
-                ,
-                'schema' => <<<JSON
-                    {
-                        "anyOf": [
-                            {
-                                "required": [ "a" ],
-                      "properties": {
-                          "a": {
-                              "type": "integer"
-                          },
-                          "aDefault": {
-                              "type": "integer",
-                              "default": 1
-                          }
-                      },
-                      "type": "object",
-                      "additionalProperties": false
+                  },
+                  "type": "object",
+                  "additionalProperties": false
+                },
+                {
+                  "required": [ "b" ],
+                  "properties": {
+                    "b": {
+                      "type": "integer"
                     },
-                    {
-                      "required": [ "b" ],
-                      "properties": {
-                          "b": {
-                              "type": "integer"
-                          },
-                          "bDefault": {
-                              "type": "integer",
-                              "default": 2
-                          }
-                      },
-                      "type": "object",
-                      "additionalProperties": false
+                    "bDefault": {
+                      "type": "integer",
+                      "default": 2
                     }
-                  ]
+                  },
+                  "type": "object",
+                  "additionalProperties": false
                 }
-JSON
-                ,
-                'checkMode' => Constraint::CHECK_MODE_APPLY_DEFAULTS
-            ]
+              ]
+            }',
+            'checkMode' => Constraint::CHECK_MODE_APPLY_DEFAULTS
         ];
     }
 }
diff -pruN 6.4.1-1/tests/Constraints/UnionTypesTest.php 6.6.0-1/tests/Constraints/UnionTypesTest.php
--- 6.4.1-1/tests/Constraints/UnionTypesTest.php	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/tests/Constraints/UnionTypesTest.php	2025-10-10 11:34:09.000000000 +0000
@@ -1,53 +1,45 @@
 <?php
 
-/*
- * This file is part of the JsonSchema package.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+declare(strict_types=1);
 
 namespace JsonSchema\Tests\Constraints;
 
 class UnionTypesTest extends BaseTestCase
 {
+    /** @var bool */
     protected $validateSchema = true;
 
-    public function getInvalidTests(): array
+    public function getInvalidTests(): \Generator
     {
-        return [
-            [
-                '{
-                  "stringOrNumber":4.8,
-                  "booleanOrNull":5
-                }',
-                '{
-                  "type":"object",
-                  "properties":{
-                    "stringOrNumber":{"type":["string","number"]},
-                    "booleanOrNull":{"type":["boolean","null"]}
-                  }
-                }'
-            ]
+        yield [
+            '{
+              "stringOrNumber":4.8,
+              "booleanOrNull":5
+            }',
+            '{
+              "type":"object",
+              "properties":{
+                "stringOrNumber":{"type":["string","number"]},
+                "booleanOrNull":{"type":["boolean","null"]}
+              }
+            }'
         ];
     }
 
-    public function getValidTests(): array
+    public function getValidTests(): \Generator
     {
-        return [
-            [
-                '{
-                  "stringOrNumber":4.8,
-                  "booleanOrNull":false
-                }',
-                '{
-                  "type":"object",
-                  "properties":{
-                    "stringOrNumber":{"type":["string","number"]},
-                    "booleanOrNull":{"type":["boolean","null"]}
-                  }
-                }'
-            ]
+        yield [
+            '{
+              "stringOrNumber":4.8,
+              "booleanOrNull":false
+            }',
+            '{
+              "type":"object",
+              "properties":{
+                "stringOrNumber":{"type":["string","number"]},
+                "booleanOrNull":{"type":["boolean","null"]}
+              }
+            }'
         ];
     }
 }
diff -pruN 6.4.1-1/tests/Constraints/UnionWithNullValueTest.php 6.6.0-1/tests/Constraints/UnionWithNullValueTest.php
--- 6.4.1-1/tests/Constraints/UnionWithNullValueTest.php	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/tests/Constraints/UnionWithNullValueTest.php	2025-10-10 11:34:09.000000000 +0000
@@ -1,53 +1,45 @@
 <?php
 
-/*
- * This file is part of the JsonSchema package.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+declare(strict_types=1);
 
 namespace JsonSchema\Tests\Constraints;
 
 class UnionWithNullValueTest extends BaseTestCase
 {
+    /** @var bool */
     protected $validateSchema = true;
 
-    public function getInvalidTests(): array
+    public function getInvalidTests(): \Generator
     {
-        return [
-            [
-                '{
-                  "stringOrNumber":null,
-                  "booleanOrNull":null
-                }',
-                '{
-                  "type":"object",
-                  "properties":{
-                    "stringOrNumber":{"type":["string","number"]},
-                    "booleanOrNull":{"type":["boolean","null"]}
-                  }
-                }'
-            ]
+        yield [
+            '{
+              "stringOrNumber":null,
+              "booleanOrNull":null
+            }',
+            '{
+              "type":"object",
+              "properties":{
+                "stringOrNumber":{"type":["string","number"]},
+                "booleanOrNull":{"type":["boolean","null"]}
+              }
+            }'
         ];
     }
 
-    public function getValidTests(): array
+    public function getValidTests(): \Generator
     {
-        return [
-            [
-                '{
-                  "stringOrNumber":12,
-                  "booleanOrNull":null
-                }',
-                '{
-                  "type":"object",
-                  "properties":{
-                    "stringOrNumber":{"type":["string","number"]},
-                    "booleanOrNull":{"type":["boolean","null"]}
-                  }
-                }'
-            ]
+        yield [
+            '{
+              "stringOrNumber":12,
+              "booleanOrNull":null
+            }',
+            '{
+              "type":"object",
+              "properties":{
+                "stringOrNumber":{"type":["string","number"]},
+                "booleanOrNull":{"type":["boolean","null"]}
+              }
+            }'
         ];
     }
 }
diff -pruN 6.4.1-1/tests/Constraints/UniqueItemsTest.php 6.6.0-1/tests/Constraints/UniqueItemsTest.php
--- 6.4.1-1/tests/Constraints/UniqueItemsTest.php	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/tests/Constraints/UniqueItemsTest.php	2025-10-10 11:34:09.000000000 +0000
@@ -1,161 +1,157 @@
 <?php
 
-/*
- * This file is part of the JsonSchema package.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+declare(strict_types=1);
 
 namespace JsonSchema\Tests\Constraints;
 
 class UniqueItemsTest extends BaseTestCase
 {
+    /** @var bool */
     protected $validateSchema = true;
 
-    public function getInvalidTests(): array
+    public function getInvalidTests(): \Generator
     {
-        return [
-            [
-                '[1,2,2]',
-                '{
-                  "type":"array",
-                  "uniqueItems": true
-                }'
-            ],
-            [
-                '[{"a":"b"},{"a":"c"},{"a":"b"}]',
-                '{
-                  "type":"array",
-                  "uniqueItems": true
-                }'
-            ],
-            [
-                '[{"foo": {"bar" : {"baz" : true}}}, {"foo": {"bar" : {"baz" : true}}}]',
-                '{
-                    "type": "array",
-                    "uniqueItems": true
-                }'
-            ],
-            [
-                '[1.0, 1.00, 1]',
-                '{
-                    "type": "array",
-                    "uniqueItems": true
-                }'
-            ],
-            [
-                '[["foo"], ["foo"]]',
-                '{
-                    "type": "array",
-                    "uniqueItems": true
-                }'
-            ],
-            [
-                '[{}, [1], true, null, {}, 1]',
-                '{
-                    "type": "array",
-                    "uniqueItems": true
-                }'
-            ]
+        yield 'Non unique integers' => [
+            'input' => '[1,2,2]',
+            'schema' => '{
+              "type":"array",
+              "uniqueItems": true
+            }'
+        ];
+        yield 'Non unique objects' => [
+            'input' => '[{"a":"b"},{"a":"c"},{"a":"b"}]',
+            'schema' => '{
+              "type":"array",
+              "uniqueItems": true
+            }'
+        ];
+        yield 'Non unique objects - three levels deep' => [
+            'input' => '[{"foo": {"bar" : {"baz" : true}}}, {"foo": {"bar" : {"baz" : true}}}]',
+            'schema' => '{
+                "type": "array",
+                "uniqueItems": true
+            }'
+        ];
+        yield 'Non unique mathematical values for the number one' => [
+            'input' => '[1.0, 1.00, 1]',
+            'schema' => '{
+                "type": "array",
+                "uniqueItems": true
+            }'
+        ];
+        yield 'Non unique arrays' => [
+            'input' => '[["foo"], ["foo"]]',
+            'schema' => '{
+                "type": "array",
+                "uniqueItems": true
+            }'
+        ];
+        yield 'Non unique mix of different types' => [
+            'input' => '[{}, [1], true, null, {}, 1]',
+            'schema' => '{
+                "type": "array",
+                "uniqueItems": true
+            }'
+        ];
+        yield 'objects are non-unique despite key order' => [
+            'input' => '[{"a": 1, "b": 2}, {"b": 2, "a": 1}]',
+            'schema' => '{"uniqueItems": true}',
         ];
     }
 
-    public function getValidTests(): array
+    public function getValidTests(): \Generator
     {
-        return [
-            [
-                '[1,2,3]',
-                '{
-                  "type":"array",
-                  "uniqueItems": true
-                }'
-            ],
-            [
-                '[{"foo": 12}, {"bar": false}]',
-                '{
-                    "type": "array",
-                    "uniqueItems": true
-                }'
-            ],
-            [
-                '[1, true]',
-                '{
-                    "type": "array",
-                    "uniqueItems": true
-                }'
-            ],
-            [
-                '[0, false]',
-                '{
-                    "type": "array",
-                    "uniqueItems": true
-                }'
-            ],
-            [
-                '[{"foo": {"bar" : {"baz" : true}}}, {"foo": {"bar" : {"baz" : false}}}]',
-                '{
-                    "type": "array",
-                    "uniqueItems": true
-                }'
-            ],
-            [
-                '[["foo"], ["bar"]]',
-                '{
-                    "type": "array",
-                    "uniqueItems": true
-                }'
-            ],
-            [
-                '[{}, [1], true, null, 1]',
-                '{
-                    "type": "array",
-                    "uniqueItems": true
-                }'
-            ],
-            // below equals the invalid tests, but with uniqueItems set to false
-            [
-                '[1,2,2]',
-                '{
-                  "type":"array",
-                  "uniqueItems": false
-                }'
-            ],
-            [
-                '[{"a":"b"},{"a":"c"},{"a":"b"}]',
-                '{
-                  "type":"array",
-                  "uniqueItems": false
-                }'
-            ],
-            [
-                '[{"foo": {"bar" : {"baz" : true}}}, {"foo": {"bar" : {"baz" : true}}}]',
-                '{
-                    "type": "array",
-                    "uniqueItems": false
-                }'
-            ],
-            [
-                '[1.0, 1.00, 1]',
-                '{
-                    "type": "array",
-                    "uniqueItems": false
-                }'
-            ],
-            [
-                '[["foo"], ["foo"]]',
-                '{
-                    "type": "array",
-                    "uniqueItems": false
-                }'
-            ],
-            [
-                '[{}, [1], true, null, {}, 1]',
-                '{
-                    "type": "array",
-                    "uniqueItems": false
-                }'
-            ]
+        yield 'unique integers' => [
+            'input' => '[1,2,3]',
+            'schema' => '{
+                "type":"array",
+                "uniqueItems": true
+            }'
+        ];
+        yield 'unique objects' =>[
+            'input' => '[{"foo": 12}, {"bar": false}]',
+            'schema' => '{
+                "type": "array",
+                "uniqueItems": true
+            }'
+        ];
+        yield 'Integer one and boolean true' => [
+            'input' => '[1, true]',
+            'schema' => '{
+                "type": "array",
+                "uniqueItems": true
+            }'
+        ];
+        yield 'Integer zero and boolean false' => [
+            'input' => '[0, false]',
+            'schema' => '{
+                "type": "array",
+                "uniqueItems": true
+            }'
+        ];
+        yield 'Objects with different value three levels deep' => [
+            'input' => '[{"foo": {"bar" : {"baz" : true}}}, {"foo": {"bar" : {"baz" : false}}}]',
+            'schema' => '{
+                "type": "array",
+                "uniqueItems": true
+            }'
+        ];
+        yield 'Array of strings' => [
+            'input' => '[["foo"], ["bar"]]',
+            'schema' => '{
+                "type": "array",
+                "uniqueItems": true
+            }'
+        ];
+        yield 'Object, Array, boolean, null and integer' => [
+            'input' => '[{}, [1], true, null, 1]',
+            'schema' => '{
+                "type": "array",
+                "uniqueItems": true
+            }'
+        ];
+        // below equals the invalid tests, but with uniqueItems set to false
+        yield 'Non unique integers' => [
+            'input' => '[1,2,2]',
+            'schema' =>  '{
+              "type":"array",
+              "uniqueItems": false
+            }'
+        ];
+        yield 'Non unique objects' => [
+            'input' => '[{"a":"b"},{"a":"c"},{"a":"b"}]',
+            'schema' => '{
+              "type":"array",
+              "uniqueItems": false
+            }'
+        ];
+        yield 'Non unique objects - three levels deep' => [
+            'input' => '[{"foo": {"bar" : {"baz" : true}}}, {"foo": {"bar" : {"baz" : true}}}]',
+            'schema' => '{
+                "type": "array",
+                "uniqueItems": false
+            }'
+        ];
+        yield 'Non unique mathematical values for the number one' => [
+            'input' => '[1.0, 1.00, 1]',
+            'schema' => '{
+                "type": "array",
+                "uniqueItems": false
+            }'
+        ];
+        yield 'Non unique arrays' => [
+            'input' => '[["foo"], ["foo"]]',
+            'schema' => '{
+                "type": "array",
+                "uniqueItems": false
+            }'
+        ];
+        yield 'Non unique mix of different types' => [
+            'input' => '[{}, [1], true, null, {}, 1]',
+            'schema' => '{
+                "type": "array",
+                "uniqueItems": false
+            }'
         ];
     }
 }
diff -pruN 6.4.1-1/tests/Constraints/ValidationExceptionTest.php 6.6.0-1/tests/Constraints/ValidationExceptionTest.php
--- 6.4.1-1/tests/Constraints/ValidationExceptionTest.php	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/tests/Constraints/ValidationExceptionTest.php	2025-10-10 11:34:09.000000000 +0000
@@ -1,11 +1,6 @@
 <?php
 
-/*
- * This file is part of the JsonSchema package.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+declare(strict_types=1);
 
 namespace JsonSchema\Tests\Constraints;
 
@@ -19,7 +14,7 @@ class ValidationExceptionTest extends Te
     public function testValidationException(): void
     {
         $exception = new ValidationException();
-        $this->assertInstanceOf('\JsonSchema\Exception\ValidationException', $exception);
+        $this->assertInstanceOf(\JsonSchema\Exception\ValidationException::class, $exception);
 
         $checkValue = json_decode('{"propertyOne": "thisIsNotAnObject"}');
         $schema = json_decode('{
@@ -45,7 +40,7 @@ class ValidationExceptionTest extends Te
             $exception->getMessage()
         );
 
-        $this->expectException('JsonSchema\Exception\ValidationException');
+        $this->expectException(\JsonSchema\Exception\ValidationException::class);
         throw $exception;
     }
 }
diff -pruN 6.4.1-1/tests/Constraints/VeryBaseTestCase.php 6.6.0-1/tests/Constraints/VeryBaseTestCase.php
--- 6.4.1-1/tests/Constraints/VeryBaseTestCase.php	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/tests/Constraints/VeryBaseTestCase.php	2025-10-10 11:34:09.000000000 +0000
@@ -2,80 +2,84 @@
 
 declare(strict_types=1);
 
-/*
- * This file is part of the JsonSchema package.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
 namespace JsonSchema\Tests\Constraints;
 
+use JsonSchema\DraftIdentifiers;
+use JsonSchema\UriRetrieverInterface;
 use PHPUnit\Framework\TestCase;
 use Prophecy\Argument;
+use stdClass;
 
-/**
- * @package JsonSchema\Tests\Constraints
- */
 abstract class VeryBaseTestCase extends TestCase
 {
-    /** @var object */
-    private $jsonSchemaDraft03;
+    private const DRAFT_SCHEMA_DIR = __DIR__ . '/../../dist/schema/';
+    private const TEST_SUITE_REMOTES =  __DIR__ . '/../../vendor/json-schema/json-schema-test-suite/remotes';
 
-    /** @var object */
-    private $jsonSchemaDraft04;
+    /** @var array<string, stdClass> */
+    private $draftSchemas = [];
 
-    protected function getUriRetrieverMock(?object $schema): object
+    /**
+     * @param object|bool|null $schema
+     *
+     * @return object
+     */
+    protected function getUriRetrieverMock($schema): object
     {
-        $relativeTestsRoot = realpath(__DIR__ . '/../../vendor/json-schema/json-schema-test-suite/remotes');
-
-        $jsonSchemaDraft03 = $this->getJsonSchemaDraft03();
-        $jsonSchemaDraft04 = $this->getJsonSchemaDraft04();
-
-        $uriRetriever = $this->prophesize('JsonSchema\UriRetrieverInterface');
-        $uriRetriever->retrieve('http://www.my-domain.com/schema.json')
+        $uriRetriever = $this->prophesize(UriRetrieverInterface::class);
+        $uriRetriever->retrieve($schema->id ?? 'http://www.my-domain.com/schema.json')
             ->willReturn($schema)
             ->shouldBeCalled();
 
+        $that = $this;
         $uriRetriever->retrieve(Argument::any())
-            ->will(function ($args) use ($jsonSchemaDraft03, $jsonSchemaDraft04, $relativeTestsRoot) {
-                if ('http://json-schema.org/draft-03/schema' === $args[0]) {
-                    return $jsonSchemaDraft03;
-                } elseif ('http://json-schema.org/draft-04/schema' === $args[0]) {
-                    return $jsonSchemaDraft04;
-                } elseif (0 === strpos($args[0], 'http://localhost:1234')) {
-                    $urlParts = parse_url($args[0]);
-
-                    return json_decode(file_get_contents($relativeTestsRoot . $urlParts['path']));
-                } elseif (0 === strpos($args[0], 'http://www.my-domain.com')) {
-                    $urlParts = parse_url($args[0]);
+            ->will(function ($args) use ($that): stdClass {
+                if (strpos($args[0], DraftIdentifiers::DRAFT_3()->withoutFragment()) === 0) {
+                    return $that->getDraftSchema('json-schema-draft-03.json');
+                }
+
+                if (strpos($args[0], DraftIdentifiers::DRAFT_4()->withoutFragment()) === 0) {
+                    return $that->getDraftSchema('json-schema-draft-04.json');
+                }
+                if (strpos($args[0], DraftIdentifiers::DRAFT_6()->withoutFragment()) === 0) {
+                    return $that->getDraftSchema('json-schema-draft-06.json');
+                }
 
-                    return json_decode(file_get_contents($relativeTestsRoot . '/folder' . $urlParts['path']));
+                $urlParts = parse_url($args[0]);
+
+                if (0 === strpos($args[0], 'http://localhost:1234')) {
+                    return $that->readAndJsonDecodeFile(self::TEST_SUITE_REMOTES . $urlParts['path']);
+                }
+
+                if (0 === strpos($args[0], 'http://www.my-domain.com')) {
+                    return $that->readAndJsonDecodeFile(self::TEST_SUITE_REMOTES . '/folder' . $urlParts['path']);
                 }
+
+                throw new \InvalidArgumentException(sprintf('No handling for %s has been setup', $args[0]));
             });
 
         return $uriRetriever->reveal();
     }
 
-    private function getJsonSchemaDraft03(): object
+    private function getDraftSchema(string $draft): stdClass
     {
-        if (!$this->jsonSchemaDraft03) {
-            $this->jsonSchemaDraft03 = json_decode(
-                file_get_contents(__DIR__ . '/../../dist/schema/json-schema-draft-03.json')
-            );
+        if (!array_key_exists($draft, $this->draftSchemas)) {
+            $this->draftSchemas[$draft] = $this->readAndJsonDecodeFile(self::DRAFT_SCHEMA_DIR . '/' . $draft);
         }
 
-        return $this->jsonSchemaDraft03;
+        return $this->draftSchemas[$draft];
     }
 
-    private function getJsonSchemaDraft04(): object
+    private function readAndJsonDecodeFile(string $file): stdClass
     {
-        if (!$this->jsonSchemaDraft04) {
-            $this->jsonSchemaDraft04 = json_decode(
-                file_get_contents(__DIR__ . '/../../dist/schema/json-schema-draft-04.json')
-            );
+        if (!file_exists($file)) {
+            throw new \InvalidArgumentException(sprintf('File "%s" does not exist', $file));
         }
 
-        return $this->jsonSchemaDraft04;
+        return json_decode(file_get_contents($file), false);
+    }
+
+    protected function is32Bit(): bool
+    {
+        return PHP_INT_SIZE === 4;
     }
 }
diff -pruN 6.4.1-1/tests/Constraints/WrongMessagesFailingTestCaseTest.php 6.6.0-1/tests/Constraints/WrongMessagesFailingTestCaseTest.php
--- 6.4.1-1/tests/Constraints/WrongMessagesFailingTestCaseTest.php	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/tests/Constraints/WrongMessagesFailingTestCaseTest.php	2025-10-10 11:34:09.000000000 +0000
@@ -1,53 +1,45 @@
 <?php
 
-/*
- * This file is part of the JsonSchema package.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+declare(strict_types=1);
 
 namespace JsonSchema\Tests\Constraints;
 
 class WrongMessagesFailingTestCaseTest extends BaseTestCase
 {
+    /** @var bool */
     protected $validateSchema = true;
 
-    public function getInvalidTests(): array
+    public function getInvalidTests(): \Generator
     {
-        return [
-            [
-                '{
-                  "stringOrNumber":4.8,
-                  "booleanOrNull":["A","B"]
-                }',
-                '{
-                  "type":"object",
-                  "properties":{
-                    "stringOrNumber":{"type":["string","number"]},
-                    "booleanOrNull":{"type":["boolean","null"]}
-                  }
-                }'
-            ]
+        yield [
+            '{
+              "stringOrNumber":4.8,
+              "booleanOrNull":["A","B"]
+            }',
+            '{
+              "type":"object",
+              "properties":{
+                "stringOrNumber":{"type":["string","number"]},
+                "booleanOrNull":{"type":["boolean","null"]}
+              }
+            }'
         ];
     }
 
-    public function getValidTests(): array
+    public function getValidTests(): \Generator
     {
-        return [
-            [
-                '{
-                  "stringOrNumber":4.8,
-                  "booleanOrNull":true
-                }',
-                '{
-                  "type":"object",
-                  "properties":{
-                    "stringOrNumber":{"type":["string","number"]},
-                    "booleanOrNull":{"type":["boolean","null"]}
-                  }
-                }'
-            ]
+        yield [
+            '{
+              "stringOrNumber":4.8,
+              "booleanOrNull":true
+            }',
+            '{
+              "type":"object",
+              "properties":{
+                "stringOrNumber":{"type":["string","number"]},
+                "booleanOrNull":{"type":["boolean","null"]}
+              }
+            }'
         ];
     }
 }
diff -pruN 6.4.1-1/tests/Drafts/BaseDraftTestCase.php 6.6.0-1/tests/Drafts/BaseDraftTestCase.php
--- 6.4.1-1/tests/Drafts/BaseDraftTestCase.php	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/tests/Drafts/BaseDraftTestCase.php	2025-10-10 11:34:09.000000000 +0000
@@ -6,15 +6,15 @@ namespace JsonSchema\Tests\Drafts;
 
 use JsonSchema\Tests\Constraints\BaseTestCase;
 
-/**
- * @package JsonSchema\Tests\Drafts
- */
 abstract class BaseDraftTestCase extends BaseTestCase
 {
     /** @var string */
-    protected $relativeTestsRoot = '/../../vendor/json-schema/json-schema-test-suite/tests';
+    protected const RELATIVE_TESTS_ROOT = '/../../vendor/json-schema/json-schema-test-suite/tests';
 
-    private function setUpTests($isValid): array
+    /**
+     * @return array<string, array{string, string}>
+     */
+    private function setUpTests(bool $isValid): array
     {
         $filePaths = $this->getFilePaths();
         $skippedTests = $this->getSkippedTests();
@@ -27,7 +27,7 @@ abstract class BaseDraftTestCase extends
                     continue;
                 }
 
-                $suites = json_decode(file_get_contents($file));
+                $suites = json_decode(file_get_contents($file), false);
                 foreach ($suites as $suite) {
                     $suiteDescription = $suite->description;
                     foreach ($suite->tests as $test) {
@@ -45,29 +45,23 @@ abstract class BaseDraftTestCase extends
         return $tests;
     }
 
-    /**
-     * {@inheritdoc}
-     */
-    public function getInvalidTests(): array
+    public function getInvalidTests(): \Generator
     {
-        return $this->setUpTests(false);
+        yield from $this->setUpTests(false);
     }
 
-    /**
-     * {@inheritdoc}
-     */
-    public function getValidTests(): array
+    public function getValidTests(): \Generator
     {
-        return $this->setUpTests(true);
+        yield from $this->setUpTests(true);
     }
 
     /**
-     * @return string[]
+     * @return list<string>
      */
     abstract protected function getFilePaths(): array;
 
     /**
-     * @return string[]
+     * @return list<string>
      */
     abstract protected function getSkippedTests(): array;
 
diff -pruN 6.4.1-1/tests/Drafts/Draft3Test.php 6.6.0-1/tests/Drafts/Draft3Test.php
--- 6.4.1-1/tests/Drafts/Draft3Test.php	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/tests/Drafts/Draft3Test.php	2025-10-10 11:34:09.000000000 +0000
@@ -1,53 +1,123 @@
 <?php
 
-/*
- * This file is part of the JsonSchema package.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+declare(strict_types=1);
 
 namespace JsonSchema\Tests\Drafts;
 
-/**
- * @package JsonSchema\Tests\Drafts
- */
+use JsonSchema\Constraints\Factory;
+use JsonSchema\DraftIdentifiers;
+use JsonSchema\SchemaStorage;
+use JsonSchema\Validator;
+
 class Draft3Test extends BaseDraftTestCase
 {
-    protected $schemaSpec = 'http://json-schema.org/draft-03/schema#';
+    /** @var string */
+    protected $schemaSpec = DraftIdentifiers::DRAFT_3;
+    /** @var bool */
     protected $validateSchema = true;
 
     /**
+     * This test is a copy of https://github.com/json-schema-org/JSON-Schema-Test-Suite/blob/main/tests/draft3/ref.json#L203-L225
+     *
+     * @todo cleanup when #821 gets merged
+     *
+     * @param mixed $data
+     * @dataProvider refPreventsASiblingIdFromChangingTheBaseUriProvider
+     */
+    public function testRefPreventsASiblingIdFromChangingTheBaseUriProvider($data, bool $expectedResult): void
+    {
+        $schema = json_decode(<<<'JSON'
+            {
+                "id": "http://localhost:1234/sibling_id/base/",
+                "definitions": {
+                    "foo": {
+                        "id": "http://localhost:1234/sibling_id/foo.json",
+                        "type": "string"
+                    },
+                    "base_foo": {
+                        "$comment": "this canonical uri is http://localhost:1234/sibling_id/base/foo.json",
+                        "id": "foo.json",
+                        "type": "number"
+                    }
+                },
+                "extends": [
+                    {
+                        "$comment": "$ref resolves to http://localhost:1234/sibling_id/base/foo.json, not http://localhost:1234/sibling_id/foo.json",
+                        "id": "http://localhost:1234/sibling_id/",
+                        "$ref": "foo.json"
+                    }
+                ]
+            }
+JSON
+        , false);
+
+        $schemaStorage = new SchemaStorage();
+        $schemaStorage->addSchema(property_exists($schema, 'id') ? $schema->id : 'internal://mySchema', $schema);
+        $validator = new Validator(new Factory($schemaStorage));
+        $validator->validate($data, $schema);
+
+        self::assertEquals($expectedResult, $validator->isValid());
+    }
+
+    public function refPreventsASiblingIdFromChangingTheBaseUriProvider(): \Generator
+    {
+        yield '$ref resolves to /definitions/base_foo, data does not validate' => ['data' => 'a', 'valid' => false];
+        yield '$ref resolves to /definitions/base_foo, data validate' => ['data' => 1, 'valid' => true];
+    }
+
+    /**
      * {@inheritdoc}
      */
     protected function getFilePaths(): array
     {
         return [
-            realpath(__DIR__ . $this->relativeTestsRoot . '/draft3'),
-            realpath(__DIR__ . $this->relativeTestsRoot . '/draft3/optional')
+            realpath(__DIR__ . self::RELATIVE_TESTS_ROOT . '/draft3'),
+            realpath(__DIR__ . self::RELATIVE_TESTS_ROOT . '/draft3/optional')
+        ];
+    }
+
+    public function getInvalidTests(): \Generator
+    {
+        $skip = [
+            'ref.json / $ref prevents a sibling id from changing the base uri / $ref resolves to /definitions/base_foo, data does not validate'
         ];
+
+        foreach (parent::getInvalidTests() as $name => $testcase) {
+            if (in_array($name, $skip, true)) {
+                continue;
+            }
+            yield $name => $testcase;
+        }
     }
 
-    public function getInvalidForAssocTests(): array
+    public function getInvalidForAssocTests(): \Generator
     {
-        $tests = parent::getInvalidForAssocTests();
-        unset(
-            $tests['type.json / object type matches objects / an array is not an object'],
-            $tests['type.json / array type matches arrays / an object is not an array']
-        );
+        $skip = [
+            'type.json / object type matches objects / an array is not an object',
+            'type.json / array type matches arrays / an object is not an array',
+        ];
 
-        return $tests;
+        foreach (parent::getInvalidForAssocTests() as $name => $testcase) {
+            if (in_array($name, $skip, true)) {
+                continue;
+            }
+            yield $name => $testcase;
+        }
     }
 
-    public function getValidForAssocTests(): array
+    public function getValidForAssocTests(): \Generator
     {
-        $tests = parent::getValidForAssocTests();
-        unset(
-            $tests['type.json / object type matches objects / an array is not an object'],
-            $tests['type.json / array type matches arrays / an object is not an array']
-        );
+        $skip = [
+            'type.json / object type matches objects / an array is not an object',
+            'type.json / array type matches arrays / an object is not an array',
+        ];
 
-        return $tests;
+        foreach (parent::getValidForAssocTests() as $name => $testcase) {
+            if (in_array($name, $skip, true)) {
+                continue;
+            }
+            yield $name => $testcase;
+        }
     }
 
     /**
@@ -58,6 +128,7 @@ class Draft3Test extends BaseDraftTestCa
         return [
             // Optional
             'bignum.json',
+            'ecmascript-regex.json',
             'format.json',
             'jsregex.json',
             'zeroTerminatedFloats.json'
diff -pruN 6.4.1-1/tests/Drafts/Draft4Test.php 6.6.0-1/tests/Drafts/Draft4Test.php
--- 6.4.1-1/tests/Drafts/Draft4Test.php	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/tests/Drafts/Draft4Test.php	2025-10-10 11:34:09.000000000 +0000
@@ -1,20 +1,12 @@
 <?php
 
-/*
- * This file is part of the JsonSchema package.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+declare(strict_types=1);
 
 namespace JsonSchema\Tests\Drafts;
 
-/**
- * @package JsonSchema\Tests\Drafts
- */
 class Draft4Test extends BaseDraftTestCase
 {
-    protected $schemaSpec = 'http://json-schema.org/draft-04/schema#';
+    /** @var bool */
     protected $validateSchema = true;
 
     /**
@@ -23,31 +15,93 @@ class Draft4Test extends BaseDraftTestCa
     protected function getFilePaths(): array
     {
         return [
-            realpath(__DIR__ . $this->relativeTestsRoot . '/draft4'),
-            realpath(__DIR__ . $this->relativeTestsRoot . '/draft4/optional')
+            realpath(__DIR__ . self::RELATIVE_TESTS_ROOT . '/draft4'),
+            realpath(__DIR__ . self::RELATIVE_TESTS_ROOT . '/draft4/optional')
         ];
     }
 
-    public function getInvalidForAssocTests(): array
+    public function getInvalidTests(): \Generator
     {
-        $tests = parent::getInvalidForAssocTests();
-        unset(
-            $tests['type.json / object type matches objects / an array is not an object'],
-            $tests['type.json / array type matches arrays / an object is not an array']
-        );
+        $skip = [
+            'id.json / id inside an enum is not a real identifier / no match on enum or $ref to id',
+            'ref.json / $ref prevents a sibling id from changing the base uri / $ref resolves to /definitions/base_foo, data does not validate',
+            'ref.json / Recursive references between schemas / invalid tree',
+            'ref.json / refs with quote / object with strings is invalid',
+            'ref.json / Location-independent identifier / mismatch',
+            'ref.json / Location-independent identifier with base URI change in subschema / mismatch',
+            'ref.json / empty tokens in $ref json-pointer / non-number is invalid',
+            'ref.json / id must be resolved against nearest parent, not just immediate parent / non-number is invalid',
+            'refRemote.json / Location-independent identifier in remote ref / string is invalid',
+            'refRemote.json / base URI change - change folder / string is invalid'
+        ];
+
+        foreach (parent::getInvalidTests() as $name => $testcase) {
+            if (in_array($name, $skip, true)) {
+                continue;
+            }
+            yield $name => $testcase;
+        }
+    }
+
+    public function getInvalidForAssocTests(): \Generator
+    {
+        $skip = [
+            'ref.json / Recursive references between schemas / valid tree',
+            'type.json / object type matches objects / an array is not an object',
+            'type.json / array type matches arrays / an object is not an array',
+        ];
 
-        return $tests;
+        foreach (parent::getInvalidForAssocTests() as $name => $testcase) {
+            if (in_array($name, $skip, true)) {
+                continue;
+            }
+            yield $name => $testcase;
+        }
     }
 
-    public function getValidForAssocTests(): array
+    public function getValidTests(): \Generator
     {
-        $tests = parent::getValidForAssocTests();
-        unset(
-            $tests['type.json / object type matches objects / an array is not an object'],
-            $tests['type.json / array type matches arrays / an object is not an array']
-        );
+        $skip = [
+            'ref.json / $ref prevents a sibling id from changing the base uri / $ref resolves to /definitions/base_foo, data validates',
+            'ref.json / Recursive references between schemas / valid tree',
+            'ref.json / refs with quote / object with numbers is valid',
+            'ref.json / Location-independent identifier / match',
+            'ref.json / Location-independent identifier with base URI change in subschema / match',
+            'ref.json / empty tokens in $ref json-pointer / number is valid',
+            'ref.json / naive replacement of $ref with its destination is not correct / match the enum exactly',
+            'ref.json / id must be resolved against nearest parent, not just immediate parent / number is valid',
+            'refRemote.json / Location-independent identifier in remote ref / integer is valid',
+            'refRemote.json / base URI change - change folder / number is valid',
+        ];
+
+        if ($this->is32Bit()) {
+            $skip[] = 'multipleOf.json / small multiple of large integer / any integer is a multiple of 1e-8'; // Test case contains a number which doesn't fit in 32 bits
+        }
+
+        foreach (parent::getValidTests() as $name => $testcase) {
+            if (in_array($name, $skip, true)) {
+                continue;
+            }
+            yield $name => $testcase;
+        }
+    }
+
+    public function getValidForAssocTests(): \Generator
+    {
+        $skip = [
+            'minProperties.json / minProperties validation / ignores arrays',
+            'required.json / required properties whose names are Javascript object property names / ignores arrays',
+            'required.json / required validation / ignores arrays',
+            'type.json / object type matches objects / an array is not an object',
+            'type.json / array type matches arrays / an object is not an array',
+        ];
 
-        return $tests;
+        foreach (parent::getValidForAssocTests() as $name => $testcase) {
+            if (in_array($name, $skip, true)) {
+                continue;
+            }
+            yield $name => $testcase;
+        }
     }
 
     /**
@@ -58,7 +112,9 @@ class Draft4Test extends BaseDraftTestCa
         return [
             // Optional
             'bignum.json',
+            'ecmascript-regex.json',
             'format.json',
+            'float-overflow.json',
             'zeroTerminatedFloats.json',
             // Required
             'not.json' // only one test case failing
diff -pruN 6.4.1-1/tests/Entity/JsonPointerTest.php 6.6.0-1/tests/Entity/JsonPointerTest.php
--- 6.4.1-1/tests/Entity/JsonPointerTest.php	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/tests/Entity/JsonPointerTest.php	2025-10-10 11:34:09.000000000 +0000
@@ -2,24 +2,12 @@
 
 declare(strict_types=1);
 
-/*
- * This file is part of the JsonSchema package.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
 namespace JsonSchema\Tests\Entity;
 
 use JsonSchema\Entity\JsonPointer;
 use JsonSchema\Exception\InvalidArgumentException;
 use PHPUnit\Framework\TestCase;
 
-/**
- * @package JsonSchema\Tests\Entity
- *
- * @author Joost Nijhuis <jnijhuis81@gmail.com>
- */
 class JsonPointerTest extends TestCase
 {
     /**
diff -pruN 6.4.1-1/tests/Exception/InvalidArgumentExceptionTest.php 6.6.0-1/tests/Exception/InvalidArgumentExceptionTest.php
--- 6.4.1-1/tests/Exception/InvalidArgumentExceptionTest.php	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/tests/Exception/InvalidArgumentExceptionTest.php	2025-10-10 11:34:09.000000000 +0000
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace JsonSchema\Tests\Exception;
 
 use JsonSchema\Exception\InvalidArgumentException;
@@ -11,6 +13,6 @@ class InvalidArgumentExceptionTest exten
     {
         $exception = new InvalidArgumentException();
         self::assertInstanceOf('\InvalidArgumentException', $exception);
-        self::assertInstanceOf('\JsonSchema\Exception\ExceptionInterface', $exception);
+        self::assertInstanceOf(\JsonSchema\Exception\ExceptionInterface::class, $exception);
     }
 }
diff -pruN 6.4.1-1/tests/Exception/InvalidSchemaMediaTypeExceptionTest.php 6.6.0-1/tests/Exception/InvalidSchemaMediaTypeExceptionTest.php
--- 6.4.1-1/tests/Exception/InvalidSchemaMediaTypeExceptionTest.php	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/tests/Exception/InvalidSchemaMediaTypeExceptionTest.php	2025-10-10 11:34:09.000000000 +0000
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace JsonSchema\Tests\Exception;
 
 use JsonSchema\Exception\InvalidSchemaMediaTypeException;
@@ -11,7 +13,7 @@ class InvalidSchemaMediaTypeExceptionTes
     {
         $exception = new InvalidSchemaMediaTypeException();
         self::assertInstanceOf('\RuntimeException', $exception);
-        self::assertInstanceOf('\JsonSchema\Exception\RuntimeException', $exception);
-        self::assertInstanceOf('\JsonSchema\Exception\ExceptionInterface', $exception);
+        self::assertInstanceOf(\JsonSchema\Exception\RuntimeException::class, $exception);
+        self::assertInstanceOf(\JsonSchema\Exception\ExceptionInterface::class, $exception);
     }
 }
diff -pruN 6.4.1-1/tests/Exception/InvalidSourceUriExceptionTest.php 6.6.0-1/tests/Exception/InvalidSourceUriExceptionTest.php
--- 6.4.1-1/tests/Exception/InvalidSourceUriExceptionTest.php	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/tests/Exception/InvalidSourceUriExceptionTest.php	2025-10-10 11:34:09.000000000 +0000
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace JsonSchema\Tests\Exception;
 
 use JsonSchema\Exception\InvalidSourceUriException;
@@ -11,7 +13,7 @@ class InvalidSourceUriExceptionTest exte
     {
         $exception = new InvalidSourceUriException();
         self::assertInstanceOf('\InvalidArgumentException', $exception);
-        self::assertInstanceOf('\JsonSchema\Exception\InvalidArgumentException', $exception);
-        self::assertInstanceOf('\JsonSchema\Exception\ExceptionInterface', $exception);
+        self::assertInstanceOf(\JsonSchema\Exception\InvalidArgumentException::class, $exception);
+        self::assertInstanceOf(\JsonSchema\Exception\ExceptionInterface::class, $exception);
     }
 }
diff -pruN 6.4.1-1/tests/Exception/JsonDecodingExceptionTest.php 6.6.0-1/tests/Exception/JsonDecodingExceptionTest.php
--- 6.4.1-1/tests/Exception/JsonDecodingExceptionTest.php	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/tests/Exception/JsonDecodingExceptionTest.php	2025-10-10 11:34:09.000000000 +0000
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace JsonSchema\Tests\Exception;
 
 use JsonSchema\Exception\JsonDecodingException;
@@ -11,8 +13,8 @@ class JsonDecodingExceptionTest extends
     {
         $exception = new JsonDecodingException();
         self::assertInstanceOf('\RuntimeException', $exception);
-        self::assertInstanceOf('\JsonSchema\Exception\RuntimeException', $exception);
-        self::assertInstanceOf('\JsonSchema\Exception\ExceptionInterface', $exception);
+        self::assertInstanceOf(\JsonSchema\Exception\RuntimeException::class, $exception);
+        self::assertInstanceOf(\JsonSchema\Exception\ExceptionInterface::class, $exception);
     }
 
     public function testDefaultMessage()
diff -pruN 6.4.1-1/tests/Exception/ResourceNotFoundExceptionTest.php 6.6.0-1/tests/Exception/ResourceNotFoundExceptionTest.php
--- 6.4.1-1/tests/Exception/ResourceNotFoundExceptionTest.php	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/tests/Exception/ResourceNotFoundExceptionTest.php	2025-10-10 11:34:09.000000000 +0000
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace JsonSchema\Tests\Exception;
 
 use JsonSchema\Exception\ResourceNotFoundException;
@@ -11,7 +13,7 @@ class ResourceNotFoundExceptionTest exte
     {
         $exception = new ResourceNotFoundException();
         self::assertInstanceOf('\RuntimeException', $exception);
-        self::assertInstanceOf('\JsonSchema\Exception\RuntimeException', $exception);
-        self::assertInstanceOf('\JsonSchema\Exception\ExceptionInterface', $exception);
+        self::assertInstanceOf(\JsonSchema\Exception\RuntimeException::class, $exception);
+        self::assertInstanceOf(\JsonSchema\Exception\ExceptionInterface::class, $exception);
     }
 }
diff -pruN 6.4.1-1/tests/Exception/RuntimeExceptionTest.php 6.6.0-1/tests/Exception/RuntimeExceptionTest.php
--- 6.4.1-1/tests/Exception/RuntimeExceptionTest.php	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/tests/Exception/RuntimeExceptionTest.php	2025-10-10 11:34:09.000000000 +0000
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace JsonSchema\Tests\Exception;
 
 use JsonSchema\Exception\RuntimeException;
@@ -11,6 +13,6 @@ class RuntimeExceptionTest extends TestC
     {
         $exception = new RuntimeException();
         self::assertInstanceOf('\RuntimeException', $exception);
-        self::assertInstanceOf('\JsonSchema\Exception\ExceptionInterface', $exception);
+        self::assertInstanceOf(\JsonSchema\Exception\ExceptionInterface::class, $exception);
     }
 }
diff -pruN 6.4.1-1/tests/Exception/UnresolvableJsonPointerExceptionTest.php 6.6.0-1/tests/Exception/UnresolvableJsonPointerExceptionTest.php
--- 6.4.1-1/tests/Exception/UnresolvableJsonPointerExceptionTest.php	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/tests/Exception/UnresolvableJsonPointerExceptionTest.php	2025-10-10 11:34:09.000000000 +0000
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace JsonSchema\Tests\Exception;
 
 use JsonSchema\Exception\UnresolvableJsonPointerException;
@@ -11,7 +13,7 @@ class UnresolvableJsonPointerExceptionTe
     {
         $exception = new UnresolvableJsonPointerException();
         self::assertInstanceOf('\InvalidArgumentException', $exception);
-        self::assertInstanceOf('\JsonSchema\Exception\InvalidArgumentException', $exception);
-        self::assertInstanceOf('\JsonSchema\Exception\ExceptionInterface', $exception);
+        self::assertInstanceOf(\JsonSchema\Exception\InvalidArgumentException::class, $exception);
+        self::assertInstanceOf(\JsonSchema\Exception\ExceptionInterface::class, $exception);
     }
 }
diff -pruN 6.4.1-1/tests/Exception/UriResolverExceptionTest.php 6.6.0-1/tests/Exception/UriResolverExceptionTest.php
--- 6.4.1-1/tests/Exception/UriResolverExceptionTest.php	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/tests/Exception/UriResolverExceptionTest.php	2025-10-10 11:34:09.000000000 +0000
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace JsonSchema\Tests\Exception;
 
 use JsonSchema\Exception\UriResolverException;
@@ -11,7 +13,7 @@ class UriResolverExceptionTest extends T
     {
         $exception = new UriResolverException();
         self::assertInstanceOf('\RuntimeException', $exception);
-        self::assertInstanceOf('\JsonSchema\Exception\RuntimeException', $exception);
-        self::assertInstanceOf('\JsonSchema\Exception\ExceptionInterface', $exception);
+        self::assertInstanceOf(\JsonSchema\Exception\RuntimeException::class, $exception);
+        self::assertInstanceOf(\JsonSchema\Exception\ExceptionInterface::class, $exception);
     }
 }
diff -pruN 6.4.1-1/tests/Iterators/ObjectIteratorTest.php 6.6.0-1/tests/Iterators/ObjectIteratorTest.php
--- 6.4.1-1/tests/Iterators/ObjectIteratorTest.php	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/tests/Iterators/ObjectIteratorTest.php	2025-10-10 11:34:09.000000000 +0000
@@ -1,11 +1,6 @@
 <?php
 
-/*
- * This file is part of the JsonSchema package.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+declare(strict_types=1);
 
 namespace JsonSchema\Tests\Iterators;
 
@@ -39,7 +34,7 @@ class ObjectIteratorTest extends TestCas
     {
         $i = new ObjectIterator($this->testObject);
 
-        $this->assertInstanceOf('\JsonSchema\Iterator\ObjectIterator', $i);
+        $this->assertInstanceOf(\JsonSchema\Iterator\ObjectIterator::class, $i);
     }
 
     public function testInitialState(): void
diff -pruN 6.4.1-1/tests/JsonSchemaTestSuiteTest.php 6.6.0-1/tests/JsonSchemaTestSuiteTest.php
--- 6.4.1-1/tests/JsonSchemaTestSuiteTest.php	1970-01-01 00:00:00.000000000 +0000
+++ 6.6.0-1/tests/JsonSchemaTestSuiteTest.php	2025-10-10 11:34:09.000000000 +0000
@@ -0,0 +1,197 @@
+<?php
+
+declare(strict_types=1);
+
+namespace JsonSchema\Tests;
+
+use CallbackFilterIterator;
+use JsonSchema\Constraints\Constraint;
+use JsonSchema\Constraints\Factory;
+use JsonSchema\SchemaStorage;
+use JsonSchema\SchemaStorageInterface;
+use JsonSchema\Validator;
+use PHPUnit\Framework\TestCase;
+use RecursiveDirectoryIterator;
+use RecursiveIteratorIterator;
+
+class JsonSchemaTestSuiteTest extends TestCase
+{
+    /**
+     * @dataProvider casesDataProvider
+     *
+     * @param \stdClass|bool $schema
+     * @param mixed          $data
+     */
+    public function testTestCaseValidatesCorrectly(
+        string $testCaseDescription,
+        string $testDescription,
+        $schema,
+        $data,
+        int $checkMode,
+        bool $expectedValidationResult,
+        bool $optional
+    ): void {
+        $schemaStorage = new SchemaStorage();
+        $id = is_object($schema) && property_exists($schema, 'id') ? $schema->id : SchemaStorage::INTERNAL_PROVIDED_SCHEMA_URI;
+        $schemaStorage->addSchema($id, $schema);
+        $this->loadRemotesIntoStorage($schemaStorage);
+        $validator = new Validator(new Factory($schemaStorage));
+
+        try {
+            $validator->validate($data, $schema, $checkMode);
+        } catch (\Exception $e) {
+            if ($optional) {
+                $this->markTestSkipped('Optional test case throws exception during validate() invocation: "' . $e->getMessage() . '"');
+            }
+
+            throw $e;
+        }
+
+        if ($optional && $expectedValidationResult !== (count($validator->getErrors()) === 0)) {
+            $this->markTestSkipped('Optional test case would fail');
+        }
+
+        self::assertEquals(
+            $expectedValidationResult,
+            count($validator->getErrors()) === 0,
+            $expectedValidationResult ? print_r($validator->getErrors(), true) : 'Validator returned valid but the testcase indicates it is invalid'
+        );
+    }
+
+    public function casesDataProvider(): \Generator
+    {
+        $testDir = __DIR__ . '/../vendor/json-schema/json-schema-test-suite/tests';
+        $drafts = array_filter(glob($testDir . '/*'), static function (string $filename) {
+            return is_dir($filename);
+        });
+        $skippedDrafts = ['draft7', 'draft2019-09', 'draft2020-12', 'draft-next', 'latest'];
+
+        foreach ($drafts as $draft) {
+            if (in_array(basename($draft), $skippedDrafts, true)) {
+                continue;
+            }
+
+            $files = new CallbackFilterIterator(
+                new RecursiveIteratorIterator(
+                    new RecursiveDirectoryIterator($draft)
+                ),
+                function ($file) {
+                    return $file->isFile() && strtolower($file->getExtension()) === 'json';
+                }
+            );
+            /** @var \SplFileInfo $file */
+            foreach ($files as $file) {
+                $contents = json_decode(file_get_contents($file->getPathname()), false);
+                foreach ($contents as $testCase) {
+                    foreach ($testCase->tests as $test) {
+                        $name = sprintf(
+                            '[%s/%s%s]: %s: %s is expected to be %s',
+                            basename($draft),
+                            str_contains($file->getPathname(), '/optional/') ? 'optional/' : '',
+                            $file->getBasename(),
+                            $testCase->description,
+                            $test->description,
+                            $test->valid ? 'valid' : 'invalid'
+                        );
+
+                        if ($this->shouldNotYieldTest($name)) {
+                            continue;
+                        }
+
+                        yield $name => [
+                            'testCaseDescription' => $testCase->description,
+                            'testDescription' => $test->description,
+                            'schema' => $testCase->schema,
+                            'data' => $test->data,
+                            'checkMode' => $this->getCheckModeForDraft($baseDraftName),
+                            'expectedValidationResult' => $test->valid,
+                            'optional' => str_contains($file->getPathname(), '/optional/')
+                        ];
+                    }
+                }
+            }
+        }
+    }
+
+    private function loadRemotesIntoStorage(SchemaStorageInterface $storage): void
+    {
+        $remotesDir = __DIR__ . '/../vendor/json-schema/json-schema-test-suite/remotes';
+
+        $directory = new \RecursiveDirectoryIterator($remotesDir);
+        $iterator = new \RecursiveIteratorIterator($directory);
+
+        foreach ($iterator as $info) {
+            if (!$info->isFile()) {
+                continue;
+            }
+
+            $id = str_replace($remotesDir, 'http://localhost:1234', $info->getPathname());
+            $storage->addSchema($id, json_decode(file_get_contents($info->getPathname()), false));
+        }
+    }
+
+    private function shouldNotYieldTest(string $name): bool
+    {
+        $skip = [
+            '[draft4/ref.json]: refs with quote: object with numbers is valid is expected to be valid', // Test case was added after v1.2.0, skip test for now.
+            '[draft4/ref.json]: refs with quote: object with strings is invalid is expected to be invalid', // Test case was added after v1.2.0, skip test for now.
+            '[draft4/ref.json]: Location-independent identifier: match is expected to be valid', // Test case was added after v1.2.0, skip test for now.
+            '[draft4/ref.json]: Location-independent identifier: mismatch is expected to be invalid', // Test case was added after v1.2.0, skip test for now.
+            '[draft4/ref.json]: Location-independent identifier with base URI change in subschema: match is expected to be valid', // Test case was added after v1.2.0, skip test for now.
+            '[draft4/ref.json]: Location-independent identifier with base URI change in subschema: mismatch is expected to be invalid', // Test case was added after v1.2.0, skip test for now.
+            '[draft4/ref.json]: id must be resolved against nearest parent, not just immediate parent: number is valid is expected to be valid', // Test case was added after v1.2.0, skip test for now.
+            '[draft4/ref.json]: id must be resolved against nearest parent, not just immediate parent: non-number is invalid is expected to be invalid', // Test case was added after v1.2.0, skip test for now.
+            '[draft4/ref.json]: empty tokens in $ref json-pointer: number is valid is expected to be valid', // Test case was added after v1.2.0, skip test for now.
+            '[draft4/ref.json]: empty tokens in $ref json-pointer: non-number is invalid is expected to be invalid', // Test case was added after v1.2.0, skip test for now.
+            '[draft4/refRemote.json]: base URI change - change folder: number is valid is expected to be valid', // Test case was added after v1.2.0, skip test for now.
+            '[draft4/refRemote.json]: base URI change - change folder: string is invalid is expected to be invalid', // Test case was added after v1.2.0, skip test for now.
+            '[draft4/refRemote.json]: Location-independent identifier in remote ref: integer is valid is expected to be valid', // Test case was added after v1.2.0, skip test for now.
+            '[draft4/refRemote.json]: Location-independent identifier in remote ref: string is invalid is expected to be invalid', // Test case was added after v1.2.0, skip test for now.
+            '[draft6/ref.json]: Location-independent identifier with base URI change in subschema: mismatch is expected to be invalid', // Test case was added after v1.2.0, skip test for now.
+            '[draft6/ref.json]: Location-independent identifier: mismatch is expected to be invalid', // Same test case is skipped for draft4, skip for now as well.
+            '[draft6/ref.json]: refs with quote: object with strings is invalid is expected to be invalid', // Same test case is skipped for draft4, skip for now as well.
+            '[draft6/ref.json]: empty tokens in $ref json-pointer: non-number is invalid is expected to be invalid', // Same test case is skipped for draft4, skip for now as well.
+            '[draft6/refRemote.json]: base URI change - change folder: string is invalid is expected to be invalid', // Same test case is skipped for draft4, skip for now as well.
+            '[draft6/refRemote.json]: Location-independent identifier in remote ref: string is invalid is expected to be invalid', // Same test case is skipped for draft4, skip for now as well.
+            // Skipping complex edge cases for now
+            '[draft6/unknownKeyword.json]: $id inside an unknown keyword is not a real identifier: type matches second anyOf, which has a real schema in it is expected to be valid',
+            '[draft6/unknownKeyword.json]: $id inside an unknown keyword is not a real identifier: type matches non-schema in third anyOf is expected to be invalid',
+            '[draft6/refRemote.json]: $ref to $ref finds location-independent $id: non-number is invalid is expected to be invalid',
+            '[draft6/ref.json]: ref overrides any sibling keywords: ref valid, maxItems ignored is expected to be valid',
+            '[draft6/ref.json]: Reference an anchor with a non-relative URI: mismatch is expected to be invalid',
+            '[draft6/ref.json]: refs with relative uris and defs: invalid on inner field is expected to be invalid',
+            '[draft6/ref.json]: refs with relative uris and defs: invalid on outer field is expected to be invalid',
+            '[draft6/ref.json]: relative refs with absolute uris and defs: invalid on inner field is expected to be invalid',
+            '[draft6/ref.json]: relative refs with absolute uris and defs: invalid on outer field is expected to be invalid',
+            '[draft6/ref.json]: simple URN base URI with JSON pointer: a non-string is invalid is expected to be invalid',
+            '[draft6/ref.json]: URN base URI with NSS: a non-string is invalid is expected to be invalid',
+            '[draft6/ref.json]: URN base URI with r-component: a non-string is invalid is expected to be invalid',
+            '[draft6/ref.json]: URN base URI with q-component: a non-string is invalid is expected to be invalid',
+            '[draft6/ref.json]: URN base URI with URN and anchor ref: a non-string is invalid is expected to be invalid',
+        ];
+
+        if ($this->is32Bit()) {
+            $skip[] = '[draft4/multipleOf.json]: small multiple of large integer: any integer is a multiple of 1e-8 is expected to be valid'; // Test case contains a number which doesn't fit in 32 bits
+        }
+
+        return in_array($name, $skip, true);
+    }
+
+    private function is32Bit(): bool
+    {
+        return PHP_INT_SIZE === 4;
+    }
+
+    /**
+     * @phpstan-return int-mask-of<Validator::ERROR_*>
+     */
+    private function getCheckModeForDraft(string $draft): int
+    {
+        switch ($draft) {
+            case 'draft6':
+                return Constraint::CHECK_MODE_NORMAL | Constraint::CHECK_MODE_STRICT;
+            default:
+                return Constraint::CHECK_MODE_NORMAL;
+        }
+    }
+}
diff -pruN 6.4.1-1/tests/RefTest.php 6.6.0-1/tests/RefTest.php
--- 6.4.1-1/tests/RefTest.php	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/tests/RefTest.php	2025-10-10 11:34:09.000000000 +0000
@@ -1,11 +1,6 @@
 <?php
 
-/*
- * This file is part of the JsonSchema package.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+declare(strict_types=1);
 
 namespace JsonSchema\Tests;
 
@@ -56,7 +51,7 @@ class RefTest extends TestCase
                 }',
                 '{"propertyOne": 5}',
                 true,
-                '\JsonSchema\Exception\UnresolvableJsonPointerException'
+                \JsonSchema\Exception\UnresolvableJsonPointerException::class
             ]
         ];
     }
diff -pruN 6.4.1-1/tests/SchemaStorageTest.php 6.6.0-1/tests/SchemaStorageTest.php
--- 6.4.1-1/tests/SchemaStorageTest.php	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/tests/SchemaStorageTest.php	2025-10-10 11:34:09.000000000 +0000
@@ -1,14 +1,10 @@
 <?php
 
-/*
- * This file is part of the JsonSchema package.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+declare(strict_types=1);
 
 namespace JsonSchema\Tests;
 
+use JsonSchema\DraftIdentifiers;
 use JsonSchema\SchemaStorage;
 use JsonSchema\Uri\UriRetriever;
 use JsonSchema\Validator;
@@ -21,7 +17,7 @@ class SchemaStorageTest extends TestCase
         $mainSchema = $this->getMainSchema();
         $mainSchemaPath = 'http://www.example.com/schema.json';
 
-        $uriRetriever = $this->prophesize('JsonSchema\UriRetrieverInterface');
+        $uriRetriever = $this->prophesize(\JsonSchema\UriRetrieverInterface::class);
         $uriRetriever->retrieve($mainSchemaPath)->willReturn($mainSchema)->shouldBeCalled();
 
         $schemaStorage = new SchemaStorage($uriRetriever->reveal());
@@ -55,7 +51,7 @@ class SchemaStorageTest extends TestCase
         $schema3Path = 'http://www.my-domain.com/schema3.json';
 
         /** @var UriRetriever $uriRetriever */
-        $uriRetriever = $this->prophesize('JsonSchema\UriRetrieverInterface');
+        $uriRetriever = $this->prophesize(\JsonSchema\UriRetrieverInterface::class);
         $uriRetriever->retrieve($mainSchemaPath)->willReturn($mainSchema)->shouldBeCalled();
         $uriRetriever->retrieve($schema2Path)->willReturn($schema2)->shouldBeCalled();
         $uriRetriever->retrieve($schema3Path)->willReturn($schema3)->shouldBeCalled();
@@ -102,13 +98,13 @@ class SchemaStorageTest extends TestCase
 
     public function testUnresolvableJsonPointExceptionShouldBeThrown(): void
     {
-        $this->expectException('JsonSchema\Exception\UnresolvableJsonPointerException');
+        $this->expectException(\JsonSchema\Exception\UnresolvableJsonPointerException::class);
         $this->expectExceptionMessage('File: http://www.example.com/schema.json is found, but could not resolve fragment: #/definitions/car');
 
         $mainSchema = $this->getInvalidSchema();
         $mainSchemaPath = 'http://www.example.com/schema.json';
 
-        $uriRetriever = $this->prophesize('JsonSchema\UriRetrieverInterface');
+        $uriRetriever = $this->prophesize(\JsonSchema\UriRetrieverInterface::class);
         $uriRetriever->retrieve($mainSchemaPath)
             ->willReturn($mainSchema)
             ->shouldBeCalled();
@@ -119,7 +115,7 @@ class SchemaStorageTest extends TestCase
 
     public function testResolveRefWithNoAssociatedFileName(): void
     {
-        $this->expectException('JsonSchema\Exception\UnresolvableJsonPointerException');
+        $this->expectException(\JsonSchema\Exception\UnresolvableJsonPointerException::class);
         $this->expectExceptionMessage("Could not resolve fragment '#': no file is defined");
 
         $schemaStorage = new SchemaStorage();
@@ -130,7 +126,7 @@ class SchemaStorageTest extends TestCase
     {
         return (object) [
             'version' => 'v1',
-            '$schema' => 'http://json-schema.org/draft-04/schema#',
+            '$schema' => DraftIdentifiers::DRAFT_4,
             'id' => 'http://www.example.com/schema.json',
             'type' => 'object',
             'additionalProperties' => true,
@@ -189,7 +185,7 @@ class SchemaStorageTest extends TestCase
     {
         return (object) [
             'version' => 'v1',
-            '$schema' => 'http://json-schema.org/draft-04/schema#',
+            '$schema' => DraftIdentifiers::DRAFT_4,
             'id' => 'http://www.my-domain.com/schema2.json',
             'definitions' => (object) [
                 'car' => (object) [
@@ -216,7 +212,7 @@ class SchemaStorageTest extends TestCase
     {
         return (object) [
             'version' => 'v1',
-            '$schema' => 'http://json-schema.org/draft-04/schema#',
+            '$schema' => DraftIdentifiers::DRAFT_4,
             'title' => 'wheel',
             'wheel' => (object) [
                 'properties' => (object) [
@@ -238,7 +234,7 @@ class SchemaStorageTest extends TestCase
     {
         return (object) [
             'version' => 'v1',
-            '$schema' => 'http://json-schema.org/draft-04/schema#',
+            '$schema' => DraftIdentifiers::DRAFT_4,
             'type' => 'object',
             'properties' => (object) [
                 'spokes' => (object) [
@@ -263,24 +259,24 @@ class SchemaStorageTest extends TestCase
     public function testGetUriRetriever(): void
     {
         $s = new SchemaStorage();
-        $s->addSchema('http://json-schema.org/draft-04/schema#');
-        $this->assertInstanceOf('\JsonSchema\Uri\UriRetriever', $s->getUriRetriever());
+        $s->addSchema(DraftIdentifiers::DRAFT_4);
+        $this->assertInstanceOf(\JsonSchema\Uri\UriRetriever::class, $s->getUriRetriever());
     }
 
     public function testGetUriResolver(): void
     {
         $s = new SchemaStorage();
-        $s->addSchema('http://json-schema.org/draft-04/schema#');
-        $this->assertInstanceOf('\JsonSchema\Uri\UriResolver', $s->getUriResolver());
+        $s->addSchema(DraftIdentifiers::DRAFT_4);
+        $this->assertInstanceOf(\JsonSchema\Uri\UriResolver::class, $s->getUriResolver());
     }
 
     public function testMetaSchemaFixes(): void
     {
         $s = new SchemaStorage();
-        $s->addSchema('http://json-schema.org/draft-03/schema#');
-        $s->addSchema('http://json-schema.org/draft-04/schema#');
-        $draft_03 = $s->getSchema('http://json-schema.org/draft-03/schema#');
-        $draft_04 = $s->getSchema('http://json-schema.org/draft-04/schema#');
+        $s->addSchema(DraftIdentifiers::DRAFT_3);
+        $s->addSchema(DraftIdentifiers::DRAFT_4);
+        $draft_03 = $s->getSchema(DraftIdentifiers::DRAFT_3);
+        $draft_04 = $s->getSchema(DraftIdentifiers::DRAFT_4);
 
         $this->assertEquals('uri-reference', $draft_03->properties->id->format);
         $this->assertEquals('uri-reference', $draft_03->properties->{'$ref'}->format);
@@ -291,15 +287,17 @@ class SchemaStorageTest extends TestCase
     {
         $schemaOne = json_decode('{"id": "test/schema", "$ref": "../test2/schema2"}');
 
-        $uriRetriever = $this->prophesize('JsonSchema\UriRetrieverInterface');
+        $uriRetriever = $this->prophesize(\JsonSchema\UriRetrieverInterface::class);
         $uriRetriever->retrieve('test/schema')->willReturn($schemaOne)->shouldBeCalled();
 
         $s = new SchemaStorage($uriRetriever->reveal());
-        $schema = $s->addSchema('test/schema');
+        $s->addSchema('test/schema');
 
         $r = new \ReflectionObject($s);
         $p = $r->getProperty('schemas');
-        $p->setAccessible(true);
+        if (PHP_VERSION_ID < 80100) {
+            $p->setAccessible(true);
+        }
         $schemas = $p->getValue($s);
 
         $this->assertEquals(
diff -pruN 6.4.1-1/tests/Tool/Validator/RelativeReferenceValidatorTest.php 6.6.0-1/tests/Tool/Validator/RelativeReferenceValidatorTest.php
--- 6.4.1-1/tests/Tool/Validator/RelativeReferenceValidatorTest.php	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/tests/Tool/Validator/RelativeReferenceValidatorTest.php	2025-10-10 11:34:09.000000000 +0000
@@ -2,7 +2,7 @@
 
 declare(strict_types=1);
 
-namespace Tool\Validator;
+namespace JsonSchema\Tests\Tool\Validator;
 
 use JsonSchema\Tool\Validator\RelativeReferenceValidator;
 use PHPUnit\Framework\TestCase;
diff -pruN 6.4.1-1/tests/Tool/Validator/UriValidatorTest.php 6.6.0-1/tests/Tool/Validator/UriValidatorTest.php
--- 6.4.1-1/tests/Tool/Validator/UriValidatorTest.php	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/tests/Tool/Validator/UriValidatorTest.php	2025-10-10 11:34:09.000000000 +0000
@@ -2,7 +2,7 @@
 
 declare(strict_types=1);
 
-namespace Tool\Validator;
+namespace JsonSchema\Tests\Tool\Validator;
 
 use JsonSchema\Tool\Validator\UriValidator;
 use PHPUnit\Framework\TestCase;
diff -pruN 6.4.1-1/tests/Uri/Retrievers/CurlTest.php 6.6.0-1/tests/Uri/Retrievers/CurlTest.php
--- 6.4.1-1/tests/Uri/Retrievers/CurlTest.php	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/tests/Uri/Retrievers/CurlTest.php	2025-10-10 11:34:09.000000000 +0000
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace JsonSchema\Tests\Uri\Retrievers
 {
     use JsonSchema\Uri\Retrievers\Curl;
@@ -19,7 +21,7 @@ namespace JsonSchema\Tests\Uri\Retriever
         {
             $c = new Curl();
 
-            $this->expectException('\JsonSchema\Exception\ResourceNotFoundException');
+            $this->expectException(\JsonSchema\Exception\ResourceNotFoundException::class);
             $this->expectExceptionMessage('JSON schema not found');
 
             $c->retrieve(__DIR__ . '/notARealFile');
diff -pruN 6.4.1-1/tests/Uri/Retrievers/FileGetContentsTest.php 6.6.0-1/tests/Uri/Retrievers/FileGetContentsTest.php
--- 6.4.1-1/tests/Uri/Retrievers/FileGetContentsTest.php	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/tests/Uri/Retrievers/FileGetContentsTest.php	2025-10-10 11:34:09.000000000 +0000
@@ -1,13 +1,12 @@
 <?php
 
+declare(strict_types=1);
+
 namespace JsonSchema\Tests\Uri\Retrievers;
 
 use JsonSchema\Uri\Retrievers\FileGetContents;
 use PHPUnit\Framework\TestCase;
 
-/**
- * @group FileGetContents
- */
 class FileGetContentsTest extends TestCase
 {
     public function testFetchMissingFile(): void
@@ -32,7 +31,9 @@ class FileGetContentsTest extends TestCa
 
         $reflector = new \ReflectionObject($res);
         $fetchContentType = $reflector->getMethod('fetchContentType');
-        $fetchContentType->setAccessible(true);
+        if (PHP_VERSION_ID < 80100) {
+            $fetchContentType->setAccessible(true);
+        }
 
         $this->assertTrue($fetchContentType->invoke($res, ['Content-Type: application/json']));
         $this->assertFalse($fetchContentType->invoke($res, ['X-Some-Header: whateverValue']));
diff -pruN 6.4.1-1/tests/Uri/Retrievers/PredefinedArrayTest.php 6.6.0-1/tests/Uri/Retrievers/PredefinedArrayTest.php
--- 6.4.1-1/tests/Uri/Retrievers/PredefinedArrayTest.php	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/tests/Uri/Retrievers/PredefinedArrayTest.php	2025-10-10 11:34:09.000000000 +0000
@@ -1,13 +1,12 @@
 <?php
 
+declare(strict_types=1);
+
 namespace JsonSchema\Tests\Uri\Retrievers;
 
 use JsonSchema\Uri\Retrievers\PredefinedArray;
 use PHPUnit\Framework\TestCase;
 
-/**
- * @group PredefinedArray
- */
 class PredefinedArrayTest extends TestCase
 {
     private $retriever;
diff -pruN 6.4.1-1/tests/Uri/UriResolverTest.php 6.6.0-1/tests/Uri/UriResolverTest.php
--- 6.4.1-1/tests/Uri/UriResolverTest.php	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/tests/Uri/UriResolverTest.php	2025-10-10 11:34:09.000000000 +0000
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace JsonSchema\Tests\Uri;
 
 use JsonSchema\Uri\UriResolver;
diff -pruN 6.4.1-1/tests/Uri/UriRetrieverTest.php 6.6.0-1/tests/Uri/UriRetrieverTest.php
--- 6.4.1-1/tests/Uri/UriRetrieverTest.php	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/tests/Uri/UriRetrieverTest.php	2025-10-10 11:34:09.000000000 +0000
@@ -1,14 +1,10 @@
 <?php
 
-/*
- * This file is part of the JsonSchema package.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+declare(strict_types=1);
 
 namespace JsonSchema\Tests\Uri;
 
+use JsonSchema\DraftIdentifiers;
 use JsonSchema\Exception\InvalidSchemaMediaTypeException;
 use JsonSchema\Exception\JsonDecodingException;
 use JsonSchema\Exception\ResourceNotFoundException;
@@ -17,9 +13,6 @@ use JsonSchema\Uri\UriRetriever;
 use JsonSchema\Validator;
 use PHPUnit\Framework\TestCase;
 
-/**
- * @group UriRetriever
- */
 class UriRetrieverTest extends TestCase
 {
     protected $validator;
@@ -37,7 +30,7 @@ class UriRetrieverTest extends TestCase
             throw new JsonDecodingException($error);
         }
 
-        $retriever = $this->createMock('JsonSchema\Uri\UriRetriever');
+        $retriever = $this->createMock(\JsonSchema\Uri\UriRetriever::class);
 
         $retriever->expects($this->at(0))
                   ->method('retrieve')
@@ -235,7 +228,7 @@ EOF;
 
     public function testConfirmMediaTypeAcceptsJsonSchemaType(): void
     {
-        $uriRetriever = $this->createMock('JsonSchema\Uri\Retrievers\UriRetrieverInterface');
+        $uriRetriever = $this->createMock(\JsonSchema\Uri\Retrievers\UriRetrieverInterface::class);
         $retriever = new UriRetriever();
 
         $uriRetriever->expects($this->at(0))
@@ -247,7 +240,7 @@ EOF;
 
     public function testConfirmMediaTypeAcceptsJsonType(): void
     {
-        $uriRetriever = $this->createMock('JsonSchema\Uri\Retrievers\UriRetrieverInterface');
+        $uriRetriever = $this->createMock(\JsonSchema\Uri\Retrievers\UriRetrieverInterface::class);
         $retriever = new UriRetriever();
 
         $uriRetriever->expects($this->at(0))
@@ -259,7 +252,7 @@ EOF;
 
     public function testConfirmMediaTypeThrowsExceptionForUnsupportedTypes(): void
     {
-        $uriRetriever = $this->createMock('JsonSchema\Uri\Retrievers\UriRetrieverInterface');
+        $uriRetriever = $this->createMock(\JsonSchema\Uri\Retrievers\UriRetrieverInterface::class);
         $retriever = new UriRetriever();
         $uriRetriever->expects($this->at(0))
                 ->method('getContentType')
@@ -274,12 +267,16 @@ EOF;
     {
         $retrieverMock = $this->getRetrieverMock($schema);
 
-        $factory = new \ReflectionProperty('JsonSchema\Constraints\BaseConstraint', 'factory');
-        $factory->setAccessible(true);
+        $factory = new \ReflectionProperty(\JsonSchema\Constraints\BaseConstraint::class, 'factory');
+        if (PHP_VERSION_ID < 80100) {
+            $factory->setAccessible(true);
+        }
         $factory = $factory->getValue($this->validator);
 
-        $retriever = new \ReflectionProperty('JsonSchema\Constraints\Factory', 'uriRetriever');
-        $retriever->setAccessible(true);
+        $retriever = new \ReflectionProperty(\JsonSchema\Constraints\Factory::class, 'uriRetriever');
+        if (PHP_VERSION_ID < 80100) {
+            $retriever->setAccessible(true);
+        }
         $retriever->setValue($factory, $retrieverMock);
     }
 
@@ -310,12 +307,12 @@ EOF;
 
         $this->assertEquals(
             $root . 'json-schema-draft-03.json',
-            $retriever->translate('http://json-schema.org/draft-03/schema#')
+            $retriever->translate(DraftIdentifiers::DRAFT_3)
         );
 
         $this->assertEquals(
             $root . 'json-schema-draft-04.json',
-            $retriever->translate('http://json-schema.org/draft-04/schema#')
+            $retriever->translate(DraftIdentifiers::DRAFT_4)
         );
     }
 
@@ -333,7 +330,7 @@ EOF;
 
     public function testInvalidContentTypeEndpointsDefault(): void
     {
-        $mock = $this->createMock('JsonSchema\Uri\Retrievers\UriRetrieverInterface');
+        $mock = $this->createMock(\JsonSchema\Uri\Retrievers\UriRetrieverInterface::class);
         $mock->method('getContentType')->willReturn('Application/X-Fake-Type');
         $retriever = new UriRetriever();
 
@@ -343,7 +340,7 @@ EOF;
 
     public function testInvalidContentTypeEndpointsUnknown(): void
     {
-        $mock = $this->createMock('JsonSchema\Uri\Retrievers\UriRetrieverInterface');
+        $mock = $this->createMock(\JsonSchema\Uri\Retrievers\UriRetrieverInterface::class);
         $mock->method('getContentType')->willReturn('Application/X-Fake-Type');
         $retriever = new UriRetriever();
 
@@ -353,7 +350,7 @@ EOF;
 
     public function testInvalidContentTypeEndpointsAdded(): void
     {
-        $mock = $this->createMock('JsonSchema\Uri\Retrievers\UriRetrieverInterface');
+        $mock = $this->createMock(\JsonSchema\Uri\Retrievers\UriRetrieverInterface::class);
         $mock->method('getContentType')->willReturn('Application/X-Fake-Type');
         $retriever = new UriRetriever();
         $retriever->addInvalidContentTypeEndpoint('http://example.com');
@@ -370,12 +367,16 @@ EOF;
 
         // inject a schema cache value
         $schemaCache = $reflector->getProperty('schemaCache');
-        $schemaCache->setAccessible(true);
+        if (PHP_VERSION_ID < 80100) {
+            $schemaCache->setAccessible(true);
+        }
         $schemaCache->setValue($retriever, ['local://test/uri' => 'testSchemaValue']);
 
         // retrieve from schema cache
         $loadSchema = $reflector->getMethod('loadSchema');
-        $loadSchema->setAccessible(true);
+        if (PHP_VERSION_ID < 80100) {
+            $loadSchema->setAccessible(true);
+        }
         $this->assertEquals(
             'testSchemaValue',
             $loadSchema->invoke($retriever, 'local://test/uri')
@@ -386,7 +387,7 @@ EOF;
     {
         $retriever = new UriRetriever();
 
-        $this->expectException('JsonSchema\Exception\JsonDecodingException');
+        $this->expectException(\JsonSchema\Exception\JsonDecodingException::class);
         $this->expectExceptionMessage('JSON syntax is malformed');
 
         $retriever->retrieve('package://tests/fixtures/bad-syntax.json');
diff -pruN 6.4.1-1/tests/ValidatorTest.php 6.6.0-1/tests/ValidatorTest.php
--- 6.4.1-1/tests/ValidatorTest.php	2025-04-04 13:08:07.000000000 +0000
+++ 6.6.0-1/tests/ValidatorTest.php	2025-10-10 11:34:09.000000000 +0000
@@ -1,7 +1,12 @@
 <?php
 
+declare(strict_types=1);
+
 namespace JsonSchema\Tests;
 
+use JsonSchema\Constraints\Constraint;
+use JsonSchema\Constraints\Factory;
+use JsonSchema\DraftIdentifiers;
 use JsonSchema\Exception\InvalidArgumentException;
 use JsonSchema\Validator;
 use PHPUnit\Framework\TestCase;
@@ -62,4 +67,31 @@ class ValidatorTest extends TestCase
 
         $this->assertTrue($validator->isValid(), 'Validation failed, but should have succeeded.');
     }
+
+    /** @dataProvider draftIdentifiersNotSupportedForStrictMode */
+    public function testItThrowsForStrictValidationOnDraft(DraftIdentifiers $draft): void
+    {
+        $data = json_decode('"42"', false);
+        $schema = json_decode('{"type":"integer"}', false);
+        $factory = new Factory(null, null, Constraint::CHECK_MODE_NORMAL | Constraint::CHECK_MODE_STRICT);
+        $factory->setDefaultDialect($draft->getValue());
+        $validator = new Validator($factory);
+
+        $this->expectException(InvalidArgumentException::class);
+        $this->expectExceptionMessage('Unknown constraint ' . $draft->toConstraintName());
+
+        $validator->validate($data, $schema);
+    }
+
+    public function draftIdentifiersNotSupportedForStrictMode(): \Generator
+    {
+        foreach (DraftIdentifiers::getEnumerators() as $draft) {
+            switch ($draft) {
+                case DraftIdentifiers::DRAFT_6():
+                    break;
+                default:
+                    yield $draft->toConstraintName() => [$draft];
+            }
+        }
+    }
 }
