44
55namespace JsonSchema \Tests ;
66
7+ use CallbackFilterIterator ;
78use JsonSchema \Constraints \Factory ;
89use JsonSchema \SchemaStorage ;
910use JsonSchema \SchemaStorageInterface ;
1011use JsonSchema \Validator ;
1112use PHPUnit \Framework \TestCase ;
13+ use RecursiveDirectoryIterator ;
14+ use RecursiveIteratorIterator ;
1215
1316class JsonSchemaTestSuite extends TestCase
1417{
@@ -33,28 +36,53 @@ public function testIt(
3336 self ::assertEquals ($ expectedValidationResult , count ($ validator ->getErrors ()) === 0 );
3437 }
3538
39+ public function testItOnce (): void
40+ {
41+ $ schema = json_decode ('{ "required": ["__proto__", "toString", "constructor"] } ' , false );
42+ $ data = [];
43+
44+ $ schemaStorage = new SchemaStorage ();
45+ $ schemaStorage ->addSchema (SchemaStorage::INTERNAL_PROVIDED_SCHEMA_URI , $ schema );
46+ $ this ->loadRemotesIntoStorage ($ schemaStorage );
47+ $ validator = new Validator (new Factory ($ schemaStorage ));
48+
49+ $ result = $ validator ->validate ($ data , $ schema );
50+
51+ self ::assertEquals (true , count ($ validator ->getErrors ()) === 0 );
52+ }
53+
54+
3655 public function casesDataProvider (): \Generator
3756 {
3857 $ testDir = __DIR__ . '/../vendor/json-schema/json-schema-test-suite/tests ' ;
3958 $ drafts = array_filter (glob ($ testDir . '/* ' ), static function (string $ filename ) {
4059 return is_dir ($ filename );
4160 });
42- $ skippedDrafts = ['draft4 ' , 'draft6 ' , 'draft7 ' , 'draft2019-09 ' , 'draft2020-12 ' , 'draft-next ' , 'latest ' ];
61+ $ skippedDrafts = ['draft3 ' , 'draft6 ' , 'draft7 ' , 'draft2019-09 ' , 'draft2020-12 ' , 'draft-next ' , 'latest ' ];
4362
4463 foreach ($ drafts as $ draft ) {
45- $ files = glob ($ draft . '/*.json ' );
4664 if (in_array (basename ($ draft ), $ skippedDrafts , true )) {
4765 continue ;
4866 }
4967
68+ $ files = new CallbackFilterIterator (
69+ new RecursiveIteratorIterator (
70+ new RecursiveDirectoryIterator ($ draft )
71+ ),
72+ function ($ file ) {
73+ return $ file ->isFile () && strtolower ($ file ->getExtension ()) === 'json ' ;
74+ }
75+ );
76+ /** @var \SplFileInfo $file */
5077 foreach ($ files as $ file ) {
51- $ contents = json_decode (file_get_contents ($ file ), false );
78+ $ contents = json_decode (file_get_contents ($ file-> getPathname () ), false );
5279 foreach ($ contents as $ testCase ) {
5380 foreach ($ testCase ->tests as $ test ) {
5481 $ name = sprintf (
55- '[%s/%s]: %s: %s is expected to be %s ' ,
82+ '[%s/%s%s ]: %s: %s is expected to be %s ' ,
5683 basename ($ draft ),
57- basename ($ file ),
84+ str_contains ($ file ->getPathname (), 'optional ' ) ? 'optional/ ' : '' ,
85+ $ file ->getBasename (),
5886 $ testCase ->description ,
5987 $ test ->description ,
6088 $ test ->valid ? 'valid ' : 'invalid ' ,
0 commit comments