allow vendord
All checks were successful
Build, Push and Deploy / build-and-push (push) Successful in 3m3s
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 16s
Build, Push and Deploy / deploy-staging (push) Successful in 32s
Build, Push and Deploy / deploy-production (push) Has been skipped
Build, Push and Deploy / cleanup (push) Successful in 1s
All checks were successful
Build, Push and Deploy / build-and-push (push) Successful in 3m3s
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 16s
Build, Push and Deploy / deploy-staging (push) Successful in 32s
Build, Push and Deploy / deploy-production (push) Has been skipped
Build, Push and Deploy / cleanup (push) Successful in 1s
This commit is contained in:
93
vendor/rize/uri-template/tests/Rize/Uri/Node/ParserTest.php
vendored
Normal file
93
vendor/rize/uri-template/tests/Rize/Uri/Node/ParserTest.php
vendored
Normal file
@@ -0,0 +1,93 @@
|
||||
<?php
|
||||
|
||||
use PHPUnit\Framework\Attributes\Depends;
|
||||
use Rize\UriTemplate;
|
||||
use Rize\UriTemplate\Node;
|
||||
use Rize\UriTemplate\Operator;
|
||||
use Rize\UriTemplate\Parser;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
class ParserTest extends TestCase
|
||||
{
|
||||
protected function service()
|
||||
{
|
||||
return new Parser();
|
||||
}
|
||||
|
||||
public function testParseTemplate()
|
||||
{
|
||||
$input = 'http://www.example.com/{term:1}/{term}/{test*}/foo{?query,number}';
|
||||
$expected = [new Node\Literal('http://www.example.com/'), new Node\Expression(
|
||||
'term:1',
|
||||
Operator\Abstraction::createById(''),
|
||||
[new Node\Variable(
|
||||
'term:1',
|
||||
['modifier' => ':', 'value' => 1],
|
||||
)],
|
||||
), new Node\Literal('/'), new Node\Expression(
|
||||
'term',
|
||||
Operator\Abstraction::createById(''),
|
||||
[new Node\Variable(
|
||||
'term',
|
||||
['modifier' => null, 'value' => null],
|
||||
)],
|
||||
), new Node\Literal('/'), new Node\Expression(
|
||||
'test*',
|
||||
Operator\Abstraction::createById(''),
|
||||
[new Node\Variable(
|
||||
'test',
|
||||
['modifier' => '*', 'value' => null],
|
||||
)],
|
||||
), new Node\Literal('/foo'), new Node\Expression(
|
||||
'query,number',
|
||||
Operator\Abstraction::createById('?'),
|
||||
[new Node\Variable(
|
||||
'query',
|
||||
['modifier' => null, 'value' => null],
|
||||
), new Node\Variable(
|
||||
'number',
|
||||
['modifier' => null, 'value' => null],
|
||||
)],
|
||||
)];
|
||||
|
||||
$service = $this->service();
|
||||
$actual = $service->parse($input);
|
||||
|
||||
$this->assertEquals($expected, $actual);
|
||||
}
|
||||
|
||||
public function testParseTemplateWithLiteral()
|
||||
{
|
||||
// will pass
|
||||
$uri = new UriTemplate('http://www.example.com/v1/company/', []);
|
||||
$params = $uri->extract('/{countryCode}/{registrationNumber}/test{.format}', '/gb/0123456/test.json');
|
||||
static::assertEquals(['countryCode' => 'gb', 'registrationNumber' => '0123456', 'format' => 'json'], $params);
|
||||
}
|
||||
|
||||
#[Depends('testParseTemplateWithLiteral')]
|
||||
public function testParseTemplateWithTwoVariablesAndDotBetween()
|
||||
{
|
||||
// will fail
|
||||
$uri = new UriTemplate('http://www.example.com/v1/company/', []);
|
||||
$params = $uri->extract('/{countryCode}/{registrationNumber}{.format}', '/gb/0123456.json');
|
||||
static::assertEquals(['countryCode' => 'gb', 'registrationNumber' => '0123456', 'format' => 'json'], $params);
|
||||
}
|
||||
|
||||
#[Depends('testParseTemplateWithLiteral')]
|
||||
public function testParseTemplateWithTwoVariablesAndDotBetweenStrict()
|
||||
{
|
||||
// will fail
|
||||
$uri = new UriTemplate('http://www.example.com/v1/company/', []);
|
||||
$params = $uri->extract('/{countryCode}/{registrationNumber}{.format}', '/gb/0123456.json', true);
|
||||
static::assertEquals(['countryCode' => 'gb', 'registrationNumber' => '0123456', 'format' => 'json'], $params);
|
||||
}
|
||||
|
||||
#[Depends('testParseTemplateWithLiteral')]
|
||||
public function testParseTemplateWithThreeVariablesAndDotBetweenStrict()
|
||||
{
|
||||
// will fail
|
||||
$uri = new UriTemplate('http://www.example.com/v1/company/', []);
|
||||
$params = $uri->extract('/{countryCode}/{registrationNumber}{.namespace}{.format}', '/gb/0123456.company.json');
|
||||
static::assertEquals(['countryCode' => 'gb', 'registrationNumber' => '0123456', 'namespace' => 'company', 'format' => 'json'], $params);
|
||||
}
|
||||
}
|
||||
253
vendor/rize/uri-template/tests/Rize/UriTemplateTest.php
vendored
Normal file
253
vendor/rize/uri-template/tests/Rize/UriTemplateTest.php
vendored
Normal file
@@ -0,0 +1,253 @@
|
||||
<?php
|
||||
|
||||
use PHPUnit\Framework\Attributes\DataProvider;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
use PHPUnit\Metadata\Covers;
|
||||
use Rize\UriTemplate\UriTemplate;
|
||||
|
||||
/**
|
||||
* URI Template
|
||||
*
|
||||
* http://tools.ietf.org/html/rfc6570
|
||||
*/
|
||||
class UriTemplateTest extends TestCase
|
||||
{
|
||||
public function service($uri = '', $params = [])
|
||||
{
|
||||
return new UriTemplate($uri, $params);
|
||||
}
|
||||
|
||||
public static function dataExpansion()
|
||||
{
|
||||
$params = ['count' => ["one", "two", "three"], 'dom' => ["example", "com"], 'dub' => "me/too", 'hello' => "Hello World!", 'half' => "50%", 'var' => "value", 'who' => "fred", 'base' => "http://example.com/home/", 'path' => "/foo/bar", 'list' => ["red", "green", "blue"], 'keys' => ["semi" => ";", "dot" => ".", "comma" => ","], 'list_with_empty' => [''], 'keys_with_empty' => ['john' => ''], 'v' => "6", 'x' => "1024", 'y' => "768", 'empty' => "", 'empty_keys' => [], 'undef' => null];
|
||||
|
||||
return [
|
||||
['http://example.com/~john', ['uri' => 'http://example.com/~{username}', 'params' => ['username' => 'john']]],
|
||||
['http://example.com/dictionary/d/dog', ['uri' => 'http://example.com/dictionary/{term:1}/{term}', 'params' => ['term' => 'dog'], 'extract' => ['term:1' => 'd', 'term' => 'dog']]],
|
||||
# Form-style parameters expression
|
||||
['http://example.com/j/john/search?q=mycelium&q=3&lang=th,jp,en', ['uri' => 'http://example.com/{term:1}/{term}/search{?q*,lang}', 'params' => ['q' => ['mycelium', 3], 'lang' => ['th', 'jp', 'en'], 'term' => 'john']]],
|
||||
['http://www.example.com/john', ['uri' => 'http://www.example.com/{username}', 'params' => ['username' => 'john']]],
|
||||
['http://www.example.com/foo?query=mycelium&number=100', ['uri' => 'http://www.example.com/foo{?query,number}', 'params' => ['query' => 'mycelium', 'number' => 100]]],
|
||||
# 'query' is undefined
|
||||
['http://www.example.com/foo?number=100', [
|
||||
'uri' => 'http://www.example.com/foo{?query,number}',
|
||||
'params' => ['number' => 100],
|
||||
# we can't extract undefined values
|
||||
'extract' => false,
|
||||
]],
|
||||
# undefined variables
|
||||
['http://www.example.com/foo', ['uri' => 'http://www.example.com/foo{?query,number}', 'params' => [], 'extract' => ['query' => null, 'number' => null]]],
|
||||
['http://www.example.com/foo', ['uri' => 'http://www.example.com/foo{?number}', 'params' => [], 'extract' => ['number' => null]]],
|
||||
['one,two,three|one,two,three|/one,two,three|/one/two/three|;count=one,two,three|;count=one;count=two;count=three|?count=one,two,three|?count=one&count=two&count=three|&count=one&count=two&count=three', ['uri' => '{count}|{count*}|{/count}|{/count*}|{;count}|{;count*}|{?count}|{?count*}|{&count*}', 'params' => ['count' => ['one', 'two', 'three']]]],
|
||||
['http://www.host.com/path/to/a/file.x.y', ['uri' => 'http://{host}{/segments*}/{file}{.extensions*}', 'params' => ['host' => 'www.host.com', 'segments' => ['path', 'to', 'a'], 'file' => 'file', 'extensions' => ['x', 'y']], 'extract' => ['host' => 'www.host.com', 'segments' => ['path', 'to', 'a'], 'file' => 'file.x.y', 'extensions' => null]]],
|
||||
# level 1 - Simple String Expansion: {var}
|
||||
['value|Hello%20World%21|50%25|OX|OX|1024,768|1024,Hello%20World%21,768|?1024,|?1024|?768|val|value|red,green,blue|semi,%3B,dot,.,comma,%2C|semi=%3B,dot=.,comma=%2C', ['uri' => '{var}|{hello}|{half}|O{empty}X|O{undef}X|{x,y}|{x,hello,y}|?{x,empty}|?{x,undef}|?{undef,y}|{var:3}|{var:30}|{list}|{keys}|{keys*}', 'params' => $params]],
|
||||
# level 2 - Reserved Expansion: {+var}
|
||||
['value|Hello%20World!|50%25|http%3A%2F%2Fexample.com%2Fhome%2Findex|http://example.com/home/index|OX|OX|/foo/bar/here|here?ref=/foo/bar|up/foo/barvalue/here|1024,Hello%20World!,768|/foo/bar,1024/here|/foo/b/here|red,green,blue|red,green,blue|semi,;,dot,.,comma,,|semi=;,dot=.,comma=,', ['uri' => '{+var}|{+hello}|{+half}|{base}index|{+base}index|O{+empty}X|O{+undef}X|{+path}/here|here?ref={+path}|up{+path}{var}/here|{+x,hello,y}|{+path,x}/here|{+path:6}/here|{+list}|{+list*}|{+keys}|{+keys*}', 'params' => $params]],
|
||||
# level 2 - Fragment Expansion: {#var}
|
||||
['#value|#Hello%20World!|#50%25|foo#|foo|#1024,Hello%20World!,768|#/foo/bar,1024/here|#/foo/b/here|#red,green,blue|#red,green,blue|#semi,;,dot,.,comma,,|#semi=;,dot=.,comma=,', ['uri' => '{#var}|{#hello}|{#half}|foo{#empty}|foo{#undef}|{#x,hello,y}|{#path,x}/here|{#path:6}/here|{#list}|{#list*}|{#keys}|{#keys*}', 'params' => $params]],
|
||||
# Label Expansion with Dot-Prefix: {.var}
|
||||
['.fred|.fred.fred|.50%25.fred|www.example.com|X.value|X.|X|X.val|X.red,green,blue|X.red.green.blue|X.semi,%3B,dot,.,comma,%2C|X.semi=%3B.dot=..comma=%2C|X|X', ['uri' => '{.who}|{.who,who}|{.half,who}|www{.dom*}|X{.var}|X{.empty}|X{.undef}|X{.var:3}|X{.list}|X{.list*}|X{.keys}|X{.keys*}|X{.empty_keys}|X{.empty_keys*}', 'params' => $params]],
|
||||
# Path Segment Expansion: {/var}
|
||||
['/fred|/fred/fred|/50%25/fred|/fred/me%2Ftoo|/value|/value/|/value|/value/1024/here|/v/value|/red,green,blue|/red/green/blue|/red/green/blue/%2Ffoo|/semi,%3B,dot,.,comma,%2C|/semi=%3B/dot=./comma=%2C', ['uri' => '{/who}|{/who,who}|{/half,who}|{/who,dub}|{/var}|{/var,empty}|{/var,undef}|{/var,x}/here|{/var:1,var}|{/list}|{/list*}|{/list*,path:4}|{/keys}|{/keys*}', 'params' => $params]],
|
||||
# Path-Style Parameter Expansion: {;var}
|
||||
[';who=fred|;half=50%25|;empty|;v=6;empty;who=fred|;v=6;who=fred|;x=1024;y=768|;x=1024;y=768;empty|;x=1024;y=768|;hello=Hello|;list=red,green,blue|;list=red;list=green;list=blue|;keys=semi,%3B,dot,.,comma,%2C|;semi=%3B;dot=.;comma=%2C', ['uri' => '{;who}|{;half}|{;empty}|{;v,empty,who}|{;v,bar,who}|{;x,y}|{;x,y,empty}|{;x,y,undef}|{;hello:5}|{;list}|{;list*}|{;keys}|{;keys*}', 'params' => $params]],
|
||||
# Form-Style Query Expansion: {?var}
|
||||
['?who=fred|?half=50%25|?x=1024&y=768|?x=1024&y=768&empty=|?x=1024&y=768|?var=val|?list=red,green,blue|?list=red&list=green&list=blue|?keys=semi,%3B,dot,.,comma,%2C|?semi=%3B&dot=.&comma=%2C|?list_with_empty=|?john=', ['uri' => '{?who}|{?half}|{?x,y}|{?x,y,empty}|{?x,y,undef}|{?var:3}|{?list}|{?list*}|{?keys}|{?keys*}|{?list_with_empty*}|{?keys_with_empty*}', 'params' => $params]],
|
||||
# Form-Style Query Continuation: {&var}
|
||||
['&who=fred|&half=50%25|?fixed=yes&x=1024|&x=1024&y=768&empty=|&x=1024&y=768|&var=val|&list=red,green,blue|&list=red&list=green&list=blue|&keys=semi,%3B,dot,.,comma,%2C|&semi=%3B&dot=.&comma=%2C', ['uri' => '{&who}|{&half}|?fixed=yes{&x}|{&x,y,empty}|{&x,y,undef}|{&var:3}|{&list}|{&list*}|{&keys}|{&keys*}', 'params' => $params]],
|
||||
# Test empty values
|
||||
['|||', ['uri' => '{empty}|{empty*}|{?empty}|{?empty*}', 'params' => ['empty' => []]]],
|
||||
];
|
||||
}
|
||||
|
||||
public static function dataExpandWithArrayModifier()
|
||||
{
|
||||
return [
|
||||
# List
|
||||
[
|
||||
# '?choices[]=a&choices[]=b&choices[]=c',
|
||||
'?choices%5B%5D=a&choices%5B%5D=b&choices%5B%5D=c',
|
||||
['uri' => '{?choices%}', 'params' => ['choices' => ['a', 'b', 'c']]],
|
||||
],
|
||||
# Keys
|
||||
[
|
||||
# '?choices[a]=1&choices[b]=2&choices[c][test]=3',
|
||||
'?choices%5Ba%5D=1&choices%5Bb%5D=2&choices%5Bc%5D%5Btest%5D=3',
|
||||
['uri' => '{?choices%}', 'params' => ['choices' => ['a' => 1, 'b' => 2, 'c' => ['test' => 3]]]],
|
||||
],
|
||||
# Mixed
|
||||
[
|
||||
# '?list[]=a&list[]=b&keys[a]=1&keys[b]=2',
|
||||
'?list%5B%5D=a&list%5B%5D=b&keys%5Ba%5D=1&keys%5Bb%5D=2',
|
||||
['uri' => '{?list%,keys%}', 'params' => ['list' => ['a', 'b'], 'keys' => ['a' => 1, 'b' => 2]]],
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
public static function dataBaseTemplate()
|
||||
{
|
||||
return [
|
||||
[
|
||||
'http://google.com/api/1/users/1',
|
||||
# base uri
|
||||
['uri' => '{+host}/api/{v}', 'params' => ['host' => 'http://google.com', 'v' => 1]],
|
||||
# other uri
|
||||
['uri' => '/{resource}/{id}', 'params' => ['resource' => 'users', 'id' => 1]],
|
||||
],
|
||||
# test override base params
|
||||
[
|
||||
'http://github.com/api/1/users/1',
|
||||
# base uri
|
||||
['uri' => '{+host}/api/{v}', 'params' => ['host' => 'http://google.com', 'v' => 1]],
|
||||
# other uri
|
||||
['uri' => '/{resource}/{id}', 'params' => ['host' => 'http://github.com', 'resource' => 'users', 'id' => 1]],
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
public static function dataExtraction()
|
||||
{
|
||||
return [['/no/{term:1}/random/foo{?query,list%,keys%}', '/no/j/random/foo?query=1,2,3&list%5B%5D=a&list%5B%5D=b&keys%5Ba%5D=1&keys%5Bb%5D=2&keys%5Bc%5D%5Btest%5D%5Btest%5D=1', ['term:1' => 'j', 'query' => [1, 2, 3], 'list' => ['a', 'b'], 'keys' => ['a' => 1, 'b' => 2, 'c' => ['test' => ['test' => 1]]]]], ['/no/{term:1}/random/{term}/{test*}/foo{?query,number}', '/no/j/random/john/a,b,c/foo?query=1,2,3&number=10', ['term:1' => 'j', 'term' => 'john', 'test' => ['a', 'b', 'c'], 'query' => [1, 2, 3], 'number' => 10]], ['/search/{term:1}/{term}/{?q*,limit}', '/search/j/john/?a=1&b=2&limit=10', ['term:1' => 'j', 'term' => 'john', 'q' => ['a' => 1, 'b' => 2], 'limit' => 10]], ['http://www.example.com/foo{?query,number}', 'http://www.example.com/foo?query=5', ['query' => 5, 'number' => null]], ['{count}|{count*}|{/count}|{/count*}|{;count}|{;count*}|{?count}|{?count*}|{&count*}', 'one,two,three|one,two,three|/one,two,three|/one/two/three|;count=one,two,three|;count=one;count=two;count=three|?count=one,two,three|?count=one&count=two&count=three|&count=one&count=two&count=three', ['count' => ['one', 'two', 'three']]], ['http://example.com/{term:1}/{term}/search{?q*,lang}', 'http://example.com/j/john/search?q=Hello%20World%21&q=3&lang=th,jp,en', ['q' => ['Hello World!', 3], 'lang' => ['th', 'jp', 'en'], 'term' => 'john', 'term:1' => 'j']], ['/foo/bar/{number}', '/foo/bar/0', ['number' => 0]], ['/some/{path}{?ref}', '/some/foo', ['path' => 'foo', 'ref' => null]]];
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider dataExpansion
|
||||
*/
|
||||
public function testExpansion($expected, $input)
|
||||
{
|
||||
$service = $this->service();
|
||||
$result = $service->expand($input['uri'], $input['params']);
|
||||
|
||||
$this->assertEquals($expected, $result);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider dataExpandWithArrayModifier
|
||||
*/
|
||||
public function testExpandWithArrayModifier($expected, $input)
|
||||
{
|
||||
$service = $this->service();
|
||||
$result = $service->expand($input['uri'], $input['params']);
|
||||
|
||||
$this->assertEquals($expected, $result);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider dataBaseTemplate
|
||||
*/
|
||||
public function testBaseTemplate($expected, $base, $other)
|
||||
{
|
||||
$service = $this->service($base['uri'], $base['params']);
|
||||
$result = $service->expand($other['uri'], $other['params']);
|
||||
|
||||
$this->assertEquals($expected, $result);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider dataExtraction
|
||||
*/
|
||||
public function testExtract($template, $uri, $expected)
|
||||
{
|
||||
$service = $this->service();
|
||||
$actual = $service->extract($template, $uri);
|
||||
|
||||
$this->assertEquals($expected, $actual);
|
||||
}
|
||||
|
||||
public function testExpandFromFixture()
|
||||
{
|
||||
$dir = dirname(__DIR__) . DIRECTORY_SEPARATOR . 'fixtures' . DIRECTORY_SEPARATOR;
|
||||
$files = ['spec-examples.json', 'spec-examples-by-section.json', 'extended-tests.json'];
|
||||
$service = $this->service();
|
||||
|
||||
foreach ($files as $file) {
|
||||
$content = json_decode(file_get_contents($dir . $file), $array = true);
|
||||
|
||||
# iterate through each fixture
|
||||
foreach ($content as $fixture) {
|
||||
$vars = $fixture['variables'];
|
||||
|
||||
# assert each test cases
|
||||
foreach ($fixture['testcases'] as $case) {
|
||||
[$uri, $expected] = $case;
|
||||
|
||||
$actual = $service->expand($uri, $vars);
|
||||
|
||||
if (is_array($expected)) {
|
||||
$expected = current(array_filter($expected, fn($input) => $actual === $input));
|
||||
}
|
||||
|
||||
$this->assertEquals($expected, $actual);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static function dataExtractStrictMode()
|
||||
{
|
||||
$dataTest = [['/search/{term:1}/{term}/{?q*,limit}', '/search/j/john/?a=1&b=2&limit=10', ['term:1' => 'j', 'term' => 'john', 'limit' => '10', 'q' => ['a' => '1', 'b' => '2']]], ['http://example.com/{term:1}/{term}/search{?q*,lang}', 'http://example.com/j/john/search?q=Hello%20World%21&q=3&lang=th,jp,en', ['term:1' => 'j', 'term' => 'john', 'lang' => ['th', 'jp', 'en'], 'q' => ['Hello World!', '3']]], ['/foo/bar/{number}', '/foo/bar/0', ['number' => 0]], ['/', '/', []]];
|
||||
|
||||
$rfc3986AllowedPathCharacters = ['-', '.', '_', '~', '!', '$', '&', "'", '(', ')', '*', '+', ',', ';', '=', ':', '@'];
|
||||
|
||||
foreach ($rfc3986AllowedPathCharacters as $char) {
|
||||
$title = "RFC3986 path character ($char)";
|
||||
$title = str_replace("'", 'single quote', $title); // PhpStorm workaround
|
||||
if ($char === ',') { // , means array on RFC6570
|
||||
$params = ['term' => ['foo', 'baz']];
|
||||
} else {
|
||||
$params = ['term' => "foo{$char}baz"];
|
||||
}
|
||||
|
||||
$data = ['/search/{term}', "/search/foo{$char}baz", $params];
|
||||
|
||||
$dataTest[$title] = $data;
|
||||
$data = ['/search/{;term}', "/search/;term=foo{$char}baz", $params];
|
||||
$dataTest['Named ' . $title] = $data;
|
||||
}
|
||||
|
||||
$rfc3986AllowedQueryCharacters = $rfc3986AllowedPathCharacters;
|
||||
$rfc3986AllowedQueryCharacters[] = '/';
|
||||
$rfc3986AllowedQueryCharacters[] = '?';
|
||||
unset($rfc3986AllowedQueryCharacters[array_search('&', $rfc3986AllowedQueryCharacters, true)]);
|
||||
|
||||
foreach ($rfc3986AllowedQueryCharacters as $char) {
|
||||
$title = "RFC3986 query character ($char)";
|
||||
$title = str_replace("'", 'single quote', $title); // PhpStorm workaround
|
||||
if ($char === ',') { // , means array on RFC6570
|
||||
$params = ['term' => ['foo', 'baz']];
|
||||
} else {
|
||||
$params = ['term' => "foo{$char}baz"];
|
||||
}
|
||||
|
||||
$data = ['/search/{?term}', "/search/?term=foo{$char}baz", $params];
|
||||
$dataTest['Named ' . $title] = $data;
|
||||
}
|
||||
|
||||
return $dataTest;
|
||||
}
|
||||
|
||||
public static function extractStrictModeNotMatchProvider()
|
||||
{
|
||||
return [['/', '/a'], ['/{test}', '/a/'], ['/search/{term:1}/{term}/{?q*,limit}', '/search/j/?a=1&b=2&limit=10'], ['http://www.example.com/foo{?query,number}', 'http://www.example.com/foo?query=5'], ['http://www.example.com/foo{?query,number}', 'http://www.example.com/foo'], ['http://example.com/{term:1}/{term}/search{?q*,lang}', 'http://example.com/j/john/search?q=']];
|
||||
}
|
||||
|
||||
#[DataProvider('dataExtractStrictMode')]
|
||||
public function testExtractStrictMode(string $template, string $uri, array $expectedParams)
|
||||
{
|
||||
$service = $this->service();
|
||||
$params = $service->extract($template, $uri, true);
|
||||
|
||||
$this->assertTrue(isset($params));
|
||||
$this->assertEquals($expectedParams, $params);
|
||||
}
|
||||
|
||||
#[DataProvider('extractStrictModeNotMatchProvider')]
|
||||
public function testExtractStrictModeNotMatch(string $template, string $uri)
|
||||
{
|
||||
$service = $this->service();
|
||||
$actual = $service->extract($template, $uri, true);
|
||||
|
||||
$this->assertFalse(isset($actual));
|
||||
}
|
||||
}
|
||||
90
vendor/rize/uri-template/tests/fixtures/README.md
vendored
Normal file
90
vendor/rize/uri-template/tests/fixtures/README.md
vendored
Normal file
@@ -0,0 +1,90 @@
|
||||
|
||||
URI Template Tests
|
||||
==================
|
||||
|
||||
This is a set of tests for implementations of
|
||||
[RFC6570](http://tools.ietf.org/html/rfc6570) - URI Template. It is designed
|
||||
to be reused by any implementation, to improve interoperability and
|
||||
implementation quality.
|
||||
|
||||
If your project uses Git for version control, you can make uritemplate-tests into a [submodule](http://help.github.com/submodules/).
|
||||
|
||||
Test Format
|
||||
-----------
|
||||
|
||||
Each test file is a [JSON](http://tools.ietf.org/html/RFC6627) document
|
||||
containing an object whose properties are groups of related tests.
|
||||
Alternatively, all tests are available in XML as well, with the XML files
|
||||
being generated by transform-json-tests.xslt which uses json2xml.xslt as a
|
||||
general-purpose JSON-to-XML parsing library.
|
||||
|
||||
Each group, in turn, is an object with three children:
|
||||
|
||||
* level - the level of the tests covered, as per the RFC (optional; if absent,
|
||||
assume level 4).
|
||||
* variables - an object representing the variables that are available to the
|
||||
tests in the suite
|
||||
* testcases - a list of testcases, where each case is a two-member list, the
|
||||
first being the template, the second being the result of expanding the
|
||||
template with the provided variables.
|
||||
|
||||
Note that the result string can be a few different things:
|
||||
|
||||
* string - if the second member is a string, the result of expansion is
|
||||
expected to match it, character-for-character.
|
||||
* list - if the second member is a list of strings, the result of expansion
|
||||
is expected to match one of them; this allows for templates that can
|
||||
expand into different, equally-acceptable URIs.
|
||||
* false - if the second member is boolean false, expansion is expected to
|
||||
fail (i.e., the template was invalid).
|
||||
|
||||
For example:
|
||||
|
||||
{
|
||||
"Level 1 Examples" :
|
||||
{
|
||||
"level": 1,
|
||||
"variables": {
|
||||
"var" : "value",
|
||||
"hello" : "Hello World!"
|
||||
},
|
||||
"testcases" : [
|
||||
["{var}", "value"],
|
||||
["{hello}", "Hello%20World%21"]
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Tests Included
|
||||
--------------
|
||||
|
||||
The following test files are included:
|
||||
|
||||
* spec-examples.json - The complete set of example templates from the RFC
|
||||
* spec-examples-by-section.json - The examples, section by section
|
||||
* extended-tests.json - more complex test cases
|
||||
* negative-tests.json - invalid templates
|
||||
|
||||
For all these test files, XML versions with the names *.xml can be
|
||||
generated with the transform-json-tests.xslt XSLT stylesheet. The XSLT
|
||||
contains the names of the above test files as a parameter, and can be
|
||||
started with any XML as input (i.e., the XML input is ignored).
|
||||
|
||||
License
|
||||
-------
|
||||
|
||||
Copyright 2011-2012 The Authors
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
118
vendor/rize/uri-template/tests/fixtures/extended-tests.json
vendored
Normal file
118
vendor/rize/uri-template/tests/fixtures/extended-tests.json
vendored
Normal file
@@ -0,0 +1,118 @@
|
||||
{
|
||||
"Additional Examples 1":{
|
||||
"level":4,
|
||||
"variables":{
|
||||
"id" : "person",
|
||||
"token" : "12345",
|
||||
"fields" : ["id", "name", "picture"],
|
||||
"format" : "json",
|
||||
"q" : "URI Templates",
|
||||
"page" : "5",
|
||||
"lang" : "en",
|
||||
"geocode" : ["37.76","-122.427"],
|
||||
"first_name" : "John",
|
||||
"last.name" : "Doe",
|
||||
"Some%20Thing" : "foo",
|
||||
"number" : 6,
|
||||
"long" : 37.76,
|
||||
"lat" : -122.427,
|
||||
"group_id" : "12345",
|
||||
"query" : "PREFIX dc: <http://purl.org/dc/elements/1.1/> SELECT ?book ?who WHERE { ?book dc:creator ?who }",
|
||||
"uri" : "http://example.org/?uri=http%3A%2F%2Fexample.org%2F",
|
||||
"word" : "drücken",
|
||||
"Stra%C3%9Fe" : "Grüner Weg",
|
||||
"random" : "šö䟜ñꀣ¥‡ÑÒÓÔÕÖרÙÚàáâãäåæçÿ",
|
||||
"assoc_special_chars" :
|
||||
{ "šö䟜ñꀣ¥‡ÑÒÓÔÕ" : "ÖרÙÚàáâãäåæçÿ" }
|
||||
},
|
||||
"testcases":[
|
||||
|
||||
[ "{/id*}" , "/person" ],
|
||||
[ "{/id*}{?fields,first_name,last.name,token}" , [
|
||||
"/person?fields=id,name,picture&first_name=John&last.name=Doe&token=12345",
|
||||
"/person?fields=id,picture,name&first_name=John&last.name=Doe&token=12345",
|
||||
"/person?fields=picture,name,id&first_name=John&last.name=Doe&token=12345",
|
||||
"/person?fields=picture,id,name&first_name=John&last.name=Doe&token=12345",
|
||||
"/person?fields=name,picture,id&first_name=John&last.name=Doe&token=12345",
|
||||
"/person?fields=name,id,picture&first_name=John&last.name=Doe&token=12345"]
|
||||
],
|
||||
["/search.{format}{?q,geocode,lang,locale,page,result_type}",
|
||||
[ "/search.json?q=URI%20Templates&geocode=37.76,-122.427&lang=en&page=5",
|
||||
"/search.json?q=URI%20Templates&geocode=-122.427,37.76&lang=en&page=5"]
|
||||
],
|
||||
["/test{/Some%20Thing}", "/test/foo" ],
|
||||
["/set{?number}", "/set?number=6"],
|
||||
["/loc{?long,lat}" , "/loc?long=37.76&lat=-122.427"],
|
||||
["/base{/group_id,first_name}/pages{/page,lang}{?format,q}","/base/12345/John/pages/5/en?format=json&q=URI%20Templates"],
|
||||
["/sparql{?query}", "/sparql?query=PREFIX%20dc%3A%20%3Chttp%3A%2F%2Fpurl.org%2Fdc%2Felements%2F1.1%2F%3E%20SELECT%20%3Fbook%20%3Fwho%20WHERE%20%7B%20%3Fbook%20dc%3Acreator%20%3Fwho%20%7D"],
|
||||
["/go{?uri}", "/go?uri=http%3A%2F%2Fexample.org%2F%3Furi%3Dhttp%253A%252F%252Fexample.org%252F"],
|
||||
["/service{?word}", "/service?word=dr%C3%BCcken"],
|
||||
["/lookup{?Stra%C3%9Fe}", "/lookup?Stra%25C3%259Fe=Gr%C3%BCner%20Weg"],
|
||||
["{random}" , "%C5%A1%C3%B6%C3%A4%C5%B8%C5%93%C3%B1%C3%AA%E2%82%AC%C2%A3%C2%A5%E2%80%A1%C3%91%C3%92%C3%93%C3%94%C3%95%C3%96%C3%97%C3%98%C3%99%C3%9A%C3%A0%C3%A1%C3%A2%C3%A3%C3%A4%C3%A5%C3%A6%C3%A7%C3%BF"],
|
||||
["{?assoc_special_chars*}", "?%C5%A1%C3%B6%C3%A4%C5%B8%C5%93%C3%B1%C3%AA%E2%82%AC%C2%A3%C2%A5%E2%80%A1%C3%91%C3%92%C3%93%C3%94%C3%95=%C3%96%C3%97%C3%98%C3%99%C3%9A%C3%A0%C3%A1%C3%A2%C3%A3%C3%A4%C3%A5%C3%A6%C3%A7%C3%BF"]
|
||||
]
|
||||
},
|
||||
"Additional Examples 2":{
|
||||
"level":4,
|
||||
"variables":{
|
||||
"id" : ["person","albums"],
|
||||
"token" : "12345",
|
||||
"fields" : ["id", "name", "picture"],
|
||||
"format" : "atom",
|
||||
"q" : "URI Templates",
|
||||
"page" : "10",
|
||||
"start" : "5",
|
||||
"lang" : "en",
|
||||
"geocode" : ["37.76","-122.427"]
|
||||
},
|
||||
"testcases":[
|
||||
|
||||
[ "{/id*}" , ["/person/albums","/albums/person"] ],
|
||||
[ "{/id*}{?fields,token}" , [
|
||||
"/person/albums?fields=id,name,picture&token=12345",
|
||||
"/person/albums?fields=id,picture,name&token=12345",
|
||||
"/person/albums?fields=picture,name,id&token=12345",
|
||||
"/person/albums?fields=picture,id,name&token=12345",
|
||||
"/person/albums?fields=name,picture,id&token=12345",
|
||||
"/person/albums?fields=name,id,picture&token=12345",
|
||||
"/albums/person?fields=id,name,picture&token=12345",
|
||||
"/albums/person?fields=id,picture,name&token=12345",
|
||||
"/albums/person?fields=picture,name,id&token=12345",
|
||||
"/albums/person?fields=picture,id,name&token=12345",
|
||||
"/albums/person?fields=name,picture,id&token=12345",
|
||||
"/albums/person?fields=name,id,picture&token=12345"]
|
||||
]
|
||||
]
|
||||
},
|
||||
"Additional Examples 3: Empty Variables":{
|
||||
"variables" : {
|
||||
"empty_list" : [],
|
||||
"empty_assoc" : {}
|
||||
},
|
||||
"testcases":[
|
||||
[ "{/empty_list}", [ "" ] ],
|
||||
[ "{/empty_list*}", [ "" ] ],
|
||||
[ "{?empty_list}", [ ""] ],
|
||||
[ "{?empty_list*}", [ "" ] ],
|
||||
[ "{?empty_assoc}", [ "" ] ],
|
||||
[ "{?empty_assoc*}", [ "" ] ]
|
||||
]
|
||||
},
|
||||
"Additional Examples 4: Numeric Keys":{
|
||||
"variables" : {
|
||||
"42" : "The Answer to the Ultimate Question of Life, the Universe, and Everything",
|
||||
"1337" : ["leet", "as","it", "can","be"],
|
||||
"german" : {
|
||||
"11": "elf",
|
||||
"12": "zwölf"
|
||||
}
|
||||
},
|
||||
"testcases":[
|
||||
[ "{42}", "The%20Answer%20to%20the%20Ultimate%20Question%20of%20Life%2C%20the%20Universe%2C%20and%20Everything"],
|
||||
[ "{?42}", "?42=The%20Answer%20to%20the%20Ultimate%20Question%20of%20Life%2C%20the%20Universe%2C%20and%20Everything"],
|
||||
[ "{1337}", "leet,as,it,can,be"],
|
||||
[ "{?1337*}", "?1337=leet&1337=as&1337=it&1337=can&1337=be"],
|
||||
[ "{?german*}", [ "?11=elf&12=zw%C3%B6lf", "?12=zw%C3%B6lf&11=elf"] ]
|
||||
]
|
||||
}
|
||||
}
|
||||
201
vendor/rize/uri-template/tests/fixtures/json2xml.xslt
vendored
Normal file
201
vendor/rize/uri-template/tests/fixtures/json2xml.xslt
vendored
Normal file
@@ -0,0 +1,201 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Downloaded on 12/6/2012 from http://www.gerixsoft.com/blog/xslt/json2xml -->
|
||||
|
||||
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
|
||||
|
||||
<xsl:template match="json">
|
||||
<xsl:copy>
|
||||
<xsl:copy-of select="@*"/>
|
||||
<xsl:call-template name="json2xml">
|
||||
<xsl:with-param name="text" select="."/>
|
||||
</xsl:call-template>
|
||||
</xsl:copy>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template name="json2xml">
|
||||
<xsl:param name="text"/>
|
||||
<xsl:variable name="mode0">
|
||||
<xsl:variable name="regexps" select="'//(.*?)\n', '/\*(.*?)\*/', '(''|")(([^\\]|\\[\\"''/btnvfr])*?)\3', '(-?\d+(\.\d+([eE][+-]?\d+)?|[eE][+-]?\d+))', '(-?[1-9]\d*)', '(-?0[0-7]+)', '(-?0x[0-9a-fA-F]+)', '([:,\{\}\[\]])', '(true|false)', '(null)'"/>
|
||||
<xsl:analyze-string select="$text" regex="{string-join($regexps,'|')}" flags="s">
|
||||
<xsl:matching-substring>
|
||||
<xsl:choose>
|
||||
<!-- single line comment -->
|
||||
<xsl:when test="regex-group(1)">
|
||||
<xsl:comment>
|
||||
<xsl:value-of select="regex-group(1)"/>
|
||||
</xsl:comment>
|
||||
<xsl:text> </xsl:text>
|
||||
</xsl:when>
|
||||
<!-- multi line comment -->
|
||||
<xsl:when test="regex-group(2)">
|
||||
<xsl:comment>
|
||||
<xsl:value-of select="regex-group(2)"/>
|
||||
</xsl:comment>
|
||||
</xsl:when>
|
||||
<!-- string -->
|
||||
<xsl:when test="regex-group(3)">
|
||||
<string>
|
||||
<xsl:analyze-string select="regex-group(4)" regex="\\([\\"'/btnvfr])" flags="s">
|
||||
<xsl:matching-substring>
|
||||
<xsl:variable name="s" select="regex-group(1)"/>
|
||||
<xsl:choose>
|
||||
<xsl:when test="$s=('\', '"', '''', '/')">
|
||||
<xsl:value-of select="regex-group(1)"/>
|
||||
</xsl:when>
|
||||
<xsl:when test="$s='b'">
|
||||
<!--xsl:text></xsl:text-->
|
||||
<xsl:message select="'escape sequense \b is not supported by XML'"/>
|
||||
<xsl:text>\b</xsl:text>
|
||||
</xsl:when>
|
||||
<xsl:when test="$s='t'">
|
||||
<xsl:text>	</xsl:text>
|
||||
</xsl:when>
|
||||
<xsl:when test="$s='n'">
|
||||
<xsl:text> </xsl:text>
|
||||
</xsl:when>
|
||||
<xsl:when test="$s='v'">
|
||||
<!--xsl:text></xsl:text-->
|
||||
<xsl:message select="'escape sequence \v is not supported by XML'"/>
|
||||
<xsl:text>\v</xsl:text>
|
||||
</xsl:when>
|
||||
<xsl:when test="$s='f'">
|
||||
<!--xsl:text></xsl:text-->
|
||||
<xsl:message select="'escape sequence \f is not supported by XML'"/>
|
||||
<xsl:text>\f</xsl:text>
|
||||
</xsl:when>
|
||||
<xsl:when test="$s='r'">
|
||||
<xsl:text> </xsl:text>
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<xsl:message terminate="yes" select="'internal error'"/>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:matching-substring>
|
||||
<xsl:non-matching-substring>
|
||||
<xsl:value-of select="."/>
|
||||
</xsl:non-matching-substring>
|
||||
</xsl:analyze-string>
|
||||
</string>
|
||||
</xsl:when>
|
||||
<!-- double -->
|
||||
<xsl:when test="regex-group(6)">
|
||||
<double>
|
||||
<xsl:value-of select="regex-group(6)"/>
|
||||
</double>
|
||||
</xsl:when>
|
||||
<!-- integer -->
|
||||
<xsl:when test="regex-group(9)">
|
||||
<integer>
|
||||
<xsl:value-of select="regex-group(9)"/>
|
||||
</integer>
|
||||
</xsl:when>
|
||||
<!-- octal -->
|
||||
<xsl:when test="regex-group(10)">
|
||||
<integer>
|
||||
<xsl:value-of xmlns:Integer="java:java.lang.Integer" select="Integer:parseInt(regex-group(10), 8)"/>
|
||||
</integer>
|
||||
</xsl:when>
|
||||
<!-- hex -->
|
||||
<xsl:when test="regex-group(11)">
|
||||
<integer>
|
||||
<xsl:value-of xmlns:Integer="java:java.lang.Integer" select="Integer:parseInt(replace(regex-group(11), '0x', ''), 16)"/>
|
||||
</integer>
|
||||
</xsl:when>
|
||||
<!-- symbol -->
|
||||
<xsl:when test="regex-group(12)">
|
||||
<symbol>
|
||||
<xsl:value-of select="regex-group(12)"/>
|
||||
</symbol>
|
||||
</xsl:when>
|
||||
<!-- boolean -->
|
||||
<xsl:when test="regex-group(13)">
|
||||
<boolean>
|
||||
<xsl:value-of select="regex-group(13)"/>
|
||||
</boolean>
|
||||
</xsl:when>
|
||||
<!-- null -->
|
||||
<xsl:when test="regex-group(14)">
|
||||
<null />
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<xsl:message terminate="yes" select="'internal error'"/>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:matching-substring>
|
||||
<xsl:non-matching-substring>
|
||||
<xsl:if test="normalize-space()!=''">
|
||||
<xsl:message select="concat('unknown token: ', .)"/>
|
||||
<xsl:value-of select="."/>
|
||||
</xsl:if>
|
||||
</xsl:non-matching-substring>
|
||||
</xsl:analyze-string>
|
||||
</xsl:variable>
|
||||
<xsl:variable name="mode1">
|
||||
<xsl:apply-templates mode="json2xml1" select="$mode0/node()[1]"/>
|
||||
</xsl:variable>
|
||||
<xsl:variable name="mode2">
|
||||
<xsl:apply-templates mode="json2xml2" select="$mode1"/>
|
||||
</xsl:variable>
|
||||
<xsl:variable name="mode3">
|
||||
<xsl:apply-templates mode="json2xml3" select="$mode2"/>
|
||||
</xsl:variable>
|
||||
<xsl:copy-of select="$mode3"/> <!-- change $mode3 to $mode[0-2] for easy debug -->
|
||||
</xsl:template>
|
||||
|
||||
<!-- json2xml1 mode: group content between {} and [] into object and array elements -->
|
||||
|
||||
<xsl:template mode="json2xml1" match="node()" priority="-9">
|
||||
<xsl:copy-of select="."/>
|
||||
<xsl:apply-templates mode="json2xml1" select="following-sibling::node()[1]"/>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template mode="json2xml1" match="symbol[.=('}',']')]"/>
|
||||
|
||||
<xsl:template mode="json2xml1" match="symbol[.=('{','[')]">
|
||||
<xsl:element name="{if (.='{') then 'object' else 'array'}">
|
||||
<xsl:apply-templates mode="json2xml1" select="following-sibling::node()[1]"/>
|
||||
</xsl:element>
|
||||
<xsl:variable name="level" select="count(preceding-sibling::symbol[.=('{','[')])-count(preceding-sibling::symbol[.=('}',']')])+1"/>
|
||||
<xsl:variable name="ender"
|
||||
select="following-sibling::symbol[.=('}',']') and count(preceding-sibling::symbol[.=('{','[')])-count(preceding-sibling::symbol[.=('}',']')])=$level][1]"/>
|
||||
<xsl:apply-templates mode="json2xml1" select="$ender/following-sibling::node()[1]"/>
|
||||
</xsl:template>
|
||||
|
||||
<!-- json2xml2 mode: group <string>:<string|integer|double|object|array> into field element -->
|
||||
|
||||
<xsl:template priority="-9" mode="json2xml2" match="@*|node()">
|
||||
<xsl:copy>
|
||||
<xsl:apply-templates mode="json2xml2" select="@*|node()"/>
|
||||
</xsl:copy>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template mode="json2xml2"
|
||||
match="string[following-sibling::*[1]/self::symbol[.=':'] and following-sibling::*[2]/(self::string|self::integer|self::double|self::boolean|self::object|self::array|self::null)]"/>
|
||||
|
||||
<xsl:template mode="json2xml2"
|
||||
match="symbol[.=':'][preceding-sibling::*[1]/self::string and following-sibling::*[1]/(self::string|self::integer|self::double|self::boolean|self::object|self::array|self::null)]">
|
||||
<field name="{preceding-sibling::*[1]}">
|
||||
<xsl:for-each select="following-sibling::*[1]">
|
||||
<xsl:copy>
|
||||
<xsl:apply-templates mode="json2xml2" select="@*|node()"/>
|
||||
</xsl:copy>
|
||||
</xsl:for-each>
|
||||
</field>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template mode="json2xml2"
|
||||
match="*[self::string|self::integer|self::double|self::boolean|self::object|self::array|self::null][preceding-sibling::*[2]/self::string and preceding-sibling::*[1]/self::symbol[.=':']]"/>
|
||||
|
||||
<!-- json2xml3 mode: drop comma between consecutive field and object elements -->
|
||||
|
||||
<xsl:template priority="-9" mode="json2xml3" match="@*|node()">
|
||||
<xsl:copy>
|
||||
<xsl:apply-templates mode="json2xml3" select="@*|node()"/>
|
||||
</xsl:copy>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template mode="json2xml3" match="object/symbol[.=','][preceding-sibling::*[1]/self::field and following-sibling::*[1]/self::field]"/>
|
||||
|
||||
<xsl:template mode="json2xml3" match="array/symbol[.=','][preceding-sibling::*[1]/(self::string|self::integer|self::double|self::boolean|self::object|self::array|self::null) and following-sibling::*[1]/(self::string|self::integer|self::double|self::boolean|self::object|self::array|self::null)]"/>
|
||||
|
||||
</xsl:stylesheet>
|
||||
57
vendor/rize/uri-template/tests/fixtures/negative-tests.json
vendored
Normal file
57
vendor/rize/uri-template/tests/fixtures/negative-tests.json
vendored
Normal file
@@ -0,0 +1,57 @@
|
||||
{
|
||||
"Failure Tests":{
|
||||
"level":4,
|
||||
"variables":{
|
||||
"id" : "thing",
|
||||
"var" : "value",
|
||||
"hello" : "Hello World!",
|
||||
"with space" : "fail",
|
||||
" leading_space" : "Hi!",
|
||||
"trailing_space " : "Bye!",
|
||||
"empty" : "",
|
||||
"path" : "/foo/bar",
|
||||
"x" : "1024",
|
||||
"y" : "768",
|
||||
"list" : ["red", "green", "blue"],
|
||||
"keys" : { "semi" : ";", "dot" : ".", "comma" : ","},
|
||||
"example" : "red",
|
||||
"searchTerms" : "uri templates",
|
||||
"~thing" : "some-user",
|
||||
"default-graph-uri" : ["http://www.example/book/","http://www.example/papers/"],
|
||||
"query" : "PREFIX dc: <http://purl.org/dc/elements/1.1/> SELECT ?book ?who WHERE { ?book dc:creator ?who }"
|
||||
|
||||
},
|
||||
"testcases":[
|
||||
[ "{/id*", false ],
|
||||
[ "/id*}", false ],
|
||||
[ "{/?id}", false ],
|
||||
[ "{var:prefix}", false ],
|
||||
[ "{hello:2*}", false ] ,
|
||||
[ "{??hello}", false ] ,
|
||||
[ "{!hello}", false ] ,
|
||||
[ "{with space}", false],
|
||||
[ "{ leading_space}", false],
|
||||
[ "{trailing_space }", false],
|
||||
[ "{=path}", false ] ,
|
||||
[ "{$var}", false ],
|
||||
[ "{|var*}", false ],
|
||||
[ "{*keys?}", false ],
|
||||
[ "{?empty=default,var}", false ],
|
||||
[ "{var}{-prefix|/-/|var}" , false ],
|
||||
[ "?q={searchTerms}&c={example:color?}" , false ],
|
||||
[ "x{?empty|foo=none}" , false ],
|
||||
[ "/h{#hello+}" , false ],
|
||||
[ "/h#{hello+}" , false ],
|
||||
[ "{keys:1}", false ],
|
||||
[ "{+keys:1}", false ],
|
||||
[ "{;keys:1*}", false ],
|
||||
[ "?{-join|&|var,list}" , false ],
|
||||
[ "/people/{~thing}", false],
|
||||
[ "/{default-graph-uri}", false ],
|
||||
[ "/sparql{?query,default-graph-uri}", false ],
|
||||
[ "/sparql{?query){&default-graph-uri*}", false ],
|
||||
[ "/resolution{?x, y}" , false ]
|
||||
|
||||
]
|
||||
}
|
||||
}
|
||||
439
vendor/rize/uri-template/tests/fixtures/spec-examples-by-section.json
vendored
Normal file
439
vendor/rize/uri-template/tests/fixtures/spec-examples-by-section.json
vendored
Normal file
@@ -0,0 +1,439 @@
|
||||
{
|
||||
"3.2.1 Variable Expansion" :
|
||||
{
|
||||
"variables": {
|
||||
"count" : ["one", "two", "three"],
|
||||
"dom" : ["example", "com"],
|
||||
"dub" : "me/too",
|
||||
"hello" : "Hello World!",
|
||||
"half" : "50%",
|
||||
"var" : "value",
|
||||
"who" : "fred",
|
||||
"base" : "http://example.com/home/",
|
||||
"path" : "/foo/bar",
|
||||
"list" : ["red", "green", "blue"],
|
||||
"keys" : { "semi" : ";", "dot" : ".", "comma" : ","},
|
||||
"v" : "6",
|
||||
"x" : "1024",
|
||||
"y" : "768",
|
||||
"empty" : "",
|
||||
"empty_keys" : [],
|
||||
"undef" : null
|
||||
},
|
||||
"testcases" : [
|
||||
["{count}", "one,two,three"],
|
||||
["{count*}", "one,two,three"],
|
||||
["{/count}", "/one,two,three"],
|
||||
["{/count*}", "/one/two/three"],
|
||||
["{;count}", ";count=one,two,three"],
|
||||
["{;count*}", ";count=one;count=two;count=three"],
|
||||
["{?count}", "?count=one,two,three"],
|
||||
["{?count*}", "?count=one&count=two&count=three"],
|
||||
["{&count*}", "&count=one&count=two&count=three"]
|
||||
]
|
||||
},
|
||||
"3.2.2 Simple String Expansion" :
|
||||
{
|
||||
"variables": {
|
||||
"count" : ["one", "two", "three"],
|
||||
"dom" : ["example", "com"],
|
||||
"dub" : "me/too",
|
||||
"hello" : "Hello World!",
|
||||
"half" : "50%",
|
||||
"var" : "value",
|
||||
"who" : "fred",
|
||||
"base" : "http://example.com/home/",
|
||||
"path" : "/foo/bar",
|
||||
"list" : ["red", "green", "blue"],
|
||||
"keys" : { "semi" : ";", "dot" : ".", "comma" : ","},
|
||||
"v" : "6",
|
||||
"x" : "1024",
|
||||
"y" : "768",
|
||||
"empty" : "",
|
||||
"empty_keys" : [],
|
||||
"undef" : null
|
||||
},
|
||||
"testcases" : [
|
||||
["{var}", "value"],
|
||||
["{hello}", "Hello%20World%21"],
|
||||
["{half}", "50%25"],
|
||||
["O{empty}X", "OX"],
|
||||
["O{undef}X", "OX"],
|
||||
["{x,y}", "1024,768"],
|
||||
["{x,hello,y}", "1024,Hello%20World%21,768"],
|
||||
["?{x,empty}", "?1024,"],
|
||||
["?{x,undef}", "?1024"],
|
||||
["?{undef,y}", "?768"],
|
||||
["{var:3}", "val"],
|
||||
["{var:30}", "value"],
|
||||
["{list}", "red,green,blue"],
|
||||
["{list*}", "red,green,blue"],
|
||||
["{keys}", [
|
||||
"comma,%2C,dot,.,semi,%3B",
|
||||
"comma,%2C,semi,%3B,dot,.",
|
||||
"dot,.,comma,%2C,semi,%3B",
|
||||
"dot,.,semi,%3B,comma,%2C",
|
||||
"semi,%3B,comma,%2C,dot,.",
|
||||
"semi,%3B,dot,.,comma,%2C"
|
||||
]],
|
||||
["{keys*}", [
|
||||
"comma=%2C,dot=.,semi=%3B",
|
||||
"comma=%2C,semi=%3B,dot=.",
|
||||
"dot=.,comma=%2C,semi=%3B",
|
||||
"dot=.,semi=%3B,comma=%2C",
|
||||
"semi=%3B,comma=%2C,dot=.",
|
||||
"semi=%3B,dot=.,comma=%2C"
|
||||
]]
|
||||
]
|
||||
},
|
||||
"3.2.3 Reserved Expansion" :
|
||||
{
|
||||
"variables": {
|
||||
"count" : ["one", "two", "three"],
|
||||
"dom" : ["example", "com"],
|
||||
"dub" : "me/too",
|
||||
"hello" : "Hello World!",
|
||||
"half" : "50%",
|
||||
"var" : "value",
|
||||
"who" : "fred",
|
||||
"base" : "http://example.com/home/",
|
||||
"path" : "/foo/bar",
|
||||
"list" : ["red", "green", "blue"],
|
||||
"keys" : { "semi" : ";", "dot" : ".", "comma" : ","},
|
||||
"v" : "6",
|
||||
"x" : "1024",
|
||||
"y" : "768",
|
||||
"empty" : "",
|
||||
"empty_keys" : [],
|
||||
"undef" : null
|
||||
},
|
||||
"testcases" : [
|
||||
["{+var}", "value"],
|
||||
["{/var,empty}", "/value/"],
|
||||
["{/var,undef}", "/value"],
|
||||
["{+hello}", "Hello%20World!"],
|
||||
["{+half}", "50%25"],
|
||||
["{base}index", "http%3A%2F%2Fexample.com%2Fhome%2Findex"],
|
||||
["{+base}index", "http://example.com/home/index"],
|
||||
["O{+empty}X", "OX"],
|
||||
["O{+undef}X", "OX"],
|
||||
["{+path}/here", "/foo/bar/here"],
|
||||
["{+path:6}/here", "/foo/b/here"],
|
||||
["here?ref={+path}", "here?ref=/foo/bar"],
|
||||
["up{+path}{var}/here", "up/foo/barvalue/here"],
|
||||
["{+x,hello,y}", "1024,Hello%20World!,768"],
|
||||
["{+path,x}/here", "/foo/bar,1024/here"],
|
||||
["{+list}", "red,green,blue"],
|
||||
["{+list*}", "red,green,blue"],
|
||||
["{+keys}", [
|
||||
"comma,,,dot,.,semi,;",
|
||||
"comma,,,semi,;,dot,.",
|
||||
"dot,.,comma,,,semi,;",
|
||||
"dot,.,semi,;,comma,,",
|
||||
"semi,;,comma,,,dot,.",
|
||||
"semi,;,dot,.,comma,,"
|
||||
]],
|
||||
["{+keys*}", [
|
||||
"comma=,,dot=.,semi=;",
|
||||
"comma=,,semi=;,dot=.",
|
||||
"dot=.,comma=,,semi=;",
|
||||
"dot=.,semi=;,comma=,",
|
||||
"semi=;,comma=,,dot=.",
|
||||
"semi=;,dot=.,comma=,"
|
||||
]]
|
||||
]
|
||||
},
|
||||
"3.2.4 Fragment Expansion" :
|
||||
{
|
||||
"variables": {
|
||||
"count" : ["one", "two", "three"],
|
||||
"dom" : ["example", "com"],
|
||||
"dub" : "me/too",
|
||||
"hello" : "Hello World!",
|
||||
"half" : "50%",
|
||||
"var" : "value",
|
||||
"who" : "fred",
|
||||
"base" : "http://example.com/home/",
|
||||
"path" : "/foo/bar",
|
||||
"list" : ["red", "green", "blue"],
|
||||
"keys" : { "semi" : ";", "dot" : ".", "comma" : ","},
|
||||
"v" : "6",
|
||||
"x" : "1024",
|
||||
"y" : "768",
|
||||
"empty" : "",
|
||||
"empty_keys" : [],
|
||||
"undef" : null
|
||||
},
|
||||
"testcases" : [
|
||||
["{#var}", "#value"],
|
||||
["{#hello}", "#Hello%20World!"],
|
||||
["{#half}", "#50%25"],
|
||||
["foo{#empty}", "foo#"],
|
||||
["foo{#undef}", "foo"],
|
||||
["{#x,hello,y}", "#1024,Hello%20World!,768"],
|
||||
["{#path,x}/here", "#/foo/bar,1024/here"],
|
||||
["{#path:6}/here", "#/foo/b/here"],
|
||||
["{#list}", "#red,green,blue"],
|
||||
["{#list*}", "#red,green,blue"],
|
||||
["{#keys}", [
|
||||
"#comma,,,dot,.,semi,;",
|
||||
"#comma,,,semi,;,dot,.",
|
||||
"#dot,.,comma,,,semi,;",
|
||||
"#dot,.,semi,;,comma,,",
|
||||
"#semi,;,comma,,,dot,.",
|
||||
"#semi,;,dot,.,comma,,"
|
||||
]]
|
||||
]
|
||||
},
|
||||
"3.2.5 Label Expansion with Dot-Prefix" :
|
||||
{
|
||||
"variables": {
|
||||
"count" : ["one", "two", "three"],
|
||||
"dom" : ["example", "com"],
|
||||
"dub" : "me/too",
|
||||
"hello" : "Hello World!",
|
||||
"half" : "50%",
|
||||
"var" : "value",
|
||||
"who" : "fred",
|
||||
"base" : "http://example.com/home/",
|
||||
"path" : "/foo/bar",
|
||||
"list" : ["red", "green", "blue"],
|
||||
"keys" : { "semi" : ";", "dot" : ".", "comma" : ","},
|
||||
"v" : "6",
|
||||
"x" : "1024",
|
||||
"y" : "768",
|
||||
"empty" : "",
|
||||
"empty_keys" : [],
|
||||
"undef" : null
|
||||
},
|
||||
"testcases" : [
|
||||
["{.who}", ".fred"],
|
||||
["{.who,who}", ".fred.fred"],
|
||||
["{.half,who}", ".50%25.fred"],
|
||||
["www{.dom*}", "www.example.com"],
|
||||
["X{.var}", "X.value"],
|
||||
["X{.var:3}", "X.val"],
|
||||
["X{.empty}", "X."],
|
||||
["X{.undef}", "X"],
|
||||
["X{.list}", "X.red,green,blue"],
|
||||
["X{.list*}", "X.red.green.blue"],
|
||||
["{#keys}", [
|
||||
"#comma,,,dot,.,semi,;",
|
||||
"#comma,,,semi,;,dot,.",
|
||||
"#dot,.,comma,,,semi,;",
|
||||
"#dot,.,semi,;,comma,,",
|
||||
"#semi,;,comma,,,dot,.",
|
||||
"#semi,;,dot,.,comma,,"
|
||||
]],
|
||||
["{#keys*}", [
|
||||
"#comma=,,dot=.,semi=;",
|
||||
"#comma=,,semi=;,dot=.",
|
||||
"#dot=.,comma=,,semi=;",
|
||||
"#dot=.,semi=;,comma=,",
|
||||
"#semi=;,comma=,,dot=.",
|
||||
"#semi=;,dot=.,comma=,"
|
||||
]],
|
||||
["X{.empty_keys}", "X"],
|
||||
["X{.empty_keys*}", "X"]
|
||||
]
|
||||
},
|
||||
"3.2.6 Path Segment Expansion" :
|
||||
{
|
||||
"variables": {
|
||||
"count" : ["one", "two", "three"],
|
||||
"dom" : ["example", "com"],
|
||||
"dub" : "me/too",
|
||||
"hello" : "Hello World!",
|
||||
"half" : "50%",
|
||||
"var" : "value",
|
||||
"who" : "fred",
|
||||
"base" : "http://example.com/home/",
|
||||
"path" : "/foo/bar",
|
||||
"list" : ["red", "green", "blue"],
|
||||
"keys" : { "semi" : ";", "dot" : ".", "comma" : ","},
|
||||
"v" : "6",
|
||||
"x" : "1024",
|
||||
"y" : "768",
|
||||
"empty" : "",
|
||||
"empty_keys" : [],
|
||||
"undef" : null
|
||||
},
|
||||
"testcases" : [
|
||||
["{/who}", "/fred"],
|
||||
["{/who,who}", "/fred/fred"],
|
||||
["{/half,who}", "/50%25/fred"],
|
||||
["{/who,dub}", "/fred/me%2Ftoo"],
|
||||
["{/var}", "/value"],
|
||||
["{/var,empty}", "/value/"],
|
||||
["{/var,undef}", "/value"],
|
||||
["{/var,x}/here", "/value/1024/here"],
|
||||
["{/var:1,var}", "/v/value"],
|
||||
["{/list}", "/red,green,blue"],
|
||||
["{/list*}", "/red/green/blue"],
|
||||
["{/list*,path:4}", "/red/green/blue/%2Ffoo"],
|
||||
["{/keys}", [
|
||||
"/comma,%2C,dot,.,semi,%3B",
|
||||
"/comma,%2C,semi,%3B,dot,.",
|
||||
"/dot,.,comma,%2C,semi,%3B",
|
||||
"/dot,.,semi,%3B,comma,%2C",
|
||||
"/semi,%3B,comma,%2C,dot,.",
|
||||
"/semi,%3B,dot,.,comma,%2C"
|
||||
]],
|
||||
["{/keys*}", [
|
||||
"/comma=%2C/dot=./semi=%3B",
|
||||
"/comma=%2C/semi=%3B/dot=.",
|
||||
"/dot=./comma=%2C/semi=%3B",
|
||||
"/dot=./semi=%3B/comma=%2C",
|
||||
"/semi=%3B/comma=%2C/dot=.",
|
||||
"/semi=%3B/dot=./comma=%2C"
|
||||
]]
|
||||
]
|
||||
},
|
||||
"3.2.7 Path-Style Parameter Expansion" :
|
||||
{
|
||||
"variables": {
|
||||
"count" : ["one", "two", "three"],
|
||||
"dom" : ["example", "com"],
|
||||
"dub" : "me/too",
|
||||
"hello" : "Hello World!",
|
||||
"half" : "50%",
|
||||
"var" : "value",
|
||||
"who" : "fred",
|
||||
"base" : "http://example.com/home/",
|
||||
"path" : "/foo/bar",
|
||||
"list" : ["red", "green", "blue"],
|
||||
"keys" : { "semi" : ";", "dot" : ".", "comma" : ","},
|
||||
"v" : "6",
|
||||
"x" : "1024",
|
||||
"y" : "768",
|
||||
"empty" : "",
|
||||
"empty_keys" : [],
|
||||
"undef" : null
|
||||
},
|
||||
"testcases" : [
|
||||
["{;who}", ";who=fred"],
|
||||
["{;half}", ";half=50%25"],
|
||||
["{;empty}", ";empty"],
|
||||
["{;hello:5}", ";hello=Hello"],
|
||||
["{;v,empty,who}", ";v=6;empty;who=fred"],
|
||||
["{;v,bar,who}", ";v=6;who=fred"],
|
||||
["{;x,y}", ";x=1024;y=768"],
|
||||
["{;x,y,empty}", ";x=1024;y=768;empty"],
|
||||
["{;x,y,undef}", ";x=1024;y=768"],
|
||||
["{;list}", ";list=red,green,blue"],
|
||||
["{;list*}", ";list=red;list=green;list=blue"],
|
||||
["{;keys}", [
|
||||
";keys=comma,%2C,dot,.,semi,%3B",
|
||||
";keys=comma,%2C,semi,%3B,dot,.",
|
||||
";keys=dot,.,comma,%2C,semi,%3B",
|
||||
";keys=dot,.,semi,%3B,comma,%2C",
|
||||
";keys=semi,%3B,comma,%2C,dot,.",
|
||||
";keys=semi,%3B,dot,.,comma,%2C"
|
||||
]],
|
||||
["{;keys*}", [
|
||||
";comma=%2C;dot=.;semi=%3B",
|
||||
";comma=%2C;semi=%3B;dot=.",
|
||||
";dot=.;comma=%2C;semi=%3B",
|
||||
";dot=.;semi=%3B;comma=%2C",
|
||||
";semi=%3B;comma=%2C;dot=.",
|
||||
";semi=%3B;dot=.;comma=%2C"
|
||||
]]
|
||||
]
|
||||
},
|
||||
"3.2.8 Form-Style Query Expansion" :
|
||||
{
|
||||
"variables": {
|
||||
"count" : ["one", "two", "three"],
|
||||
"dom" : ["example", "com"],
|
||||
"dub" : "me/too",
|
||||
"hello" : "Hello World!",
|
||||
"half" : "50%",
|
||||
"var" : "value",
|
||||
"who" : "fred",
|
||||
"base" : "http://example.com/home/",
|
||||
"path" : "/foo/bar",
|
||||
"list" : ["red", "green", "blue"],
|
||||
"keys" : { "semi" : ";", "dot" : ".", "comma" : ","},
|
||||
"v" : "6",
|
||||
"x" : "1024",
|
||||
"y" : "768",
|
||||
"empty" : "",
|
||||
"empty_keys" : [],
|
||||
"undef" : null
|
||||
},
|
||||
"testcases" : [
|
||||
["{?who}", "?who=fred"],
|
||||
["{?half}", "?half=50%25"],
|
||||
["{?x,y}", "?x=1024&y=768"],
|
||||
["{?x,y,empty}", "?x=1024&y=768&empty="],
|
||||
["{?x,y,undef}", "?x=1024&y=768"],
|
||||
["{?var:3}", "?var=val"],
|
||||
["{?list}", "?list=red,green,blue"],
|
||||
["{?list*}", "?list=red&list=green&list=blue"],
|
||||
["{?keys}", [
|
||||
"?keys=comma,%2C,dot,.,semi,%3B",
|
||||
"?keys=comma,%2C,semi,%3B,dot,.",
|
||||
"?keys=dot,.,comma,%2C,semi,%3B",
|
||||
"?keys=dot,.,semi,%3B,comma,%2C",
|
||||
"?keys=semi,%3B,comma,%2C,dot,.",
|
||||
"?keys=semi,%3B,dot,.,comma,%2C"
|
||||
]],
|
||||
["{?keys*}", [
|
||||
"?comma=%2C&dot=.&semi=%3B",
|
||||
"?comma=%2C&semi=%3B&dot=.",
|
||||
"?dot=.&comma=%2C&semi=%3B",
|
||||
"?dot=.&semi=%3B&comma=%2C",
|
||||
"?semi=%3B&comma=%2C&dot=.",
|
||||
"?semi=%3B&dot=.&comma=%2C"
|
||||
]]
|
||||
]
|
||||
},
|
||||
"3.2.9 Form-Style Query Continuation" :
|
||||
{
|
||||
"variables": {
|
||||
"count" : ["one", "two", "three"],
|
||||
"dom" : ["example", "com"],
|
||||
"dub" : "me/too",
|
||||
"hello" : "Hello World!",
|
||||
"half" : "50%",
|
||||
"var" : "value",
|
||||
"who" : "fred",
|
||||
"base" : "http://example.com/home/",
|
||||
"path" : "/foo/bar",
|
||||
"list" : ["red", "green", "blue"],
|
||||
"keys" : { "semi" : ";", "dot" : ".", "comma" : ","},
|
||||
"v" : "6",
|
||||
"x" : "1024",
|
||||
"y" : "768",
|
||||
"empty" : "",
|
||||
"empty_keys" : [],
|
||||
"undef" : null
|
||||
},
|
||||
"testcases" : [
|
||||
["{&who}", "&who=fred"],
|
||||
["{&half}", "&half=50%25"],
|
||||
["?fixed=yes{&x}", "?fixed=yes&x=1024"],
|
||||
["{&var:3}", "&var=val"],
|
||||
["{&x,y,empty}", "&x=1024&y=768&empty="],
|
||||
["{&x,y,undef}", "&x=1024&y=768"],
|
||||
["{&list}", "&list=red,green,blue"],
|
||||
["{&list*}", "&list=red&list=green&list=blue"],
|
||||
["{&keys}", [
|
||||
"&keys=comma,%2C,dot,.,semi,%3B",
|
||||
"&keys=comma,%2C,semi,%3B,dot,.",
|
||||
"&keys=dot,.,comma,%2C,semi,%3B",
|
||||
"&keys=dot,.,semi,%3B,comma,%2C",
|
||||
"&keys=semi,%3B,comma,%2C,dot,.",
|
||||
"&keys=semi,%3B,dot,.,comma,%2C"
|
||||
]],
|
||||
["{&keys*}", [
|
||||
"&comma=%2C&dot=.&semi=%3B",
|
||||
"&comma=%2C&semi=%3B&dot=.",
|
||||
"&dot=.&comma=%2C&semi=%3B",
|
||||
"&dot=.&semi=%3B&comma=%2C",
|
||||
"&semi=%3B&comma=%2C&dot=.",
|
||||
"&semi=%3B&dot=.&comma=%2C"
|
||||
]]
|
||||
]
|
||||
}
|
||||
}
|
||||
218
vendor/rize/uri-template/tests/fixtures/spec-examples.json
vendored
Normal file
218
vendor/rize/uri-template/tests/fixtures/spec-examples.json
vendored
Normal file
@@ -0,0 +1,218 @@
|
||||
{
|
||||
"Level 1 Examples" :
|
||||
{
|
||||
"level": 1,
|
||||
"variables": {
|
||||
"var" : "value",
|
||||
"hello" : "Hello World!"
|
||||
},
|
||||
"testcases" : [
|
||||
["{var}", "value"],
|
||||
["{hello}", "Hello%20World%21"]
|
||||
]
|
||||
},
|
||||
"Level 2 Examples" :
|
||||
{
|
||||
"level": 2,
|
||||
"variables": {
|
||||
"var" : "value",
|
||||
"hello" : "Hello World!",
|
||||
"path" : "/foo/bar"
|
||||
},
|
||||
"testcases" : [
|
||||
["{+var}", "value"],
|
||||
["{+hello}", "Hello%20World!"],
|
||||
["{+path}/here", "/foo/bar/here"],
|
||||
["here?ref={+path}", "here?ref=/foo/bar"]
|
||||
]
|
||||
},
|
||||
"Level 3 Examples" :
|
||||
{
|
||||
"level": 3,
|
||||
"variables": {
|
||||
"var" : "value",
|
||||
"hello" : "Hello World!",
|
||||
"empty" : "",
|
||||
"path" : "/foo/bar",
|
||||
"x" : "1024",
|
||||
"y" : "768"
|
||||
},
|
||||
"testcases" : [
|
||||
["map?{x,y}", "map?1024,768"],
|
||||
["{x,hello,y}", "1024,Hello%20World%21,768"],
|
||||
["{+x,hello,y}", "1024,Hello%20World!,768"],
|
||||
["{+path,x}/here", "/foo/bar,1024/here"],
|
||||
["{#x,hello,y}", "#1024,Hello%20World!,768"],
|
||||
["{#path,x}/here", "#/foo/bar,1024/here"],
|
||||
["X{.var}", "X.value"],
|
||||
["X{.x,y}", "X.1024.768"],
|
||||
["{/var}", "/value"],
|
||||
["{/var,x}/here", "/value/1024/here"],
|
||||
["{;x,y}", ";x=1024;y=768"],
|
||||
["{;x,y,empty}", ";x=1024;y=768;empty"],
|
||||
["{?x,y}", "?x=1024&y=768"],
|
||||
["{?x,y,empty}", "?x=1024&y=768&empty="],
|
||||
["?fixed=yes{&x}", "?fixed=yes&x=1024"],
|
||||
["{&x,y,empty}", "&x=1024&y=768&empty="]
|
||||
]
|
||||
},
|
||||
"Level 4 Examples" :
|
||||
{
|
||||
"level": 4,
|
||||
"variables": {
|
||||
"var": "value",
|
||||
"hello": "Hello World!",
|
||||
"path": "/foo/bar",
|
||||
"list": ["red", "green", "blue"],
|
||||
"keys": {"semi": ";", "dot": ".", "comma":","}
|
||||
},
|
||||
"testcases": [
|
||||
["{var:3}", "val"],
|
||||
["{var:30}", "value"],
|
||||
["{list}", "red,green,blue"],
|
||||
["{list*}", "red,green,blue"],
|
||||
["{keys}", [
|
||||
"comma,%2C,dot,.,semi,%3B",
|
||||
"comma,%2C,semi,%3B,dot,.",
|
||||
"dot,.,comma,%2C,semi,%3B",
|
||||
"dot,.,semi,%3B,comma,%2C",
|
||||
"semi,%3B,comma,%2C,dot,.",
|
||||
"semi,%3B,dot,.,comma,%2C"
|
||||
]],
|
||||
["{keys*}", [
|
||||
"comma=%2C,dot=.,semi=%3B",
|
||||
"comma=%2C,semi=%3B,dot=.",
|
||||
"dot=.,comma=%2C,semi=%3B",
|
||||
"dot=.,semi=%3B,comma=%2C",
|
||||
"semi=%3B,comma=%2C,dot=.",
|
||||
"semi=%3B,dot=.,comma=%2C"
|
||||
]],
|
||||
["{+path:6}/here", "/foo/b/here"],
|
||||
["{+list}", "red,green,blue"],
|
||||
["{+list*}", "red,green,blue"],
|
||||
["{+keys}", [
|
||||
"comma,,,dot,.,semi,;",
|
||||
"comma,,,semi,;,dot,.",
|
||||
"dot,.,comma,,,semi,;",
|
||||
"dot,.,semi,;,comma,,",
|
||||
"semi,;,comma,,,dot,.",
|
||||
"semi,;,dot,.,comma,,"
|
||||
]],
|
||||
["{+keys*}", [
|
||||
"comma=,,dot=.,semi=;",
|
||||
"comma=,,semi=;,dot=.",
|
||||
"dot=.,comma=,,semi=;",
|
||||
"dot=.,semi=;,comma=,",
|
||||
"semi=;,comma=,,dot=.",
|
||||
"semi=;,dot=.,comma=,"
|
||||
]],
|
||||
["{#path:6}/here", "#/foo/b/here"],
|
||||
["{#list}", "#red,green,blue"],
|
||||
["{#list*}", "#red,green,blue"],
|
||||
["{#keys}", [
|
||||
"#comma,,,dot,.,semi,;",
|
||||
"#comma,,,semi,;,dot,.",
|
||||
"#dot,.,comma,,,semi,;",
|
||||
"#dot,.,semi,;,comma,,",
|
||||
"#semi,;,comma,,,dot,.",
|
||||
"#semi,;,dot,.,comma,,"
|
||||
]],
|
||||
["{#keys*}", [
|
||||
"#comma=,,dot=.,semi=;",
|
||||
"#comma=,,semi=;,dot=.",
|
||||
"#dot=.,comma=,,semi=;",
|
||||
"#dot=.,semi=;,comma=,",
|
||||
"#semi=;,comma=,,dot=.",
|
||||
"#semi=;,dot=.,comma=,"
|
||||
]],
|
||||
["X{.var:3}", "X.val"],
|
||||
["X{.list}", "X.red,green,blue"],
|
||||
["X{.list*}", "X.red.green.blue"],
|
||||
["X{.keys}", [
|
||||
"X.comma,%2C,dot,.,semi,%3B",
|
||||
"X.comma,%2C,semi,%3B,dot,.",
|
||||
"X.dot,.,comma,%2C,semi,%3B",
|
||||
"X.dot,.,semi,%3B,comma,%2C",
|
||||
"X.semi,%3B,comma,%2C,dot,.",
|
||||
"X.semi,%3B,dot,.,comma,%2C"
|
||||
]],
|
||||
["{/var:1,var}", "/v/value"],
|
||||
["{/list}", "/red,green,blue"],
|
||||
["{/list*}", "/red/green/blue"],
|
||||
["{/list*,path:4}", "/red/green/blue/%2Ffoo"],
|
||||
["{/keys}", [
|
||||
"/comma,%2C,dot,.,semi,%3B",
|
||||
"/comma,%2C,semi,%3B,dot,.",
|
||||
"/dot,.,comma,%2C,semi,%3B",
|
||||
"/dot,.,semi,%3B,comma,%2C",
|
||||
"/semi,%3B,comma,%2C,dot,.",
|
||||
"/semi,%3B,dot,.,comma,%2C"
|
||||
]],
|
||||
["{/keys*}", [
|
||||
"/comma=%2C/dot=./semi=%3B",
|
||||
"/comma=%2C/semi=%3B/dot=.",
|
||||
"/dot=./comma=%2C/semi=%3B",
|
||||
"/dot=./semi=%3B/comma=%2C",
|
||||
"/semi=%3B/comma=%2C/dot=.",
|
||||
"/semi=%3B/dot=./comma=%2C"
|
||||
]],
|
||||
["{;hello:5}", ";hello=Hello"],
|
||||
["{;list}", ";list=red,green,blue"],
|
||||
["{;list*}", ";list=red;list=green;list=blue"],
|
||||
["{;keys}", [
|
||||
";keys=comma,%2C,dot,.,semi,%3B",
|
||||
";keys=comma,%2C,semi,%3B,dot,.",
|
||||
";keys=dot,.,comma,%2C,semi,%3B",
|
||||
";keys=dot,.,semi,%3B,comma,%2C",
|
||||
";keys=semi,%3B,comma,%2C,dot,.",
|
||||
";keys=semi,%3B,dot,.,comma,%2C"
|
||||
]],
|
||||
["{;keys*}", [
|
||||
";comma=%2C;dot=.;semi=%3B",
|
||||
";comma=%2C;semi=%3B;dot=.",
|
||||
";dot=.;comma=%2C;semi=%3B",
|
||||
";dot=.;semi=%3B;comma=%2C",
|
||||
";semi=%3B;comma=%2C;dot=.",
|
||||
";semi=%3B;dot=.;comma=%2C"
|
||||
]],
|
||||
["{?var:3}", "?var=val"],
|
||||
["{?list}", "?list=red,green,blue"],
|
||||
["{?list*}", "?list=red&list=green&list=blue"],
|
||||
["{?keys}", [
|
||||
"?keys=comma,%2C,dot,.,semi,%3B",
|
||||
"?keys=comma,%2C,semi,%3B,dot,.",
|
||||
"?keys=dot,.,comma,%2C,semi,%3B",
|
||||
"?keys=dot,.,semi,%3B,comma,%2C",
|
||||
"?keys=semi,%3B,comma,%2C,dot,.",
|
||||
"?keys=semi,%3B,dot,.,comma,%2C"
|
||||
]],
|
||||
["{?keys*}", [
|
||||
"?comma=%2C&dot=.&semi=%3B",
|
||||
"?comma=%2C&semi=%3B&dot=.",
|
||||
"?dot=.&comma=%2C&semi=%3B",
|
||||
"?dot=.&semi=%3B&comma=%2C",
|
||||
"?semi=%3B&comma=%2C&dot=.",
|
||||
"?semi=%3B&dot=.&comma=%2C"
|
||||
]],
|
||||
["{&var:3}", "&var=val"],
|
||||
["{&list}", "&list=red,green,blue"],
|
||||
["{&list*}", "&list=red&list=green&list=blue"],
|
||||
["{&keys}", [
|
||||
"&keys=comma,%2C,dot,.,semi,%3B",
|
||||
"&keys=comma,%2C,semi,%3B,dot,.",
|
||||
"&keys=dot,.,comma,%2C,semi,%3B",
|
||||
"&keys=dot,.,semi,%3B,comma,%2C",
|
||||
"&keys=semi,%3B,comma,%2C,dot,.",
|
||||
"&keys=semi,%3B,dot,.,comma,%2C"
|
||||
]],
|
||||
["{&keys*}", [
|
||||
"&comma=%2C&dot=.&semi=%3B",
|
||||
"&comma=%2C&semi=%3B&dot=.",
|
||||
"&dot=.&comma=%2C&semi=%3B",
|
||||
"&dot=.&semi=%3B&comma=%2C",
|
||||
"&semi=%3B&comma=%2C&dot=.",
|
||||
"&semi=%3B&dot=.&comma=%2C"
|
||||
]]
|
||||
]
|
||||
}
|
||||
}
|
||||
51
vendor/rize/uri-template/tests/fixtures/transform-json-tests.xslt
vendored
Normal file
51
vendor/rize/uri-template/tests/fixtures/transform-json-tests.xslt
vendored
Normal file
@@ -0,0 +1,51 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
|
||||
|
||||
<xsl:include href="json2xml.xslt"/>
|
||||
|
||||
<!-- the input test files need to be supplied as a sequence of file names only (no extension) -->
|
||||
<xsl:param name="tests" select="('extended-tests', 'negative-tests', 'spec-examples-by-section', 'spec-examples')"/>
|
||||
<xsl:param name="json-ext" select="'json'"/>
|
||||
<xsl:param name="xml-ext" select="'xml'"/>
|
||||
|
||||
<!-- run this stylesheet with any input to generate the XML test files at output. -->
|
||||
<!-- (a popular way of doing this is to supply the XSLT to itself as the input file.) -->
|
||||
|
||||
<xsl:template match="/">
|
||||
<xsl:for-each select="$tests">
|
||||
<xsl:variable name="file" select="current()"/>
|
||||
<xsl:variable name="json">
|
||||
<json>
|
||||
<xsl:value-of select="unparsed-text(concat($file, '.', $json-ext))"/>
|
||||
</json>
|
||||
</xsl:variable>
|
||||
<xsl:variable name="xml">
|
||||
<xsl:apply-templates select="$json/json"/>
|
||||
</xsl:variable>
|
||||
<xsl:result-document href="{$file}.{$xml-ext}" method="xml" indent="yes">
|
||||
<tests>
|
||||
<xsl:for-each select="$xml/json/object/field">
|
||||
<test name="{@name}">
|
||||
<xsl:if test="exists(object/field[1][@name eq 'level'])">
|
||||
<xsl:attribute name="level" select="object/field[1][@name eq 'level']/integer/text()"/>
|
||||
</xsl:if>
|
||||
<variables>
|
||||
<xsl:for-each select="object/field[@name eq 'variables']/object/field">
|
||||
<variable name="{@name}">
|
||||
<xsl:copy-of select="*"/>
|
||||
</variable>
|
||||
</xsl:for-each>
|
||||
</variables>
|
||||
<testcases>
|
||||
<xsl:for-each select="object/field[@name eq 'testcases']/array/array">
|
||||
<testcase template="{*[1]}" result="{*[2]}"/>
|
||||
</xsl:for-each> </testcases>
|
||||
</test>
|
||||
</xsl:for-each>
|
||||
</tests>
|
||||
</xsl:result-document>
|
||||
</xsl:for-each>
|
||||
</xsl:template>
|
||||
|
||||
</xsl:stylesheet>
|
||||
Reference in New Issue
Block a user