xref: /aosp_15_r20/external/llvm/unittests/Support/YAMLParserTest.cpp (revision 9880d6810fe72a1726cb53787c6711e909410d58)
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