193210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer//===- unittest/Support/YAMLParserTest ------------------------------------===//
293210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer//
393210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer//                     The LLVM Compiler Infrastructure
493210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer//
593210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer// This file is distributed under the University of Illinois Open Source
693210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer// License. See LICENSE.TXT for details.
793210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer//
893210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer//===----------------------------------------------------------------------===//
993210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer
1093210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer#include "llvm/ADT/SmallString.h"
1193210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer#include "llvm/ADT/Twine.h"
1293210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer#include "llvm/Support/Casting.h"
13525398e1376b0d61fe80a83ed2261e2e6e6ab4a3Sean Silva#include "llvm/Support/MemoryBuffer.h"
1493210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer#include "llvm/Support/SourceMgr.h"
1593210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer#include "llvm/Support/YAMLParser.h"
1693210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer#include "gtest/gtest.h"
1793210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer
1893210e847a1496b24cef881723e57c489082dcfeMichael J. Spencernamespace llvm {
1993210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer
20d7122b8d3c48eab05d425c99fee53cde07feafe4Nick Kledzikstatic void SuppressDiagnosticsOutput(const SMDiagnostic &, void *) {
21d7122b8d3c48eab05d425c99fee53cde07feafe4Nick Kledzik  // Prevent SourceMgr from writing errors to stderr
22d7122b8d3c48eab05d425c99fee53cde07feafe4Nick Kledzik  // to reduce noise in unit test runs.
23d7122b8d3c48eab05d425c99fee53cde07feafe4Nick Kledzik}
24d7122b8d3c48eab05d425c99fee53cde07feafe4Nick Kledzik
25525398e1376b0d61fe80a83ed2261e2e6e6ab4a3Sean Silva// Assumes Ctx is an SMDiagnostic where Diag can be stored.
26525398e1376b0d61fe80a83ed2261e2e6e6ab4a3Sean Silvastatic void CollectDiagnosticsOutput(const SMDiagnostic &Diag, void *Ctx) {
27525398e1376b0d61fe80a83ed2261e2e6e6ab4a3Sean Silva  SMDiagnostic* DiagOut = static_cast<SMDiagnostic*>(Ctx);
28525398e1376b0d61fe80a83ed2261e2e6e6ab4a3Sean Silva  *DiagOut = Diag;
29525398e1376b0d61fe80a83ed2261e2e6e6ab4a3Sean Silva}
30525398e1376b0d61fe80a83ed2261e2e6e6ab4a3Sean Silva
3193210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer// Checks that the given input gives a parse error. Makes sure that an error
3293210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer// text is available and the parse fails.
3393210e847a1496b24cef881723e57c489082dcfeMichael J. Spencerstatic void ExpectParseError(StringRef Message, StringRef Input) {
3493210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer  SourceMgr SM;
3593210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer  yaml::Stream Stream(Input, SM);
36d7122b8d3c48eab05d425c99fee53cde07feafe4Nick Kledzik  SM.setDiagHandler(SuppressDiagnosticsOutput);
3793210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer  EXPECT_FALSE(Stream.validate()) << Message << ": " << Input;
3893210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer  EXPECT_TRUE(Stream.failed()) << Message << ": " << Input;
3993210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer}
4093210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer
4193210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer// Checks that the given input can be parsed without error.
4293210e847a1496b24cef881723e57c489082dcfeMichael J. Spencerstatic void ExpectParseSuccess(StringRef Message, StringRef Input) {
4393210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer  SourceMgr SM;
4493210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer  yaml::Stream Stream(Input, SM);
4593210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer  EXPECT_TRUE(Stream.validate()) << Message << ": " << Input;
4693210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer}
4793210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer
4893210e847a1496b24cef881723e57c489082dcfeMichael J. SpencerTEST(YAMLParser, ParsesEmptyArray) {
4993210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer  ExpectParseSuccess("Empty array", "[]");
5093210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer}
5193210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer
5293210e847a1496b24cef881723e57c489082dcfeMichael J. SpencerTEST(YAMLParser, FailsIfNotClosingArray) {
5393210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer  ExpectParseError("Not closing array", "[");
5493210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer  ExpectParseError("Not closing array", "  [  ");
5593210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer  ExpectParseError("Not closing array", "  [x");
5693210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer}
5793210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer
5893210e847a1496b24cef881723e57c489082dcfeMichael J. SpencerTEST(YAMLParser, ParsesEmptyArrayWithWhitespace) {
5993210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer  ExpectParseSuccess("Array with spaces", "  [  ]  ");
6093210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer  ExpectParseSuccess("All whitespaces", "\t\r\n[\t\n \t\r ]\t\r \n\n");
6193210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer}
6293210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer
6393210e847a1496b24cef881723e57c489082dcfeMichael J. SpencerTEST(YAMLParser, ParsesEmptyObject) {
6493210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer  ExpectParseSuccess("Empty object", "[{}]");
6593210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer}
6693210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer
6793210e847a1496b24cef881723e57c489082dcfeMichael J. SpencerTEST(YAMLParser, ParsesObject) {
6893210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer  ExpectParseSuccess("Object with an entry", "[{\"a\":\"/b\"}]");
6993210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer}
7093210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer
7193210e847a1496b24cef881723e57c489082dcfeMichael J. SpencerTEST(YAMLParser, ParsesMultipleKeyValuePairsInObject) {
7293210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer  ExpectParseSuccess("Multiple key, value pairs",
7393210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer                     "[{\"a\":\"/b\",\"c\":\"d\",\"e\":\"f\"}]");
7493210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer}
7593210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer
7693210e847a1496b24cef881723e57c489082dcfeMichael J. SpencerTEST(YAMLParser, FailsIfNotClosingObject) {
7793210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer  ExpectParseError("Missing close on empty", "[{]");
7893210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer  ExpectParseError("Missing close after pair", "[{\"a\":\"b\"]");
7993210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer}
8093210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer
8193210e847a1496b24cef881723e57c489082dcfeMichael J. SpencerTEST(YAMLParser, FailsIfMissingColon) {
8293210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer  ExpectParseError("Missing colon between key and value", "[{\"a\"\"/b\"}]");
8393210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer  ExpectParseError("Missing colon between key and value", "[{\"a\" \"b\"}]");
8493210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer}
8593210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer
8693210e847a1496b24cef881723e57c489082dcfeMichael J. SpencerTEST(YAMLParser, FailsOnMissingQuote) {
8793210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer  ExpectParseError("Missing open quote", "[{a\":\"b\"}]");
8893210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer  ExpectParseError("Missing closing quote", "[{\"a\":\"b}]");
8993210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer}
9093210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer
9193210e847a1496b24cef881723e57c489082dcfeMichael J. SpencerTEST(YAMLParser, ParsesEscapedQuotes) {
9293210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer  ExpectParseSuccess("Parses escaped string in key and value",
9393210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer                     "[{\"a\":\"\\\"b\\\"  \\\" \\\"\"}]");
9493210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer}
9593210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer
9693210e847a1496b24cef881723e57c489082dcfeMichael J. SpencerTEST(YAMLParser, ParsesEmptyString) {
9793210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer  ExpectParseSuccess("Parses empty string in value", "[{\"a\":\"\"}]");
9893210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer}
9993210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer
10093210e847a1496b24cef881723e57c489082dcfeMichael J. SpencerTEST(YAMLParser, ParsesMultipleObjects) {
10193210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer  ExpectParseSuccess(
10293210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer      "Multiple objects in array",
10393210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer      "["
10493210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer      " { \"a\" : \"b\" },"
10593210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer      " { \"a\" : \"b\" },"
10693210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer      " { \"a\" : \"b\" }"
10793210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer      "]");
10893210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer}
10993210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer
11093210e847a1496b24cef881723e57c489082dcfeMichael J. SpencerTEST(YAMLParser, FailsOnMissingComma) {
11193210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer  ExpectParseError(
11293210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer      "Missing comma",
11393210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer      "["
11493210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer      " { \"a\" : \"b\" }"
11593210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer      " { \"a\" : \"b\" }"
11693210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer      "]");
11793210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer}
11893210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer
11993210e847a1496b24cef881723e57c489082dcfeMichael J. SpencerTEST(YAMLParser, ParsesSpacesInBetweenTokens) {
12093210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer  ExpectParseSuccess(
12193210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer      "Various whitespace between tokens",
12293210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer      " \t \n\n \r [ \t \n\n \r"
12393210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer      " \t \n\n \r { \t \n\n \r\"a\"\t \n\n \r :"
12493210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer      " \t \n\n \r \"b\"\t \n\n \r } \t \n\n \r,\t \n\n \r"
12593210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer      " \t \n\n \r { \t \n\n \r\"a\"\t \n\n \r :"
12693210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer      " \t \n\n \r \"b\"\t \n\n \r } \t \n\n \r]\t \n\n \r");
12793210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer}
12893210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer
12993210e847a1496b24cef881723e57c489082dcfeMichael J. SpencerTEST(YAMLParser, ParsesArrayOfArrays) {
13093210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer  ExpectParseSuccess("Array of arrays", "[[]]");
13193210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer}
13293210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer
13393210e847a1496b24cef881723e57c489082dcfeMichael J. SpencerTEST(YAMLParser, HandlesEndOfFileGracefully) {
13493210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer  ExpectParseError("In string starting with EOF", "[\"");
13593210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer  ExpectParseError("In string hitting EOF", "[\"   ");
13693210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer  ExpectParseError("In string escaping EOF", "[\"  \\");
13793210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer  ExpectParseError("In array starting with EOF", "[");
13893210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer  ExpectParseError("In array element starting with EOF", "[[], ");
13993210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer  ExpectParseError("In array hitting EOF", "[[] ");
14093210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer  ExpectParseError("In array hitting EOF", "[[]");
14193210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer  ExpectParseError("In object hitting EOF", "{\"\"");
14293210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer}
14393210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer
14493210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer// Checks that the given string can be parsed into an identical string inside
14593210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer// of an array.
14693210e847a1496b24cef881723e57c489082dcfeMichael J. Spencerstatic void ExpectCanParseString(StringRef String) {
14793210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer  std::string StringInArray = (llvm::Twine("[\"") + String + "\"]").str();
14893210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer  SourceMgr SM;
14993210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer  yaml::Stream Stream(StringInArray, SM);
15093210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer  yaml::SequenceNode *ParsedSequence
15193210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer    = dyn_cast<yaml::SequenceNode>(Stream.begin()->getRoot());
15293210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer  StringRef ParsedString
15393210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer    = dyn_cast<yaml::ScalarNode>(
15493210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer      static_cast<yaml::Node*>(ParsedSequence->begin()))->getRawValue();
15593210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer  ParsedString = ParsedString.substr(1, ParsedString.size() - 2);
15693210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer  EXPECT_EQ(String, ParsedString.str());
15793210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer}
15893210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer
15993210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer// Checks that parsing the given string inside an array fails.
16093210e847a1496b24cef881723e57c489082dcfeMichael J. Spencerstatic void ExpectCannotParseString(StringRef String) {
16193210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer  std::string StringInArray = (llvm::Twine("[\"") + String + "\"]").str();
16293210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer  ExpectParseError((Twine("When parsing string \"") + String + "\"").str(),
16393210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer                   StringInArray);
16493210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer}
16593210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer
16693210e847a1496b24cef881723e57c489082dcfeMichael J. SpencerTEST(YAMLParser, ParsesStrings) {
16793210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer  ExpectCanParseString("");
16893210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer  ExpectCannotParseString("\\");
16993210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer  ExpectCannotParseString("\"");
17093210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer  ExpectCanParseString(" ");
17193210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer  ExpectCanParseString("\\ ");
17293210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer  ExpectCanParseString("\\\"");
17393210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer  ExpectCannotParseString("\"\\");
17493210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer  ExpectCannotParseString(" \\");
17593210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer  ExpectCanParseString("\\\\");
17693210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer  ExpectCannotParseString("\\\\\\");
17793210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer  ExpectCanParseString("\\\\\\\\");
17893210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer  ExpectCanParseString("\\\" ");
17993210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer  ExpectCannotParseString("\\\\\" ");
18093210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer  ExpectCanParseString("\\\\\\\" ");
18193210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer  ExpectCanParseString("    \\\\  \\\"  \\\\\\\"   ");
18293210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer}
18393210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer
18493210e847a1496b24cef881723e57c489082dcfeMichael J. SpencerTEST(YAMLParser, WorksWithIteratorAlgorithms) {
18593210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer  SourceMgr SM;
18693210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer  yaml::Stream Stream("[\"1\", \"2\", \"3\", \"4\", \"5\", \"6\"]", SM);
18793210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer  yaml::SequenceNode *Array
18893210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer    = dyn_cast<yaml::SequenceNode>(Stream.begin()->getRoot());
18993210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer  EXPECT_EQ(6, std::distance(Array->begin(), Array->end()));
19093210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer}
19193210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer
192525398e1376b0d61fe80a83ed2261e2e6e6ab4a3Sean SilvaTEST(YAMLParser, DefaultDiagnosticFilename) {
193525398e1376b0d61fe80a83ed2261e2e6e6ab4a3Sean Silva  SourceMgr SM;
194525398e1376b0d61fe80a83ed2261e2e6e6ab4a3Sean Silva
195525398e1376b0d61fe80a83ed2261e2e6e6ab4a3Sean Silva  SMDiagnostic GeneratedDiag;
196525398e1376b0d61fe80a83ed2261e2e6e6ab4a3Sean Silva  SM.setDiagHandler(CollectDiagnosticsOutput, &GeneratedDiag);
197525398e1376b0d61fe80a83ed2261e2e6e6ab4a3Sean Silva
198525398e1376b0d61fe80a83ed2261e2e6e6ab4a3Sean Silva  // When we construct a YAML stream over an unnamed string,
199525398e1376b0d61fe80a83ed2261e2e6e6ab4a3Sean Silva  // the filename is hard-coded as "YAML".
200525398e1376b0d61fe80a83ed2261e2e6e6ab4a3Sean Silva  yaml::Stream UnnamedStream("[]", SM);
201525398e1376b0d61fe80a83ed2261e2e6e6ab4a3Sean Silva  UnnamedStream.printError(UnnamedStream.begin()->getRoot(), "Hello, World!");
202525398e1376b0d61fe80a83ed2261e2e6e6ab4a3Sean Silva  EXPECT_EQ("YAML", GeneratedDiag.getFilename());
203525398e1376b0d61fe80a83ed2261e2e6e6ab4a3Sean Silva}
204525398e1376b0d61fe80a83ed2261e2e6e6ab4a3Sean Silva
205525398e1376b0d61fe80a83ed2261e2e6e6ab4a3Sean SilvaTEST(YAMLParser, DiagnosticFilenameFromBufferID) {
206525398e1376b0d61fe80a83ed2261e2e6e6ab4a3Sean Silva  SourceMgr SM;
207525398e1376b0d61fe80a83ed2261e2e6e6ab4a3Sean Silva
208525398e1376b0d61fe80a83ed2261e2e6e6ab4a3Sean Silva  SMDiagnostic GeneratedDiag;
209525398e1376b0d61fe80a83ed2261e2e6e6ab4a3Sean Silva  SM.setDiagHandler(CollectDiagnosticsOutput, &GeneratedDiag);
210525398e1376b0d61fe80a83ed2261e2e6e6ab4a3Sean Silva
211525398e1376b0d61fe80a83ed2261e2e6e6ab4a3Sean Silva  // When we construct a YAML stream over a named buffer,
212525398e1376b0d61fe80a83ed2261e2e6e6ab4a3Sean Silva  // we get its ID as filename in diagnostics.
213525398e1376b0d61fe80a83ed2261e2e6e6ab4a3Sean Silva  MemoryBuffer* Buffer = MemoryBuffer::getMemBuffer("[]", "buffername.yaml");
214525398e1376b0d61fe80a83ed2261e2e6e6ab4a3Sean Silva  yaml::Stream Stream(Buffer, SM);
215525398e1376b0d61fe80a83ed2261e2e6e6ab4a3Sean Silva  Stream.printError(Stream.begin()->getRoot(), "Hello, World!");
216525398e1376b0d61fe80a83ed2261e2e6e6ab4a3Sean Silva  EXPECT_EQ("buffername.yaml", GeneratedDiag.getFilename());
217525398e1376b0d61fe80a83ed2261e2e6e6ab4a3Sean Silva}
218525398e1376b0d61fe80a83ed2261e2e6e6ab4a3Sean Silva
21993210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer} // end namespace llvm
220