1*9880d681SAndroid Build Coastguard Worker //===- unittest/Support/YAMLParserTest ------------------------------------===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker
10*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/Twine.h"
11*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/Casting.h"
12*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/MemoryBuffer.h"
13*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/SourceMgr.h"
14*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/YAMLParser.h"
15*9880d681SAndroid Build Coastguard Worker #include "gtest/gtest.h"
16*9880d681SAndroid Build Coastguard Worker
17*9880d681SAndroid Build Coastguard Worker namespace llvm {
18*9880d681SAndroid Build Coastguard Worker
SuppressDiagnosticsOutput(const SMDiagnostic &,void *)19*9880d681SAndroid Build Coastguard Worker static void SuppressDiagnosticsOutput(const SMDiagnostic &, void *) {
20*9880d681SAndroid Build Coastguard Worker // Prevent SourceMgr from writing errors to stderr
21*9880d681SAndroid Build Coastguard Worker // to reduce noise in unit test runs.
22*9880d681SAndroid Build Coastguard Worker }
23*9880d681SAndroid Build Coastguard Worker
24*9880d681SAndroid Build Coastguard Worker // Assumes Ctx is an SMDiagnostic where Diag can be stored.
CollectDiagnosticsOutput(const SMDiagnostic & Diag,void * Ctx)25*9880d681SAndroid Build Coastguard Worker static void CollectDiagnosticsOutput(const SMDiagnostic &Diag, void *Ctx) {
26*9880d681SAndroid Build Coastguard Worker SMDiagnostic* DiagOut = static_cast<SMDiagnostic*>(Ctx);
27*9880d681SAndroid Build Coastguard Worker *DiagOut = Diag;
28*9880d681SAndroid Build Coastguard Worker }
29*9880d681SAndroid Build Coastguard Worker
30*9880d681SAndroid Build Coastguard Worker // Checks that the given input gives a parse error. Makes sure that an error
31*9880d681SAndroid Build Coastguard Worker // text is available and the parse fails.
ExpectParseError(StringRef Message,StringRef Input)32*9880d681SAndroid Build Coastguard Worker static void ExpectParseError(StringRef Message, StringRef Input) {
33*9880d681SAndroid Build Coastguard Worker SourceMgr SM;
34*9880d681SAndroid Build Coastguard Worker yaml::Stream Stream(Input, SM);
35*9880d681SAndroid Build Coastguard Worker SM.setDiagHandler(SuppressDiagnosticsOutput);
36*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(Stream.validate()) << Message << ": " << Input;
37*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(Stream.failed()) << Message << ": " << Input;
38*9880d681SAndroid Build Coastguard Worker }
39*9880d681SAndroid Build Coastguard Worker
40*9880d681SAndroid Build Coastguard Worker // Checks that the given input can be parsed without error.
ExpectParseSuccess(StringRef Message,StringRef Input)41*9880d681SAndroid Build Coastguard Worker static void ExpectParseSuccess(StringRef Message, StringRef Input) {
42*9880d681SAndroid Build Coastguard Worker SourceMgr SM;
43*9880d681SAndroid Build Coastguard Worker yaml::Stream Stream(Input, SM);
44*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(Stream.validate()) << Message << ": " << Input;
45*9880d681SAndroid Build Coastguard Worker }
46*9880d681SAndroid Build Coastguard Worker
TEST(YAMLParser,ParsesEmptyArray)47*9880d681SAndroid Build Coastguard Worker TEST(YAMLParser, ParsesEmptyArray) {
48*9880d681SAndroid Build Coastguard Worker ExpectParseSuccess("Empty array", "[]");
49*9880d681SAndroid Build Coastguard Worker }
50*9880d681SAndroid Build Coastguard Worker
TEST(YAMLParser,FailsIfNotClosingArray)51*9880d681SAndroid Build Coastguard Worker TEST(YAMLParser, FailsIfNotClosingArray) {
52*9880d681SAndroid Build Coastguard Worker ExpectParseError("Not closing array", "[");
53*9880d681SAndroid Build Coastguard Worker ExpectParseError("Not closing array", " [ ");
54*9880d681SAndroid Build Coastguard Worker ExpectParseError("Not closing array", " [x");
55*9880d681SAndroid Build Coastguard Worker }
56*9880d681SAndroid Build Coastguard Worker
TEST(YAMLParser,ParsesEmptyArrayWithWhitespace)57*9880d681SAndroid Build Coastguard Worker TEST(YAMLParser, ParsesEmptyArrayWithWhitespace) {
58*9880d681SAndroid Build Coastguard Worker ExpectParseSuccess("Array with spaces", " [ ] ");
59*9880d681SAndroid Build Coastguard Worker ExpectParseSuccess("All whitespaces", "\t\r\n[\t\n \t\r ]\t\r \n\n");
60*9880d681SAndroid Build Coastguard Worker }
61*9880d681SAndroid Build Coastguard Worker
TEST(YAMLParser,ParsesEmptyObject)62*9880d681SAndroid Build Coastguard Worker TEST(YAMLParser, ParsesEmptyObject) {
63*9880d681SAndroid Build Coastguard Worker ExpectParseSuccess("Empty object", "[{}]");
64*9880d681SAndroid Build Coastguard Worker }
65*9880d681SAndroid Build Coastguard Worker
TEST(YAMLParser,ParsesObject)66*9880d681SAndroid Build Coastguard Worker TEST(YAMLParser, ParsesObject) {
67*9880d681SAndroid Build Coastguard Worker ExpectParseSuccess("Object with an entry", "[{\"a\":\"/b\"}]");
68*9880d681SAndroid Build Coastguard Worker }
69*9880d681SAndroid Build Coastguard Worker
TEST(YAMLParser,ParsesMultipleKeyValuePairsInObject)70*9880d681SAndroid Build Coastguard Worker TEST(YAMLParser, ParsesMultipleKeyValuePairsInObject) {
71*9880d681SAndroid Build Coastguard Worker ExpectParseSuccess("Multiple key, value pairs",
72*9880d681SAndroid Build Coastguard Worker "[{\"a\":\"/b\",\"c\":\"d\",\"e\":\"f\"}]");
73*9880d681SAndroid Build Coastguard Worker }
74*9880d681SAndroid Build Coastguard Worker
TEST(YAMLParser,FailsIfNotClosingObject)75*9880d681SAndroid Build Coastguard Worker TEST(YAMLParser, FailsIfNotClosingObject) {
76*9880d681SAndroid Build Coastguard Worker ExpectParseError("Missing close on empty", "[{]");
77*9880d681SAndroid Build Coastguard Worker ExpectParseError("Missing close after pair", "[{\"a\":\"b\"]");
78*9880d681SAndroid Build Coastguard Worker }
79*9880d681SAndroid Build Coastguard Worker
TEST(YAMLParser,FailsIfMissingColon)80*9880d681SAndroid Build Coastguard Worker TEST(YAMLParser, FailsIfMissingColon) {
81*9880d681SAndroid Build Coastguard Worker ExpectParseError("Missing colon between key and value", "[{\"a\"\"/b\"}]");
82*9880d681SAndroid Build Coastguard Worker ExpectParseError("Missing colon between key and value", "[{\"a\" \"b\"}]");
83*9880d681SAndroid Build Coastguard Worker }
84*9880d681SAndroid Build Coastguard Worker
TEST(YAMLParser,FailsOnMissingQuote)85*9880d681SAndroid Build Coastguard Worker TEST(YAMLParser, FailsOnMissingQuote) {
86*9880d681SAndroid Build Coastguard Worker ExpectParseError("Missing open quote", "[{a\":\"b\"}]");
87*9880d681SAndroid Build Coastguard Worker ExpectParseError("Missing closing quote", "[{\"a\":\"b}]");
88*9880d681SAndroid Build Coastguard Worker }
89*9880d681SAndroid Build Coastguard Worker
TEST(YAMLParser,ParsesEscapedQuotes)90*9880d681SAndroid Build Coastguard Worker TEST(YAMLParser, ParsesEscapedQuotes) {
91*9880d681SAndroid Build Coastguard Worker ExpectParseSuccess("Parses escaped string in key and value",
92*9880d681SAndroid Build Coastguard Worker "[{\"a\":\"\\\"b\\\" \\\" \\\"\"}]");
93*9880d681SAndroid Build Coastguard Worker }
94*9880d681SAndroid Build Coastguard Worker
TEST(YAMLParser,ParsesEmptyString)95*9880d681SAndroid Build Coastguard Worker TEST(YAMLParser, ParsesEmptyString) {
96*9880d681SAndroid Build Coastguard Worker ExpectParseSuccess("Parses empty string in value", "[{\"a\":\"\"}]");
97*9880d681SAndroid Build Coastguard Worker }
98*9880d681SAndroid Build Coastguard Worker
TEST(YAMLParser,ParsesMultipleObjects)99*9880d681SAndroid Build Coastguard Worker TEST(YAMLParser, ParsesMultipleObjects) {
100*9880d681SAndroid Build Coastguard Worker ExpectParseSuccess(
101*9880d681SAndroid Build Coastguard Worker "Multiple objects in array",
102*9880d681SAndroid Build Coastguard Worker "["
103*9880d681SAndroid Build Coastguard Worker " { \"a\" : \"b\" },"
104*9880d681SAndroid Build Coastguard Worker " { \"a\" : \"b\" },"
105*9880d681SAndroid Build Coastguard Worker " { \"a\" : \"b\" }"
106*9880d681SAndroid Build Coastguard Worker "]");
107*9880d681SAndroid Build Coastguard Worker }
108*9880d681SAndroid Build Coastguard Worker
TEST(YAMLParser,FailsOnMissingComma)109*9880d681SAndroid Build Coastguard Worker TEST(YAMLParser, FailsOnMissingComma) {
110*9880d681SAndroid Build Coastguard Worker ExpectParseError(
111*9880d681SAndroid Build Coastguard Worker "Missing comma",
112*9880d681SAndroid Build Coastguard Worker "["
113*9880d681SAndroid Build Coastguard Worker " { \"a\" : \"b\" }"
114*9880d681SAndroid Build Coastguard Worker " { \"a\" : \"b\" }"
115*9880d681SAndroid Build Coastguard Worker "]");
116*9880d681SAndroid Build Coastguard Worker }
117*9880d681SAndroid Build Coastguard Worker
TEST(YAMLParser,ParsesSpacesInBetweenTokens)118*9880d681SAndroid Build Coastguard Worker TEST(YAMLParser, ParsesSpacesInBetweenTokens) {
119*9880d681SAndroid Build Coastguard Worker ExpectParseSuccess(
120*9880d681SAndroid Build Coastguard Worker "Various whitespace between tokens",
121*9880d681SAndroid Build Coastguard Worker " \t \n\n \r [ \t \n\n \r"
122*9880d681SAndroid Build Coastguard Worker " \t \n\n \r { \t \n\n \r\"a\"\t \n\n \r :"
123*9880d681SAndroid Build Coastguard Worker " \t \n\n \r \"b\"\t \n\n \r } \t \n\n \r,\t \n\n \r"
124*9880d681SAndroid Build Coastguard Worker " \t \n\n \r { \t \n\n \r\"a\"\t \n\n \r :"
125*9880d681SAndroid Build Coastguard Worker " \t \n\n \r \"b\"\t \n\n \r } \t \n\n \r]\t \n\n \r");
126*9880d681SAndroid Build Coastguard Worker }
127*9880d681SAndroid Build Coastguard Worker
TEST(YAMLParser,ParsesArrayOfArrays)128*9880d681SAndroid Build Coastguard Worker TEST(YAMLParser, ParsesArrayOfArrays) {
129*9880d681SAndroid Build Coastguard Worker ExpectParseSuccess("Array of arrays", "[[]]");
130*9880d681SAndroid Build Coastguard Worker }
131*9880d681SAndroid Build Coastguard Worker
TEST(YAMLParser,ParsesBlockLiteralScalars)132*9880d681SAndroid Build Coastguard Worker TEST(YAMLParser, ParsesBlockLiteralScalars) {
133*9880d681SAndroid Build Coastguard Worker ExpectParseSuccess("Block literal scalar", "test: |\n Hello\n World\n");
134*9880d681SAndroid Build Coastguard Worker ExpectParseSuccess("Block literal scalar EOF", "test: |\n Hello\n World");
135*9880d681SAndroid Build Coastguard Worker ExpectParseSuccess("Empty block literal scalar header EOF", "test: | ");
136*9880d681SAndroid Build Coastguard Worker ExpectParseSuccess("Empty block literal scalar", "test: |\ntest2: 20");
137*9880d681SAndroid Build Coastguard Worker ExpectParseSuccess("Empty block literal scalar 2", "- | \n \n\n \n- 42");
138*9880d681SAndroid Build Coastguard Worker ExpectParseSuccess("Block literal scalar in sequence",
139*9880d681SAndroid Build Coastguard Worker "- |\n Testing\n Out\n\n- 22");
140*9880d681SAndroid Build Coastguard Worker ExpectParseSuccess("Block literal scalar in document",
141*9880d681SAndroid Build Coastguard Worker "--- |\n Document\n...");
142*9880d681SAndroid Build Coastguard Worker ExpectParseSuccess("Empty non indented lines still count",
143*9880d681SAndroid Build Coastguard Worker "- |\n First line\n \n\n Another line\n\n- 2");
144*9880d681SAndroid Build Coastguard Worker ExpectParseSuccess("Comment in block literal scalar header",
145*9880d681SAndroid Build Coastguard Worker "test: | # Comment \n No Comment\ntest 2: | # Void");
146*9880d681SAndroid Build Coastguard Worker ExpectParseSuccess("Chomping indicators in block literal scalar header",
147*9880d681SAndroid Build Coastguard Worker "test: |- \n Hello\n\ntest 2: |+ \n\n World\n\n\n");
148*9880d681SAndroid Build Coastguard Worker ExpectParseSuccess("Indent indicators in block literal scalar header",
149*9880d681SAndroid Build Coastguard Worker "test: |1 \n \n Hello \n World\n");
150*9880d681SAndroid Build Coastguard Worker ExpectParseSuccess("Chomping and indent indicators in block literals",
151*9880d681SAndroid Build Coastguard Worker "test: |-1\n Hello\ntest 2: |9+\n World");
152*9880d681SAndroid Build Coastguard Worker ExpectParseSuccess("Trailing comments in block literals",
153*9880d681SAndroid Build Coastguard Worker "test: |\n Content\n # Trailing\n #Comment\ntest 2: 3");
154*9880d681SAndroid Build Coastguard Worker ExpectParseError("Invalid block scalar header", "test: | failure");
155*9880d681SAndroid Build Coastguard Worker ExpectParseError("Invalid line indentation", "test: |\n First line\n Error");
156*9880d681SAndroid Build Coastguard Worker ExpectParseError("Long leading space line", "test: |\n \n Test\n");
157*9880d681SAndroid Build Coastguard Worker }
158*9880d681SAndroid Build Coastguard Worker
TEST(YAMLParser,NullTerminatedBlockScalars)159*9880d681SAndroid Build Coastguard Worker TEST(YAMLParser, NullTerminatedBlockScalars) {
160*9880d681SAndroid Build Coastguard Worker SourceMgr SM;
161*9880d681SAndroid Build Coastguard Worker yaml::Stream Stream("test: |\n Hello\n World\n", SM);
162*9880d681SAndroid Build Coastguard Worker yaml::Document &Doc = *Stream.begin();
163*9880d681SAndroid Build Coastguard Worker yaml::MappingNode *Map = cast<yaml::MappingNode>(Doc.getRoot());
164*9880d681SAndroid Build Coastguard Worker StringRef Value =
165*9880d681SAndroid Build Coastguard Worker cast<yaml::BlockScalarNode>(Map->begin()->getValue())->getValue();
166*9880d681SAndroid Build Coastguard Worker
167*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Value, "Hello\nWorld\n");
168*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Value.data()[Value.size()], '\0');
169*9880d681SAndroid Build Coastguard Worker }
170*9880d681SAndroid Build Coastguard Worker
TEST(YAMLParser,HandlesEndOfFileGracefully)171*9880d681SAndroid Build Coastguard Worker TEST(YAMLParser, HandlesEndOfFileGracefully) {
172*9880d681SAndroid Build Coastguard Worker ExpectParseError("In string starting with EOF", "[\"");
173*9880d681SAndroid Build Coastguard Worker ExpectParseError("In string hitting EOF", "[\" ");
174*9880d681SAndroid Build Coastguard Worker ExpectParseError("In string escaping EOF", "[\" \\");
175*9880d681SAndroid Build Coastguard Worker ExpectParseError("In array starting with EOF", "[");
176*9880d681SAndroid Build Coastguard Worker ExpectParseError("In array element starting with EOF", "[[], ");
177*9880d681SAndroid Build Coastguard Worker ExpectParseError("In array hitting EOF", "[[] ");
178*9880d681SAndroid Build Coastguard Worker ExpectParseError("In array hitting EOF", "[[]");
179*9880d681SAndroid Build Coastguard Worker ExpectParseError("In object hitting EOF", "{\"\"");
180*9880d681SAndroid Build Coastguard Worker }
181*9880d681SAndroid Build Coastguard Worker
TEST(YAMLParser,HandlesNullValuesInKeyValueNodesGracefully)182*9880d681SAndroid Build Coastguard Worker TEST(YAMLParser, HandlesNullValuesInKeyValueNodesGracefully) {
183*9880d681SAndroid Build Coastguard Worker ExpectParseError("KeyValueNode with null value", "test: '");
184*9880d681SAndroid Build Coastguard Worker }
185*9880d681SAndroid Build Coastguard Worker
186*9880d681SAndroid Build Coastguard Worker // Checks that the given string can be parsed into an identical string inside
187*9880d681SAndroid Build Coastguard Worker // of an array.
ExpectCanParseString(StringRef String)188*9880d681SAndroid Build Coastguard Worker static void ExpectCanParseString(StringRef String) {
189*9880d681SAndroid Build Coastguard Worker std::string StringInArray = (llvm::Twine("[\"") + String + "\"]").str();
190*9880d681SAndroid Build Coastguard Worker SourceMgr SM;
191*9880d681SAndroid Build Coastguard Worker yaml::Stream Stream(StringInArray, SM);
192*9880d681SAndroid Build Coastguard Worker yaml::SequenceNode *ParsedSequence
193*9880d681SAndroid Build Coastguard Worker = dyn_cast<yaml::SequenceNode>(Stream.begin()->getRoot());
194*9880d681SAndroid Build Coastguard Worker StringRef ParsedString
195*9880d681SAndroid Build Coastguard Worker = dyn_cast<yaml::ScalarNode>(
196*9880d681SAndroid Build Coastguard Worker static_cast<yaml::Node*>(ParsedSequence->begin()))->getRawValue();
197*9880d681SAndroid Build Coastguard Worker ParsedString = ParsedString.substr(1, ParsedString.size() - 2);
198*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(String, ParsedString.str());
199*9880d681SAndroid Build Coastguard Worker }
200*9880d681SAndroid Build Coastguard Worker
201*9880d681SAndroid Build Coastguard Worker // Checks that parsing the given string inside an array fails.
ExpectCannotParseString(StringRef String)202*9880d681SAndroid Build Coastguard Worker static void ExpectCannotParseString(StringRef String) {
203*9880d681SAndroid Build Coastguard Worker std::string StringInArray = (llvm::Twine("[\"") + String + "\"]").str();
204*9880d681SAndroid Build Coastguard Worker ExpectParseError((Twine("When parsing string \"") + String + "\"").str(),
205*9880d681SAndroid Build Coastguard Worker StringInArray);
206*9880d681SAndroid Build Coastguard Worker }
207*9880d681SAndroid Build Coastguard Worker
TEST(YAMLParser,ParsesStrings)208*9880d681SAndroid Build Coastguard Worker TEST(YAMLParser, ParsesStrings) {
209*9880d681SAndroid Build Coastguard Worker ExpectCanParseString("");
210*9880d681SAndroid Build Coastguard Worker ExpectCannotParseString("\\");
211*9880d681SAndroid Build Coastguard Worker ExpectCannotParseString("\"");
212*9880d681SAndroid Build Coastguard Worker ExpectCanParseString(" ");
213*9880d681SAndroid Build Coastguard Worker ExpectCanParseString("\\ ");
214*9880d681SAndroid Build Coastguard Worker ExpectCanParseString("\\\"");
215*9880d681SAndroid Build Coastguard Worker ExpectCannotParseString("\"\\");
216*9880d681SAndroid Build Coastguard Worker ExpectCannotParseString(" \\");
217*9880d681SAndroid Build Coastguard Worker ExpectCanParseString("\\\\");
218*9880d681SAndroid Build Coastguard Worker ExpectCannotParseString("\\\\\\");
219*9880d681SAndroid Build Coastguard Worker ExpectCanParseString("\\\\\\\\");
220*9880d681SAndroid Build Coastguard Worker ExpectCanParseString("\\\" ");
221*9880d681SAndroid Build Coastguard Worker ExpectCannotParseString("\\\\\" ");
222*9880d681SAndroid Build Coastguard Worker ExpectCanParseString("\\\\\\\" ");
223*9880d681SAndroid Build Coastguard Worker ExpectCanParseString(" \\\\ \\\" \\\\\\\" ");
224*9880d681SAndroid Build Coastguard Worker }
225*9880d681SAndroid Build Coastguard Worker
TEST(YAMLParser,WorksWithIteratorAlgorithms)226*9880d681SAndroid Build Coastguard Worker TEST(YAMLParser, WorksWithIteratorAlgorithms) {
227*9880d681SAndroid Build Coastguard Worker SourceMgr SM;
228*9880d681SAndroid Build Coastguard Worker yaml::Stream Stream("[\"1\", \"2\", \"3\", \"4\", \"5\", \"6\"]", SM);
229*9880d681SAndroid Build Coastguard Worker yaml::SequenceNode *Array
230*9880d681SAndroid Build Coastguard Worker = dyn_cast<yaml::SequenceNode>(Stream.begin()->getRoot());
231*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(6, std::distance(Array->begin(), Array->end()));
232*9880d681SAndroid Build Coastguard Worker }
233*9880d681SAndroid Build Coastguard Worker
TEST(YAMLParser,DefaultDiagnosticFilename)234*9880d681SAndroid Build Coastguard Worker TEST(YAMLParser, DefaultDiagnosticFilename) {
235*9880d681SAndroid Build Coastguard Worker SourceMgr SM;
236*9880d681SAndroid Build Coastguard Worker
237*9880d681SAndroid Build Coastguard Worker SMDiagnostic GeneratedDiag;
238*9880d681SAndroid Build Coastguard Worker SM.setDiagHandler(CollectDiagnosticsOutput, &GeneratedDiag);
239*9880d681SAndroid Build Coastguard Worker
240*9880d681SAndroid Build Coastguard Worker // When we construct a YAML stream over an unnamed string,
241*9880d681SAndroid Build Coastguard Worker // the filename is hard-coded as "YAML".
242*9880d681SAndroid Build Coastguard Worker yaml::Stream UnnamedStream("[]", SM);
243*9880d681SAndroid Build Coastguard Worker UnnamedStream.printError(UnnamedStream.begin()->getRoot(), "Hello, World!");
244*9880d681SAndroid Build Coastguard Worker EXPECT_EQ("YAML", GeneratedDiag.getFilename());
245*9880d681SAndroid Build Coastguard Worker }
246*9880d681SAndroid Build Coastguard Worker
TEST(YAMLParser,DiagnosticFilenameFromBufferID)247*9880d681SAndroid Build Coastguard Worker TEST(YAMLParser, DiagnosticFilenameFromBufferID) {
248*9880d681SAndroid Build Coastguard Worker SourceMgr SM;
249*9880d681SAndroid Build Coastguard Worker
250*9880d681SAndroid Build Coastguard Worker SMDiagnostic GeneratedDiag;
251*9880d681SAndroid Build Coastguard Worker SM.setDiagHandler(CollectDiagnosticsOutput, &GeneratedDiag);
252*9880d681SAndroid Build Coastguard Worker
253*9880d681SAndroid Build Coastguard Worker // When we construct a YAML stream over a named buffer,
254*9880d681SAndroid Build Coastguard Worker // we get its ID as filename in diagnostics.
255*9880d681SAndroid Build Coastguard Worker std::unique_ptr<MemoryBuffer> Buffer =
256*9880d681SAndroid Build Coastguard Worker MemoryBuffer::getMemBuffer("[]", "buffername.yaml");
257*9880d681SAndroid Build Coastguard Worker yaml::Stream Stream(Buffer->getMemBufferRef(), SM);
258*9880d681SAndroid Build Coastguard Worker Stream.printError(Stream.begin()->getRoot(), "Hello, World!");
259*9880d681SAndroid Build Coastguard Worker EXPECT_EQ("buffername.yaml", GeneratedDiag.getFilename());
260*9880d681SAndroid Build Coastguard Worker }
261*9880d681SAndroid Build Coastguard Worker
TEST(YAMLParser,SameNodeIteratorOperatorNotEquals)262*9880d681SAndroid Build Coastguard Worker TEST(YAMLParser, SameNodeIteratorOperatorNotEquals) {
263*9880d681SAndroid Build Coastguard Worker SourceMgr SM;
264*9880d681SAndroid Build Coastguard Worker yaml::Stream Stream("[\"1\", \"2\"]", SM);
265*9880d681SAndroid Build Coastguard Worker
266*9880d681SAndroid Build Coastguard Worker yaml::SequenceNode *Node = dyn_cast<yaml::SequenceNode>(
267*9880d681SAndroid Build Coastguard Worker Stream.begin()->getRoot());
268*9880d681SAndroid Build Coastguard Worker
269*9880d681SAndroid Build Coastguard Worker auto Begin = Node->begin();
270*9880d681SAndroid Build Coastguard Worker auto End = Node->end();
271*9880d681SAndroid Build Coastguard Worker
272*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(Begin != End);
273*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(Begin != Begin);
274*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(End != End);
275*9880d681SAndroid Build Coastguard Worker }
276*9880d681SAndroid Build Coastguard Worker
TEST(YAMLParser,SameNodeIteratorOperatorEquals)277*9880d681SAndroid Build Coastguard Worker TEST(YAMLParser, SameNodeIteratorOperatorEquals) {
278*9880d681SAndroid Build Coastguard Worker SourceMgr SM;
279*9880d681SAndroid Build Coastguard Worker yaml::Stream Stream("[\"1\", \"2\"]", SM);
280*9880d681SAndroid Build Coastguard Worker
281*9880d681SAndroid Build Coastguard Worker yaml::SequenceNode *Node = dyn_cast<yaml::SequenceNode>(
282*9880d681SAndroid Build Coastguard Worker Stream.begin()->getRoot());
283*9880d681SAndroid Build Coastguard Worker
284*9880d681SAndroid Build Coastguard Worker auto Begin = Node->begin();
285*9880d681SAndroid Build Coastguard Worker auto End = Node->end();
286*9880d681SAndroid Build Coastguard Worker
287*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(Begin == End);
288*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(Begin == Begin);
289*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(End == End);
290*9880d681SAndroid Build Coastguard Worker }
291*9880d681SAndroid Build Coastguard Worker
TEST(YAMLParser,DifferentNodesIteratorOperatorNotEquals)292*9880d681SAndroid Build Coastguard Worker TEST(YAMLParser, DifferentNodesIteratorOperatorNotEquals) {
293*9880d681SAndroid Build Coastguard Worker SourceMgr SM;
294*9880d681SAndroid Build Coastguard Worker yaml::Stream Stream("[\"1\", \"2\"]", SM);
295*9880d681SAndroid Build Coastguard Worker yaml::Stream AnotherStream("[\"1\", \"2\"]", SM);
296*9880d681SAndroid Build Coastguard Worker
297*9880d681SAndroid Build Coastguard Worker yaml::SequenceNode *Node = dyn_cast<yaml::SequenceNode>(
298*9880d681SAndroid Build Coastguard Worker Stream.begin()->getRoot());
299*9880d681SAndroid Build Coastguard Worker yaml::SequenceNode *AnotherNode = dyn_cast<yaml::SequenceNode>(
300*9880d681SAndroid Build Coastguard Worker AnotherStream.begin()->getRoot());
301*9880d681SAndroid Build Coastguard Worker
302*9880d681SAndroid Build Coastguard Worker auto Begin = Node->begin();
303*9880d681SAndroid Build Coastguard Worker auto End = Node->end();
304*9880d681SAndroid Build Coastguard Worker
305*9880d681SAndroid Build Coastguard Worker auto AnotherBegin = AnotherNode->begin();
306*9880d681SAndroid Build Coastguard Worker auto AnotherEnd = AnotherNode->end();
307*9880d681SAndroid Build Coastguard Worker
308*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(Begin != AnotherBegin);
309*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(Begin != AnotherEnd);
310*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(End != AnotherEnd);
311*9880d681SAndroid Build Coastguard Worker }
312*9880d681SAndroid Build Coastguard Worker
TEST(YAMLParser,DifferentNodesIteratorOperatorEquals)313*9880d681SAndroid Build Coastguard Worker TEST(YAMLParser, DifferentNodesIteratorOperatorEquals) {
314*9880d681SAndroid Build Coastguard Worker SourceMgr SM;
315*9880d681SAndroid Build Coastguard Worker yaml::Stream Stream("[\"1\", \"2\"]", SM);
316*9880d681SAndroid Build Coastguard Worker yaml::Stream AnotherStream("[\"1\", \"2\"]", SM);
317*9880d681SAndroid Build Coastguard Worker
318*9880d681SAndroid Build Coastguard Worker yaml::SequenceNode *Node = dyn_cast<yaml::SequenceNode>(
319*9880d681SAndroid Build Coastguard Worker Stream.begin()->getRoot());
320*9880d681SAndroid Build Coastguard Worker yaml::SequenceNode *AnotherNode = dyn_cast<yaml::SequenceNode>(
321*9880d681SAndroid Build Coastguard Worker AnotherStream.begin()->getRoot());
322*9880d681SAndroid Build Coastguard Worker
323*9880d681SAndroid Build Coastguard Worker auto Begin = Node->begin();
324*9880d681SAndroid Build Coastguard Worker auto End = Node->end();
325*9880d681SAndroid Build Coastguard Worker
326*9880d681SAndroid Build Coastguard Worker auto AnotherBegin = AnotherNode->begin();
327*9880d681SAndroid Build Coastguard Worker auto AnotherEnd = AnotherNode->end();
328*9880d681SAndroid Build Coastguard Worker
329*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(Begin == AnotherBegin);
330*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(Begin == AnotherEnd);
331*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(End == AnotherEnd);
332*9880d681SAndroid Build Coastguard Worker }
333*9880d681SAndroid Build Coastguard Worker
334*9880d681SAndroid Build Coastguard Worker } // end namespace llvm
335