18ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//===- unittest/Support/YAMLIOTest.cpp ------------------------------------===//
28ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//
38ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//                     The LLVM Compiler Infrastructure
48ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//
58ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik// This file is distributed under the University of Illinois Open Source
68ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik// License. See LICENSE.TXT for details.
78ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//
88ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//===----------------------------------------------------------------------===//
98ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
108ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik#include "llvm/ADT/SmallString.h"
118ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik#include "llvm/ADT/Twine.h"
128ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik#include "llvm/Support/Casting.h"
138ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik#include "llvm/Support/Format.h"
148ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik#include "llvm/Support/YAMLTraits.h"
158ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik#include "gtest/gtest.h"
168ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
178ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
188ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikusing llvm::yaml::Input;
198ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikusing llvm::yaml::Output;
208ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikusing llvm::yaml::IO;
218ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikusing llvm::yaml::MappingTraits;
228ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikusing llvm::yaml::MappingNormalization;
238ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikusing llvm::yaml::ScalarTraits;
248ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikusing llvm::yaml::Hex8;
258ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikusing llvm::yaml::Hex16;
268ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikusing llvm::yaml::Hex32;
278ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikusing llvm::yaml::Hex64;
288ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
298ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
3036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
3136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
3236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesstatic void suppressErrorMessages(const llvm::SMDiagnostic &, void *) {
3336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
3436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
3536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
3636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
378ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//===----------------------------------------------------------------------===//
388ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//  Test MappingTraits
398ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//===----------------------------------------------------------------------===//
408ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
418ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikstruct FooBar {
428ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  int foo;
438ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  int bar;
448ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik};
458ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledziktypedef std::vector<FooBar> FooBarSequence;
468ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
478ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick KledzikLLVM_YAML_IS_SEQUENCE_VECTOR(FooBar)
488ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
498ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
508ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledziknamespace llvm {
518ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledziknamespace yaml {
528ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  template <>
538ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  struct MappingTraits<FooBar> {
548ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    static void mapping(IO &io, FooBar& fb) {
558ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      io.mapRequired("foo",    fb.foo);
568ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      io.mapRequired("bar",    fb.bar);
578ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    }
588ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  };
598ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
608ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
618ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
628ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
638ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//
648ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik// Test the reading of a yaml mapping
658ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//
668ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick KledzikTEST(YAMLIO, TestMapRead) {
678ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  FooBar doc;
686919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko  {
696919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko    Input yin("---\nfoo:  3\nbar:  5\n...\n");
706919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko    yin >> doc;
718ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
726919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko    EXPECT_FALSE(yin.error());
736919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko    EXPECT_EQ(doc.foo, 3);
746919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko    EXPECT_EQ(doc.bar, 5);
756919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko  }
768ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
776919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko  {
786919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko    Input yin("{foo: 3, bar: 5}");
796919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko    yin >> doc;
806919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko
816919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko    EXPECT_FALSE(yin.error());
826919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko    EXPECT_EQ(doc.foo, 3);
836919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko    EXPECT_EQ(doc.bar, 5);
846919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko  }
856919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko}
868ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
878ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//
888ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik// Test the reading of a yaml sequence of mappings
898ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//
908ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick KledzikTEST(YAMLIO, TestSequenceMapRead) {
918ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  FooBarSequence seq;
928ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  Input yin("---\n - foo:  3\n   bar:  5\n - foo:  7\n   bar:  9\n...\n");
938ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  yin >> seq;
948ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
958ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  EXPECT_FALSE(yin.error());
968ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  EXPECT_EQ(seq.size(), 2UL);
978ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  FooBar& map1 = seq[0];
988ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  FooBar& map2 = seq[1];
998ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  EXPECT_EQ(map1.foo, 3);
1008ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  EXPECT_EQ(map1.bar, 5);
1018ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  EXPECT_EQ(map2.foo, 7);
1028ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  EXPECT_EQ(map2.bar, 9);
1038ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
1048ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
1058ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
1068ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//
1078ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik// Test writing then reading back a sequence of mappings
1088ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//
1098ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick KledzikTEST(YAMLIO, TestSequenceMapWriteAndRead) {
1108ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  std::string intermediate;
1118ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  {
1128ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    FooBar entry1;
1138ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    entry1.foo = 10;
1148ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    entry1.bar = -3;
1158ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    FooBar entry2;
1168ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    entry2.foo = 257;
1178ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    entry2.bar = 0;
1188ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    FooBarSequence seq;
1198ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    seq.push_back(entry1);
1208ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    seq.push_back(entry2);
1218ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
1228ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    llvm::raw_string_ostream ostr(intermediate);
1238ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    Output yout(ostr);
1248ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    yout << seq;
1258ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
1268ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
1278ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  {
1288ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    Input yin(intermediate);
1298ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    FooBarSequence seq2;
1308ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    yin >> seq2;
1318ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
1328ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    EXPECT_FALSE(yin.error());
1338ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    EXPECT_EQ(seq2.size(), 2UL);
1348ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    FooBar& map1 = seq2[0];
1358ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    FooBar& map2 = seq2[1];
1368ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    EXPECT_EQ(map1.foo, 10);
1378ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    EXPECT_EQ(map1.bar, -3);
1388ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    EXPECT_EQ(map2.foo, 257);
1398ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    EXPECT_EQ(map2.bar, 0);
1408ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
1418ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
1428ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
1438ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
1448ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//===----------------------------------------------------------------------===//
1458ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//  Test built-in types
1468ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//===----------------------------------------------------------------------===//
1478ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
1488ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikstruct BuiltInTypes {
1498ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  llvm::StringRef str;
15036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  std::string stdstr;
1518ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  uint64_t        u64;
1528ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  uint32_t        u32;
1538ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  uint16_t        u16;
1548ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  uint8_t         u8;
1558ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  bool            b;
1568ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  int64_t         s64;
1578ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  int32_t         s32;
1588ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  int16_t         s16;
1598ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  int8_t          s8;
1608ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  float           f;
1618ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  double          d;
1628ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  Hex8            h8;
1638ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  Hex16           h16;
1648ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  Hex32           h32;
1658ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  Hex64           h64;
1668ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik};
1678ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
1688ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledziknamespace llvm {
1698ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledziknamespace yaml {
1708ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  template <>
1718ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  struct MappingTraits<BuiltInTypes> {
1728ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    static void mapping(IO &io, BuiltInTypes& bt) {
1738ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      io.mapRequired("str",      bt.str);
17436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      io.mapRequired("stdstr",   bt.stdstr);
1758ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      io.mapRequired("u64",      bt.u64);
1768ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      io.mapRequired("u32",      bt.u32);
1778ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      io.mapRequired("u16",      bt.u16);
1788ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      io.mapRequired("u8",       bt.u8);
1798ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      io.mapRequired("b",        bt.b);
1808ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      io.mapRequired("s64",      bt.s64);
1818ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      io.mapRequired("s32",      bt.s32);
1828ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      io.mapRequired("s16",      bt.s16);
1838ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      io.mapRequired("s8",       bt.s8);
1848ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      io.mapRequired("f",        bt.f);
1858ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      io.mapRequired("d",        bt.d);
1868ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      io.mapRequired("h8",       bt.h8);
1878ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      io.mapRequired("h16",      bt.h16);
1888ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      io.mapRequired("h32",      bt.h32);
1898ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      io.mapRequired("h64",      bt.h64);
1908ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    }
1918ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  };
1928ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
1938ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
1948ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
1958ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
1968ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//
1978ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik// Test the reading of all built-in scalar conversions
1988ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//
1998ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick KledzikTEST(YAMLIO, TestReadBuiltInTypes) {
2008ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  BuiltInTypes map;
2018ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  Input yin("---\n"
2028ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "str:      hello there\n"
20336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines            "stdstr:   hello where?\n"
2048ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "u64:      5000000000\n"
2058ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "u32:      4000000000\n"
2068ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "u16:      65000\n"
2078ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "u8:       255\n"
2088ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "b:        false\n"
2098ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "s64:      -5000000000\n"
2108ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "s32:      -2000000000\n"
2118ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "s16:      -32000\n"
2128ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "s8:       -127\n"
2138ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "f:        137.125\n"
2148ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "d:        -2.8625\n"
2158ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "h8:       0xFF\n"
2168ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "h16:      0x8765\n"
2178ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "h32:      0xFEDCBA98\n"
2188ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "h64:      0xFEDCBA9876543210\n"
2198ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik           "...\n");
2208ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  yin >> map;
2218ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
2228ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  EXPECT_FALSE(yin.error());
2238ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  EXPECT_TRUE(map.str.equals("hello there"));
22436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_TRUE(map.stdstr == "hello where?");
2258ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  EXPECT_EQ(map.u64, 5000000000ULL);
22682612a6d73fd00f494ba16caef08a400c07db489Nick Kledzik  EXPECT_EQ(map.u32, 4000000000U);
2278ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  EXPECT_EQ(map.u16, 65000);
2288ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  EXPECT_EQ(map.u8,  255);
2298ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  EXPECT_EQ(map.b,   false);
2308ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  EXPECT_EQ(map.s64, -5000000000LL);
2318ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  EXPECT_EQ(map.s32, -2000000000L);
2328ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  EXPECT_EQ(map.s16, -32000);
2338ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  EXPECT_EQ(map.s8,  -127);
2348ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  EXPECT_EQ(map.f,   137.125);
2358ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  EXPECT_EQ(map.d,   -2.8625);
2368ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  EXPECT_EQ(map.h8,  Hex8(255));
2378ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  EXPECT_EQ(map.h16, Hex16(0x8765));
2388ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  EXPECT_EQ(map.h32, Hex32(0xFEDCBA98));
2398ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  EXPECT_EQ(map.h64, Hex64(0xFEDCBA9876543210LL));
2408ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
2418ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
2428ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
2438ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//
2448ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik// Test writing then reading back all built-in scalar types
2458ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//
2468ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick KledzikTEST(YAMLIO, TestReadWriteBuiltInTypes) {
2478ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  std::string intermediate;
2488ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  {
2498ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    BuiltInTypes map;
2508ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    map.str = "one two";
25136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    map.stdstr = "three four";
25282612a6d73fd00f494ba16caef08a400c07db489Nick Kledzik    map.u64 = 6000000000ULL;
25382612a6d73fd00f494ba16caef08a400c07db489Nick Kledzik    map.u32 = 3000000000U;
2548ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    map.u16 = 50000;
2558ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    map.u8  = 254;
2568ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    map.b   = true;
25782612a6d73fd00f494ba16caef08a400c07db489Nick Kledzik    map.s64 = -6000000000LL;
2588ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    map.s32 = -2000000000;
2598ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    map.s16 = -32000;
2608ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    map.s8  = -128;
2618ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    map.f   = 3.25;
2628ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    map.d   = -2.8625;
2638ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    map.h8  = 254;
2648ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    map.h16 = 50000;
26582612a6d73fd00f494ba16caef08a400c07db489Nick Kledzik    map.h32 = 3000000000U;
2668ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    map.h64 = 6000000000LL;
2678ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
2688ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    llvm::raw_string_ostream ostr(intermediate);
2698ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    Output yout(ostr);
2708ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    yout << map;
2718ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
2728ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
2738ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  {
2748ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    Input yin(intermediate);
2758ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    BuiltInTypes map;
2768ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    yin >> map;
2778ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
2788ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    EXPECT_FALSE(yin.error());
2798ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    EXPECT_TRUE(map.str.equals("one two"));
28036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    EXPECT_TRUE(map.stdstr == "three four");
2818ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    EXPECT_EQ(map.u64,      6000000000ULL);
28282612a6d73fd00f494ba16caef08a400c07db489Nick Kledzik    EXPECT_EQ(map.u32,      3000000000U);
2838ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    EXPECT_EQ(map.u16,      50000);
2848ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    EXPECT_EQ(map.u8,       254);
2858ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    EXPECT_EQ(map.b,        true);
2868ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    EXPECT_EQ(map.s64,      -6000000000LL);
2878ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    EXPECT_EQ(map.s32,      -2000000000L);
2888ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    EXPECT_EQ(map.s16,      -32000);
2898ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    EXPECT_EQ(map.s8,       -128);
2908ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    EXPECT_EQ(map.f,        3.25);
2918ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    EXPECT_EQ(map.d,        -2.8625);
2928ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    EXPECT_EQ(map.h8,       Hex8(254));
2938ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    EXPECT_EQ(map.h16,      Hex16(50000));
29482612a6d73fd00f494ba16caef08a400c07db489Nick Kledzik    EXPECT_EQ(map.h32,      Hex32(3000000000U));
2958ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    EXPECT_EQ(map.h64,      Hex64(6000000000LL));
2968ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
2978ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
2988ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
2992e942d5402ddfadb04853a6f9dab2128af7a1d5eRui Ueyamastruct StringTypes {
3002e942d5402ddfadb04853a6f9dab2128af7a1d5eRui Ueyama  llvm::StringRef str1;
3012e942d5402ddfadb04853a6f9dab2128af7a1d5eRui Ueyama  llvm::StringRef str2;
3022e942d5402ddfadb04853a6f9dab2128af7a1d5eRui Ueyama  llvm::StringRef str3;
3032e942d5402ddfadb04853a6f9dab2128af7a1d5eRui Ueyama  llvm::StringRef str4;
3042e942d5402ddfadb04853a6f9dab2128af7a1d5eRui Ueyama  llvm::StringRef str5;
305dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  llvm::StringRef str6;
306dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  llvm::StringRef str7;
307dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  llvm::StringRef str8;
308dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  llvm::StringRef str9;
309dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  llvm::StringRef str10;
310dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  llvm::StringRef str11;
31136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  std::string stdstr1;
31236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  std::string stdstr2;
31336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  std::string stdstr3;
31436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  std::string stdstr4;
31536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  std::string stdstr5;
316dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  std::string stdstr6;
317dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  std::string stdstr7;
318dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  std::string stdstr8;
319dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  std::string stdstr9;
320dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  std::string stdstr10;
321dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  std::string stdstr11;
3222e942d5402ddfadb04853a6f9dab2128af7a1d5eRui Ueyama};
3238ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
3242e942d5402ddfadb04853a6f9dab2128af7a1d5eRui Ueyamanamespace llvm {
3252e942d5402ddfadb04853a6f9dab2128af7a1d5eRui Ueyamanamespace yaml {
3262e942d5402ddfadb04853a6f9dab2128af7a1d5eRui Ueyama  template <>
3272e942d5402ddfadb04853a6f9dab2128af7a1d5eRui Ueyama  struct MappingTraits<StringTypes> {
3282e942d5402ddfadb04853a6f9dab2128af7a1d5eRui Ueyama    static void mapping(IO &io, StringTypes& st) {
3292e942d5402ddfadb04853a6f9dab2128af7a1d5eRui Ueyama      io.mapRequired("str1",      st.str1);
3302e942d5402ddfadb04853a6f9dab2128af7a1d5eRui Ueyama      io.mapRequired("str2",      st.str2);
3312e942d5402ddfadb04853a6f9dab2128af7a1d5eRui Ueyama      io.mapRequired("str3",      st.str3);
3322e942d5402ddfadb04853a6f9dab2128af7a1d5eRui Ueyama      io.mapRequired("str4",      st.str4);
3332e942d5402ddfadb04853a6f9dab2128af7a1d5eRui Ueyama      io.mapRequired("str5",      st.str5);
334dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      io.mapRequired("str6",      st.str6);
335dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      io.mapRequired("str7",      st.str7);
336dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      io.mapRequired("str8",      st.str8);
337dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      io.mapRequired("str9",      st.str9);
338dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      io.mapRequired("str10",     st.str10);
339dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      io.mapRequired("str11",     st.str11);
34036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      io.mapRequired("stdstr1",   st.stdstr1);
34136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      io.mapRequired("stdstr2",   st.stdstr2);
34236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      io.mapRequired("stdstr3",   st.stdstr3);
34336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      io.mapRequired("stdstr4",   st.stdstr4);
34436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      io.mapRequired("stdstr5",   st.stdstr5);
345dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      io.mapRequired("stdstr6",   st.stdstr6);
346dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      io.mapRequired("stdstr7",   st.stdstr7);
347dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      io.mapRequired("stdstr8",   st.stdstr8);
348dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      io.mapRequired("stdstr9",   st.stdstr9);
349dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      io.mapRequired("stdstr10",  st.stdstr10);
350dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      io.mapRequired("stdstr11",  st.stdstr11);
3512e942d5402ddfadb04853a6f9dab2128af7a1d5eRui Ueyama    }
3522e942d5402ddfadb04853a6f9dab2128af7a1d5eRui Ueyama  };
3532e942d5402ddfadb04853a6f9dab2128af7a1d5eRui Ueyama}
3542e942d5402ddfadb04853a6f9dab2128af7a1d5eRui Ueyama}
3552e942d5402ddfadb04853a6f9dab2128af7a1d5eRui Ueyama
3562e942d5402ddfadb04853a6f9dab2128af7a1d5eRui UeyamaTEST(YAMLIO, TestReadWriteStringTypes) {
3572e942d5402ddfadb04853a6f9dab2128af7a1d5eRui Ueyama  std::string intermediate;
3582e942d5402ddfadb04853a6f9dab2128af7a1d5eRui Ueyama  {
3592e942d5402ddfadb04853a6f9dab2128af7a1d5eRui Ueyama    StringTypes map;
3602e942d5402ddfadb04853a6f9dab2128af7a1d5eRui Ueyama    map.str1 = "'aaa";
3612e942d5402ddfadb04853a6f9dab2128af7a1d5eRui Ueyama    map.str2 = "\"bbb";
3622e942d5402ddfadb04853a6f9dab2128af7a1d5eRui Ueyama    map.str3 = "`ccc";
3632e942d5402ddfadb04853a6f9dab2128af7a1d5eRui Ueyama    map.str4 = "@ddd";
3642e942d5402ddfadb04853a6f9dab2128af7a1d5eRui Ueyama    map.str5 = "";
365dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    map.str6 = "0000000004000000";
366dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    map.str7 = "true";
367dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    map.str8 = "FALSE";
368dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    map.str9 = "~";
369dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    map.str10 = "0.2e20";
370dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    map.str11 = "0x30";
37136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    map.stdstr1 = "'eee";
37236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    map.stdstr2 = "\"fff";
37336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    map.stdstr3 = "`ggg";
37436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    map.stdstr4 = "@hhh";
37536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    map.stdstr5 = "";
376dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    map.stdstr6 = "0000000004000000";
377dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    map.stdstr7 = "true";
378dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    map.stdstr8 = "FALSE";
379dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    map.stdstr9 = "~";
380dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    map.stdstr10 = "0.2e20";
381dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    map.stdstr11 = "0x30";
3822e942d5402ddfadb04853a6f9dab2128af7a1d5eRui Ueyama
3832e942d5402ddfadb04853a6f9dab2128af7a1d5eRui Ueyama    llvm::raw_string_ostream ostr(intermediate);
3842e942d5402ddfadb04853a6f9dab2128af7a1d5eRui Ueyama    Output yout(ostr);
3852e942d5402ddfadb04853a6f9dab2128af7a1d5eRui Ueyama    yout << map;
3862e942d5402ddfadb04853a6f9dab2128af7a1d5eRui Ueyama  }
3872e942d5402ddfadb04853a6f9dab2128af7a1d5eRui Ueyama
3882e942d5402ddfadb04853a6f9dab2128af7a1d5eRui Ueyama  llvm::StringRef flowOut(intermediate);
3892e942d5402ddfadb04853a6f9dab2128af7a1d5eRui Ueyama  EXPECT_NE(llvm::StringRef::npos, flowOut.find("'''aaa"));
3902e942d5402ddfadb04853a6f9dab2128af7a1d5eRui Ueyama  EXPECT_NE(llvm::StringRef::npos, flowOut.find("'\"bbb'"));
3912e942d5402ddfadb04853a6f9dab2128af7a1d5eRui Ueyama  EXPECT_NE(llvm::StringRef::npos, flowOut.find("'`ccc'"));
3922e942d5402ddfadb04853a6f9dab2128af7a1d5eRui Ueyama  EXPECT_NE(llvm::StringRef::npos, flowOut.find("'@ddd'"));
3932e942d5402ddfadb04853a6f9dab2128af7a1d5eRui Ueyama  EXPECT_NE(llvm::StringRef::npos, flowOut.find("''\n"));
394dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  EXPECT_NE(llvm::StringRef::npos, flowOut.find("'0000000004000000'\n"));
395dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  EXPECT_NE(llvm::StringRef::npos, flowOut.find("'true'\n"));
396dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  EXPECT_NE(llvm::StringRef::npos, flowOut.find("'FALSE'\n"));
397dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  EXPECT_NE(llvm::StringRef::npos, flowOut.find("'~'\n"));
398dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  EXPECT_NE(llvm::StringRef::npos, flowOut.find("'0.2e20'\n"));
399dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  EXPECT_NE(llvm::StringRef::npos, flowOut.find("'0x30'\n"));
40036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_NE(std::string::npos, flowOut.find("'''eee"));
40136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_NE(std::string::npos, flowOut.find("'\"fff'"));
40236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_NE(std::string::npos, flowOut.find("'`ggg'"));
40336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_NE(std::string::npos, flowOut.find("'@hhh'"));
40436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_NE(std::string::npos, flowOut.find("''\n"));
405dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  EXPECT_NE(std::string::npos, flowOut.find("'0000000004000000'\n"));
4062e942d5402ddfadb04853a6f9dab2128af7a1d5eRui Ueyama
4072e942d5402ddfadb04853a6f9dab2128af7a1d5eRui Ueyama  {
4082e942d5402ddfadb04853a6f9dab2128af7a1d5eRui Ueyama    Input yin(intermediate);
4092e942d5402ddfadb04853a6f9dab2128af7a1d5eRui Ueyama    StringTypes map;
4102e942d5402ddfadb04853a6f9dab2128af7a1d5eRui Ueyama    yin >> map;
4112e942d5402ddfadb04853a6f9dab2128af7a1d5eRui Ueyama
4122e942d5402ddfadb04853a6f9dab2128af7a1d5eRui Ueyama    EXPECT_FALSE(yin.error());
4132e942d5402ddfadb04853a6f9dab2128af7a1d5eRui Ueyama    EXPECT_TRUE(map.str1.equals("'aaa"));
4142e942d5402ddfadb04853a6f9dab2128af7a1d5eRui Ueyama    EXPECT_TRUE(map.str2.equals("\"bbb"));
4152e942d5402ddfadb04853a6f9dab2128af7a1d5eRui Ueyama    EXPECT_TRUE(map.str3.equals("`ccc"));
4162e942d5402ddfadb04853a6f9dab2128af7a1d5eRui Ueyama    EXPECT_TRUE(map.str4.equals("@ddd"));
4172e942d5402ddfadb04853a6f9dab2128af7a1d5eRui Ueyama    EXPECT_TRUE(map.str5.equals(""));
418dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    EXPECT_TRUE(map.str6.equals("0000000004000000"));
41936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    EXPECT_TRUE(map.stdstr1 == "'eee");
42036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    EXPECT_TRUE(map.stdstr2 == "\"fff");
42136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    EXPECT_TRUE(map.stdstr3 == "`ggg");
42236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    EXPECT_TRUE(map.stdstr4 == "@hhh");
42336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    EXPECT_TRUE(map.stdstr5 == "");
424dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    EXPECT_TRUE(map.stdstr6 == "0000000004000000");
4252e942d5402ddfadb04853a6f9dab2128af7a1d5eRui Ueyama  }
4262e942d5402ddfadb04853a6f9dab2128af7a1d5eRui Ueyama}
4278ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
4288ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//===----------------------------------------------------------------------===//
4298ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//  Test ScalarEnumerationTraits
4308ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//===----------------------------------------------------------------------===//
4318ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
4328ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikenum Colors {
4338ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    cRed,
4348ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    cBlue,
4358ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    cGreen,
4368ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    cYellow
4378ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik};
4388ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
4398ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikstruct ColorMap {
4408ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  Colors      c1;
4418ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  Colors      c2;
4428ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  Colors      c3;
4438ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  Colors      c4;
4448ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  Colors      c5;
4458ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  Colors      c6;
4468ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik};
4478ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
4488ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledziknamespace llvm {
4498ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledziknamespace yaml {
4508ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  template <>
4518ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  struct ScalarEnumerationTraits<Colors> {
4528ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    static void enumeration(IO &io, Colors &value) {
4538ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      io.enumCase(value, "red",   cRed);
4548ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      io.enumCase(value, "blue",  cBlue);
4558ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      io.enumCase(value, "green", cGreen);
4568ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      io.enumCase(value, "yellow",cYellow);
4578ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    }
4588ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  };
4598ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  template <>
4608ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  struct MappingTraits<ColorMap> {
4618ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    static void mapping(IO &io, ColorMap& c) {
4628ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      io.mapRequired("c1", c.c1);
4638ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      io.mapRequired("c2", c.c2);
4648ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      io.mapRequired("c3", c.c3);
4658ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      io.mapOptional("c4", c.c4, cBlue);   // supplies default
4668ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      io.mapOptional("c5", c.c5, cYellow); // supplies default
4678ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      io.mapOptional("c6", c.c6, cRed);    // supplies default
4688ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    }
4698ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  };
4708ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
4718ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
4728ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
4738ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
4748ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//
4758ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik// Test reading enumerated scalars
4768ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//
4778ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick KledzikTEST(YAMLIO, TestEnumRead) {
4788ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  ColorMap map;
4798ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  Input yin("---\n"
4808ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "c1:  blue\n"
4818ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "c2:  red\n"
4828ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "c3:  green\n"
4838ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "c5:  yellow\n"
4848ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "...\n");
4858ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  yin >> map;
4868ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
4878ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  EXPECT_FALSE(yin.error());
4888ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  EXPECT_EQ(cBlue,  map.c1);
4898ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  EXPECT_EQ(cRed,   map.c2);
4908ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  EXPECT_EQ(cGreen, map.c3);
4918ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  EXPECT_EQ(cBlue,  map.c4);  // tests default
4928ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  EXPECT_EQ(cYellow,map.c5);  // tests overridden
4938ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  EXPECT_EQ(cRed,   map.c6);  // tests default
4948ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
4958ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
4968ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
4978ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
4988ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//===----------------------------------------------------------------------===//
4998ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//  Test ScalarBitSetTraits
5008ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//===----------------------------------------------------------------------===//
5018ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
5028ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikenum MyFlags {
5038ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  flagNone    = 0,
5048ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  flagBig     = 1 << 0,
5058ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  flagFlat    = 1 << 1,
5068ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  flagRound   = 1 << 2,
5078ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  flagPointy  = 1 << 3
5088ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik};
5098ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikinline MyFlags operator|(MyFlags a, MyFlags b) {
5108ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  return static_cast<MyFlags>(
5118ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik                      static_cast<uint32_t>(a) | static_cast<uint32_t>(b));
5128ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
5138ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
5148ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikstruct FlagsMap {
5158ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  MyFlags     f1;
5168ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  MyFlags     f2;
5178ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  MyFlags     f3;
5188ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  MyFlags     f4;
5198ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik};
5208ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
5218ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
5228ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledziknamespace llvm {
5238ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledziknamespace yaml {
5248ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  template <>
5258ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  struct ScalarBitSetTraits<MyFlags> {
5268ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    static void bitset(IO &io, MyFlags &value) {
5278ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      io.bitSetCase(value, "big",   flagBig);
5288ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      io.bitSetCase(value, "flat",  flagFlat);
5298ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      io.bitSetCase(value, "round", flagRound);
5308ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      io.bitSetCase(value, "pointy",flagPointy);
5318ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    }
5328ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  };
5338ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  template <>
5348ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  struct MappingTraits<FlagsMap> {
5358ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    static void mapping(IO &io, FlagsMap& c) {
5368ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      io.mapRequired("f1", c.f1);
5378ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      io.mapRequired("f2", c.f2);
5388ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      io.mapRequired("f3", c.f3);
5398ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      io.mapOptional("f4", c.f4, MyFlags(flagRound));
5408ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik     }
5418ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  };
5428ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
5438ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
5448ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
5458ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
5468ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//
5478ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik// Test reading flow sequence representing bit-mask values
5488ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//
5498ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick KledzikTEST(YAMLIO, TestFlagsRead) {
5508ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  FlagsMap map;
5518ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  Input yin("---\n"
5528ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "f1:  [ big ]\n"
5538ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "f2:  [ round, flat ]\n"
5548ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "f3:  []\n"
5558ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "...\n");
5568ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  yin >> map;
5578ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
5588ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  EXPECT_FALSE(yin.error());
5598ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  EXPECT_EQ(flagBig,              map.f1);
5608ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  EXPECT_EQ(flagRound|flagFlat,   map.f2);
5618ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  EXPECT_EQ(flagNone,             map.f3);  // check empty set
5628ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  EXPECT_EQ(flagRound,            map.f4);  // check optional key
5638ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
5648ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
5658ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
5668ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//
5678ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik// Test writing then reading back bit-mask values
5688ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//
5698ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick KledzikTEST(YAMLIO, TestReadWriteFlags) {
5708ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  std::string intermediate;
5718ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  {
5728ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    FlagsMap map;
5738ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    map.f1 = flagBig;
5748ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    map.f2 = flagRound | flagFlat;
5758ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    map.f3 = flagNone;
5768ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    map.f4 = flagNone;
5778ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
5788ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    llvm::raw_string_ostream ostr(intermediate);
5798ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    Output yout(ostr);
5808ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    yout << map;
5818ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
5828ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
5838ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  {
5848ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    Input yin(intermediate);
5858ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    FlagsMap map2;
5868ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    yin >> map2;
5878ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
5888ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    EXPECT_FALSE(yin.error());
5898ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    EXPECT_EQ(flagBig,              map2.f1);
5908ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    EXPECT_EQ(flagRound|flagFlat,   map2.f2);
5918ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    EXPECT_EQ(flagNone,             map2.f3);
5928ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    //EXPECT_EQ(flagRound,            map2.f4);  // check optional key
5938ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
5948ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
5958ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
5968ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
5978ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
5988ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//===----------------------------------------------------------------------===//
5998ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//  Test ScalarTraits
6008ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//===----------------------------------------------------------------------===//
6018ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
6028ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikstruct MyCustomType {
6038ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  int length;
6048ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  int width;
6058ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik};
6068ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
6078ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikstruct MyCustomTypeMap {
6088ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  MyCustomType     f1;
6098ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  MyCustomType     f2;
6108ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  int              f3;
6118ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik};
6128ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
6138ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
6148ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledziknamespace llvm {
6158ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledziknamespace yaml {
6168ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  template <>
6178ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  struct MappingTraits<MyCustomTypeMap> {
6188ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    static void mapping(IO &io, MyCustomTypeMap& s) {
6198ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      io.mapRequired("f1", s.f1);
6208ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      io.mapRequired("f2", s.f2);
6218ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      io.mapRequired("f3", s.f3);
6228ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik     }
6238ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  };
6248ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  // MyCustomType is formatted as a yaml scalar.  A value of
6258ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  // {length=3, width=4} would be represented in yaml as "3 by 4".
6268ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  template<>
6278ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  struct ScalarTraits<MyCustomType> {
6288ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    static void output(const MyCustomType &value, void* ctxt, llvm::raw_ostream &out) {
6298ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      out << llvm::format("%d by %d", value.length, value.width);
6308ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    }
6318ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    static StringRef input(StringRef scalar, void* ctxt, MyCustomType &value) {
6328ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      size_t byStart = scalar.find("by");
6338ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      if ( byStart != StringRef::npos ) {
6348ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik        StringRef lenStr = scalar.slice(0, byStart);
6358ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik        lenStr = lenStr.rtrim();
6368ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik        if ( lenStr.getAsInteger(0, value.length) ) {
6378ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik          return "malformed length";
6388ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik        }
6398ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik        StringRef widthStr = scalar.drop_front(byStart+2);
6408ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik        widthStr = widthStr.ltrim();
6418ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik        if ( widthStr.getAsInteger(0, value.width) ) {
6428ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik          return "malformed width";
6438ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik        }
6448ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik        return StringRef();
6458ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      }
6468ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      else {
6478ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik          return "malformed by";
6488ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      }
6498ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    }
650dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    static bool mustQuote(StringRef) { return true; }
6518ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  };
6528ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
6538ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
6548ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
6558ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
6568ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//
6578ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik// Test writing then reading back custom values
6588ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//
6598ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick KledzikTEST(YAMLIO, TestReadWriteMyCustomType) {
6608ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  std::string intermediate;
6618ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  {
6628ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    MyCustomTypeMap map;
6638ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    map.f1.length = 1;
6648ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    map.f1.width  = 4;
6658ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    map.f2.length = 100;
6668ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    map.f2.width  = 400;
6678ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    map.f3 = 10;
6688ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
6698ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    llvm::raw_string_ostream ostr(intermediate);
6708ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    Output yout(ostr);
6718ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    yout << map;
6728ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
6738ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
6748ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  {
6758ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    Input yin(intermediate);
6768ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    MyCustomTypeMap map2;
6778ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    yin >> map2;
6788ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
6798ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    EXPECT_FALSE(yin.error());
6808ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    EXPECT_EQ(1,      map2.f1.length);
6818ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    EXPECT_EQ(4,      map2.f1.width);
6828ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    EXPECT_EQ(100,    map2.f2.length);
6838ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    EXPECT_EQ(400,    map2.f2.width);
6848ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    EXPECT_EQ(10,     map2.f3);
6858ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
6868ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
6878ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
6888ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
6898ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//===----------------------------------------------------------------------===//
6908ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//  Test flow sequences
6918ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//===----------------------------------------------------------------------===//
6928ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
6938ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick KledzikLLVM_YAML_STRONG_TYPEDEF(int, MyNumber)
6948ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick KledzikLLVM_YAML_IS_FLOW_SEQUENCE_VECTOR(MyNumber)
6958ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick KledzikLLVM_YAML_IS_FLOW_SEQUENCE_VECTOR(llvm::StringRef)
6968ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
6978ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledziknamespace llvm {
6988ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledziknamespace yaml {
6998ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  template<>
7008ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  struct ScalarTraits<MyNumber> {
7018ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    static void output(const MyNumber &value, void *, llvm::raw_ostream &out) {
7028ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      out << value;
7038ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    }
7048ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
7058ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    static StringRef input(StringRef scalar, void *, MyNumber &value) {
706f2150b6857f942dbb498bac2bcb39da34ee01c27David Blaikie      long long n;
7078ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      if ( getAsSignedInteger(scalar, 0, n) )
7088ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik        return "invalid number";
7098ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      value = n;
7108ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      return StringRef();
7118ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    }
712dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
713dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    static bool mustQuote(StringRef) { return false; }
7148ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  };
7158ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
7168ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
7178ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
7188ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikstruct NameAndNumbers {
7198ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  llvm::StringRef               name;
7208ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  std::vector<llvm::StringRef>  strings;
7218ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  std::vector<MyNumber>         single;
7228ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  std::vector<MyNumber>         numbers;
7238ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik};
7248ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
7258ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledziknamespace llvm {
7268ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledziknamespace yaml {
7278ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  template <>
7288ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  struct MappingTraits<NameAndNumbers> {
7298ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    static void mapping(IO &io, NameAndNumbers& nn) {
7308ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      io.mapRequired("name",     nn.name);
7318ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      io.mapRequired("strings",  nn.strings);
7328ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      io.mapRequired("single",   nn.single);
7338ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      io.mapRequired("numbers",  nn.numbers);
7348ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    }
7358ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  };
7368ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
7378ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
7388ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
7398ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
7408ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//
7418ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik// Test writing then reading back custom values
7428ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//
7438ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick KledzikTEST(YAMLIO, TestReadWriteMyFlowSequence) {
7448ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  std::string intermediate;
7458ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  {
7468ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    NameAndNumbers map;
7478ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    map.name  = "hello";
7488ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    map.strings.push_back(llvm::StringRef("one"));
7498ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    map.strings.push_back(llvm::StringRef("two"));
7508ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    map.single.push_back(1);
7518ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    map.numbers.push_back(10);
7528ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    map.numbers.push_back(-30);
7538ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    map.numbers.push_back(1024);
7548ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
7558ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    llvm::raw_string_ostream ostr(intermediate);
756e9cf283e081cb68f0276aa4b893f290b9c26a0c7Rui Ueyama    Output yout(ostr);
7578ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    yout << map;
758e9cf283e081cb68f0276aa4b893f290b9c26a0c7Rui Ueyama
75950c30427405142f1b587edee846606184ae6af8eNick Kledzik    // Verify sequences were written in flow style
76050c30427405142f1b587edee846606184ae6af8eNick Kledzik    ostr.flush();
76150c30427405142f1b587edee846606184ae6af8eNick Kledzik    llvm::StringRef flowOut(intermediate);
76250c30427405142f1b587edee846606184ae6af8eNick Kledzik    EXPECT_NE(llvm::StringRef::npos, flowOut.find("one, two"));
76350c30427405142f1b587edee846606184ae6af8eNick Kledzik    EXPECT_NE(llvm::StringRef::npos, flowOut.find("10, -30, 1024"));
7648ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
7658ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
7668ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  {
7678ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    Input yin(intermediate);
7688ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    NameAndNumbers map2;
7698ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    yin >> map2;
7708ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
7718ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    EXPECT_FALSE(yin.error());
7728ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    EXPECT_TRUE(map2.name.equals("hello"));
7738ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    EXPECT_EQ(map2.strings.size(), 2UL);
7748ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    EXPECT_TRUE(map2.strings[0].equals("one"));
7758ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    EXPECT_TRUE(map2.strings[1].equals("two"));
7768ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    EXPECT_EQ(map2.single.size(), 1UL);
7778ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    EXPECT_EQ(1,       map2.single[0]);
7788ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    EXPECT_EQ(map2.numbers.size(), 3UL);
7798ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    EXPECT_EQ(10,      map2.numbers[0]);
7808ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    EXPECT_EQ(-30,     map2.numbers[1]);
7818ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    EXPECT_EQ(1024,    map2.numbers[2]);
7828ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
7838ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
7848ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
7858ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
7868ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//===----------------------------------------------------------------------===//
7878ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//  Test normalizing/denormalizing
7888ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//===----------------------------------------------------------------------===//
7898ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
7908ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick KledzikLLVM_YAML_STRONG_TYPEDEF(uint32_t, TotalSeconds)
7918ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
7928ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledziktypedef std::vector<TotalSeconds> SecondsSequence;
7938ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
79450c30427405142f1b587edee846606184ae6af8eNick KledzikLLVM_YAML_IS_SEQUENCE_VECTOR(TotalSeconds)
7958ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
7968ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
7978ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledziknamespace llvm {
7988ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledziknamespace yaml {
7998ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  template <>
8008ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  struct MappingTraits<TotalSeconds> {
8018ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
8028ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    class NormalizedSeconds {
8038ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    public:
8048ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      NormalizedSeconds(IO &io)
8058ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik        : hours(0), minutes(0), seconds(0) {
8068ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      }
8078ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      NormalizedSeconds(IO &, TotalSeconds &secs)
8088ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik        : hours(secs/3600),
8098ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik          minutes((secs - (hours*3600))/60),
8108ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik          seconds(secs % 60) {
8118ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      }
8128ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      TotalSeconds denormalize(IO &) {
8138ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik        return TotalSeconds(hours*3600 + minutes*60 + seconds);
8148ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      }
8158ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
8168ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      uint32_t     hours;
8178ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      uint8_t      minutes;
8188ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      uint8_t      seconds;
8198ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    };
8208ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
8218ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    static void mapping(IO &io, TotalSeconds &secs) {
8228ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      MappingNormalization<NormalizedSeconds, TotalSeconds> keys(io, secs);
8238ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
8248ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      io.mapOptional("hours",    keys->hours,    (uint32_t)0);
8258ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      io.mapOptional("minutes",  keys->minutes,  (uint8_t)0);
8268ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      io.mapRequired("seconds",  keys->seconds);
8278ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    }
8288ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  };
8298ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
8308ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
8318ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
8328ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
8338ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//
8348ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik// Test the reading of a yaml sequence of mappings
8358ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//
8368ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick KledzikTEST(YAMLIO, TestReadMySecondsSequence) {
8378ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  SecondsSequence seq;
8388ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  Input yin("---\n - hours:  1\n   seconds:  5\n - seconds:  59\n...\n");
8398ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  yin >> seq;
8408ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
8418ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  EXPECT_FALSE(yin.error());
8428ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  EXPECT_EQ(seq.size(), 2UL);
8438ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  EXPECT_EQ(seq[0], 3605U);
8448ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  EXPECT_EQ(seq[1], 59U);
8458ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
8468ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
8478ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
8488ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//
8498ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik// Test writing then reading back custom values
8508ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//
8518ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick KledzikTEST(YAMLIO, TestReadWriteMySecondsSequence) {
8528ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  std::string intermediate;
8538ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  {
8548ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    SecondsSequence seq;
8558ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    seq.push_back(4000);
8568ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    seq.push_back(500);
8578ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    seq.push_back(59);
8588ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
8598ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    llvm::raw_string_ostream ostr(intermediate);
8608ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    Output yout(ostr);
8618ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    yout << seq;
8628ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
8638ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  {
8648ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    Input yin(intermediate);
8658ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    SecondsSequence seq2;
8668ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    yin >> seq2;
8678ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
8688ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    EXPECT_FALSE(yin.error());
8698ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    EXPECT_EQ(seq2.size(), 3UL);
8708ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    EXPECT_EQ(seq2[0], 4000U);
8718ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    EXPECT_EQ(seq2[1], 500U);
8728ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    EXPECT_EQ(seq2[2], 59U);
8738ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
8748ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
8758ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
8768ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
8778ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//===----------------------------------------------------------------------===//
8788ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//  Test dynamic typing
8798ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//===----------------------------------------------------------------------===//
8808ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
8818ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikenum AFlags {
8828ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    a1,
8838ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    a2,
8848ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    a3
8858ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik};
8868ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
8878ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikenum BFlags {
8888ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    b1,
8898ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    b2,
8908ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    b3
8918ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik};
8928ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
8938ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikenum Kind {
8948ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    kindA,
8958ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    kindB
8968ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik};
8978ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
8988ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikstruct KindAndFlags {
8998ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  KindAndFlags() : kind(kindA), flags(0) { }
9008ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  KindAndFlags(Kind k, uint32_t f) : kind(k), flags(f) { }
9018ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  Kind        kind;
9028ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  uint32_t    flags;
9038ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik};
9048ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
9058ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledziktypedef std::vector<KindAndFlags> KindAndFlagsSequence;
9068ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
90750c30427405142f1b587edee846606184ae6af8eNick KledzikLLVM_YAML_IS_SEQUENCE_VECTOR(KindAndFlags)
9088ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
9098ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledziknamespace llvm {
9108ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledziknamespace yaml {
9118ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  template <>
9128ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  struct ScalarEnumerationTraits<AFlags> {
9138ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    static void enumeration(IO &io, AFlags &value) {
9148ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      io.enumCase(value, "a1",  a1);
9158ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      io.enumCase(value, "a2",  a2);
9168ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      io.enumCase(value, "a3",  a3);
9178ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    }
9188ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  };
9198ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  template <>
9208ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  struct ScalarEnumerationTraits<BFlags> {
9218ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    static void enumeration(IO &io, BFlags &value) {
9228ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      io.enumCase(value, "b1",  b1);
9238ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      io.enumCase(value, "b2",  b2);
9248ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      io.enumCase(value, "b3",  b3);
9258ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    }
9268ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  };
9278ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  template <>
9288ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  struct ScalarEnumerationTraits<Kind> {
9298ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    static void enumeration(IO &io, Kind &value) {
9308ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      io.enumCase(value, "A",  kindA);
9318ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      io.enumCase(value, "B",  kindB);
9328ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    }
9338ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  };
9348ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  template <>
9358ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  struct MappingTraits<KindAndFlags> {
9368ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    static void mapping(IO &io, KindAndFlags& kf) {
9378ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      io.mapRequired("kind",  kf.kind);
938197616adda994d9c3f8fe46b2f5b5b34a1f164adDmitri Gribenko      // Type of "flags" field varies depending on "kind" field.
9395e1b31bf5588cd9ea0b16e94fcc1d908e40027e2David Greene      // Use memcpy here to avoid breaking strict aliasing rules.
940197616adda994d9c3f8fe46b2f5b5b34a1f164adDmitri Gribenko      if (kf.kind == kindA) {
941f6b6c37ca2a943a0a0f0407939b7633d7d62e321Dmitri Gribenko        AFlags aflags = static_cast<AFlags>(kf.flags);
9425e1b31bf5588cd9ea0b16e94fcc1d908e40027e2David Greene        io.mapRequired("flags", aflags);
943f6b6c37ca2a943a0a0f0407939b7633d7d62e321Dmitri Gribenko        kf.flags = aflags;
944197616adda994d9c3f8fe46b2f5b5b34a1f164adDmitri Gribenko      } else {
945f6b6c37ca2a943a0a0f0407939b7633d7d62e321Dmitri Gribenko        BFlags bflags = static_cast<BFlags>(kf.flags);
9465e1b31bf5588cd9ea0b16e94fcc1d908e40027e2David Greene        io.mapRequired("flags", bflags);
947f6b6c37ca2a943a0a0f0407939b7633d7d62e321Dmitri Gribenko        kf.flags = bflags;
9485e1b31bf5588cd9ea0b16e94fcc1d908e40027e2David Greene      }
9498ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    }
9508ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  };
9518ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
9528ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
9538ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
9548ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
9558ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//
9568ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik// Test the reading of a yaml sequence dynamic types
9578ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//
9588ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick KledzikTEST(YAMLIO, TestReadKindAndFlagsSequence) {
9598ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  KindAndFlagsSequence seq;
9608ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  Input yin("---\n - kind:  A\n   flags:  a2\n - kind:  B\n   flags:  b1\n...\n");
9618ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  yin >> seq;
9628ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
9638ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  EXPECT_FALSE(yin.error());
9648ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  EXPECT_EQ(seq.size(), 2UL);
9658ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  EXPECT_EQ(seq[0].kind,  kindA);
966c83b8fec01565df67da45f437ca1311f7286e53bNick Kledzik  EXPECT_EQ(seq[0].flags, (uint32_t)a2);
9678ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  EXPECT_EQ(seq[1].kind,  kindB);
968c83b8fec01565df67da45f437ca1311f7286e53bNick Kledzik  EXPECT_EQ(seq[1].flags, (uint32_t)b1);
9698ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
9708ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
9718ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//
9728ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik// Test writing then reading back dynamic types
9738ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//
9748ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick KledzikTEST(YAMLIO, TestReadWriteKindAndFlagsSequence) {
9758ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  std::string intermediate;
9768ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  {
9778ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    KindAndFlagsSequence seq;
9788ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    seq.push_back(KindAndFlags(kindA,a1));
9798ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    seq.push_back(KindAndFlags(kindB,b1));
9808ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    seq.push_back(KindAndFlags(kindA,a2));
9818ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    seq.push_back(KindAndFlags(kindB,b2));
9828ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    seq.push_back(KindAndFlags(kindA,a3));
9838ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
9848ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    llvm::raw_string_ostream ostr(intermediate);
9858ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    Output yout(ostr);
9868ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    yout << seq;
9878ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
9888ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  {
9898ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    Input yin(intermediate);
9908ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    KindAndFlagsSequence seq2;
9918ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    yin >> seq2;
9928ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
9938ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    EXPECT_FALSE(yin.error());
9948ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    EXPECT_EQ(seq2.size(), 5UL);
9958ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    EXPECT_EQ(seq2[0].kind,  kindA);
996c83b8fec01565df67da45f437ca1311f7286e53bNick Kledzik    EXPECT_EQ(seq2[0].flags, (uint32_t)a1);
9978ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    EXPECT_EQ(seq2[1].kind,  kindB);
998c83b8fec01565df67da45f437ca1311f7286e53bNick Kledzik    EXPECT_EQ(seq2[1].flags, (uint32_t)b1);
9998ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    EXPECT_EQ(seq2[2].kind,  kindA);
1000c83b8fec01565df67da45f437ca1311f7286e53bNick Kledzik    EXPECT_EQ(seq2[2].flags, (uint32_t)a2);
10018ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    EXPECT_EQ(seq2[3].kind,  kindB);
1002c83b8fec01565df67da45f437ca1311f7286e53bNick Kledzik    EXPECT_EQ(seq2[3].flags, (uint32_t)b2);
10038ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    EXPECT_EQ(seq2[4].kind,  kindA);
1004c83b8fec01565df67da45f437ca1311f7286e53bNick Kledzik    EXPECT_EQ(seq2[4].flags, (uint32_t)a3);
10058ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
10068ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
10078ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
10088ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
10098ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//===----------------------------------------------------------------------===//
10108ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//  Test document list
10118ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//===----------------------------------------------------------------------===//
10128ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
10138ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikstruct FooBarMap {
10148ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  int foo;
10158ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  int bar;
10168ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik};
10178ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledziktypedef std::vector<FooBarMap> FooBarMapDocumentList;
10188ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
10198ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick KledzikLLVM_YAML_IS_DOCUMENT_LIST_VECTOR(FooBarMap)
10208ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
10218ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
10228ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledziknamespace llvm {
10238ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledziknamespace yaml {
10248ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  template <>
10258ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  struct MappingTraits<FooBarMap> {
10268ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    static void mapping(IO &io, FooBarMap& fb) {
10278ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      io.mapRequired("foo",    fb.foo);
10288ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      io.mapRequired("bar",    fb.bar);
10298ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    }
10308ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  };
10318ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
10328ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
10338ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
10348ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
10358ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//
10368ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik// Test the reading of a yaml mapping
10378ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//
10388ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick KledzikTEST(YAMLIO, TestDocRead) {
10398ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  FooBarMap doc;
10408ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  Input yin("---\nfoo:  3\nbar:  5\n...\n");
10418ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  yin >> doc;
10428ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
10438ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  EXPECT_FALSE(yin.error());
10448ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  EXPECT_EQ(doc.foo, 3);
10458ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  EXPECT_EQ(doc.bar,5);
10468ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
10478ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
10488ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
10498ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
10508ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//
10518ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik// Test writing then reading back a sequence of mappings
10528ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//
10538ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick KledzikTEST(YAMLIO, TestSequenceDocListWriteAndRead) {
10548ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  std::string intermediate;
10558ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  {
10568ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    FooBarMap doc1;
10578ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    doc1.foo = 10;
10588ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    doc1.bar = -3;
10598ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    FooBarMap doc2;
10608ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    doc2.foo = 257;
10618ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    doc2.bar = 0;
10628ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    std::vector<FooBarMap> docList;
10638ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    docList.push_back(doc1);
10648ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    docList.push_back(doc2);
10658ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
10668ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    llvm::raw_string_ostream ostr(intermediate);
10678ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    Output yout(ostr);
10688ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    yout << docList;
10698ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
10708ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
10718ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
10728ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  {
10738ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    Input yin(intermediate);
10748ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    std::vector<FooBarMap> docList2;
10758ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    yin >> docList2;
10768ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
10778ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    EXPECT_FALSE(yin.error());
10788ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    EXPECT_EQ(docList2.size(), 2UL);
10798ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    FooBarMap& map1 = docList2[0];
10808ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    FooBarMap& map2 = docList2[1];
10818ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    EXPECT_EQ(map1.foo, 10);
10828ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    EXPECT_EQ(map1.bar, -3);
10838ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    EXPECT_EQ(map2.foo, 257);
10848ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    EXPECT_EQ(map2.bar, 0);
10858ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
10868ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
10878ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
10884e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik//===----------------------------------------------------------------------===//
10894e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik//  Test document tags
10904e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik//===----------------------------------------------------------------------===//
10914e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik
10924e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzikstruct MyDouble {
10934e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik  MyDouble() : value(0.0) { }
10944e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik  MyDouble(double x) : value(x) { }
10954e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik  double value;
10964e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik};
10974e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik
109852301027aa45b8608b00f4eb324ffa11e924284dNick KledzikLLVM_YAML_IS_DOCUMENT_LIST_VECTOR(MyDouble)
10994e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik
11004e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik
11014e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledziknamespace llvm {
11024e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledziknamespace yaml {
11034e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik  template <>
11044e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik  struct MappingTraits<MyDouble> {
11054e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik    static void mapping(IO &io, MyDouble &d) {
11064e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik      if (io.mapTag("!decimal", true)) {
11074e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik        mappingDecimal(io, d);
11084e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik      } else if (io.mapTag("!fraction")) {
11094e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik        mappingFraction(io, d);
11104e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik      }
11114e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik    }
11124e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik    static void mappingDecimal(IO &io, MyDouble &d) {
11134e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik      io.mapRequired("value", d.value);
11144e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik    }
11154e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik    static void mappingFraction(IO &io, MyDouble &d) {
11164e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik        double num, denom;
11174e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik        io.mapRequired("numerator",      num);
11184e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik        io.mapRequired("denominator",    denom);
11194e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik        // convert fraction to double
11204e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik        d.value = num/denom;
11214e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik    }
11224e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik  };
11234e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik }
11244e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik}
11254e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik
11264e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik
11274e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik//
11284e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik// Test the reading of two different tagged yaml documents.
11294e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik//
11304e7c22a90b28828e4a28751b65ae24091f7df4ecNick KledzikTEST(YAMLIO, TestTaggedDocuments) {
11314e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik  std::vector<MyDouble> docList;
11324e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik  Input yin("--- !decimal\nvalue:  3.0\n"
11334e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik            "--- !fraction\nnumerator:  9.0\ndenominator:  2\n...\n");
11344e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik  yin >> docList;
11354e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik  EXPECT_FALSE(yin.error());
11364e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik  EXPECT_EQ(docList.size(), 2UL);
11374e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik  EXPECT_EQ(docList[0].value, 3.0);
11384e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik  EXPECT_EQ(docList[1].value, 4.5);
11394e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik}
11404e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik
11414e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik
11424e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik
11434e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik//
11444e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik// Test writing then reading back tagged documents
11454e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik//
11464e7c22a90b28828e4a28751b65ae24091f7df4ecNick KledzikTEST(YAMLIO, TestTaggedDocumentsWriteAndRead) {
11474e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik  std::string intermediate;
11484e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik  {
11494e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik    MyDouble a(10.25);
11504e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik    MyDouble b(-3.75);
11514e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik    std::vector<MyDouble> docList;
11524e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik    docList.push_back(a);
11534e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik    docList.push_back(b);
11544e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik
11554e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik    llvm::raw_string_ostream ostr(intermediate);
11564e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik    Output yout(ostr);
11574e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik    yout << docList;
11584e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik  }
11594e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik
11604e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik  {
11614e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik    Input yin(intermediate);
11624e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik    std::vector<MyDouble> docList2;
11634e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik    yin >> docList2;
11644e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik
11654e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik    EXPECT_FALSE(yin.error());
11664e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik    EXPECT_EQ(docList2.size(), 2UL);
11674e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik    EXPECT_EQ(docList2[0].value, 10.25);
11684e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik    EXPECT_EQ(docList2[1].value, -3.75);
11694e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik  }
11704e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik}
11714e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik
11724e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik
117304fca67d6f4b314ba618714698b58dbfba3af005Nick Kledzik//===----------------------------------------------------------------------===//
117436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//  Test mapping validation
117504fca67d6f4b314ba618714698b58dbfba3af005Nick Kledzik//===----------------------------------------------------------------------===//
117604fca67d6f4b314ba618714698b58dbfba3af005Nick Kledzik
117736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesstruct MyValidation {
117836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  double value;
117904fca67d6f4b314ba618714698b58dbfba3af005Nick Kledzik};
118004fca67d6f4b314ba618714698b58dbfba3af005Nick Kledzik
118136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesLLVM_YAML_IS_DOCUMENT_LIST_VECTOR(MyValidation)
118204fca67d6f4b314ba618714698b58dbfba3af005Nick Kledzik
118304fca67d6f4b314ba618714698b58dbfba3af005Nick Kledziknamespace llvm {
118404fca67d6f4b314ba618714698b58dbfba3af005Nick Kledziknamespace yaml {
118504fca67d6f4b314ba618714698b58dbfba3af005Nick Kledzik  template <>
118636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  struct MappingTraits<MyValidation> {
118736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    static void mapping(IO &io, MyValidation &d) {
118836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines        io.mapRequired("value", d.value);
118936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    }
119036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    static StringRef validate(IO &io, MyValidation &d) {
119136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines        if (d.value < 0)
119236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines          return "negative value";
119336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines        return StringRef();
119404fca67d6f4b314ba618714698b58dbfba3af005Nick Kledzik    }
119504fca67d6f4b314ba618714698b58dbfba3af005Nick Kledzik  };
119636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines }
119704fca67d6f4b314ba618714698b58dbfba3af005Nick Kledzik}
119804fca67d6f4b314ba618714698b58dbfba3af005Nick Kledzik
119936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
120004fca67d6f4b314ba618714698b58dbfba3af005Nick Kledzik//
120136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// Test that validate() is called and complains about the negative value.
120204fca67d6f4b314ba618714698b58dbfba3af005Nick Kledzik//
120336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesTEST(YAMLIO, TestValidatingInput) {
120436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  std::vector<MyValidation> docList;
120536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  Input yin("--- \nvalue:  3.0\n"
120636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines            "--- \nvalue:  -1.0\n...\n",
1207cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            nullptr, suppressErrorMessages);
120836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  yin >> docList;
1209cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(!!yin.error());
121004fca67d6f4b314ba618714698b58dbfba3af005Nick Kledzik}
121104fca67d6f4b314ba618714698b58dbfba3af005Nick Kledzik
121204fca67d6f4b314ba618714698b58dbfba3af005Nick Kledzik
12138ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//===----------------------------------------------------------------------===//
12148ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//  Test error handling
12158ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//===----------------------------------------------------------------------===//
12168ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
12178ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//
12188ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik// Test error handling of unknown enumerated scalar
12198ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//
12208ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick KledzikTEST(YAMLIO, TestColorsReadError) {
12218ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  ColorMap map;
12228ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  Input yin("---\n"
12238ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "c1:  blue\n"
12248ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "c2:  purple\n"
12258ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "c3:  green\n"
12266919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko            "...\n",
1227cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            /*Ctxt=*/nullptr,
12286919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko            suppressErrorMessages);
12298ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  yin >> map;
1230cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(!!yin.error());
12318ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
12328ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
12338ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
12348ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//
12358ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik// Test error handling of flow sequence with unknown value
12368ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//
12378ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick KledzikTEST(YAMLIO, TestFlagsReadError) {
12388ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  FlagsMap map;
12398ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  Input yin("---\n"
12408ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "f1:  [ big ]\n"
12418ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "f2:  [ round, hollow ]\n"
12428ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "f3:  []\n"
12436919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko            "...\n",
1244cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            /*Ctxt=*/nullptr,
12456919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko            suppressErrorMessages);
12468ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  yin >> map;
12478ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
1248cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(!!yin.error());
12498ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
12508ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
12518ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
12528ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//
12538ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik// Test error handling reading built-in uint8_t type
12548ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//
12558ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick KledzikLLVM_YAML_IS_SEQUENCE_VECTOR(uint8_t)
12568ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick KledzikTEST(YAMLIO, TestReadBuiltInTypesUint8Error) {
12578ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  std::vector<uint8_t> seq;
12588ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  Input yin("---\n"
12598ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "- 255\n"
12608ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "- 0\n"
12618ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "- 257\n"
12626919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko            "...\n",
1263cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            /*Ctxt=*/nullptr,
12646919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko            suppressErrorMessages);
12658ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  yin >> seq;
12668ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
1267cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(!!yin.error());
12688ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
12698ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
12708ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
12718ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//
12728ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik// Test error handling reading built-in uint16_t type
12738ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//
12748ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick KledzikLLVM_YAML_IS_SEQUENCE_VECTOR(uint16_t)
12758ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick KledzikTEST(YAMLIO, TestReadBuiltInTypesUint16Error) {
12768ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  std::vector<uint16_t> seq;
12778ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  Input yin("---\n"
12788ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "- 65535\n"
12798ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "- 0\n"
12808ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "- 66000\n"
12816919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko            "...\n",
1282cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            /*Ctxt=*/nullptr,
12836919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko            suppressErrorMessages);
12848ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  yin >> seq;
12858ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
1286cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(!!yin.error());
12878ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
12888ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
12898ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
12908ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//
12918ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik// Test error handling reading built-in uint32_t type
12928ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//
12938ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick KledzikLLVM_YAML_IS_SEQUENCE_VECTOR(uint32_t)
12948ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick KledzikTEST(YAMLIO, TestReadBuiltInTypesUint32Error) {
12958ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  std::vector<uint32_t> seq;
12968ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  Input yin("---\n"
12978ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "- 4000000000\n"
12988ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "- 0\n"
12998ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "- 5000000000\n"
13006919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko            "...\n",
1301cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            /*Ctxt=*/nullptr,
13026919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko            suppressErrorMessages);
13038ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  yin >> seq;
13048ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
1305cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(!!yin.error());
13068ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
13078ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
13088ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
13098ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//
13108ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik// Test error handling reading built-in uint64_t type
13118ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//
13128ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick KledzikLLVM_YAML_IS_SEQUENCE_VECTOR(uint64_t)
13138ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick KledzikTEST(YAMLIO, TestReadBuiltInTypesUint64Error) {
13148ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  std::vector<uint64_t> seq;
13158ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  Input yin("---\n"
13168ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "- 18446744073709551615\n"
13178ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "- 0\n"
13188ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "- 19446744073709551615\n"
13196919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko            "...\n",
1320cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            /*Ctxt=*/nullptr,
13216919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko            suppressErrorMessages);
13228ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  yin >> seq;
13238ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
1324cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(!!yin.error());
13258ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
13268ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
13278ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
13288ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//
13298ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik// Test error handling reading built-in int8_t type
13308ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//
13318ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick KledzikLLVM_YAML_IS_SEQUENCE_VECTOR(int8_t)
13328ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick KledzikTEST(YAMLIO, TestReadBuiltInTypesint8OverError) {
13338ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  std::vector<int8_t> seq;
13348ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  Input yin("---\n"
13358ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "- -128\n"
13368ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "- 0\n"
13378ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "- 127\n"
13388ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "- 128\n"
13396919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko           "...\n",
1340cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            /*Ctxt=*/nullptr,
13416919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko            suppressErrorMessages);
13428ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  yin >> seq;
13438ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
1344cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(!!yin.error());
13458ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
13468ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
13478ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//
13488ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik// Test error handling reading built-in int8_t type
13498ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//
13508ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick KledzikTEST(YAMLIO, TestReadBuiltInTypesint8UnderError) {
13518ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  std::vector<int8_t> seq;
13528ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  Input yin("---\n"
13538ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "- -128\n"
13548ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "- 0\n"
13558ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "- 127\n"
13568ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "- -129\n"
13576919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko            "...\n",
1358cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            /*Ctxt=*/nullptr,
13596919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko            suppressErrorMessages);
13608ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  yin >> seq;
13618ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
1362cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(!!yin.error());
13638ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
13648ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
13658ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
13668ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//
13678ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik// Test error handling reading built-in int16_t type
13688ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//
13698ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick KledzikLLVM_YAML_IS_SEQUENCE_VECTOR(int16_t)
13708ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick KledzikTEST(YAMLIO, TestReadBuiltInTypesint16UnderError) {
13718ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  std::vector<int16_t> seq;
13728ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  Input yin("---\n"
13738ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "- 32767\n"
13748ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "- 0\n"
13758ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "- -32768\n"
13768ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "- -32769\n"
13776919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko            "...\n",
1378cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            /*Ctxt=*/nullptr,
13796919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko            suppressErrorMessages);
13808ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  yin >> seq;
13818ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
1382cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(!!yin.error());
13838ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
13848ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
13858ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
13868ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//
13878ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik// Test error handling reading built-in int16_t type
13888ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//
13898ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick KledzikTEST(YAMLIO, TestReadBuiltInTypesint16OverError) {
13908ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  std::vector<int16_t> seq;
13918ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  Input yin("---\n"
13928ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "- 32767\n"
13938ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "- 0\n"
13948ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "- -32768\n"
13958ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "- 32768\n"
13966919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko            "...\n",
1397cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            /*Ctxt=*/nullptr,
13986919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko            suppressErrorMessages);
13998ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  yin >> seq;
14008ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
1401cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(!!yin.error());
14028ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
14038ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
14048ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
14058ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//
14068ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik// Test error handling reading built-in int32_t type
14078ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//
14088ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick KledzikLLVM_YAML_IS_SEQUENCE_VECTOR(int32_t)
14098ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick KledzikTEST(YAMLIO, TestReadBuiltInTypesint32UnderError) {
14108ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  std::vector<int32_t> seq;
14118ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  Input yin("---\n"
14128ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "- 2147483647\n"
14138ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "- 0\n"
14148ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "- -2147483648\n"
14158ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "- -2147483649\n"
14166919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko            "...\n",
1417cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            /*Ctxt=*/nullptr,
14186919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko            suppressErrorMessages);
14198ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  yin >> seq;
14208ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
1421cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(!!yin.error());
14228ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
14238ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
14248ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//
14258ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik// Test error handling reading built-in int32_t type
14268ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//
14278ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick KledzikTEST(YAMLIO, TestReadBuiltInTypesint32OverError) {
14288ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  std::vector<int32_t> seq;
14298ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  Input yin("---\n"
14308ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "- 2147483647\n"
14318ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "- 0\n"
14328ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "- -2147483648\n"
14338ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "- 2147483649\n"
14346919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko            "...\n",
1435cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            /*Ctxt=*/nullptr,
14366919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko            suppressErrorMessages);
14378ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  yin >> seq;
14388ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
1439cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(!!yin.error());
14408ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
14418ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
14428ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
14438ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//
14448ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik// Test error handling reading built-in int64_t type
14458ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//
14468ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick KledzikLLVM_YAML_IS_SEQUENCE_VECTOR(int64_t)
14478ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick KledzikTEST(YAMLIO, TestReadBuiltInTypesint64UnderError) {
14488ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  std::vector<int64_t> seq;
14498ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  Input yin("---\n"
14508ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "- -9223372036854775808\n"
14518ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "- 0\n"
14528ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "- 9223372036854775807\n"
14538ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "- -9223372036854775809\n"
14546919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko            "...\n",
1455cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            /*Ctxt=*/nullptr,
14566919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko            suppressErrorMessages);
14578ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  yin >> seq;
14588ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
1459cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(!!yin.error());
14608ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
14618ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
14628ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//
14638ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik// Test error handling reading built-in int64_t type
14648ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//
14658ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick KledzikTEST(YAMLIO, TestReadBuiltInTypesint64OverError) {
14668ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  std::vector<int64_t> seq;
14678ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  Input yin("---\n"
14688ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "- -9223372036854775808\n"
14698ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "- 0\n"
14708ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "- 9223372036854775807\n"
14718ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "- 9223372036854775809\n"
14726919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko            "...\n",
1473cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            /*Ctxt=*/nullptr,
14746919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko            suppressErrorMessages);
14758ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  yin >> seq;
14768ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
1477cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(!!yin.error());
14788ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
14798ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
14808ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//
14818ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik// Test error handling reading built-in float type
14828ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//
14838ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick KledzikLLVM_YAML_IS_SEQUENCE_VECTOR(float)
14848ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick KledzikTEST(YAMLIO, TestReadBuiltInTypesFloatError) {
14858ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  std::vector<float> seq;
14868ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  Input yin("---\n"
14878ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "- 0.0\n"
14888ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "- 1000.1\n"
14898ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "- -123.456\n"
14908ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "- 1.2.3\n"
14916919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko            "...\n",
1492cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            /*Ctxt=*/nullptr,
14936919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko            suppressErrorMessages);
14948ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  yin >> seq;
14958ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
1496cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(!!yin.error());
14978ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
14988ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
14998ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//
15008ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik// Test error handling reading built-in float type
15018ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//
15028ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick KledzikLLVM_YAML_IS_SEQUENCE_VECTOR(double)
15038ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick KledzikTEST(YAMLIO, TestReadBuiltInTypesDoubleError) {
15048ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  std::vector<double> seq;
15058ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  Input yin("---\n"
15068ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "- 0.0\n"
15078ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "- 1000.1\n"
15088ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "- -123.456\n"
15098ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "- 1.2.3\n"
15106919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko            "...\n",
1511cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            /*Ctxt=*/nullptr,
15126919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko            suppressErrorMessages);
15138ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  yin >> seq;
15148ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
1515cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(!!yin.error());
15168ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
15178ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
15188ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//
15198ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik// Test error handling reading built-in Hex8 type
15208ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//
15218ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick KledzikLLVM_YAML_IS_SEQUENCE_VECTOR(Hex8)
15228ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick KledzikTEST(YAMLIO, TestReadBuiltInTypesHex8Error) {
15238ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  std::vector<Hex8> seq;
15248ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  Input yin("---\n"
15258ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "- 0x12\n"
15268ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "- 0xFE\n"
15278ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "- 0x123\n"
15286919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko            "...\n",
1529cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            /*Ctxt=*/nullptr,
15306919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko            suppressErrorMessages);
15318ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  yin >> seq;
15328ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
1533cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(!!yin.error());
15348ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
15358ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
15368ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
15378ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//
15388ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik// Test error handling reading built-in Hex16 type
15398ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//
15408ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick KledzikLLVM_YAML_IS_SEQUENCE_VECTOR(Hex16)
15418ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick KledzikTEST(YAMLIO, TestReadBuiltInTypesHex16Error) {
15428ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  std::vector<Hex16> seq;
15438ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  Input yin("---\n"
15448ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "- 0x0012\n"
15458ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "- 0xFEFF\n"
15468ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "- 0x12345\n"
15476919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko            "...\n",
1548cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            /*Ctxt=*/nullptr,
15496919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko            suppressErrorMessages);
15508ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  yin >> seq;
15518ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
1552cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(!!yin.error());
15538ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
15548ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
15558ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//
15568ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik// Test error handling reading built-in Hex32 type
15578ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//
15588ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick KledzikLLVM_YAML_IS_SEQUENCE_VECTOR(Hex32)
15598ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick KledzikTEST(YAMLIO, TestReadBuiltInTypesHex32Error) {
15608ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  std::vector<Hex32> seq;
15618ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  Input yin("---\n"
15628ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "- 0x0012\n"
15638ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "- 0xFEFF0000\n"
15648ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "- 0x1234556789\n"
15656919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko            "...\n",
1566cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            /*Ctxt=*/nullptr,
15676919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko            suppressErrorMessages);
15688ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  yin >> seq;
15698ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
1570cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(!!yin.error());
15718ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
15728ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
15738ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//
15748ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik// Test error handling reading built-in Hex64 type
15758ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//
15768ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick KledzikLLVM_YAML_IS_SEQUENCE_VECTOR(Hex64)
15778ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick KledzikTEST(YAMLIO, TestReadBuiltInTypesHex64Error) {
15788ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  std::vector<Hex64> seq;
15798ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  Input yin("---\n"
15808ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "- 0x0012\n"
15818ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "- 0xFFEEDDCCBBAA9988\n"
15828ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik            "- 0x12345567890ABCDEF0\n"
15836919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko            "...\n",
1584cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            /*Ctxt=*/nullptr,
15856919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko            suppressErrorMessages);
15868ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  yin >> seq;
15878ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
1588cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(!!yin.error());
15898ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
15908ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
15916919bec07f9c4ee57a0e99f263b63546b386f22bAlexander KornienkoTEST(YAMLIO, TestMalformedMapFailsGracefully) {
15926919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko  FooBar doc;
15936919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko  {
15946919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko    // We pass the suppressErrorMessages handler to handle the error
15956919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko    // message generated in the constructor of Input.
1596cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    Input yin("{foo:3, bar: 5}", /*Ctxt=*/nullptr, suppressErrorMessages);
15976919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko    yin >> doc;
1598cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    EXPECT_TRUE(!!yin.error());
15996919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko  }
16006919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko
16016919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko  {
1602cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    Input yin("---\nfoo:3\nbar: 5\n...\n", /*Ctxt=*/nullptr, suppressErrorMessages);
16036919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko    yin >> doc;
1604cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    EXPECT_TRUE(!!yin.error());
16056919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko  }
16066919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko}
16076919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko
1608d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballmanstruct OptionalTest {
1609d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballman  std::vector<int> Numbers;
1610d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballman};
1611d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballman
1612d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballmanstruct OptionalTestSeq {
1613d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballman  std::vector<OptionalTest> Tests;
1614d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballman};
1615d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballman
161610ec62d2d2d6a6e4a68faf77d1c4058e40ed83f8Aaron BallmanLLVM_YAML_IS_SEQUENCE_VECTOR(OptionalTest)
1617d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballmannamespace llvm {
1618d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballmannamespace yaml {
1619d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballman  template <>
1620d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballman  struct MappingTraits<OptionalTest> {
1621d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballman    static void mapping(IO& IO, OptionalTest &OT) {
1622d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballman      IO.mapOptional("Numbers", OT.Numbers);
1623d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballman    }
1624d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballman  };
1625d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballman
1626d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballman  template <>
1627d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballman  struct MappingTraits<OptionalTestSeq> {
1628d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballman    static void mapping(IO &IO, OptionalTestSeq &OTS) {
1629d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballman      IO.mapOptional("Tests", OTS.Tests);
1630d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballman    }
1631d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballman  };
1632d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballman}
1633d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballman}
1634d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballman
1635d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron BallmanTEST(YAMLIO, SequenceElideTest) {
1636d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballman  // Test that writing out a purely optional structure with its fields set to
1637d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballman  // default followed by other data is properly read back in.
1638d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballman  OptionalTestSeq Seq;
1639d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballman  OptionalTest One, Two, Three, Four;
1640d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballman  int N[] = {1, 2, 3};
1641d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballman  Three.Numbers.assign(N, N + 3);
1642d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballman  Seq.Tests.push_back(One);
1643d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballman  Seq.Tests.push_back(Two);
1644d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballman  Seq.Tests.push_back(Three);
1645d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballman  Seq.Tests.push_back(Four);
1646d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballman
1647d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballman  std::string intermediate;
1648d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballman  {
1649d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballman    llvm::raw_string_ostream ostr(intermediate);
1650d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballman    Output yout(ostr);
1651d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballman    yout << Seq;
1652d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballman  }
1653d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballman
1654d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballman  Input yin(intermediate);
1655d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballman  OptionalTestSeq Seq2;
1656d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballman  yin >> Seq2;
1657e9cf283e081cb68f0276aa4b893f290b9c26a0c7Rui Ueyama
1658d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballman  EXPECT_FALSE(yin.error());
1659d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballman
1660d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballman  EXPECT_EQ(4UL, Seq2.Tests.size());
1661d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballman
1662d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballman  EXPECT_TRUE(Seq2.Tests[0].Numbers.empty());
1663d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballman  EXPECT_TRUE(Seq2.Tests[1].Numbers.empty());
1664d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballman
1665d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballman  EXPECT_EQ(1, Seq2.Tests[2].Numbers[0]);
1666d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballman  EXPECT_EQ(2, Seq2.Tests[2].Numbers[1]);
1667d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballman  EXPECT_EQ(3, Seq2.Tests[2].Numbers[2]);
1668d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballman
1669d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballman  EXPECT_TRUE(Seq2.Tests[3].Numbers.empty());
1670d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballman}
16716919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko
16726919bec07f9c4ee57a0e99f263b63546b386f22bAlexander KornienkoTEST(YAMLIO, TestEmptyStringFailsForMapWithRequiredFields) {
16736919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko  FooBar doc;
16746919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko  Input yin("");
16756919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko  yin >> doc;
1676cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(!!yin.error());
16776919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko}
16786919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko
16796919bec07f9c4ee57a0e99f263b63546b386f22bAlexander KornienkoTEST(YAMLIO, TestEmptyStringSucceedsForMapWithOptionalFields) {
16806919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko  OptionalTest doc;
16816919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko  Input yin("");
16826919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko  yin >> doc;
16836919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko  EXPECT_FALSE(yin.error());
16846919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko}
16856919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko
16866919bec07f9c4ee57a0e99f263b63546b386f22bAlexander KornienkoTEST(YAMLIO, TestEmptyStringSucceedsForSequence) {
16876919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko  std::vector<uint8_t> seq;
1688cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  Input yin("", /*Ctxt=*/nullptr, suppressErrorMessages);
16896919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko  yin >> seq;
16906919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko
16916919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko  EXPECT_FALSE(yin.error());
16926919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko  EXPECT_TRUE(seq.empty());
16936919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko}
1694