View source
<?php
namespace Symfony\Component\Yaml\Tests;
use PHPUnit\Framework\TestCase;
use Symfony\Component\Yaml\Inline;
class InlineTest extends TestCase {
public function testParse($yaml, $value) {
$this
->assertSame($value, Inline::parse($yaml), sprintf('::parse() converts an inline YAML to a PHP structure (%s)', $yaml));
}
public function testParseWithMapObjects($yaml, $value) {
$actual = Inline::parse($yaml, false, false, true);
$this
->assertSame(serialize($value), serialize($actual));
}
public function testDump($yaml, $value) {
$this
->assertEquals($yaml, Inline::dump($value), sprintf('::dump() converts a PHP structure to an inline YAML (%s)', $yaml));
$this
->assertSame($value, Inline::parse(Inline::dump($value)), 'check consistency');
}
public function testDumpNumericValueWithLocale() {
$locale = setlocale(LC_NUMERIC, 0);
if (false === $locale) {
$this
->markTestSkipped('Your platform does not support locales.');
}
try {
$requiredLocales = array(
'fr_FR.UTF-8',
'fr_FR.UTF8',
'fr_FR.utf-8',
'fr_FR.utf8',
'French_France.1252',
);
if (false === setlocale(LC_NUMERIC, $requiredLocales)) {
$this
->markTestSkipped('Could not set any of required locales: ' . implode(', ', $requiredLocales));
}
$this
->assertEquals('1.2', Inline::dump(1.2));
$this
->assertContains('fr', strtolower(setlocale(LC_NUMERIC, 0)));
setlocale(LC_NUMERIC, $locale);
} catch (\Exception $e) {
setlocale(LC_NUMERIC, $locale);
throw $e;
}
}
public function testHashStringsResemblingExponentialNumericsShouldNotBeChangedToINF() {
$value = '686e444';
$this
->assertSame($value, Inline::parse(Inline::dump($value)));
}
public function testParseScalarWithNonEscapedBlackslashShouldThrowException() {
$this
->assertSame('Foo\\Var', Inline::parse('"Foo\\Var"'));
}
public function testParseScalarWithNonEscapedBlackslashAtTheEndShouldThrowException() {
Inline::parse('"Foo\\"');
}
public function testParseScalarWithIncorrectlyQuotedStringShouldThrowException() {
$value = "'don't do somthin' like that'";
Inline::parse($value);
}
public function testParseScalarWithIncorrectlyDoubleQuotedStringShouldThrowException() {
$value = '"don"t do somthin" like that"';
Inline::parse($value);
}
public function testParseInvalidMappingKeyShouldThrowException() {
$value = '{ "foo " bar": "bar" }';
Inline::parse($value);
}
public function testParseInvalidMappingShouldThrowException() {
Inline::parse('[foo] bar');
}
public function testParseInvalidSequenceShouldThrowException() {
Inline::parse('{ foo: bar } bar');
}
public function testParseScalarWithCorrectlyQuotedStringShouldReturnString() {
$value = "'don''t do somthin'' like that'";
$expect = "don't do somthin' like that";
$this
->assertSame($expect, Inline::parseScalar($value));
}
public function testParseReferences($yaml, $expected) {
$this
->assertSame($expected, Inline::parse($yaml, false, false, false, array(
'var' => 'var-value',
)));
}
public function getDataForParseReferences() {
return array(
'scalar' => array(
'*var',
'var-value',
),
'list' => array(
'[ *var ]',
array(
'var-value',
),
),
'list-in-list' => array(
'[[ *var ]]',
array(
array(
'var-value',
),
),
),
'map-in-list' => array(
'[ { key: *var } ]',
array(
array(
'key' => 'var-value',
),
),
),
'embedded-mapping-in-list' => array(
'[ key: *var ]',
array(
array(
'key' => 'var-value',
),
),
),
'map' => array(
'{ key: *var }',
array(
'key' => 'var-value',
),
),
'list-in-map' => array(
'{ key: [*var] }',
array(
'key' => array(
'var-value',
),
),
),
'map-in-map' => array(
'{ foo: { bar: *var } }',
array(
'foo' => array(
'bar' => 'var-value',
),
),
),
);
}
public function testParseMapReferenceInSequence() {
$foo = array(
'a' => 'Steve',
'b' => 'Clark',
'c' => 'Brian',
);
$this
->assertSame(array(
$foo,
), Inline::parse('[*foo]', false, false, false, array(
'foo' => $foo,
)));
}
public function testParseUnquotedAsterisk() {
Inline::parse('{ foo: * }');
}
public function testParseUnquotedAsteriskFollowedByAComment() {
Inline::parse('{ foo: * #foo }');
}
public function testParseUnquotedScalarStartingWithReservedAtIndicator() {
Inline::parse('{ foo: @foo }');
}
public function testParseUnquotedScalarStartingWithReservedBacktickIndicator() {
Inline::parse('{ foo: `foo }');
}
public function testParseUnquotedScalarStartingWithLiteralStyleIndicator() {
Inline::parse('{ foo: |foo }');
}
public function testParseUnquotedScalarStartingWithFoldedStyleIndicator() {
Inline::parse('{ foo: >foo }');
}
public function getScalarIndicators() {
return array(
array(
'|',
),
array(
'>',
),
);
}
public function testIsHash($array, $expected) {
$this
->assertSame($expected, Inline::isHash($array));
}
public function getDataForIsHash() {
return array(
array(
array(),
false,
),
array(
array(
1,
2,
3,
),
false,
),
array(
array(
2 => 1,
1 => 2,
0 => 3,
),
true,
),
array(
array(
'foo' => 1,
'bar' => 2,
),
true,
),
);
}
public function getTestsForParse() {
return array(
array(
'',
'',
),
array(
'null',
null,
),
array(
'false',
false,
),
array(
'true',
true,
),
array(
'12',
12,
),
array(
'-12',
-12,
),
array(
'"quoted string"',
'quoted string',
),
array(
"'quoted string'",
'quoted string',
),
array(
'12.30e+02',
1230.0,
),
array(
'0x4D2',
0x4d2,
),
array(
'02333',
02333,
),
array(
'.Inf',
-log(0),
),
array(
'-.Inf',
log(0),
),
array(
"'686e444'",
'686e444',
),
array(
'686e444',
\INF,
),
array(
'123456789123456789123456789123456789',
'123456789123456789123456789123456789',
),
array(
'"foo\\r\\nbar"',
"foo\r\nbar",
),
array(
"'foo#bar'",
'foo#bar',
),
array(
"'foo # bar'",
'foo # bar',
),
array(
"'#cfcfcf'",
'#cfcfcf',
),
array(
'::form_base.html.twig',
'::form_base.html.twig',
),
array(
"'y'",
'y',
),
array(
"'n'",
'n',
),
array(
"'yes'",
'yes',
),
array(
"'no'",
'no',
),
array(
"'on'",
'on',
),
array(
"'off'",
'off',
),
array(
'2007-10-30',
gmmktime(0, 0, 0, 10, 30, 2007),
),
array(
'2007-10-30T02:59:43Z',
gmmktime(2, 59, 43, 10, 30, 2007),
),
array(
'2007-10-30 02:59:43 Z',
gmmktime(2, 59, 43, 10, 30, 2007),
),
array(
'1960-10-30 02:59:43 Z',
gmmktime(2, 59, 43, 10, 30, 1960),
),
array(
'1730-10-30T02:59:43Z',
gmmktime(2, 59, 43, 10, 30, 1730),
),
array(
'"a \\"string\\" with \'quoted strings inside\'"',
'a "string" with \'quoted strings inside\'',
),
array(
"'a \"string\" with ''quoted strings inside'''",
'a "string" with \'quoted strings inside\'',
),
array(
'[foo, http://urls.are/no/mappings, false, null, 12]',
array(
'foo',
'http://urls.are/no/mappings',
false,
null,
12,
),
),
array(
'[ foo , bar , false , null , 12 ]',
array(
'foo',
'bar',
false,
null,
12,
),
),
array(
'[\'foo,bar\', \'foo bar\']',
array(
'foo,bar',
'foo bar',
),
),
array(
'{foo:bar,bar:foo,false:false,null:null,integer:12}',
array(
'foo' => 'bar',
'bar' => 'foo',
'false' => false,
'null' => null,
'integer' => 12,
),
),
array(
'{ foo : bar, bar : foo, false : false, null : null, integer : 12 }',
array(
'foo' => 'bar',
'bar' => 'foo',
'false' => false,
'null' => null,
'integer' => 12,
),
),
array(
'{foo: \'bar\', bar: \'foo: bar\'}',
array(
'foo' => 'bar',
'bar' => 'foo: bar',
),
),
array(
'{\'foo\': \'bar\', "bar": \'foo: bar\'}',
array(
'foo' => 'bar',
'bar' => 'foo: bar',
),
),
array(
'{\'foo\'\'\': \'bar\', "bar\\"": \'foo: bar\'}',
array(
'foo\'' => 'bar',
'bar"' => 'foo: bar',
),
),
array(
'{\'foo: \': \'bar\', "bar: ": \'foo: bar\'}',
array(
'foo: ' => 'bar',
'bar: ' => 'foo: bar',
),
),
array(
'[foo, [bar, foo]]',
array(
'foo',
array(
'bar',
'foo',
),
),
),
array(
'[foo, {bar: foo}]',
array(
'foo',
array(
'bar' => 'foo',
),
),
),
array(
'{ foo: {bar: foo} }',
array(
'foo' => array(
'bar' => 'foo',
),
),
),
array(
'{ foo: [bar, foo] }',
array(
'foo' => array(
'bar',
'foo',
),
),
),
array(
'[ foo, [ bar, foo ] ]',
array(
'foo',
array(
'bar',
'foo',
),
),
),
array(
'[{ foo: {bar: foo} }]',
array(
array(
'foo' => array(
'bar' => 'foo',
),
),
),
),
array(
'[foo, [bar, [foo, [bar, foo]], foo]]',
array(
'foo',
array(
'bar',
array(
'foo',
array(
'bar',
'foo',
),
),
'foo',
),
),
),
array(
'[foo, {bar: foo, foo: [foo, {bar: foo}]}, [foo, {bar: foo}]]',
array(
'foo',
array(
'bar' => 'foo',
'foo' => array(
'foo',
array(
'bar' => 'foo',
),
),
),
array(
'foo',
array(
'bar' => 'foo',
),
),
),
),
array(
'[foo, bar: { foo: bar }]',
array(
'foo',
'1' => array(
'bar' => array(
'foo' => 'bar',
),
),
),
),
array(
'[foo, \'@foo.baz\', { \'%foo%\': \'foo is %foo%\', bar: \'%foo%\' }, true, \'@service_container\']',
array(
'foo',
'@foo.baz',
array(
'%foo%' => 'foo is %foo%',
'bar' => '%foo%',
),
true,
'@service_container',
),
),
);
}
public function getTestsForParseWithMapObjects() {
return array(
array(
'',
'',
),
array(
'null',
null,
),
array(
'false',
false,
),
array(
'true',
true,
),
array(
'12',
12,
),
array(
'-12',
-12,
),
array(
'"quoted string"',
'quoted string',
),
array(
"'quoted string'",
'quoted string',
),
array(
'12.30e+02',
1230.0,
),
array(
'0x4D2',
0x4d2,
),
array(
'02333',
02333,
),
array(
'.Inf',
-log(0),
),
array(
'-.Inf',
log(0),
),
array(
"'686e444'",
'686e444',
),
array(
'686e444',
\INF,
),
array(
'123456789123456789123456789123456789',
'123456789123456789123456789123456789',
),
array(
'"foo\\r\\nbar"',
"foo\r\nbar",
),
array(
"'foo#bar'",
'foo#bar',
),
array(
"'foo # bar'",
'foo # bar',
),
array(
"'#cfcfcf'",
'#cfcfcf',
),
array(
'::form_base.html.twig',
'::form_base.html.twig',
),
array(
'2007-10-30',
gmmktime(0, 0, 0, 10, 30, 2007),
),
array(
'2007-10-30T02:59:43Z',
gmmktime(2, 59, 43, 10, 30, 2007),
),
array(
'2007-10-30 02:59:43 Z',
gmmktime(2, 59, 43, 10, 30, 2007),
),
array(
'1960-10-30 02:59:43 Z',
gmmktime(2, 59, 43, 10, 30, 1960),
),
array(
'1730-10-30T02:59:43Z',
gmmktime(2, 59, 43, 10, 30, 1730),
),
array(
'"a \\"string\\" with \'quoted strings inside\'"',
'a "string" with \'quoted strings inside\'',
),
array(
"'a \"string\" with ''quoted strings inside'''",
'a "string" with \'quoted strings inside\'',
),
array(
'[foo, http://urls.are/no/mappings, false, null, 12]',
array(
'foo',
'http://urls.are/no/mappings',
false,
null,
12,
),
),
array(
'[ foo , bar , false , null , 12 ]',
array(
'foo',
'bar',
false,
null,
12,
),
),
array(
'[\'foo,bar\', \'foo bar\']',
array(
'foo,bar',
'foo bar',
),
),
array(
'{foo:bar,bar:foo,false:false,null:null,integer:12}',
(object) array(
'foo' => 'bar',
'bar' => 'foo',
'false' => false,
'null' => null,
'integer' => 12,
),
),
array(
'{ foo : bar, bar : foo, false : false, null : null, integer : 12 }',
(object) array(
'foo' => 'bar',
'bar' => 'foo',
'false' => false,
'null' => null,
'integer' => 12,
),
),
array(
'{foo: \'bar\', bar: \'foo: bar\'}',
(object) array(
'foo' => 'bar',
'bar' => 'foo: bar',
),
),
array(
'{\'foo\': \'bar\', "bar": \'foo: bar\'}',
(object) array(
'foo' => 'bar',
'bar' => 'foo: bar',
),
),
array(
'{\'foo\'\'\': \'bar\', "bar\\"": \'foo: bar\'}',
(object) array(
'foo\'' => 'bar',
'bar"' => 'foo: bar',
),
),
array(
'{\'foo: \': \'bar\', "bar: ": \'foo: bar\'}',
(object) array(
'foo: ' => 'bar',
'bar: ' => 'foo: bar',
),
),
array(
'[foo, [bar, foo]]',
array(
'foo',
array(
'bar',
'foo',
),
),
),
array(
'[foo, {bar: foo}]',
array(
'foo',
(object) array(
'bar' => 'foo',
),
),
),
array(
'{ foo: {bar: foo} }',
(object) array(
'foo' => (object) array(
'bar' => 'foo',
),
),
),
array(
'{ foo: [bar, foo] }',
(object) array(
'foo' => array(
'bar',
'foo',
),
),
),
array(
'[ foo, [ bar, foo ] ]',
array(
'foo',
array(
'bar',
'foo',
),
),
),
array(
'[{ foo: {bar: foo} }]',
array(
(object) array(
'foo' => (object) array(
'bar' => 'foo',
),
),
),
),
array(
'[foo, [bar, [foo, [bar, foo]], foo]]',
array(
'foo',
array(
'bar',
array(
'foo',
array(
'bar',
'foo',
),
),
'foo',
),
),
),
array(
'[foo, {bar: foo, foo: [foo, {bar: foo}]}, [foo, {bar: foo}]]',
array(
'foo',
(object) array(
'bar' => 'foo',
'foo' => array(
'foo',
(object) array(
'bar' => 'foo',
),
),
),
array(
'foo',
(object) array(
'bar' => 'foo',
),
),
),
),
array(
'[foo, bar: { foo: bar }]',
array(
'foo',
'1' => (object) array(
'bar' => (object) array(
'foo' => 'bar',
),
),
),
),
array(
'[foo, \'@foo.baz\', { \'%foo%\': \'foo is %foo%\', bar: \'%foo%\' }, true, \'@service_container\']',
array(
'foo',
'@foo.baz',
(object) array(
'%foo%' => 'foo is %foo%',
'bar' => '%foo%',
),
true,
'@service_container',
),
),
array(
'{}',
new \stdClass(),
),
array(
'{ foo : bar, bar : {} }',
(object) array(
'foo' => 'bar',
'bar' => new \stdClass(),
),
),
array(
'{ foo : [], bar : {} }',
(object) array(
'foo' => array(),
'bar' => new \stdClass(),
),
),
array(
'{foo: \'bar\', bar: {} }',
(object) array(
'foo' => 'bar',
'bar' => new \stdClass(),
),
),
array(
'{\'foo\': \'bar\', "bar": {}}',
(object) array(
'foo' => 'bar',
'bar' => new \stdClass(),
),
),
array(
'{\'foo\': \'bar\', "bar": \'{}\'}',
(object) array(
'foo' => 'bar',
'bar' => '{}',
),
),
array(
'[foo, [{}, {}]]',
array(
'foo',
array(
new \stdClass(),
new \stdClass(),
),
),
),
array(
'[foo, [[], {}]]',
array(
'foo',
array(
array(),
new \stdClass(),
),
),
),
array(
'[foo, [[{}, {}], {}]]',
array(
'foo',
array(
array(
new \stdClass(),
new \stdClass(),
),
new \stdClass(),
),
),
),
array(
'[foo, {bar: {}}]',
array(
'foo',
'1' => (object) array(
'bar' => new \stdClass(),
),
),
),
);
}
public function getTestsForDump() {
return array(
array(
'null',
null,
),
array(
'false',
false,
),
array(
'true',
true,
),
array(
'12',
12,
),
array(
"'quoted string'",
'quoted string',
),
array(
'!!float 1230',
1230.0,
),
array(
'1234',
0x4d2,
),
array(
'1243',
02333,
),
array(
'.Inf',
-log(0),
),
array(
'-.Inf',
log(0),
),
array(
"'686e444'",
'686e444',
),
array(
'"foo\\r\\nbar"',
"foo\r\nbar",
),
array(
"'foo#bar'",
'foo#bar',
),
array(
"'foo # bar'",
'foo # bar',
),
array(
"'#cfcfcf'",
'#cfcfcf',
),
array(
"'a \"string\" with ''quoted strings inside'''",
'a "string" with \'quoted strings inside\'',
),
array(
"'-dash'",
'-dash',
),
array(
"'-'",
'-',
),
array(
"'y'",
'y',
),
array(
"'n'",
'n',
),
array(
"'yes'",
'yes',
),
array(
"'no'",
'no',
),
array(
"'on'",
'on',
),
array(
"'off'",
'off',
),
array(
'[foo, bar, false, null, 12]',
array(
'foo',
'bar',
false,
null,
12,
),
),
array(
'[\'foo,bar\', \'foo bar\']',
array(
'foo,bar',
'foo bar',
),
),
array(
'{ foo: bar, bar: foo, \'false\': false, \'null\': null, integer: 12 }',
array(
'foo' => 'bar',
'bar' => 'foo',
'false' => false,
'null' => null,
'integer' => 12,
),
),
array(
'{ foo: bar, bar: \'foo: bar\' }',
array(
'foo' => 'bar',
'bar' => 'foo: bar',
),
),
array(
'[foo, [bar, foo]]',
array(
'foo',
array(
'bar',
'foo',
),
),
),
array(
'[foo, [bar, [foo, [bar, foo]], foo]]',
array(
'foo',
array(
'bar',
array(
'foo',
array(
'bar',
'foo',
),
),
'foo',
),
),
),
array(
'{ foo: { bar: foo } }',
array(
'foo' => array(
'bar' => 'foo',
),
),
),
array(
'[foo, { bar: foo }]',
array(
'foo',
array(
'bar' => 'foo',
),
),
),
array(
'[foo, { bar: foo, foo: [foo, { bar: foo }] }, [foo, { bar: foo }]]',
array(
'foo',
array(
'bar' => 'foo',
'foo' => array(
'foo',
array(
'bar' => 'foo',
),
),
),
array(
'foo',
array(
'bar' => 'foo',
),
),
),
),
array(
'[foo, \'@foo.baz\', { \'%foo%\': \'foo is %foo%\', bar: \'%foo%\' }, true, \'@service_container\']',
array(
'foo',
'@foo.baz',
array(
'%foo%' => 'foo is %foo%',
'bar' => '%foo%',
),
true,
'@service_container',
),
),
array(
'{ foo: { bar: { 1: 2, baz: 3 } } }',
array(
'foo' => array(
'bar' => array(
1 => 2,
'baz' => 3,
),
),
),
),
);
}
public function testNotSupportedMissingValue() {
Inline::parse('{this, is not, supported}');
}
public function testVeryLongQuotedStrings() {
$longStringWithQuotes = str_repeat("x\r\n\\\"x\"x", 1000);
$yamlString = Inline::dump(array(
'longStringWithQuotes' => $longStringWithQuotes,
));
$arrayFromYaml = Inline::parse($yamlString);
$this
->assertEquals($longStringWithQuotes, $arrayFromYaml['longStringWithQuotes']);
}
public function testBooleanMappingKeysAreConvertedToStrings() {
$this
->assertSame(array(
'false' => 'foo',
), Inline::parse('{false: foo}'));
$this
->assertSame(array(
'true' => 'foo',
), Inline::parse('{true: foo}'));
}
public function testTheEmptyStringIsAValidMappingKey() {
$this
->assertSame(array(
'' => 'foo',
), Inline::parse('{ "": foo }'));
}
}