[Yaml Parser] Fix edge cases when parsing multiple documents

This commit is contained in:
Markus Fasselt 2020-09-18 10:16:56 +02:00
parent 6b8857c974
commit 012ee4fa59
2 changed files with 34 additions and 0 deletions

View File

@ -153,6 +153,7 @@ class Parser
$this->refs = [];
$this->skippedLineNumbers = [];
$this->locallySkippedLineNumbers = [];
$this->totalNumberOfLines = null;
if (null !== $e) {
throw $e;

View File

@ -2362,6 +2362,39 @@ 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