[Yaml Parser] Fix edge cases when parsing multiple documents
This commit is contained in:
parent
6b8857c974
commit
012ee4fa59
@ -153,6 +153,7 @@ class Parser
|
|||||||
$this->refs = [];
|
$this->refs = [];
|
||||||
$this->skippedLineNumbers = [];
|
$this->skippedLineNumbers = [];
|
||||||
$this->locallySkippedLineNumbers = [];
|
$this->locallySkippedLineNumbers = [];
|
||||||
|
$this->totalNumberOfLines = null;
|
||||||
|
|
||||||
if (null !== $e) {
|
if (null !== $e) {
|
||||||
throw $e;
|
throw $e;
|
||||||
|
@ -2362,6 +2362,39 @@ YAML;
|
|||||||
$this->parser->parse($yaml)
|
$this->parser->parse($yaml)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is a regression test for a bug where a YAML block with a nested multiline string using | was parsed without
|
||||||
|
* a trailing \n when a shorter YAML document was parsed before.
|
||||||
|
*
|
||||||
|
* When a shorter document was parsed before, the nested string did not have a \n at the end of the string, because
|
||||||
|
* the Parser thought it was the end of the file, even though it is not.
|
||||||
|
*/
|
||||||
|
public function testParsingMultipleDocuments()
|
||||||
|
{
|
||||||
|
$shortDocument = 'foo: bar';
|
||||||
|
$longDocument = <<<YAML
|
||||||
|
a:
|
||||||
|
b: |
|
||||||
|
row
|
||||||
|
row2
|
||||||
|
c: d
|
||||||
|
YAML;
|
||||||
|
|
||||||
|
$expected = ['a' => ['b' => "row\nrow2\n"], 'c' => 'd'];
|
||||||
|
|
||||||
|
// The parser was not used before, so there is a new line after row2
|
||||||
|
$this->assertSame($expected, $this->parser->parse($longDocument));
|
||||||
|
|
||||||
|
$parser = new Parser();
|
||||||
|
// The first parsing set and fixed the totalNumberOfLines in the Parser before, so parsing the short document here
|
||||||
|
// to reproduce the issue. If the issue would not have been fixed, the next assertion will fail
|
||||||
|
$parser->parse($shortDocument);
|
||||||
|
|
||||||
|
// After the total number of lines has been rset the result will be the same as if a new parser was used
|
||||||
|
// (before, there was no \n after row2)
|
||||||
|
$this->assertSame($expected, $parser->parse($longDocument));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class B
|
class B
|
||||||
|
Reference in New Issue
Block a user