getMessage(), $e->getFile(), $e->getLine() ); } $file = __DIR__ . '/compliance/' . $file . '.json'; $failure .= "\n{$compiledStr}php bin/jp.php --file {$file} --suite {$suite} --case {$case}\n\n" . "Expected: " . $this->prettyJson($result) . "\n\n"; $failure .= 'Associative? ' . var_export($asAssoc, true) . "\n\n"; if (!$error && $failed) { $this->fail("Should not have failed\n{$failure}=> {$failed} {$failureMsg}"); } elseif ($error && !$failed) { $this->fail("Should have failed\n{$failure}"); } $this->assertEquals( $this->convertAssoc($result), $this->convertAssoc($evalResult), $failure ); } public function complianceProvider() { $cases = []; $files = array_map(function ($f) { return basename($f, '.json'); }, glob(__DIR__ . '/compliance/*.json')); foreach ($files as $name) { $contents = file_get_contents(__DIR__ . "/compliance/{$name}.json"); foreach ([true, false] as $asAssoc) { $json = json_decode($contents, true); $jsonObj = json_decode($contents); foreach ($json as $suiteNumber => $suite) { $given = $asAssoc ? $suite['given'] : $jsonObj[$suiteNumber]->given; foreach ($suite['cases'] as $caseNumber => $case) { $caseData = [ $given, $case['expression'], isset($case['result']) ? $case['result'] : null, isset($case['error']) ? $case['error'] : false, $name, $suiteNumber, $caseNumber, false, $asAssoc ]; $cases[] = $caseData; $caseData[7] = true; $cases[] = $caseData; } } } } return $cases; } private function convertAssoc($data) { if ($data instanceof \stdClass) { return $this->convertAssoc((array) $data); } elseif (is_array($data)) { return array_map([$this, 'convertAssoc'], $data); } else { return $data; } } private function prettyJson($json) { if (defined('JSON_PRETTY_PRINT')) { return json_encode($json, JSON_PRETTY_PRINT); } return json_encode($json); } }