X-Git-Url: http://plrg.eecs.uci.edu/git/?p=oota-llvm.git;a=blobdiff_plain;f=unittests%2FSupport%2FYAMLParserTest.cpp;h=41ad649699caa01d2f7dd9987c084c8339ae3141;hp=cd8b9f735d7539ddce538f01c3afdc81bbba3969;hb=71a6baa31c4a08a3c123953a0239bff001b2e437;hpb=f58eecfbbb0a291647ca0ab5b2f55ca13dd89a12 diff --git a/unittests/Support/YAMLParserTest.cpp b/unittests/Support/YAMLParserTest.cpp index cd8b9f735d7..41ad649699c 100644 --- a/unittests/Support/YAMLParserTest.cpp +++ b/unittests/Support/YAMLParserTest.cpp @@ -130,6 +130,45 @@ TEST(YAMLParser, ParsesArrayOfArrays) { ExpectParseSuccess("Array of arrays", "[[]]"); } +TEST(YAMLParser, ParsesBlockLiteralScalars) { + ExpectParseSuccess("Block literal scalar", "test: |\n Hello\n World\n"); + ExpectParseSuccess("Block literal scalar EOF", "test: |\n Hello\n World"); + ExpectParseSuccess("Empty block literal scalar header EOF", "test: | "); + ExpectParseSuccess("Empty block literal scalar", "test: |\ntest2: 20"); + ExpectParseSuccess("Empty block literal scalar 2", "- | \n \n\n \n- 42"); + ExpectParseSuccess("Block literal scalar in sequence", + "- |\n Testing\n Out\n\n- 22"); + ExpectParseSuccess("Block literal scalar in document", + "--- |\n Document\n..."); + ExpectParseSuccess("Empty non indented lines still count", + "- |\n First line\n \n\n Another line\n\n- 2"); + ExpectParseSuccess("Comment in block literal scalar header", + "test: | # Comment \n No Comment\ntest 2: | # Void"); + ExpectParseSuccess("Chomping indicators in block literal scalar header", + "test: |- \n Hello\n\ntest 2: |+ \n\n World\n\n\n"); + ExpectParseSuccess("Indent indicators in block literal scalar header", + "test: |1 \n \n Hello \n World\n"); + ExpectParseSuccess("Chomping and indent indicators in block literals", + "test: |-1\n Hello\ntest 2: |9+\n World"); + ExpectParseSuccess("Trailing comments in block literals", + "test: |\n Content\n # Trailing\n #Comment\ntest 2: 3"); + ExpectParseError("Invalid block scalar header", "test: | failure"); + ExpectParseError("Invalid line indentation", "test: |\n First line\n Error"); + ExpectParseError("Long leading space line", "test: |\n \n Test\n"); +} + +TEST(YAMLParser, NullTerminatedBlockScalars) { + SourceMgr SM; + yaml::Stream Stream("test: |\n Hello\n World\n", SM); + yaml::Document &Doc = *Stream.begin(); + yaml::MappingNode *Map = cast(Doc.getRoot()); + StringRef Value = + cast(Map->begin()->getValue())->getValue(); + + EXPECT_EQ(Value, "Hello\nWorld\n"); + EXPECT_EQ(Value.data()[Value.size()], '\0'); +} + TEST(YAMLParser, HandlesEndOfFileGracefully) { ExpectParseError("In string starting with EOF", "[\""); ExpectParseError("In string hitting EOF", "[\" "); @@ -141,6 +180,10 @@ TEST(YAMLParser, HandlesEndOfFileGracefully) { ExpectParseError("In object hitting EOF", "{\"\""); } +TEST(YAMLParser, HandlesNullValuesInKeyValueNodesGracefully) { + ExpectParseError("KeyValueNode with null value", "test: '"); +} + // Checks that the given string can be parsed into an identical string inside // of an array. static void ExpectCanParseString(StringRef String) { @@ -210,10 +253,83 @@ TEST(YAMLParser, DiagnosticFilenameFromBufferID) { // When we construct a YAML stream over a named buffer, // we get its ID as filename in diagnostics. - MemoryBuffer* Buffer = MemoryBuffer::getMemBuffer("[]", "buffername.yaml"); - yaml::Stream Stream(Buffer, SM); + std::unique_ptr Buffer = + MemoryBuffer::getMemBuffer("[]", "buffername.yaml"); + yaml::Stream Stream(Buffer->getMemBufferRef(), SM); Stream.printError(Stream.begin()->getRoot(), "Hello, World!"); EXPECT_EQ("buffername.yaml", GeneratedDiag.getFilename()); } +TEST(YAMLParser, SameNodeIteratorOperatorNotEquals) { + SourceMgr SM; + yaml::Stream Stream("[\"1\", \"2\"]", SM); + + yaml::SequenceNode *Node = dyn_cast( + Stream.begin()->getRoot()); + + auto Begin = Node->begin(); + auto End = Node->end(); + + EXPECT_TRUE(Begin != End); + EXPECT_FALSE(Begin != Begin); + EXPECT_FALSE(End != End); +} + +TEST(YAMLParser, SameNodeIteratorOperatorEquals) { + SourceMgr SM; + yaml::Stream Stream("[\"1\", \"2\"]", SM); + + yaml::SequenceNode *Node = dyn_cast( + Stream.begin()->getRoot()); + + auto Begin = Node->begin(); + auto End = Node->end(); + + EXPECT_FALSE(Begin == End); + EXPECT_TRUE(Begin == Begin); + EXPECT_TRUE(End == End); +} + +TEST(YAMLParser, DifferentNodesIteratorOperatorNotEquals) { + SourceMgr SM; + yaml::Stream Stream("[\"1\", \"2\"]", SM); + yaml::Stream AnotherStream("[\"1\", \"2\"]", SM); + + yaml::SequenceNode *Node = dyn_cast( + Stream.begin()->getRoot()); + yaml::SequenceNode *AnotherNode = dyn_cast( + AnotherStream.begin()->getRoot()); + + auto Begin = Node->begin(); + auto End = Node->end(); + + auto AnotherBegin = AnotherNode->begin(); + auto AnotherEnd = AnotherNode->end(); + + EXPECT_TRUE(Begin != AnotherBegin); + EXPECT_TRUE(Begin != AnotherEnd); + EXPECT_FALSE(End != AnotherEnd); +} + +TEST(YAMLParser, DifferentNodesIteratorOperatorEquals) { + SourceMgr SM; + yaml::Stream Stream("[\"1\", \"2\"]", SM); + yaml::Stream AnotherStream("[\"1\", \"2\"]", SM); + + yaml::SequenceNode *Node = dyn_cast( + Stream.begin()->getRoot()); + yaml::SequenceNode *AnotherNode = dyn_cast( + AnotherStream.begin()->getRoot()); + + auto Begin = Node->begin(); + auto End = Node->end(); + + auto AnotherBegin = AnotherNode->begin(); + auto AnotherEnd = AnotherNode->end(); + + EXPECT_FALSE(Begin == AnotherBegin); + EXPECT_FALSE(Begin == AnotherEnd); + EXPECT_TRUE(End == AnotherEnd); +} + } // end namespace llvm