Added fixes to pass latest frame test.

This commit is contained in:
Dave Longley 2011-07-25 17:40:17 -04:00
parent 1e79de1c41
commit d841bf535c
2 changed files with 58 additions and 32 deletions

View file

@ -8,19 +8,27 @@
*/ */
require_once('jsonld.php'); require_once('jsonld.php');
// determine EOL for output based on command line php or webpage php
$isCli = defined('STDIN');
$eol = $isCli ? "\n" : '</br>';
function error_handler($errno, $errstr, $errfile, $errline) function error_handler($errno, $errstr, $errfile, $errline)
{ {
echo "</br>$errstr</br>"; global $eol;
echo "$eol$errstr$eol";
array_walk( array_walk(
debug_backtrace(), debug_backtrace(),
create_function( create_function(
'$a,$b', '$a,$b',
'echo "{$a[\'function\']}()' . 'echo "{$a[\'function\']}()' .
'(".basename($a[\'file\']).":{$a[\'line\']}); </br>";')); '(".basename($a[\'file\']).":{$a[\'line\']}); ' . $eol . '";'));
throw new Exception(); throw new Exception();
return false; return false;
} }
if(!$isCli)
{
set_error_handler('error_handler'); set_error_handler('error_handler');
}
function _sortKeys($obj) function _sortKeys($obj)
{ {
@ -78,6 +86,7 @@ function _stringifySorted($obj, $indent)
function _readTestJson($file, $filepath) function _readTestJson($file, $filepath)
{ {
$rval; $rval;
global $eol;
try try
{ {
@ -86,7 +95,7 @@ function _readTestJson($file, $filepath)
} }
catch(Exception $e) catch(Exception $e)
{ {
echo "Exception while parsing file: '$file'</br>"; echo "Exception while parsing file: '$file'$eol";
throw $e; throw $e;
} }
@ -144,6 +153,8 @@ class TestRunner
public function check($expect, $result, $indent=false) public function check($expect, $result, $indent=false)
{ {
global $eol;
// sort and use given indent level // sort and use given indent level
$expect = _stringifySorted($expect, $indent); $expect = _stringifySorted($expect, $indent);
$result = _stringifySorted($result, $indent); $result = _stringifySorted($result, $indent);
@ -159,18 +170,18 @@ class TestRunner
$fail = true; $fail = true;
} }
echo $line . '</br>'; echo "$line$eol";
if($fail) if($fail)
{ {
echo 'Expect: ' . print_r($expect, true) . '</br>'; echo 'Expect: ' . print_r($expect, true) . $eol;
echo 'Result: ' . print_r($result, true) . '</br>'; echo 'Result: ' . print_r($result, true) . $eol;
/* /*
$flags = JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT; $flags = JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT;
echo 'Legible Expect: ' . echo 'Legible Expect: ' .
json_encode(json_decode(expect, $flags)) . '</br>'; json_encode(json_decode(expect, $flags)) . $eol;
echo 'Legible Result: ' . echo 'Legible Result: ' .
json_encode(json_decode(result, $flags)) . '</br>'; json_encode(json_decode(result, $flags)) . $eol;
*/ */
// FIXME: remove me // FIXME: remove me
@ -180,11 +191,12 @@ class TestRunner
public function load($filepath) public function load($filepath)
{ {
global $eol;
$tests = array(); $tests = array();
// get full path // get full path
$filepath = realpath($filepath); $filepath = realpath($filepath);
echo "Reading test files from: '$filepath'</br>"; echo "Reading test files from: '$filepath'$eol";
// read each test file from the directory // read each test file from the directory
$files = array(); $files = array();
@ -210,7 +222,7 @@ class TestRunner
$info = pathinfo($file); $info = pathinfo($file);
if($info['extension'] == 'test') if($info['extension'] == 'test')
{ {
echo "Reading test file: '$file'</br>"; echo "Reading test file: '$file'$eol";
try try
{ {
@ -218,7 +230,7 @@ class TestRunner
} }
catch(Exception $e) catch(Exception $e)
{ {
echo "Exception while parsing file: '$file'</br>"; echo "Exception while parsing file: '$file'$eol";
throw $e; throw $e;
} }
@ -230,7 +242,7 @@ class TestRunner
} }
} }
echo count($tests) . ' test file(s) read.</br>'; echo count($tests) . " test file(s) read.$eol";
return $tests; return $tests;
} }
@ -324,6 +336,6 @@ $tr = new TestRunner();
$tr->group('JSON-LD'); $tr->group('JSON-LD');
$tr->run($tr->load('tests')); $tr->run($tr->load('tests'));
$tr->ungroup(); $tr->ungroup();
echo 'All tests complete.</br>'; echo "All tests complete.$eol";
?> ?>

View file

@ -912,7 +912,7 @@ function _expand($ctx, $property, $value, $expandSubjects)
$coerce = _getCoerceType($ctx, $property, null); $coerce = _getCoerceType($ctx, $property, null);
// automatic coercion for basic JSON types // automatic coercion for basic JSON types
if($coerce === null and !is_string($value) && if($coerce === null and !is_string($value) and
(is_numeric($value) or is_bool($value))) (is_numeric($value) or is_bool($value)))
{ {
if(is_bool($value)) if(is_bool($value))
@ -1019,8 +1019,8 @@ function _compare($v1, $v2)
/** /**
* Compares two keys in an object. If the key exists in one object * Compares two keys in an object. If the key exists in one object
* and not the other, that object is less. If the key exists in both objects, * and not the other, the object with the key is less. If the key exists in
* then the one with the lesser value is less. * both objects, then the one with the lesser value is less.
* *
* @param o1 the first object. * @param o1 the first object.
* @param o2 the second object. * @param o2 the second object.
@ -1298,16 +1298,6 @@ function _flatten($parent, $parentProperty, $value, $subjects)
{ {
_flatten($parent, $parentProperty, $v, $subjects); _flatten($parent, $parentProperty, $v, $subjects);
} }
// if value is a list of objects, sort them
if(count($value) > 0 and
(is_string($value[0]) or
(is_object($value[0]) and
(isset($value[0]->{'@literal'}) or isset($value[0]->{'@iri'})))))
{
// sort values
usort($value, '_compareObjects');
}
} }
else if(is_object($value)) else if(is_object($value))
{ {
@ -1899,7 +1889,7 @@ class JsonLdProcessor
{ {
$rval .= '|'; $rval .= '|';
} }
if(is_object($obj) and isset($obj->{'@iri'}) && if(is_object($obj) and isset($obj->{'@iri'}) and
_isBlankNodeIri($obj->{'@iri'})) _isBlankNodeIri($obj->{'@iri'}))
{ {
$rval .= '_:'; $rval .= '_:';
@ -2424,6 +2414,18 @@ function _isType($input, $frame)
return $rval; return $rval;
} }
/**
* Filters non-keywords.
*
* @param e the element to check.
*
* @return true if the element is a non-keyword.
*/
function _filterNonKeyWords($e)
{
return strpos($e, '@') !== 0;
}
/** /**
* Returns true if the given input matches the given frame via duck-typing. * Returns true if the given input matches the given frame via duck-typing.
* *
@ -2440,7 +2442,7 @@ function _isDuckType($input, $frame)
if(!isset($frame->{JSONLD_RDF_TYPE})) if(!isset($frame->{JSONLD_RDF_TYPE}))
{ {
// get frame properties that must exist on input // get frame properties that must exist on input
$props = array_keys((array)$frame); $props = array_filter(array_keys((array)$frame), '_filterNonKeywords');
if(count($props) === 0) if(count($props) === 0)
{ {
// input always matches if there are no properties // input always matches if there are no properties
@ -2485,6 +2487,10 @@ function _frame($subjects, $input, $frame, $embeds, $options)
{ {
$rval = array(); $rval = array();
$frames = $frame; $frames = $frame;
if(count($frames) == 0)
{
$frames[] = new stdClass();
}
} }
else else
{ {
@ -2510,10 +2516,18 @@ function _frame($subjects, $input, $frame, $embeds, $options)
$v = array(); $v = array();
for($n = 0; $n < $inLen and $limit !== 0; ++$n) for($n = 0; $n < $inLen and $limit !== 0; ++$n)
{ {
// add input to list if it matches frame specific type or duck-type // dereference input if it refers to a subject
if(_isType($input[$n], $frame) or _isDuckType($input[$n], $frame)) $next = $input[$n];
if(is_object($next) and isset($next->{'@iri'}) and
isset($subjects->{$next->{'@iri'}}))
{ {
$v[] = $input[$n]; $next = $subjects->{$next->{'@iri'}};
}
// add input to list if it matches frame specific type or duck-type
if(_isType($next, $frame) or _isDuckType($next, $frame))
{
$v[] = $next;
--$limit; --$limit;
} }
} }