Mercurial > hg > CbC > CbC_llvm
diff unittests/Support/YAMLIOTest.cpp @ 121:803732b1fca8
LLVM 5.0
author | kono |
---|---|
date | Fri, 27 Oct 2017 17:07:41 +0900 |
parents | 1172e4bd9c6f |
children | 3a76565eade5 |
line wrap: on
line diff
--- a/unittests/Support/YAMLIOTest.cpp Fri Nov 25 19:14:25 2016 +0900 +++ b/unittests/Support/YAMLIOTest.cpp Fri Oct 27 17:07:41 2017 +0900 @@ -14,7 +14,6 @@ #include "llvm/Support/YAMLTraits.h" #include "gtest/gtest.h" - using llvm::yaml::Input; using llvm::yaml::Output; using llvm::yaml::IO; @@ -233,6 +232,22 @@ } } +// +// Test YAML filename handling. +// +static void testErrorFilename(const llvm::SMDiagnostic &Error, void *) { + EXPECT_EQ(Error.getFilename(), "foo.yaml"); +} + +TEST(YAMLIO, TestGivenFilename) { + auto Buffer = llvm::MemoryBuffer::getMemBuffer("{ x: 42 }", "foo.yaml"); + Input yin(*Buffer, nullptr, testErrorFilename); + FooBar Value; + yin >> Value; + + EXPECT_TRUE(!!yin.error()); +} + //===----------------------------------------------------------------------===// // Test built-in types @@ -1030,7 +1045,8 @@ LLVM_YAML_STRONG_TYPEDEF(int, MyNumber) LLVM_YAML_IS_FLOW_SEQUENCE_VECTOR(MyNumber) -LLVM_YAML_IS_FLOW_SEQUENCE_VECTOR(llvm::StringRef) +LLVM_YAML_STRONG_TYPEDEF(llvm::StringRef, MyString) +LLVM_YAML_IS_FLOW_SEQUENCE_VECTOR(MyString) namespace llvm { namespace yaml { @@ -1050,12 +1066,23 @@ static bool mustQuote(StringRef) { return false; } }; + + template <> struct ScalarTraits<MyString> { + using Impl = ScalarTraits<StringRef>; + static void output(const MyString &V, void *Ctx, raw_ostream &OS) { + Impl::output(V, Ctx, OS); + } + static StringRef input(StringRef S, void *Ctx, MyString &V) { + return Impl::input(S, Ctx, V.value); + } + static bool mustQuote(StringRef S) { return Impl::mustQuote(S); } + }; } } struct NameAndNumbers { llvm::StringRef name; - std::vector<llvm::StringRef> strings; + std::vector<MyString> strings; std::vector<MyNumber> single; std::vector<MyNumber> numbers; }; @@ -1129,8 +1156,8 @@ EXPECT_FALSE(yin.error()); EXPECT_TRUE(map2.name.equals("hello")); EXPECT_EQ(map2.strings.size(), 2UL); - EXPECT_TRUE(map2.strings[0].equals("one")); - EXPECT_TRUE(map2.strings[1].equals("two")); + EXPECT_TRUE(map2.strings[0].value.equals("one")); + EXPECT_TRUE(map2.strings[1].value.equals("two")); EXPECT_EQ(map2.single.size(), 1UL); EXPECT_EQ(1, map2.single[0]); EXPECT_EQ(map2.numbers.size(), 3UL); @@ -1740,7 +1767,6 @@ // // Test error handling reading built-in uint8_t type // -LLVM_YAML_IS_SEQUENCE_VECTOR(uint8_t) TEST(YAMLIO, TestReadBuiltInTypesUint8Error) { std::vector<uint8_t> seq; Input yin("---\n" @@ -1759,7 +1785,6 @@ // // Test error handling reading built-in uint16_t type // -LLVM_YAML_IS_SEQUENCE_VECTOR(uint16_t) TEST(YAMLIO, TestReadBuiltInTypesUint16Error) { std::vector<uint16_t> seq; Input yin("---\n" @@ -1778,7 +1803,6 @@ // // Test error handling reading built-in uint32_t type // -LLVM_YAML_IS_SEQUENCE_VECTOR(uint32_t) TEST(YAMLIO, TestReadBuiltInTypesUint32Error) { std::vector<uint32_t> seq; Input yin("---\n" @@ -1797,7 +1821,6 @@ // // Test error handling reading built-in uint64_t type // -LLVM_YAML_IS_SEQUENCE_VECTOR(uint64_t) TEST(YAMLIO, TestReadBuiltInTypesUint64Error) { std::vector<uint64_t> seq; Input yin("---\n" @@ -1816,7 +1839,6 @@ // // Test error handling reading built-in int8_t type // -LLVM_YAML_IS_SEQUENCE_VECTOR(int8_t) TEST(YAMLIO, TestReadBuiltInTypesint8OverError) { std::vector<int8_t> seq; Input yin("---\n" @@ -1854,7 +1876,6 @@ // // Test error handling reading built-in int16_t type // -LLVM_YAML_IS_SEQUENCE_VECTOR(int16_t) TEST(YAMLIO, TestReadBuiltInTypesint16UnderError) { std::vector<int16_t> seq; Input yin("---\n" @@ -1893,7 +1914,6 @@ // // Test error handling reading built-in int32_t type // -LLVM_YAML_IS_SEQUENCE_VECTOR(int32_t) TEST(YAMLIO, TestReadBuiltInTypesint32UnderError) { std::vector<int32_t> seq; Input yin("---\n" @@ -1931,7 +1951,6 @@ // // Test error handling reading built-in int64_t type // -LLVM_YAML_IS_SEQUENCE_VECTOR(int64_t) TEST(YAMLIO, TestReadBuiltInTypesint64UnderError) { std::vector<int64_t> seq; Input yin("---\n" @@ -1968,7 +1987,6 @@ // // Test error handling reading built-in float type // -LLVM_YAML_IS_SEQUENCE_VECTOR(float) TEST(YAMLIO, TestReadBuiltInTypesFloatError) { std::vector<float> seq; Input yin("---\n" @@ -1987,7 +2005,6 @@ // // Test error handling reading built-in float type // -LLVM_YAML_IS_SEQUENCE_VECTOR(double) TEST(YAMLIO, TestReadBuiltInTypesDoubleError) { std::vector<double> seq; Input yin("---\n" @@ -2368,3 +2385,73 @@ out); out.clear(); } + +LLVM_YAML_IS_STRING_MAP(int) + +TEST(YAMLIO, TestCustomMapping) { + std::map<std::string, int> x; + x["foo"] = 1; + x["bar"] = 2; + + std::string out; + llvm::raw_string_ostream ostr(out); + Output xout(ostr, nullptr, 0); + + xout << x; + ostr.flush(); + EXPECT_EQ("---\n" + "bar: 2\n" + "foo: 1\n" + "...\n", + out); + + Input yin(out); + std::map<std::string, int> y; + yin >> y; + EXPECT_EQ(2ul, y.size()); + EXPECT_EQ(1, y["foo"]); + EXPECT_EQ(2, y["bar"]); +} + +LLVM_YAML_IS_STRING_MAP(FooBar) + +TEST(YAMLIO, TestCustomMappingStruct) { + std::map<std::string, FooBar> x; + x["foo"].foo = 1; + x["foo"].bar = 2; + x["bar"].foo = 3; + x["bar"].bar = 4; + + std::string out; + llvm::raw_string_ostream ostr(out); + Output xout(ostr, nullptr, 0); + + xout << x; + ostr.flush(); + EXPECT_EQ("---\n" + "bar: \n" + " foo: 3\n" + " bar: 4\n" + "foo: \n" + " foo: 1\n" + " bar: 2\n" + "...\n", + out); + + Input yin(out); + std::map<std::string, FooBar> y; + yin >> y; + EXPECT_EQ(2ul, y.size()); + EXPECT_EQ(1, y["foo"].foo); + EXPECT_EQ(2, y["foo"].bar); + EXPECT_EQ(3, y["bar"].foo); + EXPECT_EQ(4, y["bar"].bar); +} + +TEST(YAMLIO, InvalidInput) { + // polluting 1 value in the sequence + Input yin("---\n- foo: 3\n bar: 5\n1\n- foo: 3\n bar: 5\n...\n"); + std::vector<FooBar> Data; + yin >> Data; + EXPECT_TRUE((bool)yin.error()); +}