123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138 |
- <?php
- namespace JmesPath\Tests;
- use JmesPath\AstRuntime;
- use JmesPath\CompilerRuntime;
- use JmesPath\SyntaxErrorException;
- use PHPUnit\Framework\TestCase;
- class ComplianceTest extends TestCase
- {
- private static $path;
- public static function setUpBeforeClass()
- {
- self::$path = __DIR__ . '/../../compiled';
- array_map('unlink', glob(self::$path . '/jmespath_*.php'));
- }
- public static function tearDownAfterClass()
- {
- array_map('unlink', glob(self::$path . '/jmespath_*.php'));
- }
- /**
- * @dataProvider complianceProvider
- */
- public function testPassesCompliance(
- $data,
- $expression,
- $result,
- $error,
- $file,
- $suite,
- $case,
- $compiled,
- $asAssoc
- ) {
- $evalResult = null;
- $failed = false;
- $failureMsg = '';
- $failure = '';
- $compiledStr = '';
- try {
- if ($compiled) {
- $compiledStr = \JmesPath\Env::COMPILE_DIR . '=on ';
- $runtime = new CompilerRuntime(self::$path);
- } else {
- $runtime = new AstRuntime();
- }
- $evalResult = $runtime($expression, $data);
- } catch (\Exception $e) {
- $failed = $e instanceof SyntaxErrorException ? 'syntax' : 'runtime';
- $failureMsg = sprintf(
- '%s (%s line %d)',
- $e->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"
- . "Result: " . $this->prettyJson($evalResult) . "\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);
- }
- }
|