1*9880d681SAndroid Build Coastguard Worker //===- unittest/Support/YAMLIOTest.cpp ------------------------------------===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker
10*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/Twine.h"
11*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/Casting.h"
12*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/Endian.h"
13*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/Format.h"
14*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/YAMLTraits.h"
15*9880d681SAndroid Build Coastguard Worker #include "gtest/gtest.h"
16*9880d681SAndroid Build Coastguard Worker
17*9880d681SAndroid Build Coastguard Worker
18*9880d681SAndroid Build Coastguard Worker using llvm::yaml::Input;
19*9880d681SAndroid Build Coastguard Worker using llvm::yaml::Output;
20*9880d681SAndroid Build Coastguard Worker using llvm::yaml::IO;
21*9880d681SAndroid Build Coastguard Worker using llvm::yaml::MappingTraits;
22*9880d681SAndroid Build Coastguard Worker using llvm::yaml::MappingNormalization;
23*9880d681SAndroid Build Coastguard Worker using llvm::yaml::ScalarTraits;
24*9880d681SAndroid Build Coastguard Worker using llvm::yaml::Hex8;
25*9880d681SAndroid Build Coastguard Worker using llvm::yaml::Hex16;
26*9880d681SAndroid Build Coastguard Worker using llvm::yaml::Hex32;
27*9880d681SAndroid Build Coastguard Worker using llvm::yaml::Hex64;
28*9880d681SAndroid Build Coastguard Worker
29*9880d681SAndroid Build Coastguard Worker
30*9880d681SAndroid Build Coastguard Worker
31*9880d681SAndroid Build Coastguard Worker
suppressErrorMessages(const llvm::SMDiagnostic &,void *)32*9880d681SAndroid Build Coastguard Worker static void suppressErrorMessages(const llvm::SMDiagnostic &, void *) {
33*9880d681SAndroid Build Coastguard Worker }
34*9880d681SAndroid Build Coastguard Worker
35*9880d681SAndroid Build Coastguard Worker
36*9880d681SAndroid Build Coastguard Worker
37*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
38*9880d681SAndroid Build Coastguard Worker // Test MappingTraits
39*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
40*9880d681SAndroid Build Coastguard Worker
41*9880d681SAndroid Build Coastguard Worker struct FooBar {
42*9880d681SAndroid Build Coastguard Worker int foo;
43*9880d681SAndroid Build Coastguard Worker int bar;
44*9880d681SAndroid Build Coastguard Worker };
45*9880d681SAndroid Build Coastguard Worker typedef std::vector<FooBar> FooBarSequence;
46*9880d681SAndroid Build Coastguard Worker
47*9880d681SAndroid Build Coastguard Worker LLVM_YAML_IS_SEQUENCE_VECTOR(FooBar)
48*9880d681SAndroid Build Coastguard Worker
49*9880d681SAndroid Build Coastguard Worker struct FooBarContainer {
50*9880d681SAndroid Build Coastguard Worker FooBarSequence fbs;
51*9880d681SAndroid Build Coastguard Worker };
52*9880d681SAndroid Build Coastguard Worker
53*9880d681SAndroid Build Coastguard Worker namespace llvm {
54*9880d681SAndroid Build Coastguard Worker namespace yaml {
55*9880d681SAndroid Build Coastguard Worker template <>
56*9880d681SAndroid Build Coastguard Worker struct MappingTraits<FooBar> {
mappingllvm::yaml::MappingTraits57*9880d681SAndroid Build Coastguard Worker static void mapping(IO &io, FooBar& fb) {
58*9880d681SAndroid Build Coastguard Worker io.mapRequired("foo", fb.foo);
59*9880d681SAndroid Build Coastguard Worker io.mapRequired("bar", fb.bar);
60*9880d681SAndroid Build Coastguard Worker }
61*9880d681SAndroid Build Coastguard Worker };
62*9880d681SAndroid Build Coastguard Worker
63*9880d681SAndroid Build Coastguard Worker template <> struct MappingTraits<FooBarContainer> {
mappingllvm::yaml::MappingTraits64*9880d681SAndroid Build Coastguard Worker static void mapping(IO &io, FooBarContainer &fb) {
65*9880d681SAndroid Build Coastguard Worker io.mapRequired("fbs", fb.fbs);
66*9880d681SAndroid Build Coastguard Worker }
67*9880d681SAndroid Build Coastguard Worker };
68*9880d681SAndroid Build Coastguard Worker }
69*9880d681SAndroid Build Coastguard Worker }
70*9880d681SAndroid Build Coastguard Worker
71*9880d681SAndroid Build Coastguard Worker
72*9880d681SAndroid Build Coastguard Worker //
73*9880d681SAndroid Build Coastguard Worker // Test the reading of a yaml mapping
74*9880d681SAndroid Build Coastguard Worker //
TEST(YAMLIO,TestMapRead)75*9880d681SAndroid Build Coastguard Worker TEST(YAMLIO, TestMapRead) {
76*9880d681SAndroid Build Coastguard Worker FooBar doc;
77*9880d681SAndroid Build Coastguard Worker {
78*9880d681SAndroid Build Coastguard Worker Input yin("---\nfoo: 3\nbar: 5\n...\n");
79*9880d681SAndroid Build Coastguard Worker yin >> doc;
80*9880d681SAndroid Build Coastguard Worker
81*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(yin.error());
82*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(doc.foo, 3);
83*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(doc.bar, 5);
84*9880d681SAndroid Build Coastguard Worker }
85*9880d681SAndroid Build Coastguard Worker
86*9880d681SAndroid Build Coastguard Worker {
87*9880d681SAndroid Build Coastguard Worker Input yin("{foo: 3, bar: 5}");
88*9880d681SAndroid Build Coastguard Worker yin >> doc;
89*9880d681SAndroid Build Coastguard Worker
90*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(yin.error());
91*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(doc.foo, 3);
92*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(doc.bar, 5);
93*9880d681SAndroid Build Coastguard Worker }
94*9880d681SAndroid Build Coastguard Worker }
95*9880d681SAndroid Build Coastguard Worker
TEST(YAMLIO,TestMalformedMapRead)96*9880d681SAndroid Build Coastguard Worker TEST(YAMLIO, TestMalformedMapRead) {
97*9880d681SAndroid Build Coastguard Worker FooBar doc;
98*9880d681SAndroid Build Coastguard Worker Input yin("{foo: 3; bar: 5}", nullptr, suppressErrorMessages);
99*9880d681SAndroid Build Coastguard Worker yin >> doc;
100*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(!!yin.error());
101*9880d681SAndroid Build Coastguard Worker }
102*9880d681SAndroid Build Coastguard Worker
103*9880d681SAndroid Build Coastguard Worker //
104*9880d681SAndroid Build Coastguard Worker // Test the reading of a yaml sequence of mappings
105*9880d681SAndroid Build Coastguard Worker //
TEST(YAMLIO,TestSequenceMapRead)106*9880d681SAndroid Build Coastguard Worker TEST(YAMLIO, TestSequenceMapRead) {
107*9880d681SAndroid Build Coastguard Worker FooBarSequence seq;
108*9880d681SAndroid Build Coastguard Worker Input yin("---\n - foo: 3\n bar: 5\n - foo: 7\n bar: 9\n...\n");
109*9880d681SAndroid Build Coastguard Worker yin >> seq;
110*9880d681SAndroid Build Coastguard Worker
111*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(yin.error());
112*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(seq.size(), 2UL);
113*9880d681SAndroid Build Coastguard Worker FooBar& map1 = seq[0];
114*9880d681SAndroid Build Coastguard Worker FooBar& map2 = seq[1];
115*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(map1.foo, 3);
116*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(map1.bar, 5);
117*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(map2.foo, 7);
118*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(map2.bar, 9);
119*9880d681SAndroid Build Coastguard Worker }
120*9880d681SAndroid Build Coastguard Worker
121*9880d681SAndroid Build Coastguard Worker //
122*9880d681SAndroid Build Coastguard Worker // Test the reading of a map containing a yaml sequence of mappings
123*9880d681SAndroid Build Coastguard Worker //
TEST(YAMLIO,TestContainerSequenceMapRead)124*9880d681SAndroid Build Coastguard Worker TEST(YAMLIO, TestContainerSequenceMapRead) {
125*9880d681SAndroid Build Coastguard Worker {
126*9880d681SAndroid Build Coastguard Worker FooBarContainer cont;
127*9880d681SAndroid Build Coastguard Worker Input yin2("---\nfbs:\n - foo: 3\n bar: 5\n - foo: 7\n bar: 9\n...\n");
128*9880d681SAndroid Build Coastguard Worker yin2 >> cont;
129*9880d681SAndroid Build Coastguard Worker
130*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(yin2.error());
131*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(cont.fbs.size(), 2UL);
132*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(cont.fbs[0].foo, 3);
133*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(cont.fbs[0].bar, 5);
134*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(cont.fbs[1].foo, 7);
135*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(cont.fbs[1].bar, 9);
136*9880d681SAndroid Build Coastguard Worker }
137*9880d681SAndroid Build Coastguard Worker
138*9880d681SAndroid Build Coastguard Worker {
139*9880d681SAndroid Build Coastguard Worker FooBarContainer cont;
140*9880d681SAndroid Build Coastguard Worker Input yin("---\nfbs:\n...\n");
141*9880d681SAndroid Build Coastguard Worker yin >> cont;
142*9880d681SAndroid Build Coastguard Worker // Okay: Empty node represents an empty array.
143*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(yin.error());
144*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(cont.fbs.size(), 0UL);
145*9880d681SAndroid Build Coastguard Worker }
146*9880d681SAndroid Build Coastguard Worker
147*9880d681SAndroid Build Coastguard Worker {
148*9880d681SAndroid Build Coastguard Worker FooBarContainer cont;
149*9880d681SAndroid Build Coastguard Worker Input yin("---\nfbs: !!null null\n...\n");
150*9880d681SAndroid Build Coastguard Worker yin >> cont;
151*9880d681SAndroid Build Coastguard Worker // Okay: null represents an empty array.
152*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(yin.error());
153*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(cont.fbs.size(), 0UL);
154*9880d681SAndroid Build Coastguard Worker }
155*9880d681SAndroid Build Coastguard Worker
156*9880d681SAndroid Build Coastguard Worker {
157*9880d681SAndroid Build Coastguard Worker FooBarContainer cont;
158*9880d681SAndroid Build Coastguard Worker Input yin("---\nfbs: ~\n...\n");
159*9880d681SAndroid Build Coastguard Worker yin >> cont;
160*9880d681SAndroid Build Coastguard Worker // Okay: null represents an empty array.
161*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(yin.error());
162*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(cont.fbs.size(), 0UL);
163*9880d681SAndroid Build Coastguard Worker }
164*9880d681SAndroid Build Coastguard Worker
165*9880d681SAndroid Build Coastguard Worker {
166*9880d681SAndroid Build Coastguard Worker FooBarContainer cont;
167*9880d681SAndroid Build Coastguard Worker Input yin("---\nfbs: null\n...\n");
168*9880d681SAndroid Build Coastguard Worker yin >> cont;
169*9880d681SAndroid Build Coastguard Worker // Okay: null represents an empty array.
170*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(yin.error());
171*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(cont.fbs.size(), 0UL);
172*9880d681SAndroid Build Coastguard Worker }
173*9880d681SAndroid Build Coastguard Worker }
174*9880d681SAndroid Build Coastguard Worker
175*9880d681SAndroid Build Coastguard Worker //
176*9880d681SAndroid Build Coastguard Worker // Test the reading of a map containing a malformed yaml sequence
177*9880d681SAndroid Build Coastguard Worker //
TEST(YAMLIO,TestMalformedContainerSequenceMapRead)178*9880d681SAndroid Build Coastguard Worker TEST(YAMLIO, TestMalformedContainerSequenceMapRead) {
179*9880d681SAndroid Build Coastguard Worker {
180*9880d681SAndroid Build Coastguard Worker FooBarContainer cont;
181*9880d681SAndroid Build Coastguard Worker Input yin("---\nfbs:\n foo: 3\n bar: 5\n...\n", nullptr,
182*9880d681SAndroid Build Coastguard Worker suppressErrorMessages);
183*9880d681SAndroid Build Coastguard Worker yin >> cont;
184*9880d681SAndroid Build Coastguard Worker // Error: fbs is not a sequence.
185*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(!!yin.error());
186*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(cont.fbs.size(), 0UL);
187*9880d681SAndroid Build Coastguard Worker }
188*9880d681SAndroid Build Coastguard Worker
189*9880d681SAndroid Build Coastguard Worker {
190*9880d681SAndroid Build Coastguard Worker FooBarContainer cont;
191*9880d681SAndroid Build Coastguard Worker Input yin("---\nfbs: 'scalar'\n...\n", nullptr, suppressErrorMessages);
192*9880d681SAndroid Build Coastguard Worker yin >> cont;
193*9880d681SAndroid Build Coastguard Worker // This should be an error.
194*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(!!yin.error());
195*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(cont.fbs.size(), 0UL);
196*9880d681SAndroid Build Coastguard Worker }
197*9880d681SAndroid Build Coastguard Worker }
198*9880d681SAndroid Build Coastguard Worker
199*9880d681SAndroid Build Coastguard Worker //
200*9880d681SAndroid Build Coastguard Worker // Test writing then reading back a sequence of mappings
201*9880d681SAndroid Build Coastguard Worker //
TEST(YAMLIO,TestSequenceMapWriteAndRead)202*9880d681SAndroid Build Coastguard Worker TEST(YAMLIO, TestSequenceMapWriteAndRead) {
203*9880d681SAndroid Build Coastguard Worker std::string intermediate;
204*9880d681SAndroid Build Coastguard Worker {
205*9880d681SAndroid Build Coastguard Worker FooBar entry1;
206*9880d681SAndroid Build Coastguard Worker entry1.foo = 10;
207*9880d681SAndroid Build Coastguard Worker entry1.bar = -3;
208*9880d681SAndroid Build Coastguard Worker FooBar entry2;
209*9880d681SAndroid Build Coastguard Worker entry2.foo = 257;
210*9880d681SAndroid Build Coastguard Worker entry2.bar = 0;
211*9880d681SAndroid Build Coastguard Worker FooBarSequence seq;
212*9880d681SAndroid Build Coastguard Worker seq.push_back(entry1);
213*9880d681SAndroid Build Coastguard Worker seq.push_back(entry2);
214*9880d681SAndroid Build Coastguard Worker
215*9880d681SAndroid Build Coastguard Worker llvm::raw_string_ostream ostr(intermediate);
216*9880d681SAndroid Build Coastguard Worker Output yout(ostr);
217*9880d681SAndroid Build Coastguard Worker yout << seq;
218*9880d681SAndroid Build Coastguard Worker }
219*9880d681SAndroid Build Coastguard Worker
220*9880d681SAndroid Build Coastguard Worker {
221*9880d681SAndroid Build Coastguard Worker Input yin(intermediate);
222*9880d681SAndroid Build Coastguard Worker FooBarSequence seq2;
223*9880d681SAndroid Build Coastguard Worker yin >> seq2;
224*9880d681SAndroid Build Coastguard Worker
225*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(yin.error());
226*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(seq2.size(), 2UL);
227*9880d681SAndroid Build Coastguard Worker FooBar& map1 = seq2[0];
228*9880d681SAndroid Build Coastguard Worker FooBar& map2 = seq2[1];
229*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(map1.foo, 10);
230*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(map1.bar, -3);
231*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(map2.foo, 257);
232*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(map2.bar, 0);
233*9880d681SAndroid Build Coastguard Worker }
234*9880d681SAndroid Build Coastguard Worker }
235*9880d681SAndroid Build Coastguard Worker
236*9880d681SAndroid Build Coastguard Worker
237*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
238*9880d681SAndroid Build Coastguard Worker // Test built-in types
239*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
240*9880d681SAndroid Build Coastguard Worker
241*9880d681SAndroid Build Coastguard Worker struct BuiltInTypes {
242*9880d681SAndroid Build Coastguard Worker llvm::StringRef str;
243*9880d681SAndroid Build Coastguard Worker std::string stdstr;
244*9880d681SAndroid Build Coastguard Worker uint64_t u64;
245*9880d681SAndroid Build Coastguard Worker uint32_t u32;
246*9880d681SAndroid Build Coastguard Worker uint16_t u16;
247*9880d681SAndroid Build Coastguard Worker uint8_t u8;
248*9880d681SAndroid Build Coastguard Worker bool b;
249*9880d681SAndroid Build Coastguard Worker int64_t s64;
250*9880d681SAndroid Build Coastguard Worker int32_t s32;
251*9880d681SAndroid Build Coastguard Worker int16_t s16;
252*9880d681SAndroid Build Coastguard Worker int8_t s8;
253*9880d681SAndroid Build Coastguard Worker float f;
254*9880d681SAndroid Build Coastguard Worker double d;
255*9880d681SAndroid Build Coastguard Worker Hex8 h8;
256*9880d681SAndroid Build Coastguard Worker Hex16 h16;
257*9880d681SAndroid Build Coastguard Worker Hex32 h32;
258*9880d681SAndroid Build Coastguard Worker Hex64 h64;
259*9880d681SAndroid Build Coastguard Worker };
260*9880d681SAndroid Build Coastguard Worker
261*9880d681SAndroid Build Coastguard Worker namespace llvm {
262*9880d681SAndroid Build Coastguard Worker namespace yaml {
263*9880d681SAndroid Build Coastguard Worker template <>
264*9880d681SAndroid Build Coastguard Worker struct MappingTraits<BuiltInTypes> {
mappingllvm::yaml::MappingTraits265*9880d681SAndroid Build Coastguard Worker static void mapping(IO &io, BuiltInTypes& bt) {
266*9880d681SAndroid Build Coastguard Worker io.mapRequired("str", bt.str);
267*9880d681SAndroid Build Coastguard Worker io.mapRequired("stdstr", bt.stdstr);
268*9880d681SAndroid Build Coastguard Worker io.mapRequired("u64", bt.u64);
269*9880d681SAndroid Build Coastguard Worker io.mapRequired("u32", bt.u32);
270*9880d681SAndroid Build Coastguard Worker io.mapRequired("u16", bt.u16);
271*9880d681SAndroid Build Coastguard Worker io.mapRequired("u8", bt.u8);
272*9880d681SAndroid Build Coastguard Worker io.mapRequired("b", bt.b);
273*9880d681SAndroid Build Coastguard Worker io.mapRequired("s64", bt.s64);
274*9880d681SAndroid Build Coastguard Worker io.mapRequired("s32", bt.s32);
275*9880d681SAndroid Build Coastguard Worker io.mapRequired("s16", bt.s16);
276*9880d681SAndroid Build Coastguard Worker io.mapRequired("s8", bt.s8);
277*9880d681SAndroid Build Coastguard Worker io.mapRequired("f", bt.f);
278*9880d681SAndroid Build Coastguard Worker io.mapRequired("d", bt.d);
279*9880d681SAndroid Build Coastguard Worker io.mapRequired("h8", bt.h8);
280*9880d681SAndroid Build Coastguard Worker io.mapRequired("h16", bt.h16);
281*9880d681SAndroid Build Coastguard Worker io.mapRequired("h32", bt.h32);
282*9880d681SAndroid Build Coastguard Worker io.mapRequired("h64", bt.h64);
283*9880d681SAndroid Build Coastguard Worker }
284*9880d681SAndroid Build Coastguard Worker };
285*9880d681SAndroid Build Coastguard Worker }
286*9880d681SAndroid Build Coastguard Worker }
287*9880d681SAndroid Build Coastguard Worker
288*9880d681SAndroid Build Coastguard Worker
289*9880d681SAndroid Build Coastguard Worker //
290*9880d681SAndroid Build Coastguard Worker // Test the reading of all built-in scalar conversions
291*9880d681SAndroid Build Coastguard Worker //
TEST(YAMLIO,TestReadBuiltInTypes)292*9880d681SAndroid Build Coastguard Worker TEST(YAMLIO, TestReadBuiltInTypes) {
293*9880d681SAndroid Build Coastguard Worker BuiltInTypes map;
294*9880d681SAndroid Build Coastguard Worker Input yin("---\n"
295*9880d681SAndroid Build Coastguard Worker "str: hello there\n"
296*9880d681SAndroid Build Coastguard Worker "stdstr: hello where?\n"
297*9880d681SAndroid Build Coastguard Worker "u64: 5000000000\n"
298*9880d681SAndroid Build Coastguard Worker "u32: 4000000000\n"
299*9880d681SAndroid Build Coastguard Worker "u16: 65000\n"
300*9880d681SAndroid Build Coastguard Worker "u8: 255\n"
301*9880d681SAndroid Build Coastguard Worker "b: false\n"
302*9880d681SAndroid Build Coastguard Worker "s64: -5000000000\n"
303*9880d681SAndroid Build Coastguard Worker "s32: -2000000000\n"
304*9880d681SAndroid Build Coastguard Worker "s16: -32000\n"
305*9880d681SAndroid Build Coastguard Worker "s8: -127\n"
306*9880d681SAndroid Build Coastguard Worker "f: 137.125\n"
307*9880d681SAndroid Build Coastguard Worker "d: -2.8625\n"
308*9880d681SAndroid Build Coastguard Worker "h8: 0xFF\n"
309*9880d681SAndroid Build Coastguard Worker "h16: 0x8765\n"
310*9880d681SAndroid Build Coastguard Worker "h32: 0xFEDCBA98\n"
311*9880d681SAndroid Build Coastguard Worker "h64: 0xFEDCBA9876543210\n"
312*9880d681SAndroid Build Coastguard Worker "...\n");
313*9880d681SAndroid Build Coastguard Worker yin >> map;
314*9880d681SAndroid Build Coastguard Worker
315*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(yin.error());
316*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(map.str.equals("hello there"));
317*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(map.stdstr == "hello where?");
318*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(map.u64, 5000000000ULL);
319*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(map.u32, 4000000000U);
320*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(map.u16, 65000);
321*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(map.u8, 255);
322*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(map.b, false);
323*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(map.s64, -5000000000LL);
324*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(map.s32, -2000000000L);
325*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(map.s16, -32000);
326*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(map.s8, -127);
327*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(map.f, 137.125);
328*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(map.d, -2.8625);
329*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(map.h8, Hex8(255));
330*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(map.h16, Hex16(0x8765));
331*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(map.h32, Hex32(0xFEDCBA98));
332*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(map.h64, Hex64(0xFEDCBA9876543210LL));
333*9880d681SAndroid Build Coastguard Worker }
334*9880d681SAndroid Build Coastguard Worker
335*9880d681SAndroid Build Coastguard Worker
336*9880d681SAndroid Build Coastguard Worker //
337*9880d681SAndroid Build Coastguard Worker // Test writing then reading back all built-in scalar types
338*9880d681SAndroid Build Coastguard Worker //
TEST(YAMLIO,TestReadWriteBuiltInTypes)339*9880d681SAndroid Build Coastguard Worker TEST(YAMLIO, TestReadWriteBuiltInTypes) {
340*9880d681SAndroid Build Coastguard Worker std::string intermediate;
341*9880d681SAndroid Build Coastguard Worker {
342*9880d681SAndroid Build Coastguard Worker BuiltInTypes map;
343*9880d681SAndroid Build Coastguard Worker map.str = "one two";
344*9880d681SAndroid Build Coastguard Worker map.stdstr = "three four";
345*9880d681SAndroid Build Coastguard Worker map.u64 = 6000000000ULL;
346*9880d681SAndroid Build Coastguard Worker map.u32 = 3000000000U;
347*9880d681SAndroid Build Coastguard Worker map.u16 = 50000;
348*9880d681SAndroid Build Coastguard Worker map.u8 = 254;
349*9880d681SAndroid Build Coastguard Worker map.b = true;
350*9880d681SAndroid Build Coastguard Worker map.s64 = -6000000000LL;
351*9880d681SAndroid Build Coastguard Worker map.s32 = -2000000000;
352*9880d681SAndroid Build Coastguard Worker map.s16 = -32000;
353*9880d681SAndroid Build Coastguard Worker map.s8 = -128;
354*9880d681SAndroid Build Coastguard Worker map.f = 3.25;
355*9880d681SAndroid Build Coastguard Worker map.d = -2.8625;
356*9880d681SAndroid Build Coastguard Worker map.h8 = 254;
357*9880d681SAndroid Build Coastguard Worker map.h16 = 50000;
358*9880d681SAndroid Build Coastguard Worker map.h32 = 3000000000U;
359*9880d681SAndroid Build Coastguard Worker map.h64 = 6000000000LL;
360*9880d681SAndroid Build Coastguard Worker
361*9880d681SAndroid Build Coastguard Worker llvm::raw_string_ostream ostr(intermediate);
362*9880d681SAndroid Build Coastguard Worker Output yout(ostr);
363*9880d681SAndroid Build Coastguard Worker yout << map;
364*9880d681SAndroid Build Coastguard Worker }
365*9880d681SAndroid Build Coastguard Worker
366*9880d681SAndroid Build Coastguard Worker {
367*9880d681SAndroid Build Coastguard Worker Input yin(intermediate);
368*9880d681SAndroid Build Coastguard Worker BuiltInTypes map;
369*9880d681SAndroid Build Coastguard Worker yin >> map;
370*9880d681SAndroid Build Coastguard Worker
371*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(yin.error());
372*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(map.str.equals("one two"));
373*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(map.stdstr == "three four");
374*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(map.u64, 6000000000ULL);
375*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(map.u32, 3000000000U);
376*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(map.u16, 50000);
377*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(map.u8, 254);
378*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(map.b, true);
379*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(map.s64, -6000000000LL);
380*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(map.s32, -2000000000L);
381*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(map.s16, -32000);
382*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(map.s8, -128);
383*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(map.f, 3.25);
384*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(map.d, -2.8625);
385*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(map.h8, Hex8(254));
386*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(map.h16, Hex16(50000));
387*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(map.h32, Hex32(3000000000U));
388*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(map.h64, Hex64(6000000000LL));
389*9880d681SAndroid Build Coastguard Worker }
390*9880d681SAndroid Build Coastguard Worker }
391*9880d681SAndroid Build Coastguard Worker
392*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
393*9880d681SAndroid Build Coastguard Worker // Test endian-aware types
394*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
395*9880d681SAndroid Build Coastguard Worker
396*9880d681SAndroid Build Coastguard Worker struct EndianTypes {
397*9880d681SAndroid Build Coastguard Worker typedef llvm::support::detail::packed_endian_specific_integral<
398*9880d681SAndroid Build Coastguard Worker float, llvm::support::little, llvm::support::unaligned>
399*9880d681SAndroid Build Coastguard Worker ulittle_float;
400*9880d681SAndroid Build Coastguard Worker typedef llvm::support::detail::packed_endian_specific_integral<
401*9880d681SAndroid Build Coastguard Worker double, llvm::support::little, llvm::support::unaligned>
402*9880d681SAndroid Build Coastguard Worker ulittle_double;
403*9880d681SAndroid Build Coastguard Worker
404*9880d681SAndroid Build Coastguard Worker llvm::support::ulittle64_t u64;
405*9880d681SAndroid Build Coastguard Worker llvm::support::ulittle32_t u32;
406*9880d681SAndroid Build Coastguard Worker llvm::support::ulittle16_t u16;
407*9880d681SAndroid Build Coastguard Worker llvm::support::little64_t s64;
408*9880d681SAndroid Build Coastguard Worker llvm::support::little32_t s32;
409*9880d681SAndroid Build Coastguard Worker llvm::support::little16_t s16;
410*9880d681SAndroid Build Coastguard Worker ulittle_float f;
411*9880d681SAndroid Build Coastguard Worker ulittle_double d;
412*9880d681SAndroid Build Coastguard Worker };
413*9880d681SAndroid Build Coastguard Worker
414*9880d681SAndroid Build Coastguard Worker namespace llvm {
415*9880d681SAndroid Build Coastguard Worker namespace yaml {
416*9880d681SAndroid Build Coastguard Worker template <> struct MappingTraits<EndianTypes> {
mappingllvm::yaml::MappingTraits417*9880d681SAndroid Build Coastguard Worker static void mapping(IO &io, EndianTypes &et) {
418*9880d681SAndroid Build Coastguard Worker io.mapRequired("u64", et.u64);
419*9880d681SAndroid Build Coastguard Worker io.mapRequired("u32", et.u32);
420*9880d681SAndroid Build Coastguard Worker io.mapRequired("u16", et.u16);
421*9880d681SAndroid Build Coastguard Worker io.mapRequired("s64", et.s64);
422*9880d681SAndroid Build Coastguard Worker io.mapRequired("s32", et.s32);
423*9880d681SAndroid Build Coastguard Worker io.mapRequired("s16", et.s16);
424*9880d681SAndroid Build Coastguard Worker io.mapRequired("f", et.f);
425*9880d681SAndroid Build Coastguard Worker io.mapRequired("d", et.d);
426*9880d681SAndroid Build Coastguard Worker }
427*9880d681SAndroid Build Coastguard Worker };
428*9880d681SAndroid Build Coastguard Worker }
429*9880d681SAndroid Build Coastguard Worker }
430*9880d681SAndroid Build Coastguard Worker
431*9880d681SAndroid Build Coastguard Worker //
432*9880d681SAndroid Build Coastguard Worker // Test the reading of all endian scalar conversions
433*9880d681SAndroid Build Coastguard Worker //
TEST(YAMLIO,TestReadEndianTypes)434*9880d681SAndroid Build Coastguard Worker TEST(YAMLIO, TestReadEndianTypes) {
435*9880d681SAndroid Build Coastguard Worker EndianTypes map;
436*9880d681SAndroid Build Coastguard Worker Input yin("---\n"
437*9880d681SAndroid Build Coastguard Worker "u64: 5000000000\n"
438*9880d681SAndroid Build Coastguard Worker "u32: 4000000000\n"
439*9880d681SAndroid Build Coastguard Worker "u16: 65000\n"
440*9880d681SAndroid Build Coastguard Worker "s64: -5000000000\n"
441*9880d681SAndroid Build Coastguard Worker "s32: -2000000000\n"
442*9880d681SAndroid Build Coastguard Worker "s16: -32000\n"
443*9880d681SAndroid Build Coastguard Worker "f: 3.25\n"
444*9880d681SAndroid Build Coastguard Worker "d: -2.8625\n"
445*9880d681SAndroid Build Coastguard Worker "...\n");
446*9880d681SAndroid Build Coastguard Worker yin >> map;
447*9880d681SAndroid Build Coastguard Worker
448*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(yin.error());
449*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(map.u64, 5000000000ULL);
450*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(map.u32, 4000000000U);
451*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(map.u16, 65000);
452*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(map.s64, -5000000000LL);
453*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(map.s32, -2000000000L);
454*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(map.s16, -32000);
455*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(map.f, 3.25f);
456*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(map.d, -2.8625);
457*9880d681SAndroid Build Coastguard Worker }
458*9880d681SAndroid Build Coastguard Worker
459*9880d681SAndroid Build Coastguard Worker //
460*9880d681SAndroid Build Coastguard Worker // Test writing then reading back all endian-aware scalar types
461*9880d681SAndroid Build Coastguard Worker //
TEST(YAMLIO,TestReadWriteEndianTypes)462*9880d681SAndroid Build Coastguard Worker TEST(YAMLIO, TestReadWriteEndianTypes) {
463*9880d681SAndroid Build Coastguard Worker std::string intermediate;
464*9880d681SAndroid Build Coastguard Worker {
465*9880d681SAndroid Build Coastguard Worker EndianTypes map;
466*9880d681SAndroid Build Coastguard Worker map.u64 = 6000000000ULL;
467*9880d681SAndroid Build Coastguard Worker map.u32 = 3000000000U;
468*9880d681SAndroid Build Coastguard Worker map.u16 = 50000;
469*9880d681SAndroid Build Coastguard Worker map.s64 = -6000000000LL;
470*9880d681SAndroid Build Coastguard Worker map.s32 = -2000000000;
471*9880d681SAndroid Build Coastguard Worker map.s16 = -32000;
472*9880d681SAndroid Build Coastguard Worker map.f = 3.25f;
473*9880d681SAndroid Build Coastguard Worker map.d = -2.8625;
474*9880d681SAndroid Build Coastguard Worker
475*9880d681SAndroid Build Coastguard Worker llvm::raw_string_ostream ostr(intermediate);
476*9880d681SAndroid Build Coastguard Worker Output yout(ostr);
477*9880d681SAndroid Build Coastguard Worker yout << map;
478*9880d681SAndroid Build Coastguard Worker }
479*9880d681SAndroid Build Coastguard Worker
480*9880d681SAndroid Build Coastguard Worker {
481*9880d681SAndroid Build Coastguard Worker Input yin(intermediate);
482*9880d681SAndroid Build Coastguard Worker EndianTypes map;
483*9880d681SAndroid Build Coastguard Worker yin >> map;
484*9880d681SAndroid Build Coastguard Worker
485*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(yin.error());
486*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(map.u64, 6000000000ULL);
487*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(map.u32, 3000000000U);
488*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(map.u16, 50000);
489*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(map.s64, -6000000000LL);
490*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(map.s32, -2000000000L);
491*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(map.s16, -32000);
492*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(map.f, 3.25f);
493*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(map.d, -2.8625);
494*9880d681SAndroid Build Coastguard Worker }
495*9880d681SAndroid Build Coastguard Worker }
496*9880d681SAndroid Build Coastguard Worker
497*9880d681SAndroid Build Coastguard Worker struct StringTypes {
498*9880d681SAndroid Build Coastguard Worker llvm::StringRef str1;
499*9880d681SAndroid Build Coastguard Worker llvm::StringRef str2;
500*9880d681SAndroid Build Coastguard Worker llvm::StringRef str3;
501*9880d681SAndroid Build Coastguard Worker llvm::StringRef str4;
502*9880d681SAndroid Build Coastguard Worker llvm::StringRef str5;
503*9880d681SAndroid Build Coastguard Worker llvm::StringRef str6;
504*9880d681SAndroid Build Coastguard Worker llvm::StringRef str7;
505*9880d681SAndroid Build Coastguard Worker llvm::StringRef str8;
506*9880d681SAndroid Build Coastguard Worker llvm::StringRef str9;
507*9880d681SAndroid Build Coastguard Worker llvm::StringRef str10;
508*9880d681SAndroid Build Coastguard Worker llvm::StringRef str11;
509*9880d681SAndroid Build Coastguard Worker std::string stdstr1;
510*9880d681SAndroid Build Coastguard Worker std::string stdstr2;
511*9880d681SAndroid Build Coastguard Worker std::string stdstr3;
512*9880d681SAndroid Build Coastguard Worker std::string stdstr4;
513*9880d681SAndroid Build Coastguard Worker std::string stdstr5;
514*9880d681SAndroid Build Coastguard Worker std::string stdstr6;
515*9880d681SAndroid Build Coastguard Worker std::string stdstr7;
516*9880d681SAndroid Build Coastguard Worker std::string stdstr8;
517*9880d681SAndroid Build Coastguard Worker std::string stdstr9;
518*9880d681SAndroid Build Coastguard Worker std::string stdstr10;
519*9880d681SAndroid Build Coastguard Worker std::string stdstr11;
520*9880d681SAndroid Build Coastguard Worker };
521*9880d681SAndroid Build Coastguard Worker
522*9880d681SAndroid Build Coastguard Worker namespace llvm {
523*9880d681SAndroid Build Coastguard Worker namespace yaml {
524*9880d681SAndroid Build Coastguard Worker template <>
525*9880d681SAndroid Build Coastguard Worker struct MappingTraits<StringTypes> {
mappingllvm::yaml::MappingTraits526*9880d681SAndroid Build Coastguard Worker static void mapping(IO &io, StringTypes& st) {
527*9880d681SAndroid Build Coastguard Worker io.mapRequired("str1", st.str1);
528*9880d681SAndroid Build Coastguard Worker io.mapRequired("str2", st.str2);
529*9880d681SAndroid Build Coastguard Worker io.mapRequired("str3", st.str3);
530*9880d681SAndroid Build Coastguard Worker io.mapRequired("str4", st.str4);
531*9880d681SAndroid Build Coastguard Worker io.mapRequired("str5", st.str5);
532*9880d681SAndroid Build Coastguard Worker io.mapRequired("str6", st.str6);
533*9880d681SAndroid Build Coastguard Worker io.mapRequired("str7", st.str7);
534*9880d681SAndroid Build Coastguard Worker io.mapRequired("str8", st.str8);
535*9880d681SAndroid Build Coastguard Worker io.mapRequired("str9", st.str9);
536*9880d681SAndroid Build Coastguard Worker io.mapRequired("str10", st.str10);
537*9880d681SAndroid Build Coastguard Worker io.mapRequired("str11", st.str11);
538*9880d681SAndroid Build Coastguard Worker io.mapRequired("stdstr1", st.stdstr1);
539*9880d681SAndroid Build Coastguard Worker io.mapRequired("stdstr2", st.stdstr2);
540*9880d681SAndroid Build Coastguard Worker io.mapRequired("stdstr3", st.stdstr3);
541*9880d681SAndroid Build Coastguard Worker io.mapRequired("stdstr4", st.stdstr4);
542*9880d681SAndroid Build Coastguard Worker io.mapRequired("stdstr5", st.stdstr5);
543*9880d681SAndroid Build Coastguard Worker io.mapRequired("stdstr6", st.stdstr6);
544*9880d681SAndroid Build Coastguard Worker io.mapRequired("stdstr7", st.stdstr7);
545*9880d681SAndroid Build Coastguard Worker io.mapRequired("stdstr8", st.stdstr8);
546*9880d681SAndroid Build Coastguard Worker io.mapRequired("stdstr9", st.stdstr9);
547*9880d681SAndroid Build Coastguard Worker io.mapRequired("stdstr10", st.stdstr10);
548*9880d681SAndroid Build Coastguard Worker io.mapRequired("stdstr11", st.stdstr11);
549*9880d681SAndroid Build Coastguard Worker }
550*9880d681SAndroid Build Coastguard Worker };
551*9880d681SAndroid Build Coastguard Worker }
552*9880d681SAndroid Build Coastguard Worker }
553*9880d681SAndroid Build Coastguard Worker
TEST(YAMLIO,TestReadWriteStringTypes)554*9880d681SAndroid Build Coastguard Worker TEST(YAMLIO, TestReadWriteStringTypes) {
555*9880d681SAndroid Build Coastguard Worker std::string intermediate;
556*9880d681SAndroid Build Coastguard Worker {
557*9880d681SAndroid Build Coastguard Worker StringTypes map;
558*9880d681SAndroid Build Coastguard Worker map.str1 = "'aaa";
559*9880d681SAndroid Build Coastguard Worker map.str2 = "\"bbb";
560*9880d681SAndroid Build Coastguard Worker map.str3 = "`ccc";
561*9880d681SAndroid Build Coastguard Worker map.str4 = "@ddd";
562*9880d681SAndroid Build Coastguard Worker map.str5 = "";
563*9880d681SAndroid Build Coastguard Worker map.str6 = "0000000004000000";
564*9880d681SAndroid Build Coastguard Worker map.str7 = "true";
565*9880d681SAndroid Build Coastguard Worker map.str8 = "FALSE";
566*9880d681SAndroid Build Coastguard Worker map.str9 = "~";
567*9880d681SAndroid Build Coastguard Worker map.str10 = "0.2e20";
568*9880d681SAndroid Build Coastguard Worker map.str11 = "0x30";
569*9880d681SAndroid Build Coastguard Worker map.stdstr1 = "'eee";
570*9880d681SAndroid Build Coastguard Worker map.stdstr2 = "\"fff";
571*9880d681SAndroid Build Coastguard Worker map.stdstr3 = "`ggg";
572*9880d681SAndroid Build Coastguard Worker map.stdstr4 = "@hhh";
573*9880d681SAndroid Build Coastguard Worker map.stdstr5 = "";
574*9880d681SAndroid Build Coastguard Worker map.stdstr6 = "0000000004000000";
575*9880d681SAndroid Build Coastguard Worker map.stdstr7 = "true";
576*9880d681SAndroid Build Coastguard Worker map.stdstr8 = "FALSE";
577*9880d681SAndroid Build Coastguard Worker map.stdstr9 = "~";
578*9880d681SAndroid Build Coastguard Worker map.stdstr10 = "0.2e20";
579*9880d681SAndroid Build Coastguard Worker map.stdstr11 = "0x30";
580*9880d681SAndroid Build Coastguard Worker
581*9880d681SAndroid Build Coastguard Worker llvm::raw_string_ostream ostr(intermediate);
582*9880d681SAndroid Build Coastguard Worker Output yout(ostr);
583*9880d681SAndroid Build Coastguard Worker yout << map;
584*9880d681SAndroid Build Coastguard Worker }
585*9880d681SAndroid Build Coastguard Worker
586*9880d681SAndroid Build Coastguard Worker llvm::StringRef flowOut(intermediate);
587*9880d681SAndroid Build Coastguard Worker EXPECT_NE(llvm::StringRef::npos, flowOut.find("'''aaa"));
588*9880d681SAndroid Build Coastguard Worker EXPECT_NE(llvm::StringRef::npos, flowOut.find("'\"bbb'"));
589*9880d681SAndroid Build Coastguard Worker EXPECT_NE(llvm::StringRef::npos, flowOut.find("'`ccc'"));
590*9880d681SAndroid Build Coastguard Worker EXPECT_NE(llvm::StringRef::npos, flowOut.find("'@ddd'"));
591*9880d681SAndroid Build Coastguard Worker EXPECT_NE(llvm::StringRef::npos, flowOut.find("''\n"));
592*9880d681SAndroid Build Coastguard Worker EXPECT_NE(llvm::StringRef::npos, flowOut.find("'0000000004000000'\n"));
593*9880d681SAndroid Build Coastguard Worker EXPECT_NE(llvm::StringRef::npos, flowOut.find("'true'\n"));
594*9880d681SAndroid Build Coastguard Worker EXPECT_NE(llvm::StringRef::npos, flowOut.find("'FALSE'\n"));
595*9880d681SAndroid Build Coastguard Worker EXPECT_NE(llvm::StringRef::npos, flowOut.find("'~'\n"));
596*9880d681SAndroid Build Coastguard Worker EXPECT_NE(llvm::StringRef::npos, flowOut.find("'0.2e20'\n"));
597*9880d681SAndroid Build Coastguard Worker EXPECT_NE(llvm::StringRef::npos, flowOut.find("'0x30'\n"));
598*9880d681SAndroid Build Coastguard Worker EXPECT_NE(std::string::npos, flowOut.find("'''eee"));
599*9880d681SAndroid Build Coastguard Worker EXPECT_NE(std::string::npos, flowOut.find("'\"fff'"));
600*9880d681SAndroid Build Coastguard Worker EXPECT_NE(std::string::npos, flowOut.find("'`ggg'"));
601*9880d681SAndroid Build Coastguard Worker EXPECT_NE(std::string::npos, flowOut.find("'@hhh'"));
602*9880d681SAndroid Build Coastguard Worker EXPECT_NE(std::string::npos, flowOut.find("''\n"));
603*9880d681SAndroid Build Coastguard Worker EXPECT_NE(std::string::npos, flowOut.find("'0000000004000000'\n"));
604*9880d681SAndroid Build Coastguard Worker
605*9880d681SAndroid Build Coastguard Worker {
606*9880d681SAndroid Build Coastguard Worker Input yin(intermediate);
607*9880d681SAndroid Build Coastguard Worker StringTypes map;
608*9880d681SAndroid Build Coastguard Worker yin >> map;
609*9880d681SAndroid Build Coastguard Worker
610*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(yin.error());
611*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(map.str1.equals("'aaa"));
612*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(map.str2.equals("\"bbb"));
613*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(map.str3.equals("`ccc"));
614*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(map.str4.equals("@ddd"));
615*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(map.str5.equals(""));
616*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(map.str6.equals("0000000004000000"));
617*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(map.stdstr1 == "'eee");
618*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(map.stdstr2 == "\"fff");
619*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(map.stdstr3 == "`ggg");
620*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(map.stdstr4 == "@hhh");
621*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(map.stdstr5 == "");
622*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(map.stdstr6 == "0000000004000000");
623*9880d681SAndroid Build Coastguard Worker }
624*9880d681SAndroid Build Coastguard Worker }
625*9880d681SAndroid Build Coastguard Worker
626*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
627*9880d681SAndroid Build Coastguard Worker // Test ScalarEnumerationTraits
628*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
629*9880d681SAndroid Build Coastguard Worker
630*9880d681SAndroid Build Coastguard Worker enum Colors {
631*9880d681SAndroid Build Coastguard Worker cRed,
632*9880d681SAndroid Build Coastguard Worker cBlue,
633*9880d681SAndroid Build Coastguard Worker cGreen,
634*9880d681SAndroid Build Coastguard Worker cYellow
635*9880d681SAndroid Build Coastguard Worker };
636*9880d681SAndroid Build Coastguard Worker
637*9880d681SAndroid Build Coastguard Worker struct ColorMap {
638*9880d681SAndroid Build Coastguard Worker Colors c1;
639*9880d681SAndroid Build Coastguard Worker Colors c2;
640*9880d681SAndroid Build Coastguard Worker Colors c3;
641*9880d681SAndroid Build Coastguard Worker Colors c4;
642*9880d681SAndroid Build Coastguard Worker Colors c5;
643*9880d681SAndroid Build Coastguard Worker Colors c6;
644*9880d681SAndroid Build Coastguard Worker };
645*9880d681SAndroid Build Coastguard Worker
646*9880d681SAndroid Build Coastguard Worker namespace llvm {
647*9880d681SAndroid Build Coastguard Worker namespace yaml {
648*9880d681SAndroid Build Coastguard Worker template <>
649*9880d681SAndroid Build Coastguard Worker struct ScalarEnumerationTraits<Colors> {
enumerationllvm::yaml::ScalarEnumerationTraits650*9880d681SAndroid Build Coastguard Worker static void enumeration(IO &io, Colors &value) {
651*9880d681SAndroid Build Coastguard Worker io.enumCase(value, "red", cRed);
652*9880d681SAndroid Build Coastguard Worker io.enumCase(value, "blue", cBlue);
653*9880d681SAndroid Build Coastguard Worker io.enumCase(value, "green", cGreen);
654*9880d681SAndroid Build Coastguard Worker io.enumCase(value, "yellow",cYellow);
655*9880d681SAndroid Build Coastguard Worker }
656*9880d681SAndroid Build Coastguard Worker };
657*9880d681SAndroid Build Coastguard Worker template <>
658*9880d681SAndroid Build Coastguard Worker struct MappingTraits<ColorMap> {
mappingllvm::yaml::MappingTraits659*9880d681SAndroid Build Coastguard Worker static void mapping(IO &io, ColorMap& c) {
660*9880d681SAndroid Build Coastguard Worker io.mapRequired("c1", c.c1);
661*9880d681SAndroid Build Coastguard Worker io.mapRequired("c2", c.c2);
662*9880d681SAndroid Build Coastguard Worker io.mapRequired("c3", c.c3);
663*9880d681SAndroid Build Coastguard Worker io.mapOptional("c4", c.c4, cBlue); // supplies default
664*9880d681SAndroid Build Coastguard Worker io.mapOptional("c5", c.c5, cYellow); // supplies default
665*9880d681SAndroid Build Coastguard Worker io.mapOptional("c6", c.c6, cRed); // supplies default
666*9880d681SAndroid Build Coastguard Worker }
667*9880d681SAndroid Build Coastguard Worker };
668*9880d681SAndroid Build Coastguard Worker }
669*9880d681SAndroid Build Coastguard Worker }
670*9880d681SAndroid Build Coastguard Worker
671*9880d681SAndroid Build Coastguard Worker
672*9880d681SAndroid Build Coastguard Worker //
673*9880d681SAndroid Build Coastguard Worker // Test reading enumerated scalars
674*9880d681SAndroid Build Coastguard Worker //
TEST(YAMLIO,TestEnumRead)675*9880d681SAndroid Build Coastguard Worker TEST(YAMLIO, TestEnumRead) {
676*9880d681SAndroid Build Coastguard Worker ColorMap map;
677*9880d681SAndroid Build Coastguard Worker Input yin("---\n"
678*9880d681SAndroid Build Coastguard Worker "c1: blue\n"
679*9880d681SAndroid Build Coastguard Worker "c2: red\n"
680*9880d681SAndroid Build Coastguard Worker "c3: green\n"
681*9880d681SAndroid Build Coastguard Worker "c5: yellow\n"
682*9880d681SAndroid Build Coastguard Worker "...\n");
683*9880d681SAndroid Build Coastguard Worker yin >> map;
684*9880d681SAndroid Build Coastguard Worker
685*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(yin.error());
686*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(cBlue, map.c1);
687*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(cRed, map.c2);
688*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(cGreen, map.c3);
689*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(cBlue, map.c4); // tests default
690*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(cYellow,map.c5); // tests overridden
691*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(cRed, map.c6); // tests default
692*9880d681SAndroid Build Coastguard Worker }
693*9880d681SAndroid Build Coastguard Worker
694*9880d681SAndroid Build Coastguard Worker
695*9880d681SAndroid Build Coastguard Worker
696*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
697*9880d681SAndroid Build Coastguard Worker // Test ScalarBitSetTraits
698*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
699*9880d681SAndroid Build Coastguard Worker
700*9880d681SAndroid Build Coastguard Worker enum MyFlags {
701*9880d681SAndroid Build Coastguard Worker flagNone = 0,
702*9880d681SAndroid Build Coastguard Worker flagBig = 1 << 0,
703*9880d681SAndroid Build Coastguard Worker flagFlat = 1 << 1,
704*9880d681SAndroid Build Coastguard Worker flagRound = 1 << 2,
705*9880d681SAndroid Build Coastguard Worker flagPointy = 1 << 3
706*9880d681SAndroid Build Coastguard Worker };
operator |(MyFlags a,MyFlags b)707*9880d681SAndroid Build Coastguard Worker inline MyFlags operator|(MyFlags a, MyFlags b) {
708*9880d681SAndroid Build Coastguard Worker return static_cast<MyFlags>(
709*9880d681SAndroid Build Coastguard Worker static_cast<uint32_t>(a) | static_cast<uint32_t>(b));
710*9880d681SAndroid Build Coastguard Worker }
711*9880d681SAndroid Build Coastguard Worker
712*9880d681SAndroid Build Coastguard Worker struct FlagsMap {
713*9880d681SAndroid Build Coastguard Worker MyFlags f1;
714*9880d681SAndroid Build Coastguard Worker MyFlags f2;
715*9880d681SAndroid Build Coastguard Worker MyFlags f3;
716*9880d681SAndroid Build Coastguard Worker MyFlags f4;
717*9880d681SAndroid Build Coastguard Worker };
718*9880d681SAndroid Build Coastguard Worker
719*9880d681SAndroid Build Coastguard Worker
720*9880d681SAndroid Build Coastguard Worker namespace llvm {
721*9880d681SAndroid Build Coastguard Worker namespace yaml {
722*9880d681SAndroid Build Coastguard Worker template <>
723*9880d681SAndroid Build Coastguard Worker struct ScalarBitSetTraits<MyFlags> {
bitsetllvm::yaml::ScalarBitSetTraits724*9880d681SAndroid Build Coastguard Worker static void bitset(IO &io, MyFlags &value) {
725*9880d681SAndroid Build Coastguard Worker io.bitSetCase(value, "big", flagBig);
726*9880d681SAndroid Build Coastguard Worker io.bitSetCase(value, "flat", flagFlat);
727*9880d681SAndroid Build Coastguard Worker io.bitSetCase(value, "round", flagRound);
728*9880d681SAndroid Build Coastguard Worker io.bitSetCase(value, "pointy",flagPointy);
729*9880d681SAndroid Build Coastguard Worker }
730*9880d681SAndroid Build Coastguard Worker };
731*9880d681SAndroid Build Coastguard Worker template <>
732*9880d681SAndroid Build Coastguard Worker struct MappingTraits<FlagsMap> {
mappingllvm::yaml::MappingTraits733*9880d681SAndroid Build Coastguard Worker static void mapping(IO &io, FlagsMap& c) {
734*9880d681SAndroid Build Coastguard Worker io.mapRequired("f1", c.f1);
735*9880d681SAndroid Build Coastguard Worker io.mapRequired("f2", c.f2);
736*9880d681SAndroid Build Coastguard Worker io.mapRequired("f3", c.f3);
737*9880d681SAndroid Build Coastguard Worker io.mapOptional("f4", c.f4, MyFlags(flagRound));
738*9880d681SAndroid Build Coastguard Worker }
739*9880d681SAndroid Build Coastguard Worker };
740*9880d681SAndroid Build Coastguard Worker }
741*9880d681SAndroid Build Coastguard Worker }
742*9880d681SAndroid Build Coastguard Worker
743*9880d681SAndroid Build Coastguard Worker
744*9880d681SAndroid Build Coastguard Worker //
745*9880d681SAndroid Build Coastguard Worker // Test reading flow sequence representing bit-mask values
746*9880d681SAndroid Build Coastguard Worker //
TEST(YAMLIO,TestFlagsRead)747*9880d681SAndroid Build Coastguard Worker TEST(YAMLIO, TestFlagsRead) {
748*9880d681SAndroid Build Coastguard Worker FlagsMap map;
749*9880d681SAndroid Build Coastguard Worker Input yin("---\n"
750*9880d681SAndroid Build Coastguard Worker "f1: [ big ]\n"
751*9880d681SAndroid Build Coastguard Worker "f2: [ round, flat ]\n"
752*9880d681SAndroid Build Coastguard Worker "f3: []\n"
753*9880d681SAndroid Build Coastguard Worker "...\n");
754*9880d681SAndroid Build Coastguard Worker yin >> map;
755*9880d681SAndroid Build Coastguard Worker
756*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(yin.error());
757*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(flagBig, map.f1);
758*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(flagRound|flagFlat, map.f2);
759*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(flagNone, map.f3); // check empty set
760*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(flagRound, map.f4); // check optional key
761*9880d681SAndroid Build Coastguard Worker }
762*9880d681SAndroid Build Coastguard Worker
763*9880d681SAndroid Build Coastguard Worker
764*9880d681SAndroid Build Coastguard Worker //
765*9880d681SAndroid Build Coastguard Worker // Test writing then reading back bit-mask values
766*9880d681SAndroid Build Coastguard Worker //
TEST(YAMLIO,TestReadWriteFlags)767*9880d681SAndroid Build Coastguard Worker TEST(YAMLIO, TestReadWriteFlags) {
768*9880d681SAndroid Build Coastguard Worker std::string intermediate;
769*9880d681SAndroid Build Coastguard Worker {
770*9880d681SAndroid Build Coastguard Worker FlagsMap map;
771*9880d681SAndroid Build Coastguard Worker map.f1 = flagBig;
772*9880d681SAndroid Build Coastguard Worker map.f2 = flagRound | flagFlat;
773*9880d681SAndroid Build Coastguard Worker map.f3 = flagNone;
774*9880d681SAndroid Build Coastguard Worker map.f4 = flagNone;
775*9880d681SAndroid Build Coastguard Worker
776*9880d681SAndroid Build Coastguard Worker llvm::raw_string_ostream ostr(intermediate);
777*9880d681SAndroid Build Coastguard Worker Output yout(ostr);
778*9880d681SAndroid Build Coastguard Worker yout << map;
779*9880d681SAndroid Build Coastguard Worker }
780*9880d681SAndroid Build Coastguard Worker
781*9880d681SAndroid Build Coastguard Worker {
782*9880d681SAndroid Build Coastguard Worker Input yin(intermediate);
783*9880d681SAndroid Build Coastguard Worker FlagsMap map2;
784*9880d681SAndroid Build Coastguard Worker yin >> map2;
785*9880d681SAndroid Build Coastguard Worker
786*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(yin.error());
787*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(flagBig, map2.f1);
788*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(flagRound|flagFlat, map2.f2);
789*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(flagNone, map2.f3);
790*9880d681SAndroid Build Coastguard Worker //EXPECT_EQ(flagRound, map2.f4); // check optional key
791*9880d681SAndroid Build Coastguard Worker }
792*9880d681SAndroid Build Coastguard Worker }
793*9880d681SAndroid Build Coastguard Worker
794*9880d681SAndroid Build Coastguard Worker
795*9880d681SAndroid Build Coastguard Worker
796*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
797*9880d681SAndroid Build Coastguard Worker // Test ScalarTraits
798*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
799*9880d681SAndroid Build Coastguard Worker
800*9880d681SAndroid Build Coastguard Worker struct MyCustomType {
801*9880d681SAndroid Build Coastguard Worker int length;
802*9880d681SAndroid Build Coastguard Worker int width;
803*9880d681SAndroid Build Coastguard Worker };
804*9880d681SAndroid Build Coastguard Worker
805*9880d681SAndroid Build Coastguard Worker struct MyCustomTypeMap {
806*9880d681SAndroid Build Coastguard Worker MyCustomType f1;
807*9880d681SAndroid Build Coastguard Worker MyCustomType f2;
808*9880d681SAndroid Build Coastguard Worker int f3;
809*9880d681SAndroid Build Coastguard Worker };
810*9880d681SAndroid Build Coastguard Worker
811*9880d681SAndroid Build Coastguard Worker
812*9880d681SAndroid Build Coastguard Worker namespace llvm {
813*9880d681SAndroid Build Coastguard Worker namespace yaml {
814*9880d681SAndroid Build Coastguard Worker template <>
815*9880d681SAndroid Build Coastguard Worker struct MappingTraits<MyCustomTypeMap> {
mappingllvm::yaml::MappingTraits816*9880d681SAndroid Build Coastguard Worker static void mapping(IO &io, MyCustomTypeMap& s) {
817*9880d681SAndroid Build Coastguard Worker io.mapRequired("f1", s.f1);
818*9880d681SAndroid Build Coastguard Worker io.mapRequired("f2", s.f2);
819*9880d681SAndroid Build Coastguard Worker io.mapRequired("f3", s.f3);
820*9880d681SAndroid Build Coastguard Worker }
821*9880d681SAndroid Build Coastguard Worker };
822*9880d681SAndroid Build Coastguard Worker // MyCustomType is formatted as a yaml scalar. A value of
823*9880d681SAndroid Build Coastguard Worker // {length=3, width=4} would be represented in yaml as "3 by 4".
824*9880d681SAndroid Build Coastguard Worker template<>
825*9880d681SAndroid Build Coastguard Worker struct ScalarTraits<MyCustomType> {
outputllvm::yaml::ScalarTraits826*9880d681SAndroid Build Coastguard Worker static void output(const MyCustomType &value, void* ctxt, llvm::raw_ostream &out) {
827*9880d681SAndroid Build Coastguard Worker out << llvm::format("%d by %d", value.length, value.width);
828*9880d681SAndroid Build Coastguard Worker }
inputllvm::yaml::ScalarTraits829*9880d681SAndroid Build Coastguard Worker static StringRef input(StringRef scalar, void* ctxt, MyCustomType &value) {
830*9880d681SAndroid Build Coastguard Worker size_t byStart = scalar.find("by");
831*9880d681SAndroid Build Coastguard Worker if ( byStart != StringRef::npos ) {
832*9880d681SAndroid Build Coastguard Worker StringRef lenStr = scalar.slice(0, byStart);
833*9880d681SAndroid Build Coastguard Worker lenStr = lenStr.rtrim();
834*9880d681SAndroid Build Coastguard Worker if ( lenStr.getAsInteger(0, value.length) ) {
835*9880d681SAndroid Build Coastguard Worker return "malformed length";
836*9880d681SAndroid Build Coastguard Worker }
837*9880d681SAndroid Build Coastguard Worker StringRef widthStr = scalar.drop_front(byStart+2);
838*9880d681SAndroid Build Coastguard Worker widthStr = widthStr.ltrim();
839*9880d681SAndroid Build Coastguard Worker if ( widthStr.getAsInteger(0, value.width) ) {
840*9880d681SAndroid Build Coastguard Worker return "malformed width";
841*9880d681SAndroid Build Coastguard Worker }
842*9880d681SAndroid Build Coastguard Worker return StringRef();
843*9880d681SAndroid Build Coastguard Worker }
844*9880d681SAndroid Build Coastguard Worker else {
845*9880d681SAndroid Build Coastguard Worker return "malformed by";
846*9880d681SAndroid Build Coastguard Worker }
847*9880d681SAndroid Build Coastguard Worker }
mustQuotellvm::yaml::ScalarTraits848*9880d681SAndroid Build Coastguard Worker static bool mustQuote(StringRef) { return true; }
849*9880d681SAndroid Build Coastguard Worker };
850*9880d681SAndroid Build Coastguard Worker }
851*9880d681SAndroid Build Coastguard Worker }
852*9880d681SAndroid Build Coastguard Worker
853*9880d681SAndroid Build Coastguard Worker
854*9880d681SAndroid Build Coastguard Worker //
855*9880d681SAndroid Build Coastguard Worker // Test writing then reading back custom values
856*9880d681SAndroid Build Coastguard Worker //
TEST(YAMLIO,TestReadWriteMyCustomType)857*9880d681SAndroid Build Coastguard Worker TEST(YAMLIO, TestReadWriteMyCustomType) {
858*9880d681SAndroid Build Coastguard Worker std::string intermediate;
859*9880d681SAndroid Build Coastguard Worker {
860*9880d681SAndroid Build Coastguard Worker MyCustomTypeMap map;
861*9880d681SAndroid Build Coastguard Worker map.f1.length = 1;
862*9880d681SAndroid Build Coastguard Worker map.f1.width = 4;
863*9880d681SAndroid Build Coastguard Worker map.f2.length = 100;
864*9880d681SAndroid Build Coastguard Worker map.f2.width = 400;
865*9880d681SAndroid Build Coastguard Worker map.f3 = 10;
866*9880d681SAndroid Build Coastguard Worker
867*9880d681SAndroid Build Coastguard Worker llvm::raw_string_ostream ostr(intermediate);
868*9880d681SAndroid Build Coastguard Worker Output yout(ostr);
869*9880d681SAndroid Build Coastguard Worker yout << map;
870*9880d681SAndroid Build Coastguard Worker }
871*9880d681SAndroid Build Coastguard Worker
872*9880d681SAndroid Build Coastguard Worker {
873*9880d681SAndroid Build Coastguard Worker Input yin(intermediate);
874*9880d681SAndroid Build Coastguard Worker MyCustomTypeMap map2;
875*9880d681SAndroid Build Coastguard Worker yin >> map2;
876*9880d681SAndroid Build Coastguard Worker
877*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(yin.error());
878*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(1, map2.f1.length);
879*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(4, map2.f1.width);
880*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(100, map2.f2.length);
881*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(400, map2.f2.width);
882*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(10, map2.f3);
883*9880d681SAndroid Build Coastguard Worker }
884*9880d681SAndroid Build Coastguard Worker }
885*9880d681SAndroid Build Coastguard Worker
886*9880d681SAndroid Build Coastguard Worker
887*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
888*9880d681SAndroid Build Coastguard Worker // Test BlockScalarTraits
889*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
890*9880d681SAndroid Build Coastguard Worker
891*9880d681SAndroid Build Coastguard Worker struct MultilineStringType {
892*9880d681SAndroid Build Coastguard Worker std::string str;
893*9880d681SAndroid Build Coastguard Worker };
894*9880d681SAndroid Build Coastguard Worker
895*9880d681SAndroid Build Coastguard Worker struct MultilineStringTypeMap {
896*9880d681SAndroid Build Coastguard Worker MultilineStringType name;
897*9880d681SAndroid Build Coastguard Worker MultilineStringType description;
898*9880d681SAndroid Build Coastguard Worker MultilineStringType ingredients;
899*9880d681SAndroid Build Coastguard Worker MultilineStringType recipes;
900*9880d681SAndroid Build Coastguard Worker MultilineStringType warningLabels;
901*9880d681SAndroid Build Coastguard Worker MultilineStringType documentation;
902*9880d681SAndroid Build Coastguard Worker int price;
903*9880d681SAndroid Build Coastguard Worker };
904*9880d681SAndroid Build Coastguard Worker
905*9880d681SAndroid Build Coastguard Worker namespace llvm {
906*9880d681SAndroid Build Coastguard Worker namespace yaml {
907*9880d681SAndroid Build Coastguard Worker template <>
908*9880d681SAndroid Build Coastguard Worker struct MappingTraits<MultilineStringTypeMap> {
mappingllvm::yaml::MappingTraits909*9880d681SAndroid Build Coastguard Worker static void mapping(IO &io, MultilineStringTypeMap& s) {
910*9880d681SAndroid Build Coastguard Worker io.mapRequired("name", s.name);
911*9880d681SAndroid Build Coastguard Worker io.mapRequired("description", s.description);
912*9880d681SAndroid Build Coastguard Worker io.mapRequired("ingredients", s.ingredients);
913*9880d681SAndroid Build Coastguard Worker io.mapRequired("recipes", s.recipes);
914*9880d681SAndroid Build Coastguard Worker io.mapRequired("warningLabels", s.warningLabels);
915*9880d681SAndroid Build Coastguard Worker io.mapRequired("documentation", s.documentation);
916*9880d681SAndroid Build Coastguard Worker io.mapRequired("price", s.price);
917*9880d681SAndroid Build Coastguard Worker }
918*9880d681SAndroid Build Coastguard Worker };
919*9880d681SAndroid Build Coastguard Worker
920*9880d681SAndroid Build Coastguard Worker // MultilineStringType is formatted as a yaml block literal scalar. A value of
921*9880d681SAndroid Build Coastguard Worker // "Hello\nWorld" would be represented in yaml as
922*9880d681SAndroid Build Coastguard Worker // |
923*9880d681SAndroid Build Coastguard Worker // Hello
924*9880d681SAndroid Build Coastguard Worker // World
925*9880d681SAndroid Build Coastguard Worker template <>
926*9880d681SAndroid Build Coastguard Worker struct BlockScalarTraits<MultilineStringType> {
outputllvm::yaml::BlockScalarTraits927*9880d681SAndroid Build Coastguard Worker static void output(const MultilineStringType &value, void *ctxt,
928*9880d681SAndroid Build Coastguard Worker llvm::raw_ostream &out) {
929*9880d681SAndroid Build Coastguard Worker out << value.str;
930*9880d681SAndroid Build Coastguard Worker }
inputllvm::yaml::BlockScalarTraits931*9880d681SAndroid Build Coastguard Worker static StringRef input(StringRef scalar, void *ctxt,
932*9880d681SAndroid Build Coastguard Worker MultilineStringType &value) {
933*9880d681SAndroid Build Coastguard Worker value.str = scalar.str();
934*9880d681SAndroid Build Coastguard Worker return StringRef();
935*9880d681SAndroid Build Coastguard Worker }
936*9880d681SAndroid Build Coastguard Worker };
937*9880d681SAndroid Build Coastguard Worker }
938*9880d681SAndroid Build Coastguard Worker }
939*9880d681SAndroid Build Coastguard Worker
940*9880d681SAndroid Build Coastguard Worker LLVM_YAML_IS_DOCUMENT_LIST_VECTOR(MultilineStringType)
941*9880d681SAndroid Build Coastguard Worker
942*9880d681SAndroid Build Coastguard Worker //
943*9880d681SAndroid Build Coastguard Worker // Test writing then reading back custom values
944*9880d681SAndroid Build Coastguard Worker //
TEST(YAMLIO,TestReadWriteMultilineStringType)945*9880d681SAndroid Build Coastguard Worker TEST(YAMLIO, TestReadWriteMultilineStringType) {
946*9880d681SAndroid Build Coastguard Worker std::string intermediate;
947*9880d681SAndroid Build Coastguard Worker {
948*9880d681SAndroid Build Coastguard Worker MultilineStringTypeMap map;
949*9880d681SAndroid Build Coastguard Worker map.name.str = "An Item";
950*9880d681SAndroid Build Coastguard Worker map.description.str = "Hello\nWorld";
951*9880d681SAndroid Build Coastguard Worker map.ingredients.str = "SubItem 1\nSub Item 2\n\nSub Item 3\n";
952*9880d681SAndroid Build Coastguard Worker map.recipes.str = "\n\nTest 1\n\n\n";
953*9880d681SAndroid Build Coastguard Worker map.warningLabels.str = "";
954*9880d681SAndroid Build Coastguard Worker map.documentation.str = "\n\n";
955*9880d681SAndroid Build Coastguard Worker map.price = 350;
956*9880d681SAndroid Build Coastguard Worker
957*9880d681SAndroid Build Coastguard Worker llvm::raw_string_ostream ostr(intermediate);
958*9880d681SAndroid Build Coastguard Worker Output yout(ostr);
959*9880d681SAndroid Build Coastguard Worker yout << map;
960*9880d681SAndroid Build Coastguard Worker }
961*9880d681SAndroid Build Coastguard Worker {
962*9880d681SAndroid Build Coastguard Worker Input yin(intermediate);
963*9880d681SAndroid Build Coastguard Worker MultilineStringTypeMap map2;
964*9880d681SAndroid Build Coastguard Worker yin >> map2;
965*9880d681SAndroid Build Coastguard Worker
966*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(yin.error());
967*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(map2.name.str, "An Item\n");
968*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(map2.description.str, "Hello\nWorld\n");
969*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(map2.ingredients.str, "SubItem 1\nSub Item 2\n\nSub Item 3\n");
970*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(map2.recipes.str, "\n\nTest 1\n");
971*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(map2.warningLabels.str.empty());
972*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(map2.documentation.str.empty());
973*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(map2.price, 350);
974*9880d681SAndroid Build Coastguard Worker }
975*9880d681SAndroid Build Coastguard Worker }
976*9880d681SAndroid Build Coastguard Worker
977*9880d681SAndroid Build Coastguard Worker //
978*9880d681SAndroid Build Coastguard Worker // Test writing then reading back custom values
979*9880d681SAndroid Build Coastguard Worker //
TEST(YAMLIO,TestReadWriteBlockScalarDocuments)980*9880d681SAndroid Build Coastguard Worker TEST(YAMLIO, TestReadWriteBlockScalarDocuments) {
981*9880d681SAndroid Build Coastguard Worker std::string intermediate;
982*9880d681SAndroid Build Coastguard Worker {
983*9880d681SAndroid Build Coastguard Worker std::vector<MultilineStringType> documents;
984*9880d681SAndroid Build Coastguard Worker MultilineStringType doc;
985*9880d681SAndroid Build Coastguard Worker doc.str = "Hello\nWorld";
986*9880d681SAndroid Build Coastguard Worker documents.push_back(doc);
987*9880d681SAndroid Build Coastguard Worker
988*9880d681SAndroid Build Coastguard Worker llvm::raw_string_ostream ostr(intermediate);
989*9880d681SAndroid Build Coastguard Worker Output yout(ostr);
990*9880d681SAndroid Build Coastguard Worker yout << documents;
991*9880d681SAndroid Build Coastguard Worker
992*9880d681SAndroid Build Coastguard Worker // Verify that the block scalar header was written out on the same line
993*9880d681SAndroid Build Coastguard Worker // as the document marker.
994*9880d681SAndroid Build Coastguard Worker EXPECT_NE(llvm::StringRef::npos, llvm::StringRef(ostr.str()).find("--- |"));
995*9880d681SAndroid Build Coastguard Worker }
996*9880d681SAndroid Build Coastguard Worker {
997*9880d681SAndroid Build Coastguard Worker Input yin(intermediate);
998*9880d681SAndroid Build Coastguard Worker std::vector<MultilineStringType> documents2;
999*9880d681SAndroid Build Coastguard Worker yin >> documents2;
1000*9880d681SAndroid Build Coastguard Worker
1001*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(yin.error());
1002*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(documents2.size(), size_t(1));
1003*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(documents2[0].str, "Hello\nWorld\n");
1004*9880d681SAndroid Build Coastguard Worker }
1005*9880d681SAndroid Build Coastguard Worker }
1006*9880d681SAndroid Build Coastguard Worker
TEST(YAMLIO,TestReadWriteBlockScalarValue)1007*9880d681SAndroid Build Coastguard Worker TEST(YAMLIO, TestReadWriteBlockScalarValue) {
1008*9880d681SAndroid Build Coastguard Worker std::string intermediate;
1009*9880d681SAndroid Build Coastguard Worker {
1010*9880d681SAndroid Build Coastguard Worker MultilineStringType doc;
1011*9880d681SAndroid Build Coastguard Worker doc.str = "Just a block\nscalar doc";
1012*9880d681SAndroid Build Coastguard Worker
1013*9880d681SAndroid Build Coastguard Worker llvm::raw_string_ostream ostr(intermediate);
1014*9880d681SAndroid Build Coastguard Worker Output yout(ostr);
1015*9880d681SAndroid Build Coastguard Worker yout << doc;
1016*9880d681SAndroid Build Coastguard Worker }
1017*9880d681SAndroid Build Coastguard Worker {
1018*9880d681SAndroid Build Coastguard Worker Input yin(intermediate);
1019*9880d681SAndroid Build Coastguard Worker MultilineStringType doc;
1020*9880d681SAndroid Build Coastguard Worker yin >> doc;
1021*9880d681SAndroid Build Coastguard Worker
1022*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(yin.error());
1023*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(doc.str, "Just a block\nscalar doc\n");
1024*9880d681SAndroid Build Coastguard Worker }
1025*9880d681SAndroid Build Coastguard Worker }
1026*9880d681SAndroid Build Coastguard Worker
1027*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
1028*9880d681SAndroid Build Coastguard Worker // Test flow sequences
1029*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
1030*9880d681SAndroid Build Coastguard Worker
1031*9880d681SAndroid Build Coastguard Worker LLVM_YAML_STRONG_TYPEDEF(int, MyNumber)
1032*9880d681SAndroid Build Coastguard Worker LLVM_YAML_IS_FLOW_SEQUENCE_VECTOR(MyNumber)
1033*9880d681SAndroid Build Coastguard Worker LLVM_YAML_IS_FLOW_SEQUENCE_VECTOR(llvm::StringRef)
1034*9880d681SAndroid Build Coastguard Worker
1035*9880d681SAndroid Build Coastguard Worker namespace llvm {
1036*9880d681SAndroid Build Coastguard Worker namespace yaml {
1037*9880d681SAndroid Build Coastguard Worker template<>
1038*9880d681SAndroid Build Coastguard Worker struct ScalarTraits<MyNumber> {
outputllvm::yaml::ScalarTraits1039*9880d681SAndroid Build Coastguard Worker static void output(const MyNumber &value, void *, llvm::raw_ostream &out) {
1040*9880d681SAndroid Build Coastguard Worker out << value;
1041*9880d681SAndroid Build Coastguard Worker }
1042*9880d681SAndroid Build Coastguard Worker
inputllvm::yaml::ScalarTraits1043*9880d681SAndroid Build Coastguard Worker static StringRef input(StringRef scalar, void *, MyNumber &value) {
1044*9880d681SAndroid Build Coastguard Worker long long n;
1045*9880d681SAndroid Build Coastguard Worker if ( getAsSignedInteger(scalar, 0, n) )
1046*9880d681SAndroid Build Coastguard Worker return "invalid number";
1047*9880d681SAndroid Build Coastguard Worker value = n;
1048*9880d681SAndroid Build Coastguard Worker return StringRef();
1049*9880d681SAndroid Build Coastguard Worker }
1050*9880d681SAndroid Build Coastguard Worker
mustQuotellvm::yaml::ScalarTraits1051*9880d681SAndroid Build Coastguard Worker static bool mustQuote(StringRef) { return false; }
1052*9880d681SAndroid Build Coastguard Worker };
1053*9880d681SAndroid Build Coastguard Worker }
1054*9880d681SAndroid Build Coastguard Worker }
1055*9880d681SAndroid Build Coastguard Worker
1056*9880d681SAndroid Build Coastguard Worker struct NameAndNumbers {
1057*9880d681SAndroid Build Coastguard Worker llvm::StringRef name;
1058*9880d681SAndroid Build Coastguard Worker std::vector<llvm::StringRef> strings;
1059*9880d681SAndroid Build Coastguard Worker std::vector<MyNumber> single;
1060*9880d681SAndroid Build Coastguard Worker std::vector<MyNumber> numbers;
1061*9880d681SAndroid Build Coastguard Worker };
1062*9880d681SAndroid Build Coastguard Worker
1063*9880d681SAndroid Build Coastguard Worker namespace llvm {
1064*9880d681SAndroid Build Coastguard Worker namespace yaml {
1065*9880d681SAndroid Build Coastguard Worker template <>
1066*9880d681SAndroid Build Coastguard Worker struct MappingTraits<NameAndNumbers> {
mappingllvm::yaml::MappingTraits1067*9880d681SAndroid Build Coastguard Worker static void mapping(IO &io, NameAndNumbers& nn) {
1068*9880d681SAndroid Build Coastguard Worker io.mapRequired("name", nn.name);
1069*9880d681SAndroid Build Coastguard Worker io.mapRequired("strings", nn.strings);
1070*9880d681SAndroid Build Coastguard Worker io.mapRequired("single", nn.single);
1071*9880d681SAndroid Build Coastguard Worker io.mapRequired("numbers", nn.numbers);
1072*9880d681SAndroid Build Coastguard Worker }
1073*9880d681SAndroid Build Coastguard Worker };
1074*9880d681SAndroid Build Coastguard Worker }
1075*9880d681SAndroid Build Coastguard Worker }
1076*9880d681SAndroid Build Coastguard Worker
1077*9880d681SAndroid Build Coastguard Worker typedef std::vector<MyNumber> MyNumberFlowSequence;
1078*9880d681SAndroid Build Coastguard Worker
1079*9880d681SAndroid Build Coastguard Worker LLVM_YAML_IS_SEQUENCE_VECTOR(MyNumberFlowSequence)
1080*9880d681SAndroid Build Coastguard Worker
1081*9880d681SAndroid Build Coastguard Worker struct NameAndNumbersFlow {
1082*9880d681SAndroid Build Coastguard Worker llvm::StringRef name;
1083*9880d681SAndroid Build Coastguard Worker std::vector<MyNumberFlowSequence> sequenceOfNumbers;
1084*9880d681SAndroid Build Coastguard Worker };
1085*9880d681SAndroid Build Coastguard Worker
1086*9880d681SAndroid Build Coastguard Worker namespace llvm {
1087*9880d681SAndroid Build Coastguard Worker namespace yaml {
1088*9880d681SAndroid Build Coastguard Worker template <>
1089*9880d681SAndroid Build Coastguard Worker struct MappingTraits<NameAndNumbersFlow> {
mappingllvm::yaml::MappingTraits1090*9880d681SAndroid Build Coastguard Worker static void mapping(IO &io, NameAndNumbersFlow& nn) {
1091*9880d681SAndroid Build Coastguard Worker io.mapRequired("name", nn.name);
1092*9880d681SAndroid Build Coastguard Worker io.mapRequired("sequenceOfNumbers", nn.sequenceOfNumbers);
1093*9880d681SAndroid Build Coastguard Worker }
1094*9880d681SAndroid Build Coastguard Worker };
1095*9880d681SAndroid Build Coastguard Worker }
1096*9880d681SAndroid Build Coastguard Worker }
1097*9880d681SAndroid Build Coastguard Worker
1098*9880d681SAndroid Build Coastguard Worker //
1099*9880d681SAndroid Build Coastguard Worker // Test writing then reading back custom values
1100*9880d681SAndroid Build Coastguard Worker //
TEST(YAMLIO,TestReadWriteMyFlowSequence)1101*9880d681SAndroid Build Coastguard Worker TEST(YAMLIO, TestReadWriteMyFlowSequence) {
1102*9880d681SAndroid Build Coastguard Worker std::string intermediate;
1103*9880d681SAndroid Build Coastguard Worker {
1104*9880d681SAndroid Build Coastguard Worker NameAndNumbers map;
1105*9880d681SAndroid Build Coastguard Worker map.name = "hello";
1106*9880d681SAndroid Build Coastguard Worker map.strings.push_back(llvm::StringRef("one"));
1107*9880d681SAndroid Build Coastguard Worker map.strings.push_back(llvm::StringRef("two"));
1108*9880d681SAndroid Build Coastguard Worker map.single.push_back(1);
1109*9880d681SAndroid Build Coastguard Worker map.numbers.push_back(10);
1110*9880d681SAndroid Build Coastguard Worker map.numbers.push_back(-30);
1111*9880d681SAndroid Build Coastguard Worker map.numbers.push_back(1024);
1112*9880d681SAndroid Build Coastguard Worker
1113*9880d681SAndroid Build Coastguard Worker llvm::raw_string_ostream ostr(intermediate);
1114*9880d681SAndroid Build Coastguard Worker Output yout(ostr);
1115*9880d681SAndroid Build Coastguard Worker yout << map;
1116*9880d681SAndroid Build Coastguard Worker
1117*9880d681SAndroid Build Coastguard Worker // Verify sequences were written in flow style
1118*9880d681SAndroid Build Coastguard Worker ostr.flush();
1119*9880d681SAndroid Build Coastguard Worker llvm::StringRef flowOut(intermediate);
1120*9880d681SAndroid Build Coastguard Worker EXPECT_NE(llvm::StringRef::npos, flowOut.find("one, two"));
1121*9880d681SAndroid Build Coastguard Worker EXPECT_NE(llvm::StringRef::npos, flowOut.find("10, -30, 1024"));
1122*9880d681SAndroid Build Coastguard Worker }
1123*9880d681SAndroid Build Coastguard Worker
1124*9880d681SAndroid Build Coastguard Worker {
1125*9880d681SAndroid Build Coastguard Worker Input yin(intermediate);
1126*9880d681SAndroid Build Coastguard Worker NameAndNumbers map2;
1127*9880d681SAndroid Build Coastguard Worker yin >> map2;
1128*9880d681SAndroid Build Coastguard Worker
1129*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(yin.error());
1130*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(map2.name.equals("hello"));
1131*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(map2.strings.size(), 2UL);
1132*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(map2.strings[0].equals("one"));
1133*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(map2.strings[1].equals("two"));
1134*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(map2.single.size(), 1UL);
1135*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(1, map2.single[0]);
1136*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(map2.numbers.size(), 3UL);
1137*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(10, map2.numbers[0]);
1138*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(-30, map2.numbers[1]);
1139*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(1024, map2.numbers[2]);
1140*9880d681SAndroid Build Coastguard Worker }
1141*9880d681SAndroid Build Coastguard Worker }
1142*9880d681SAndroid Build Coastguard Worker
1143*9880d681SAndroid Build Coastguard Worker
1144*9880d681SAndroid Build Coastguard Worker //
1145*9880d681SAndroid Build Coastguard Worker // Test writing then reading back a sequence of flow sequences.
1146*9880d681SAndroid Build Coastguard Worker //
TEST(YAMLIO,TestReadWriteSequenceOfMyFlowSequence)1147*9880d681SAndroid Build Coastguard Worker TEST(YAMLIO, TestReadWriteSequenceOfMyFlowSequence) {
1148*9880d681SAndroid Build Coastguard Worker std::string intermediate;
1149*9880d681SAndroid Build Coastguard Worker {
1150*9880d681SAndroid Build Coastguard Worker NameAndNumbersFlow map;
1151*9880d681SAndroid Build Coastguard Worker map.name = "hello";
1152*9880d681SAndroid Build Coastguard Worker MyNumberFlowSequence single = { 0 };
1153*9880d681SAndroid Build Coastguard Worker MyNumberFlowSequence numbers = { 12, 1, -512 };
1154*9880d681SAndroid Build Coastguard Worker map.sequenceOfNumbers.push_back(single);
1155*9880d681SAndroid Build Coastguard Worker map.sequenceOfNumbers.push_back(numbers);
1156*9880d681SAndroid Build Coastguard Worker map.sequenceOfNumbers.push_back(MyNumberFlowSequence());
1157*9880d681SAndroid Build Coastguard Worker
1158*9880d681SAndroid Build Coastguard Worker llvm::raw_string_ostream ostr(intermediate);
1159*9880d681SAndroid Build Coastguard Worker Output yout(ostr);
1160*9880d681SAndroid Build Coastguard Worker yout << map;
1161*9880d681SAndroid Build Coastguard Worker
1162*9880d681SAndroid Build Coastguard Worker // Verify sequences were written in flow style
1163*9880d681SAndroid Build Coastguard Worker // and that the parent sequence used '-'.
1164*9880d681SAndroid Build Coastguard Worker ostr.flush();
1165*9880d681SAndroid Build Coastguard Worker llvm::StringRef flowOut(intermediate);
1166*9880d681SAndroid Build Coastguard Worker EXPECT_NE(llvm::StringRef::npos, flowOut.find("- [ 0 ]"));
1167*9880d681SAndroid Build Coastguard Worker EXPECT_NE(llvm::StringRef::npos, flowOut.find("- [ 12, 1, -512 ]"));
1168*9880d681SAndroid Build Coastguard Worker EXPECT_NE(llvm::StringRef::npos, flowOut.find("- [ ]"));
1169*9880d681SAndroid Build Coastguard Worker }
1170*9880d681SAndroid Build Coastguard Worker
1171*9880d681SAndroid Build Coastguard Worker {
1172*9880d681SAndroid Build Coastguard Worker Input yin(intermediate);
1173*9880d681SAndroid Build Coastguard Worker NameAndNumbersFlow map2;
1174*9880d681SAndroid Build Coastguard Worker yin >> map2;
1175*9880d681SAndroid Build Coastguard Worker
1176*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(yin.error());
1177*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(map2.name.equals("hello"));
1178*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(map2.sequenceOfNumbers.size(), 3UL);
1179*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(map2.sequenceOfNumbers[0].size(), 1UL);
1180*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(0, map2.sequenceOfNumbers[0][0]);
1181*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(map2.sequenceOfNumbers[1].size(), 3UL);
1182*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(12, map2.sequenceOfNumbers[1][0]);
1183*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(1, map2.sequenceOfNumbers[1][1]);
1184*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(-512, map2.sequenceOfNumbers[1][2]);
1185*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(map2.sequenceOfNumbers[2].empty());
1186*9880d681SAndroid Build Coastguard Worker }
1187*9880d681SAndroid Build Coastguard Worker }
1188*9880d681SAndroid Build Coastguard Worker
1189*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
1190*9880d681SAndroid Build Coastguard Worker // Test normalizing/denormalizing
1191*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
1192*9880d681SAndroid Build Coastguard Worker
1193*9880d681SAndroid Build Coastguard Worker LLVM_YAML_STRONG_TYPEDEF(uint32_t, TotalSeconds)
1194*9880d681SAndroid Build Coastguard Worker
1195*9880d681SAndroid Build Coastguard Worker typedef std::vector<TotalSeconds> SecondsSequence;
1196*9880d681SAndroid Build Coastguard Worker
1197*9880d681SAndroid Build Coastguard Worker LLVM_YAML_IS_SEQUENCE_VECTOR(TotalSeconds)
1198*9880d681SAndroid Build Coastguard Worker
1199*9880d681SAndroid Build Coastguard Worker
1200*9880d681SAndroid Build Coastguard Worker namespace llvm {
1201*9880d681SAndroid Build Coastguard Worker namespace yaml {
1202*9880d681SAndroid Build Coastguard Worker template <>
1203*9880d681SAndroid Build Coastguard Worker struct MappingTraits<TotalSeconds> {
1204*9880d681SAndroid Build Coastguard Worker
1205*9880d681SAndroid Build Coastguard Worker class NormalizedSeconds {
1206*9880d681SAndroid Build Coastguard Worker public:
NormalizedSeconds(IO & io)1207*9880d681SAndroid Build Coastguard Worker NormalizedSeconds(IO &io)
1208*9880d681SAndroid Build Coastguard Worker : hours(0), minutes(0), seconds(0) {
1209*9880d681SAndroid Build Coastguard Worker }
NormalizedSeconds(IO &,TotalSeconds & secs)1210*9880d681SAndroid Build Coastguard Worker NormalizedSeconds(IO &, TotalSeconds &secs)
1211*9880d681SAndroid Build Coastguard Worker : hours(secs/3600),
1212*9880d681SAndroid Build Coastguard Worker minutes((secs - (hours*3600))/60),
1213*9880d681SAndroid Build Coastguard Worker seconds(secs % 60) {
1214*9880d681SAndroid Build Coastguard Worker }
denormalize(IO &)1215*9880d681SAndroid Build Coastguard Worker TotalSeconds denormalize(IO &) {
1216*9880d681SAndroid Build Coastguard Worker return TotalSeconds(hours*3600 + minutes*60 + seconds);
1217*9880d681SAndroid Build Coastguard Worker }
1218*9880d681SAndroid Build Coastguard Worker
1219*9880d681SAndroid Build Coastguard Worker uint32_t hours;
1220*9880d681SAndroid Build Coastguard Worker uint8_t minutes;
1221*9880d681SAndroid Build Coastguard Worker uint8_t seconds;
1222*9880d681SAndroid Build Coastguard Worker };
1223*9880d681SAndroid Build Coastguard Worker
mappingllvm::yaml::MappingTraits1224*9880d681SAndroid Build Coastguard Worker static void mapping(IO &io, TotalSeconds &secs) {
1225*9880d681SAndroid Build Coastguard Worker MappingNormalization<NormalizedSeconds, TotalSeconds> keys(io, secs);
1226*9880d681SAndroid Build Coastguard Worker
1227*9880d681SAndroid Build Coastguard Worker io.mapOptional("hours", keys->hours, (uint32_t)0);
1228*9880d681SAndroid Build Coastguard Worker io.mapOptional("minutes", keys->minutes, (uint8_t)0);
1229*9880d681SAndroid Build Coastguard Worker io.mapRequired("seconds", keys->seconds);
1230*9880d681SAndroid Build Coastguard Worker }
1231*9880d681SAndroid Build Coastguard Worker };
1232*9880d681SAndroid Build Coastguard Worker }
1233*9880d681SAndroid Build Coastguard Worker }
1234*9880d681SAndroid Build Coastguard Worker
1235*9880d681SAndroid Build Coastguard Worker
1236*9880d681SAndroid Build Coastguard Worker //
1237*9880d681SAndroid Build Coastguard Worker // Test the reading of a yaml sequence of mappings
1238*9880d681SAndroid Build Coastguard Worker //
TEST(YAMLIO,TestReadMySecondsSequence)1239*9880d681SAndroid Build Coastguard Worker TEST(YAMLIO, TestReadMySecondsSequence) {
1240*9880d681SAndroid Build Coastguard Worker SecondsSequence seq;
1241*9880d681SAndroid Build Coastguard Worker Input yin("---\n - hours: 1\n seconds: 5\n - seconds: 59\n...\n");
1242*9880d681SAndroid Build Coastguard Worker yin >> seq;
1243*9880d681SAndroid Build Coastguard Worker
1244*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(yin.error());
1245*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(seq.size(), 2UL);
1246*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(seq[0], 3605U);
1247*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(seq[1], 59U);
1248*9880d681SAndroid Build Coastguard Worker }
1249*9880d681SAndroid Build Coastguard Worker
1250*9880d681SAndroid Build Coastguard Worker
1251*9880d681SAndroid Build Coastguard Worker //
1252*9880d681SAndroid Build Coastguard Worker // Test writing then reading back custom values
1253*9880d681SAndroid Build Coastguard Worker //
TEST(YAMLIO,TestReadWriteMySecondsSequence)1254*9880d681SAndroid Build Coastguard Worker TEST(YAMLIO, TestReadWriteMySecondsSequence) {
1255*9880d681SAndroid Build Coastguard Worker std::string intermediate;
1256*9880d681SAndroid Build Coastguard Worker {
1257*9880d681SAndroid Build Coastguard Worker SecondsSequence seq;
1258*9880d681SAndroid Build Coastguard Worker seq.push_back(4000);
1259*9880d681SAndroid Build Coastguard Worker seq.push_back(500);
1260*9880d681SAndroid Build Coastguard Worker seq.push_back(59);
1261*9880d681SAndroid Build Coastguard Worker
1262*9880d681SAndroid Build Coastguard Worker llvm::raw_string_ostream ostr(intermediate);
1263*9880d681SAndroid Build Coastguard Worker Output yout(ostr);
1264*9880d681SAndroid Build Coastguard Worker yout << seq;
1265*9880d681SAndroid Build Coastguard Worker }
1266*9880d681SAndroid Build Coastguard Worker {
1267*9880d681SAndroid Build Coastguard Worker Input yin(intermediate);
1268*9880d681SAndroid Build Coastguard Worker SecondsSequence seq2;
1269*9880d681SAndroid Build Coastguard Worker yin >> seq2;
1270*9880d681SAndroid Build Coastguard Worker
1271*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(yin.error());
1272*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(seq2.size(), 3UL);
1273*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(seq2[0], 4000U);
1274*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(seq2[1], 500U);
1275*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(seq2[2], 59U);
1276*9880d681SAndroid Build Coastguard Worker }
1277*9880d681SAndroid Build Coastguard Worker }
1278*9880d681SAndroid Build Coastguard Worker
1279*9880d681SAndroid Build Coastguard Worker
1280*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
1281*9880d681SAndroid Build Coastguard Worker // Test dynamic typing
1282*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
1283*9880d681SAndroid Build Coastguard Worker
1284*9880d681SAndroid Build Coastguard Worker enum AFlags {
1285*9880d681SAndroid Build Coastguard Worker a1,
1286*9880d681SAndroid Build Coastguard Worker a2,
1287*9880d681SAndroid Build Coastguard Worker a3
1288*9880d681SAndroid Build Coastguard Worker };
1289*9880d681SAndroid Build Coastguard Worker
1290*9880d681SAndroid Build Coastguard Worker enum BFlags {
1291*9880d681SAndroid Build Coastguard Worker b1,
1292*9880d681SAndroid Build Coastguard Worker b2,
1293*9880d681SAndroid Build Coastguard Worker b3
1294*9880d681SAndroid Build Coastguard Worker };
1295*9880d681SAndroid Build Coastguard Worker
1296*9880d681SAndroid Build Coastguard Worker enum Kind {
1297*9880d681SAndroid Build Coastguard Worker kindA,
1298*9880d681SAndroid Build Coastguard Worker kindB
1299*9880d681SAndroid Build Coastguard Worker };
1300*9880d681SAndroid Build Coastguard Worker
1301*9880d681SAndroid Build Coastguard Worker struct KindAndFlags {
KindAndFlagsKindAndFlags1302*9880d681SAndroid Build Coastguard Worker KindAndFlags() : kind(kindA), flags(0) { }
KindAndFlagsKindAndFlags1303*9880d681SAndroid Build Coastguard Worker KindAndFlags(Kind k, uint32_t f) : kind(k), flags(f) { }
1304*9880d681SAndroid Build Coastguard Worker Kind kind;
1305*9880d681SAndroid Build Coastguard Worker uint32_t flags;
1306*9880d681SAndroid Build Coastguard Worker };
1307*9880d681SAndroid Build Coastguard Worker
1308*9880d681SAndroid Build Coastguard Worker typedef std::vector<KindAndFlags> KindAndFlagsSequence;
1309*9880d681SAndroid Build Coastguard Worker
1310*9880d681SAndroid Build Coastguard Worker LLVM_YAML_IS_SEQUENCE_VECTOR(KindAndFlags)
1311*9880d681SAndroid Build Coastguard Worker
1312*9880d681SAndroid Build Coastguard Worker namespace llvm {
1313*9880d681SAndroid Build Coastguard Worker namespace yaml {
1314*9880d681SAndroid Build Coastguard Worker template <>
1315*9880d681SAndroid Build Coastguard Worker struct ScalarEnumerationTraits<AFlags> {
enumerationllvm::yaml::ScalarEnumerationTraits1316*9880d681SAndroid Build Coastguard Worker static void enumeration(IO &io, AFlags &value) {
1317*9880d681SAndroid Build Coastguard Worker io.enumCase(value, "a1", a1);
1318*9880d681SAndroid Build Coastguard Worker io.enumCase(value, "a2", a2);
1319*9880d681SAndroid Build Coastguard Worker io.enumCase(value, "a3", a3);
1320*9880d681SAndroid Build Coastguard Worker }
1321*9880d681SAndroid Build Coastguard Worker };
1322*9880d681SAndroid Build Coastguard Worker template <>
1323*9880d681SAndroid Build Coastguard Worker struct ScalarEnumerationTraits<BFlags> {
enumerationllvm::yaml::ScalarEnumerationTraits1324*9880d681SAndroid Build Coastguard Worker static void enumeration(IO &io, BFlags &value) {
1325*9880d681SAndroid Build Coastguard Worker io.enumCase(value, "b1", b1);
1326*9880d681SAndroid Build Coastguard Worker io.enumCase(value, "b2", b2);
1327*9880d681SAndroid Build Coastguard Worker io.enumCase(value, "b3", b3);
1328*9880d681SAndroid Build Coastguard Worker }
1329*9880d681SAndroid Build Coastguard Worker };
1330*9880d681SAndroid Build Coastguard Worker template <>
1331*9880d681SAndroid Build Coastguard Worker struct ScalarEnumerationTraits<Kind> {
enumerationllvm::yaml::ScalarEnumerationTraits1332*9880d681SAndroid Build Coastguard Worker static void enumeration(IO &io, Kind &value) {
1333*9880d681SAndroid Build Coastguard Worker io.enumCase(value, "A", kindA);
1334*9880d681SAndroid Build Coastguard Worker io.enumCase(value, "B", kindB);
1335*9880d681SAndroid Build Coastguard Worker }
1336*9880d681SAndroid Build Coastguard Worker };
1337*9880d681SAndroid Build Coastguard Worker template <>
1338*9880d681SAndroid Build Coastguard Worker struct MappingTraits<KindAndFlags> {
mappingllvm::yaml::MappingTraits1339*9880d681SAndroid Build Coastguard Worker static void mapping(IO &io, KindAndFlags& kf) {
1340*9880d681SAndroid Build Coastguard Worker io.mapRequired("kind", kf.kind);
1341*9880d681SAndroid Build Coastguard Worker // Type of "flags" field varies depending on "kind" field.
1342*9880d681SAndroid Build Coastguard Worker // Use memcpy here to avoid breaking strict aliasing rules.
1343*9880d681SAndroid Build Coastguard Worker if (kf.kind == kindA) {
1344*9880d681SAndroid Build Coastguard Worker AFlags aflags = static_cast<AFlags>(kf.flags);
1345*9880d681SAndroid Build Coastguard Worker io.mapRequired("flags", aflags);
1346*9880d681SAndroid Build Coastguard Worker kf.flags = aflags;
1347*9880d681SAndroid Build Coastguard Worker } else {
1348*9880d681SAndroid Build Coastguard Worker BFlags bflags = static_cast<BFlags>(kf.flags);
1349*9880d681SAndroid Build Coastguard Worker io.mapRequired("flags", bflags);
1350*9880d681SAndroid Build Coastguard Worker kf.flags = bflags;
1351*9880d681SAndroid Build Coastguard Worker }
1352*9880d681SAndroid Build Coastguard Worker }
1353*9880d681SAndroid Build Coastguard Worker };
1354*9880d681SAndroid Build Coastguard Worker }
1355*9880d681SAndroid Build Coastguard Worker }
1356*9880d681SAndroid Build Coastguard Worker
1357*9880d681SAndroid Build Coastguard Worker
1358*9880d681SAndroid Build Coastguard Worker //
1359*9880d681SAndroid Build Coastguard Worker // Test the reading of a yaml sequence dynamic types
1360*9880d681SAndroid Build Coastguard Worker //
TEST(YAMLIO,TestReadKindAndFlagsSequence)1361*9880d681SAndroid Build Coastguard Worker TEST(YAMLIO, TestReadKindAndFlagsSequence) {
1362*9880d681SAndroid Build Coastguard Worker KindAndFlagsSequence seq;
1363*9880d681SAndroid Build Coastguard Worker Input yin("---\n - kind: A\n flags: a2\n - kind: B\n flags: b1\n...\n");
1364*9880d681SAndroid Build Coastguard Worker yin >> seq;
1365*9880d681SAndroid Build Coastguard Worker
1366*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(yin.error());
1367*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(seq.size(), 2UL);
1368*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(seq[0].kind, kindA);
1369*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(seq[0].flags, (uint32_t)a2);
1370*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(seq[1].kind, kindB);
1371*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(seq[1].flags, (uint32_t)b1);
1372*9880d681SAndroid Build Coastguard Worker }
1373*9880d681SAndroid Build Coastguard Worker
1374*9880d681SAndroid Build Coastguard Worker //
1375*9880d681SAndroid Build Coastguard Worker // Test writing then reading back dynamic types
1376*9880d681SAndroid Build Coastguard Worker //
TEST(YAMLIO,TestReadWriteKindAndFlagsSequence)1377*9880d681SAndroid Build Coastguard Worker TEST(YAMLIO, TestReadWriteKindAndFlagsSequence) {
1378*9880d681SAndroid Build Coastguard Worker std::string intermediate;
1379*9880d681SAndroid Build Coastguard Worker {
1380*9880d681SAndroid Build Coastguard Worker KindAndFlagsSequence seq;
1381*9880d681SAndroid Build Coastguard Worker seq.push_back(KindAndFlags(kindA,a1));
1382*9880d681SAndroid Build Coastguard Worker seq.push_back(KindAndFlags(kindB,b1));
1383*9880d681SAndroid Build Coastguard Worker seq.push_back(KindAndFlags(kindA,a2));
1384*9880d681SAndroid Build Coastguard Worker seq.push_back(KindAndFlags(kindB,b2));
1385*9880d681SAndroid Build Coastguard Worker seq.push_back(KindAndFlags(kindA,a3));
1386*9880d681SAndroid Build Coastguard Worker
1387*9880d681SAndroid Build Coastguard Worker llvm::raw_string_ostream ostr(intermediate);
1388*9880d681SAndroid Build Coastguard Worker Output yout(ostr);
1389*9880d681SAndroid Build Coastguard Worker yout << seq;
1390*9880d681SAndroid Build Coastguard Worker }
1391*9880d681SAndroid Build Coastguard Worker {
1392*9880d681SAndroid Build Coastguard Worker Input yin(intermediate);
1393*9880d681SAndroid Build Coastguard Worker KindAndFlagsSequence seq2;
1394*9880d681SAndroid Build Coastguard Worker yin >> seq2;
1395*9880d681SAndroid Build Coastguard Worker
1396*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(yin.error());
1397*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(seq2.size(), 5UL);
1398*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(seq2[0].kind, kindA);
1399*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(seq2[0].flags, (uint32_t)a1);
1400*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(seq2[1].kind, kindB);
1401*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(seq2[1].flags, (uint32_t)b1);
1402*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(seq2[2].kind, kindA);
1403*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(seq2[2].flags, (uint32_t)a2);
1404*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(seq2[3].kind, kindB);
1405*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(seq2[3].flags, (uint32_t)b2);
1406*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(seq2[4].kind, kindA);
1407*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(seq2[4].flags, (uint32_t)a3);
1408*9880d681SAndroid Build Coastguard Worker }
1409*9880d681SAndroid Build Coastguard Worker }
1410*9880d681SAndroid Build Coastguard Worker
1411*9880d681SAndroid Build Coastguard Worker
1412*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
1413*9880d681SAndroid Build Coastguard Worker // Test document list
1414*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
1415*9880d681SAndroid Build Coastguard Worker
1416*9880d681SAndroid Build Coastguard Worker struct FooBarMap {
1417*9880d681SAndroid Build Coastguard Worker int foo;
1418*9880d681SAndroid Build Coastguard Worker int bar;
1419*9880d681SAndroid Build Coastguard Worker };
1420*9880d681SAndroid Build Coastguard Worker typedef std::vector<FooBarMap> FooBarMapDocumentList;
1421*9880d681SAndroid Build Coastguard Worker
1422*9880d681SAndroid Build Coastguard Worker LLVM_YAML_IS_DOCUMENT_LIST_VECTOR(FooBarMap)
1423*9880d681SAndroid Build Coastguard Worker
1424*9880d681SAndroid Build Coastguard Worker
1425*9880d681SAndroid Build Coastguard Worker namespace llvm {
1426*9880d681SAndroid Build Coastguard Worker namespace yaml {
1427*9880d681SAndroid Build Coastguard Worker template <>
1428*9880d681SAndroid Build Coastguard Worker struct MappingTraits<FooBarMap> {
mappingllvm::yaml::MappingTraits1429*9880d681SAndroid Build Coastguard Worker static void mapping(IO &io, FooBarMap& fb) {
1430*9880d681SAndroid Build Coastguard Worker io.mapRequired("foo", fb.foo);
1431*9880d681SAndroid Build Coastguard Worker io.mapRequired("bar", fb.bar);
1432*9880d681SAndroid Build Coastguard Worker }
1433*9880d681SAndroid Build Coastguard Worker };
1434*9880d681SAndroid Build Coastguard Worker }
1435*9880d681SAndroid Build Coastguard Worker }
1436*9880d681SAndroid Build Coastguard Worker
1437*9880d681SAndroid Build Coastguard Worker
1438*9880d681SAndroid Build Coastguard Worker //
1439*9880d681SAndroid Build Coastguard Worker // Test the reading of a yaml mapping
1440*9880d681SAndroid Build Coastguard Worker //
TEST(YAMLIO,TestDocRead)1441*9880d681SAndroid Build Coastguard Worker TEST(YAMLIO, TestDocRead) {
1442*9880d681SAndroid Build Coastguard Worker FooBarMap doc;
1443*9880d681SAndroid Build Coastguard Worker Input yin("---\nfoo: 3\nbar: 5\n...\n");
1444*9880d681SAndroid Build Coastguard Worker yin >> doc;
1445*9880d681SAndroid Build Coastguard Worker
1446*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(yin.error());
1447*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(doc.foo, 3);
1448*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(doc.bar,5);
1449*9880d681SAndroid Build Coastguard Worker }
1450*9880d681SAndroid Build Coastguard Worker
1451*9880d681SAndroid Build Coastguard Worker
1452*9880d681SAndroid Build Coastguard Worker
1453*9880d681SAndroid Build Coastguard Worker //
1454*9880d681SAndroid Build Coastguard Worker // Test writing then reading back a sequence of mappings
1455*9880d681SAndroid Build Coastguard Worker //
TEST(YAMLIO,TestSequenceDocListWriteAndRead)1456*9880d681SAndroid Build Coastguard Worker TEST(YAMLIO, TestSequenceDocListWriteAndRead) {
1457*9880d681SAndroid Build Coastguard Worker std::string intermediate;
1458*9880d681SAndroid Build Coastguard Worker {
1459*9880d681SAndroid Build Coastguard Worker FooBarMap doc1;
1460*9880d681SAndroid Build Coastguard Worker doc1.foo = 10;
1461*9880d681SAndroid Build Coastguard Worker doc1.bar = -3;
1462*9880d681SAndroid Build Coastguard Worker FooBarMap doc2;
1463*9880d681SAndroid Build Coastguard Worker doc2.foo = 257;
1464*9880d681SAndroid Build Coastguard Worker doc2.bar = 0;
1465*9880d681SAndroid Build Coastguard Worker std::vector<FooBarMap> docList;
1466*9880d681SAndroid Build Coastguard Worker docList.push_back(doc1);
1467*9880d681SAndroid Build Coastguard Worker docList.push_back(doc2);
1468*9880d681SAndroid Build Coastguard Worker
1469*9880d681SAndroid Build Coastguard Worker llvm::raw_string_ostream ostr(intermediate);
1470*9880d681SAndroid Build Coastguard Worker Output yout(ostr);
1471*9880d681SAndroid Build Coastguard Worker yout << docList;
1472*9880d681SAndroid Build Coastguard Worker }
1473*9880d681SAndroid Build Coastguard Worker
1474*9880d681SAndroid Build Coastguard Worker
1475*9880d681SAndroid Build Coastguard Worker {
1476*9880d681SAndroid Build Coastguard Worker Input yin(intermediate);
1477*9880d681SAndroid Build Coastguard Worker std::vector<FooBarMap> docList2;
1478*9880d681SAndroid Build Coastguard Worker yin >> docList2;
1479*9880d681SAndroid Build Coastguard Worker
1480*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(yin.error());
1481*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(docList2.size(), 2UL);
1482*9880d681SAndroid Build Coastguard Worker FooBarMap& map1 = docList2[0];
1483*9880d681SAndroid Build Coastguard Worker FooBarMap& map2 = docList2[1];
1484*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(map1.foo, 10);
1485*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(map1.bar, -3);
1486*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(map2.foo, 257);
1487*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(map2.bar, 0);
1488*9880d681SAndroid Build Coastguard Worker }
1489*9880d681SAndroid Build Coastguard Worker }
1490*9880d681SAndroid Build Coastguard Worker
1491*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
1492*9880d681SAndroid Build Coastguard Worker // Test document tags
1493*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
1494*9880d681SAndroid Build Coastguard Worker
1495*9880d681SAndroid Build Coastguard Worker struct MyDouble {
MyDoubleMyDouble1496*9880d681SAndroid Build Coastguard Worker MyDouble() : value(0.0) { }
MyDoubleMyDouble1497*9880d681SAndroid Build Coastguard Worker MyDouble(double x) : value(x) { }
1498*9880d681SAndroid Build Coastguard Worker double value;
1499*9880d681SAndroid Build Coastguard Worker };
1500*9880d681SAndroid Build Coastguard Worker
1501*9880d681SAndroid Build Coastguard Worker LLVM_YAML_IS_DOCUMENT_LIST_VECTOR(MyDouble)
1502*9880d681SAndroid Build Coastguard Worker
1503*9880d681SAndroid Build Coastguard Worker
1504*9880d681SAndroid Build Coastguard Worker namespace llvm {
1505*9880d681SAndroid Build Coastguard Worker namespace yaml {
1506*9880d681SAndroid Build Coastguard Worker template <>
1507*9880d681SAndroid Build Coastguard Worker struct MappingTraits<MyDouble> {
mappingllvm::yaml::MappingTraits1508*9880d681SAndroid Build Coastguard Worker static void mapping(IO &io, MyDouble &d) {
1509*9880d681SAndroid Build Coastguard Worker if (io.mapTag("!decimal", true)) {
1510*9880d681SAndroid Build Coastguard Worker mappingDecimal(io, d);
1511*9880d681SAndroid Build Coastguard Worker } else if (io.mapTag("!fraction")) {
1512*9880d681SAndroid Build Coastguard Worker mappingFraction(io, d);
1513*9880d681SAndroid Build Coastguard Worker }
1514*9880d681SAndroid Build Coastguard Worker }
mappingDecimalllvm::yaml::MappingTraits1515*9880d681SAndroid Build Coastguard Worker static void mappingDecimal(IO &io, MyDouble &d) {
1516*9880d681SAndroid Build Coastguard Worker io.mapRequired("value", d.value);
1517*9880d681SAndroid Build Coastguard Worker }
mappingFractionllvm::yaml::MappingTraits1518*9880d681SAndroid Build Coastguard Worker static void mappingFraction(IO &io, MyDouble &d) {
1519*9880d681SAndroid Build Coastguard Worker double num, denom;
1520*9880d681SAndroid Build Coastguard Worker io.mapRequired("numerator", num);
1521*9880d681SAndroid Build Coastguard Worker io.mapRequired("denominator", denom);
1522*9880d681SAndroid Build Coastguard Worker // convert fraction to double
1523*9880d681SAndroid Build Coastguard Worker d.value = num/denom;
1524*9880d681SAndroid Build Coastguard Worker }
1525*9880d681SAndroid Build Coastguard Worker };
1526*9880d681SAndroid Build Coastguard Worker }
1527*9880d681SAndroid Build Coastguard Worker }
1528*9880d681SAndroid Build Coastguard Worker
1529*9880d681SAndroid Build Coastguard Worker
1530*9880d681SAndroid Build Coastguard Worker //
1531*9880d681SAndroid Build Coastguard Worker // Test the reading of two different tagged yaml documents.
1532*9880d681SAndroid Build Coastguard Worker //
TEST(YAMLIO,TestTaggedDocuments)1533*9880d681SAndroid Build Coastguard Worker TEST(YAMLIO, TestTaggedDocuments) {
1534*9880d681SAndroid Build Coastguard Worker std::vector<MyDouble> docList;
1535*9880d681SAndroid Build Coastguard Worker Input yin("--- !decimal\nvalue: 3.0\n"
1536*9880d681SAndroid Build Coastguard Worker "--- !fraction\nnumerator: 9.0\ndenominator: 2\n...\n");
1537*9880d681SAndroid Build Coastguard Worker yin >> docList;
1538*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(yin.error());
1539*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(docList.size(), 2UL);
1540*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(docList[0].value, 3.0);
1541*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(docList[1].value, 4.5);
1542*9880d681SAndroid Build Coastguard Worker }
1543*9880d681SAndroid Build Coastguard Worker
1544*9880d681SAndroid Build Coastguard Worker
1545*9880d681SAndroid Build Coastguard Worker
1546*9880d681SAndroid Build Coastguard Worker //
1547*9880d681SAndroid Build Coastguard Worker // Test writing then reading back tagged documents
1548*9880d681SAndroid Build Coastguard Worker //
TEST(YAMLIO,TestTaggedDocumentsWriteAndRead)1549*9880d681SAndroid Build Coastguard Worker TEST(YAMLIO, TestTaggedDocumentsWriteAndRead) {
1550*9880d681SAndroid Build Coastguard Worker std::string intermediate;
1551*9880d681SAndroid Build Coastguard Worker {
1552*9880d681SAndroid Build Coastguard Worker MyDouble a(10.25);
1553*9880d681SAndroid Build Coastguard Worker MyDouble b(-3.75);
1554*9880d681SAndroid Build Coastguard Worker std::vector<MyDouble> docList;
1555*9880d681SAndroid Build Coastguard Worker docList.push_back(a);
1556*9880d681SAndroid Build Coastguard Worker docList.push_back(b);
1557*9880d681SAndroid Build Coastguard Worker
1558*9880d681SAndroid Build Coastguard Worker llvm::raw_string_ostream ostr(intermediate);
1559*9880d681SAndroid Build Coastguard Worker Output yout(ostr);
1560*9880d681SAndroid Build Coastguard Worker yout << docList;
1561*9880d681SAndroid Build Coastguard Worker }
1562*9880d681SAndroid Build Coastguard Worker
1563*9880d681SAndroid Build Coastguard Worker {
1564*9880d681SAndroid Build Coastguard Worker Input yin(intermediate);
1565*9880d681SAndroid Build Coastguard Worker std::vector<MyDouble> docList2;
1566*9880d681SAndroid Build Coastguard Worker yin >> docList2;
1567*9880d681SAndroid Build Coastguard Worker
1568*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(yin.error());
1569*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(docList2.size(), 2UL);
1570*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(docList2[0].value, 10.25);
1571*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(docList2[1].value, -3.75);
1572*9880d681SAndroid Build Coastguard Worker }
1573*9880d681SAndroid Build Coastguard Worker }
1574*9880d681SAndroid Build Coastguard Worker
1575*9880d681SAndroid Build Coastguard Worker
1576*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
1577*9880d681SAndroid Build Coastguard Worker // Test mapping validation
1578*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
1579*9880d681SAndroid Build Coastguard Worker
1580*9880d681SAndroid Build Coastguard Worker struct MyValidation {
1581*9880d681SAndroid Build Coastguard Worker double value;
1582*9880d681SAndroid Build Coastguard Worker };
1583*9880d681SAndroid Build Coastguard Worker
1584*9880d681SAndroid Build Coastguard Worker LLVM_YAML_IS_DOCUMENT_LIST_VECTOR(MyValidation)
1585*9880d681SAndroid Build Coastguard Worker
1586*9880d681SAndroid Build Coastguard Worker namespace llvm {
1587*9880d681SAndroid Build Coastguard Worker namespace yaml {
1588*9880d681SAndroid Build Coastguard Worker template <>
1589*9880d681SAndroid Build Coastguard Worker struct MappingTraits<MyValidation> {
mappingllvm::yaml::MappingTraits1590*9880d681SAndroid Build Coastguard Worker static void mapping(IO &io, MyValidation &d) {
1591*9880d681SAndroid Build Coastguard Worker io.mapRequired("value", d.value);
1592*9880d681SAndroid Build Coastguard Worker }
validatellvm::yaml::MappingTraits1593*9880d681SAndroid Build Coastguard Worker static StringRef validate(IO &io, MyValidation &d) {
1594*9880d681SAndroid Build Coastguard Worker if (d.value < 0)
1595*9880d681SAndroid Build Coastguard Worker return "negative value";
1596*9880d681SAndroid Build Coastguard Worker return StringRef();
1597*9880d681SAndroid Build Coastguard Worker }
1598*9880d681SAndroid Build Coastguard Worker };
1599*9880d681SAndroid Build Coastguard Worker }
1600*9880d681SAndroid Build Coastguard Worker }
1601*9880d681SAndroid Build Coastguard Worker
1602*9880d681SAndroid Build Coastguard Worker
1603*9880d681SAndroid Build Coastguard Worker //
1604*9880d681SAndroid Build Coastguard Worker // Test that validate() is called and complains about the negative value.
1605*9880d681SAndroid Build Coastguard Worker //
TEST(YAMLIO,TestValidatingInput)1606*9880d681SAndroid Build Coastguard Worker TEST(YAMLIO, TestValidatingInput) {
1607*9880d681SAndroid Build Coastguard Worker std::vector<MyValidation> docList;
1608*9880d681SAndroid Build Coastguard Worker Input yin("--- \nvalue: 3.0\n"
1609*9880d681SAndroid Build Coastguard Worker "--- \nvalue: -1.0\n...\n",
1610*9880d681SAndroid Build Coastguard Worker nullptr, suppressErrorMessages);
1611*9880d681SAndroid Build Coastguard Worker yin >> docList;
1612*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(!!yin.error());
1613*9880d681SAndroid Build Coastguard Worker }
1614*9880d681SAndroid Build Coastguard Worker
1615*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
1616*9880d681SAndroid Build Coastguard Worker // Test flow mapping
1617*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
1618*9880d681SAndroid Build Coastguard Worker
1619*9880d681SAndroid Build Coastguard Worker struct FlowFooBar {
1620*9880d681SAndroid Build Coastguard Worker int foo;
1621*9880d681SAndroid Build Coastguard Worker int bar;
1622*9880d681SAndroid Build Coastguard Worker
FlowFooBarFlowFooBar1623*9880d681SAndroid Build Coastguard Worker FlowFooBar() : foo(0), bar(0) {}
FlowFooBarFlowFooBar1624*9880d681SAndroid Build Coastguard Worker FlowFooBar(int foo, int bar) : foo(foo), bar(bar) {}
1625*9880d681SAndroid Build Coastguard Worker };
1626*9880d681SAndroid Build Coastguard Worker
1627*9880d681SAndroid Build Coastguard Worker typedef std::vector<FlowFooBar> FlowFooBarSequence;
1628*9880d681SAndroid Build Coastguard Worker
1629*9880d681SAndroid Build Coastguard Worker LLVM_YAML_IS_SEQUENCE_VECTOR(FlowFooBar)
1630*9880d681SAndroid Build Coastguard Worker
1631*9880d681SAndroid Build Coastguard Worker struct FlowFooBarDoc {
1632*9880d681SAndroid Build Coastguard Worker FlowFooBar attribute;
1633*9880d681SAndroid Build Coastguard Worker FlowFooBarSequence seq;
1634*9880d681SAndroid Build Coastguard Worker };
1635*9880d681SAndroid Build Coastguard Worker
1636*9880d681SAndroid Build Coastguard Worker namespace llvm {
1637*9880d681SAndroid Build Coastguard Worker namespace yaml {
1638*9880d681SAndroid Build Coastguard Worker template <>
1639*9880d681SAndroid Build Coastguard Worker struct MappingTraits<FlowFooBar> {
mappingllvm::yaml::MappingTraits1640*9880d681SAndroid Build Coastguard Worker static void mapping(IO &io, FlowFooBar &fb) {
1641*9880d681SAndroid Build Coastguard Worker io.mapRequired("foo", fb.foo);
1642*9880d681SAndroid Build Coastguard Worker io.mapRequired("bar", fb.bar);
1643*9880d681SAndroid Build Coastguard Worker }
1644*9880d681SAndroid Build Coastguard Worker
1645*9880d681SAndroid Build Coastguard Worker static const bool flow = true;
1646*9880d681SAndroid Build Coastguard Worker };
1647*9880d681SAndroid Build Coastguard Worker
1648*9880d681SAndroid Build Coastguard Worker template <>
1649*9880d681SAndroid Build Coastguard Worker struct MappingTraits<FlowFooBarDoc> {
mappingllvm::yaml::MappingTraits1650*9880d681SAndroid Build Coastguard Worker static void mapping(IO &io, FlowFooBarDoc &fb) {
1651*9880d681SAndroid Build Coastguard Worker io.mapRequired("attribute", fb.attribute);
1652*9880d681SAndroid Build Coastguard Worker io.mapRequired("seq", fb.seq);
1653*9880d681SAndroid Build Coastguard Worker }
1654*9880d681SAndroid Build Coastguard Worker };
1655*9880d681SAndroid Build Coastguard Worker }
1656*9880d681SAndroid Build Coastguard Worker }
1657*9880d681SAndroid Build Coastguard Worker
1658*9880d681SAndroid Build Coastguard Worker //
1659*9880d681SAndroid Build Coastguard Worker // Test writing then reading back custom mappings
1660*9880d681SAndroid Build Coastguard Worker //
TEST(YAMLIO,TestReadWriteMyFlowMapping)1661*9880d681SAndroid Build Coastguard Worker TEST(YAMLIO, TestReadWriteMyFlowMapping) {
1662*9880d681SAndroid Build Coastguard Worker std::string intermediate;
1663*9880d681SAndroid Build Coastguard Worker {
1664*9880d681SAndroid Build Coastguard Worker FlowFooBarDoc doc;
1665*9880d681SAndroid Build Coastguard Worker doc.attribute = FlowFooBar(42, 907);
1666*9880d681SAndroid Build Coastguard Worker doc.seq.push_back(FlowFooBar(1, 2));
1667*9880d681SAndroid Build Coastguard Worker doc.seq.push_back(FlowFooBar(0, 0));
1668*9880d681SAndroid Build Coastguard Worker doc.seq.push_back(FlowFooBar(-1, 1024));
1669*9880d681SAndroid Build Coastguard Worker
1670*9880d681SAndroid Build Coastguard Worker llvm::raw_string_ostream ostr(intermediate);
1671*9880d681SAndroid Build Coastguard Worker Output yout(ostr);
1672*9880d681SAndroid Build Coastguard Worker yout << doc;
1673*9880d681SAndroid Build Coastguard Worker
1674*9880d681SAndroid Build Coastguard Worker // Verify that mappings were written in flow style
1675*9880d681SAndroid Build Coastguard Worker ostr.flush();
1676*9880d681SAndroid Build Coastguard Worker llvm::StringRef flowOut(intermediate);
1677*9880d681SAndroid Build Coastguard Worker EXPECT_NE(llvm::StringRef::npos, flowOut.find("{ foo: 42, bar: 907 }"));
1678*9880d681SAndroid Build Coastguard Worker EXPECT_NE(llvm::StringRef::npos, flowOut.find("- { foo: 1, bar: 2 }"));
1679*9880d681SAndroid Build Coastguard Worker EXPECT_NE(llvm::StringRef::npos, flowOut.find("- { foo: 0, bar: 0 }"));
1680*9880d681SAndroid Build Coastguard Worker EXPECT_NE(llvm::StringRef::npos, flowOut.find("- { foo: -1, bar: 1024 }"));
1681*9880d681SAndroid Build Coastguard Worker }
1682*9880d681SAndroid Build Coastguard Worker
1683*9880d681SAndroid Build Coastguard Worker {
1684*9880d681SAndroid Build Coastguard Worker Input yin(intermediate);
1685*9880d681SAndroid Build Coastguard Worker FlowFooBarDoc doc2;
1686*9880d681SAndroid Build Coastguard Worker yin >> doc2;
1687*9880d681SAndroid Build Coastguard Worker
1688*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(yin.error());
1689*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(doc2.attribute.foo, 42);
1690*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(doc2.attribute.bar, 907);
1691*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(doc2.seq.size(), 3UL);
1692*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(doc2.seq[0].foo, 1);
1693*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(doc2.seq[0].bar, 2);
1694*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(doc2.seq[1].foo, 0);
1695*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(doc2.seq[1].bar, 0);
1696*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(doc2.seq[2].foo, -1);
1697*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(doc2.seq[2].bar, 1024);
1698*9880d681SAndroid Build Coastguard Worker }
1699*9880d681SAndroid Build Coastguard Worker }
1700*9880d681SAndroid Build Coastguard Worker
1701*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
1702*9880d681SAndroid Build Coastguard Worker // Test error handling
1703*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
1704*9880d681SAndroid Build Coastguard Worker
1705*9880d681SAndroid Build Coastguard Worker //
1706*9880d681SAndroid Build Coastguard Worker // Test error handling of unknown enumerated scalar
1707*9880d681SAndroid Build Coastguard Worker //
TEST(YAMLIO,TestColorsReadError)1708*9880d681SAndroid Build Coastguard Worker TEST(YAMLIO, TestColorsReadError) {
1709*9880d681SAndroid Build Coastguard Worker ColorMap map;
1710*9880d681SAndroid Build Coastguard Worker Input yin("---\n"
1711*9880d681SAndroid Build Coastguard Worker "c1: blue\n"
1712*9880d681SAndroid Build Coastguard Worker "c2: purple\n"
1713*9880d681SAndroid Build Coastguard Worker "c3: green\n"
1714*9880d681SAndroid Build Coastguard Worker "...\n",
1715*9880d681SAndroid Build Coastguard Worker /*Ctxt=*/nullptr,
1716*9880d681SAndroid Build Coastguard Worker suppressErrorMessages);
1717*9880d681SAndroid Build Coastguard Worker yin >> map;
1718*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(!!yin.error());
1719*9880d681SAndroid Build Coastguard Worker }
1720*9880d681SAndroid Build Coastguard Worker
1721*9880d681SAndroid Build Coastguard Worker
1722*9880d681SAndroid Build Coastguard Worker //
1723*9880d681SAndroid Build Coastguard Worker // Test error handling of flow sequence with unknown value
1724*9880d681SAndroid Build Coastguard Worker //
TEST(YAMLIO,TestFlagsReadError)1725*9880d681SAndroid Build Coastguard Worker TEST(YAMLIO, TestFlagsReadError) {
1726*9880d681SAndroid Build Coastguard Worker FlagsMap map;
1727*9880d681SAndroid Build Coastguard Worker Input yin("---\n"
1728*9880d681SAndroid Build Coastguard Worker "f1: [ big ]\n"
1729*9880d681SAndroid Build Coastguard Worker "f2: [ round, hollow ]\n"
1730*9880d681SAndroid Build Coastguard Worker "f3: []\n"
1731*9880d681SAndroid Build Coastguard Worker "...\n",
1732*9880d681SAndroid Build Coastguard Worker /*Ctxt=*/nullptr,
1733*9880d681SAndroid Build Coastguard Worker suppressErrorMessages);
1734*9880d681SAndroid Build Coastguard Worker yin >> map;
1735*9880d681SAndroid Build Coastguard Worker
1736*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(!!yin.error());
1737*9880d681SAndroid Build Coastguard Worker }
1738*9880d681SAndroid Build Coastguard Worker
1739*9880d681SAndroid Build Coastguard Worker
1740*9880d681SAndroid Build Coastguard Worker //
1741*9880d681SAndroid Build Coastguard Worker // Test error handling reading built-in uint8_t type
1742*9880d681SAndroid Build Coastguard Worker //
1743*9880d681SAndroid Build Coastguard Worker LLVM_YAML_IS_SEQUENCE_VECTOR(uint8_t)
TEST(YAMLIO,TestReadBuiltInTypesUint8Error)1744*9880d681SAndroid Build Coastguard Worker TEST(YAMLIO, TestReadBuiltInTypesUint8Error) {
1745*9880d681SAndroid Build Coastguard Worker std::vector<uint8_t> seq;
1746*9880d681SAndroid Build Coastguard Worker Input yin("---\n"
1747*9880d681SAndroid Build Coastguard Worker "- 255\n"
1748*9880d681SAndroid Build Coastguard Worker "- 0\n"
1749*9880d681SAndroid Build Coastguard Worker "- 257\n"
1750*9880d681SAndroid Build Coastguard Worker "...\n",
1751*9880d681SAndroid Build Coastguard Worker /*Ctxt=*/nullptr,
1752*9880d681SAndroid Build Coastguard Worker suppressErrorMessages);
1753*9880d681SAndroid Build Coastguard Worker yin >> seq;
1754*9880d681SAndroid Build Coastguard Worker
1755*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(!!yin.error());
1756*9880d681SAndroid Build Coastguard Worker }
1757*9880d681SAndroid Build Coastguard Worker
1758*9880d681SAndroid Build Coastguard Worker
1759*9880d681SAndroid Build Coastguard Worker //
1760*9880d681SAndroid Build Coastguard Worker // Test error handling reading built-in uint16_t type
1761*9880d681SAndroid Build Coastguard Worker //
1762*9880d681SAndroid Build Coastguard Worker LLVM_YAML_IS_SEQUENCE_VECTOR(uint16_t)
TEST(YAMLIO,TestReadBuiltInTypesUint16Error)1763*9880d681SAndroid Build Coastguard Worker TEST(YAMLIO, TestReadBuiltInTypesUint16Error) {
1764*9880d681SAndroid Build Coastguard Worker std::vector<uint16_t> seq;
1765*9880d681SAndroid Build Coastguard Worker Input yin("---\n"
1766*9880d681SAndroid Build Coastguard Worker "- 65535\n"
1767*9880d681SAndroid Build Coastguard Worker "- 0\n"
1768*9880d681SAndroid Build Coastguard Worker "- 66000\n"
1769*9880d681SAndroid Build Coastguard Worker "...\n",
1770*9880d681SAndroid Build Coastguard Worker /*Ctxt=*/nullptr,
1771*9880d681SAndroid Build Coastguard Worker suppressErrorMessages);
1772*9880d681SAndroid Build Coastguard Worker yin >> seq;
1773*9880d681SAndroid Build Coastguard Worker
1774*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(!!yin.error());
1775*9880d681SAndroid Build Coastguard Worker }
1776*9880d681SAndroid Build Coastguard Worker
1777*9880d681SAndroid Build Coastguard Worker
1778*9880d681SAndroid Build Coastguard Worker //
1779*9880d681SAndroid Build Coastguard Worker // Test error handling reading built-in uint32_t type
1780*9880d681SAndroid Build Coastguard Worker //
1781*9880d681SAndroid Build Coastguard Worker LLVM_YAML_IS_SEQUENCE_VECTOR(uint32_t)
TEST(YAMLIO,TestReadBuiltInTypesUint32Error)1782*9880d681SAndroid Build Coastguard Worker TEST(YAMLIO, TestReadBuiltInTypesUint32Error) {
1783*9880d681SAndroid Build Coastguard Worker std::vector<uint32_t> seq;
1784*9880d681SAndroid Build Coastguard Worker Input yin("---\n"
1785*9880d681SAndroid Build Coastguard Worker "- 4000000000\n"
1786*9880d681SAndroid Build Coastguard Worker "- 0\n"
1787*9880d681SAndroid Build Coastguard Worker "- 5000000000\n"
1788*9880d681SAndroid Build Coastguard Worker "...\n",
1789*9880d681SAndroid Build Coastguard Worker /*Ctxt=*/nullptr,
1790*9880d681SAndroid Build Coastguard Worker suppressErrorMessages);
1791*9880d681SAndroid Build Coastguard Worker yin >> seq;
1792*9880d681SAndroid Build Coastguard Worker
1793*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(!!yin.error());
1794*9880d681SAndroid Build Coastguard Worker }
1795*9880d681SAndroid Build Coastguard Worker
1796*9880d681SAndroid Build Coastguard Worker
1797*9880d681SAndroid Build Coastguard Worker //
1798*9880d681SAndroid Build Coastguard Worker // Test error handling reading built-in uint64_t type
1799*9880d681SAndroid Build Coastguard Worker //
1800*9880d681SAndroid Build Coastguard Worker LLVM_YAML_IS_SEQUENCE_VECTOR(uint64_t)
TEST(YAMLIO,TestReadBuiltInTypesUint64Error)1801*9880d681SAndroid Build Coastguard Worker TEST(YAMLIO, TestReadBuiltInTypesUint64Error) {
1802*9880d681SAndroid Build Coastguard Worker std::vector<uint64_t> seq;
1803*9880d681SAndroid Build Coastguard Worker Input yin("---\n"
1804*9880d681SAndroid Build Coastguard Worker "- 18446744073709551615\n"
1805*9880d681SAndroid Build Coastguard Worker "- 0\n"
1806*9880d681SAndroid Build Coastguard Worker "- 19446744073709551615\n"
1807*9880d681SAndroid Build Coastguard Worker "...\n",
1808*9880d681SAndroid Build Coastguard Worker /*Ctxt=*/nullptr,
1809*9880d681SAndroid Build Coastguard Worker suppressErrorMessages);
1810*9880d681SAndroid Build Coastguard Worker yin >> seq;
1811*9880d681SAndroid Build Coastguard Worker
1812*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(!!yin.error());
1813*9880d681SAndroid Build Coastguard Worker }
1814*9880d681SAndroid Build Coastguard Worker
1815*9880d681SAndroid Build Coastguard Worker
1816*9880d681SAndroid Build Coastguard Worker //
1817*9880d681SAndroid Build Coastguard Worker // Test error handling reading built-in int8_t type
1818*9880d681SAndroid Build Coastguard Worker //
1819*9880d681SAndroid Build Coastguard Worker LLVM_YAML_IS_SEQUENCE_VECTOR(int8_t)
TEST(YAMLIO,TestReadBuiltInTypesint8OverError)1820*9880d681SAndroid Build Coastguard Worker TEST(YAMLIO, TestReadBuiltInTypesint8OverError) {
1821*9880d681SAndroid Build Coastguard Worker std::vector<int8_t> seq;
1822*9880d681SAndroid Build Coastguard Worker Input yin("---\n"
1823*9880d681SAndroid Build Coastguard Worker "- -128\n"
1824*9880d681SAndroid Build Coastguard Worker "- 0\n"
1825*9880d681SAndroid Build Coastguard Worker "- 127\n"
1826*9880d681SAndroid Build Coastguard Worker "- 128\n"
1827*9880d681SAndroid Build Coastguard Worker "...\n",
1828*9880d681SAndroid Build Coastguard Worker /*Ctxt=*/nullptr,
1829*9880d681SAndroid Build Coastguard Worker suppressErrorMessages);
1830*9880d681SAndroid Build Coastguard Worker yin >> seq;
1831*9880d681SAndroid Build Coastguard Worker
1832*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(!!yin.error());
1833*9880d681SAndroid Build Coastguard Worker }
1834*9880d681SAndroid Build Coastguard Worker
1835*9880d681SAndroid Build Coastguard Worker //
1836*9880d681SAndroid Build Coastguard Worker // Test error handling reading built-in int8_t type
1837*9880d681SAndroid Build Coastguard Worker //
TEST(YAMLIO,TestReadBuiltInTypesint8UnderError)1838*9880d681SAndroid Build Coastguard Worker TEST(YAMLIO, TestReadBuiltInTypesint8UnderError) {
1839*9880d681SAndroid Build Coastguard Worker std::vector<int8_t> seq;
1840*9880d681SAndroid Build Coastguard Worker Input yin("---\n"
1841*9880d681SAndroid Build Coastguard Worker "- -128\n"
1842*9880d681SAndroid Build Coastguard Worker "- 0\n"
1843*9880d681SAndroid Build Coastguard Worker "- 127\n"
1844*9880d681SAndroid Build Coastguard Worker "- -129\n"
1845*9880d681SAndroid Build Coastguard Worker "...\n",
1846*9880d681SAndroid Build Coastguard Worker /*Ctxt=*/nullptr,
1847*9880d681SAndroid Build Coastguard Worker suppressErrorMessages);
1848*9880d681SAndroid Build Coastguard Worker yin >> seq;
1849*9880d681SAndroid Build Coastguard Worker
1850*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(!!yin.error());
1851*9880d681SAndroid Build Coastguard Worker }
1852*9880d681SAndroid Build Coastguard Worker
1853*9880d681SAndroid Build Coastguard Worker
1854*9880d681SAndroid Build Coastguard Worker //
1855*9880d681SAndroid Build Coastguard Worker // Test error handling reading built-in int16_t type
1856*9880d681SAndroid Build Coastguard Worker //
1857*9880d681SAndroid Build Coastguard Worker LLVM_YAML_IS_SEQUENCE_VECTOR(int16_t)
TEST(YAMLIO,TestReadBuiltInTypesint16UnderError)1858*9880d681SAndroid Build Coastguard Worker TEST(YAMLIO, TestReadBuiltInTypesint16UnderError) {
1859*9880d681SAndroid Build Coastguard Worker std::vector<int16_t> seq;
1860*9880d681SAndroid Build Coastguard Worker Input yin("---\n"
1861*9880d681SAndroid Build Coastguard Worker "- 32767\n"
1862*9880d681SAndroid Build Coastguard Worker "- 0\n"
1863*9880d681SAndroid Build Coastguard Worker "- -32768\n"
1864*9880d681SAndroid Build Coastguard Worker "- -32769\n"
1865*9880d681SAndroid Build Coastguard Worker "...\n",
1866*9880d681SAndroid Build Coastguard Worker /*Ctxt=*/nullptr,
1867*9880d681SAndroid Build Coastguard Worker suppressErrorMessages);
1868*9880d681SAndroid Build Coastguard Worker yin >> seq;
1869*9880d681SAndroid Build Coastguard Worker
1870*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(!!yin.error());
1871*9880d681SAndroid Build Coastguard Worker }
1872*9880d681SAndroid Build Coastguard Worker
1873*9880d681SAndroid Build Coastguard Worker
1874*9880d681SAndroid Build Coastguard Worker //
1875*9880d681SAndroid Build Coastguard Worker // Test error handling reading built-in int16_t type
1876*9880d681SAndroid Build Coastguard Worker //
TEST(YAMLIO,TestReadBuiltInTypesint16OverError)1877*9880d681SAndroid Build Coastguard Worker TEST(YAMLIO, TestReadBuiltInTypesint16OverError) {
1878*9880d681SAndroid Build Coastguard Worker std::vector<int16_t> seq;
1879*9880d681SAndroid Build Coastguard Worker Input yin("---\n"
1880*9880d681SAndroid Build Coastguard Worker "- 32767\n"
1881*9880d681SAndroid Build Coastguard Worker "- 0\n"
1882*9880d681SAndroid Build Coastguard Worker "- -32768\n"
1883*9880d681SAndroid Build Coastguard Worker "- 32768\n"
1884*9880d681SAndroid Build Coastguard Worker "...\n",
1885*9880d681SAndroid Build Coastguard Worker /*Ctxt=*/nullptr,
1886*9880d681SAndroid Build Coastguard Worker suppressErrorMessages);
1887*9880d681SAndroid Build Coastguard Worker yin >> seq;
1888*9880d681SAndroid Build Coastguard Worker
1889*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(!!yin.error());
1890*9880d681SAndroid Build Coastguard Worker }
1891*9880d681SAndroid Build Coastguard Worker
1892*9880d681SAndroid Build Coastguard Worker
1893*9880d681SAndroid Build Coastguard Worker //
1894*9880d681SAndroid Build Coastguard Worker // Test error handling reading built-in int32_t type
1895*9880d681SAndroid Build Coastguard Worker //
1896*9880d681SAndroid Build Coastguard Worker LLVM_YAML_IS_SEQUENCE_VECTOR(int32_t)
TEST(YAMLIO,TestReadBuiltInTypesint32UnderError)1897*9880d681SAndroid Build Coastguard Worker TEST(YAMLIO, TestReadBuiltInTypesint32UnderError) {
1898*9880d681SAndroid Build Coastguard Worker std::vector<int32_t> seq;
1899*9880d681SAndroid Build Coastguard Worker Input yin("---\n"
1900*9880d681SAndroid Build Coastguard Worker "- 2147483647\n"
1901*9880d681SAndroid Build Coastguard Worker "- 0\n"
1902*9880d681SAndroid Build Coastguard Worker "- -2147483648\n"
1903*9880d681SAndroid Build Coastguard Worker "- -2147483649\n"
1904*9880d681SAndroid Build Coastguard Worker "...\n",
1905*9880d681SAndroid Build Coastguard Worker /*Ctxt=*/nullptr,
1906*9880d681SAndroid Build Coastguard Worker suppressErrorMessages);
1907*9880d681SAndroid Build Coastguard Worker yin >> seq;
1908*9880d681SAndroid Build Coastguard Worker
1909*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(!!yin.error());
1910*9880d681SAndroid Build Coastguard Worker }
1911*9880d681SAndroid Build Coastguard Worker
1912*9880d681SAndroid Build Coastguard Worker //
1913*9880d681SAndroid Build Coastguard Worker // Test error handling reading built-in int32_t type
1914*9880d681SAndroid Build Coastguard Worker //
TEST(YAMLIO,TestReadBuiltInTypesint32OverError)1915*9880d681SAndroid Build Coastguard Worker TEST(YAMLIO, TestReadBuiltInTypesint32OverError) {
1916*9880d681SAndroid Build Coastguard Worker std::vector<int32_t> seq;
1917*9880d681SAndroid Build Coastguard Worker Input yin("---\n"
1918*9880d681SAndroid Build Coastguard Worker "- 2147483647\n"
1919*9880d681SAndroid Build Coastguard Worker "- 0\n"
1920*9880d681SAndroid Build Coastguard Worker "- -2147483648\n"
1921*9880d681SAndroid Build Coastguard Worker "- 2147483649\n"
1922*9880d681SAndroid Build Coastguard Worker "...\n",
1923*9880d681SAndroid Build Coastguard Worker /*Ctxt=*/nullptr,
1924*9880d681SAndroid Build Coastguard Worker suppressErrorMessages);
1925*9880d681SAndroid Build Coastguard Worker yin >> seq;
1926*9880d681SAndroid Build Coastguard Worker
1927*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(!!yin.error());
1928*9880d681SAndroid Build Coastguard Worker }
1929*9880d681SAndroid Build Coastguard Worker
1930*9880d681SAndroid Build Coastguard Worker
1931*9880d681SAndroid Build Coastguard Worker //
1932*9880d681SAndroid Build Coastguard Worker // Test error handling reading built-in int64_t type
1933*9880d681SAndroid Build Coastguard Worker //
1934*9880d681SAndroid Build Coastguard Worker LLVM_YAML_IS_SEQUENCE_VECTOR(int64_t)
TEST(YAMLIO,TestReadBuiltInTypesint64UnderError)1935*9880d681SAndroid Build Coastguard Worker TEST(YAMLIO, TestReadBuiltInTypesint64UnderError) {
1936*9880d681SAndroid Build Coastguard Worker std::vector<int64_t> seq;
1937*9880d681SAndroid Build Coastguard Worker Input yin("---\n"
1938*9880d681SAndroid Build Coastguard Worker "- -9223372036854775808\n"
1939*9880d681SAndroid Build Coastguard Worker "- 0\n"
1940*9880d681SAndroid Build Coastguard Worker "- 9223372036854775807\n"
1941*9880d681SAndroid Build Coastguard Worker "- -9223372036854775809\n"
1942*9880d681SAndroid Build Coastguard Worker "...\n",
1943*9880d681SAndroid Build Coastguard Worker /*Ctxt=*/nullptr,
1944*9880d681SAndroid Build Coastguard Worker suppressErrorMessages);
1945*9880d681SAndroid Build Coastguard Worker yin >> seq;
1946*9880d681SAndroid Build Coastguard Worker
1947*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(!!yin.error());
1948*9880d681SAndroid Build Coastguard Worker }
1949*9880d681SAndroid Build Coastguard Worker
1950*9880d681SAndroid Build Coastguard Worker //
1951*9880d681SAndroid Build Coastguard Worker // Test error handling reading built-in int64_t type
1952*9880d681SAndroid Build Coastguard Worker //
TEST(YAMLIO,TestReadBuiltInTypesint64OverError)1953*9880d681SAndroid Build Coastguard Worker TEST(YAMLIO, TestReadBuiltInTypesint64OverError) {
1954*9880d681SAndroid Build Coastguard Worker std::vector<int64_t> seq;
1955*9880d681SAndroid Build Coastguard Worker Input yin("---\n"
1956*9880d681SAndroid Build Coastguard Worker "- -9223372036854775808\n"
1957*9880d681SAndroid Build Coastguard Worker "- 0\n"
1958*9880d681SAndroid Build Coastguard Worker "- 9223372036854775807\n"
1959*9880d681SAndroid Build Coastguard Worker "- 9223372036854775809\n"
1960*9880d681SAndroid Build Coastguard Worker "...\n",
1961*9880d681SAndroid Build Coastguard Worker /*Ctxt=*/nullptr,
1962*9880d681SAndroid Build Coastguard Worker suppressErrorMessages);
1963*9880d681SAndroid Build Coastguard Worker yin >> seq;
1964*9880d681SAndroid Build Coastguard Worker
1965*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(!!yin.error());
1966*9880d681SAndroid Build Coastguard Worker }
1967*9880d681SAndroid Build Coastguard Worker
1968*9880d681SAndroid Build Coastguard Worker //
1969*9880d681SAndroid Build Coastguard Worker // Test error handling reading built-in float type
1970*9880d681SAndroid Build Coastguard Worker //
1971*9880d681SAndroid Build Coastguard Worker LLVM_YAML_IS_SEQUENCE_VECTOR(float)
TEST(YAMLIO,TestReadBuiltInTypesFloatError)1972*9880d681SAndroid Build Coastguard Worker TEST(YAMLIO, TestReadBuiltInTypesFloatError) {
1973*9880d681SAndroid Build Coastguard Worker std::vector<float> seq;
1974*9880d681SAndroid Build Coastguard Worker Input yin("---\n"
1975*9880d681SAndroid Build Coastguard Worker "- 0.0\n"
1976*9880d681SAndroid Build Coastguard Worker "- 1000.1\n"
1977*9880d681SAndroid Build Coastguard Worker "- -123.456\n"
1978*9880d681SAndroid Build Coastguard Worker "- 1.2.3\n"
1979*9880d681SAndroid Build Coastguard Worker "...\n",
1980*9880d681SAndroid Build Coastguard Worker /*Ctxt=*/nullptr,
1981*9880d681SAndroid Build Coastguard Worker suppressErrorMessages);
1982*9880d681SAndroid Build Coastguard Worker yin >> seq;
1983*9880d681SAndroid Build Coastguard Worker
1984*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(!!yin.error());
1985*9880d681SAndroid Build Coastguard Worker }
1986*9880d681SAndroid Build Coastguard Worker
1987*9880d681SAndroid Build Coastguard Worker //
1988*9880d681SAndroid Build Coastguard Worker // Test error handling reading built-in float type
1989*9880d681SAndroid Build Coastguard Worker //
1990*9880d681SAndroid Build Coastguard Worker LLVM_YAML_IS_SEQUENCE_VECTOR(double)
TEST(YAMLIO,TestReadBuiltInTypesDoubleError)1991*9880d681SAndroid Build Coastguard Worker TEST(YAMLIO, TestReadBuiltInTypesDoubleError) {
1992*9880d681SAndroid Build Coastguard Worker std::vector<double> seq;
1993*9880d681SAndroid Build Coastguard Worker Input yin("---\n"
1994*9880d681SAndroid Build Coastguard Worker "- 0.0\n"
1995*9880d681SAndroid Build Coastguard Worker "- 1000.1\n"
1996*9880d681SAndroid Build Coastguard Worker "- -123.456\n"
1997*9880d681SAndroid Build Coastguard Worker "- 1.2.3\n"
1998*9880d681SAndroid Build Coastguard Worker "...\n",
1999*9880d681SAndroid Build Coastguard Worker /*Ctxt=*/nullptr,
2000*9880d681SAndroid Build Coastguard Worker suppressErrorMessages);
2001*9880d681SAndroid Build Coastguard Worker yin >> seq;
2002*9880d681SAndroid Build Coastguard Worker
2003*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(!!yin.error());
2004*9880d681SAndroid Build Coastguard Worker }
2005*9880d681SAndroid Build Coastguard Worker
2006*9880d681SAndroid Build Coastguard Worker //
2007*9880d681SAndroid Build Coastguard Worker // Test error handling reading built-in Hex8 type
2008*9880d681SAndroid Build Coastguard Worker //
2009*9880d681SAndroid Build Coastguard Worker LLVM_YAML_IS_SEQUENCE_VECTOR(Hex8)
TEST(YAMLIO,TestReadBuiltInTypesHex8Error)2010*9880d681SAndroid Build Coastguard Worker TEST(YAMLIO, TestReadBuiltInTypesHex8Error) {
2011*9880d681SAndroid Build Coastguard Worker std::vector<Hex8> seq;
2012*9880d681SAndroid Build Coastguard Worker Input yin("---\n"
2013*9880d681SAndroid Build Coastguard Worker "- 0x12\n"
2014*9880d681SAndroid Build Coastguard Worker "- 0xFE\n"
2015*9880d681SAndroid Build Coastguard Worker "- 0x123\n"
2016*9880d681SAndroid Build Coastguard Worker "...\n",
2017*9880d681SAndroid Build Coastguard Worker /*Ctxt=*/nullptr,
2018*9880d681SAndroid Build Coastguard Worker suppressErrorMessages);
2019*9880d681SAndroid Build Coastguard Worker yin >> seq;
2020*9880d681SAndroid Build Coastguard Worker
2021*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(!!yin.error());
2022*9880d681SAndroid Build Coastguard Worker }
2023*9880d681SAndroid Build Coastguard Worker
2024*9880d681SAndroid Build Coastguard Worker
2025*9880d681SAndroid Build Coastguard Worker //
2026*9880d681SAndroid Build Coastguard Worker // Test error handling reading built-in Hex16 type
2027*9880d681SAndroid Build Coastguard Worker //
2028*9880d681SAndroid Build Coastguard Worker LLVM_YAML_IS_SEQUENCE_VECTOR(Hex16)
TEST(YAMLIO,TestReadBuiltInTypesHex16Error)2029*9880d681SAndroid Build Coastguard Worker TEST(YAMLIO, TestReadBuiltInTypesHex16Error) {
2030*9880d681SAndroid Build Coastguard Worker std::vector<Hex16> seq;
2031*9880d681SAndroid Build Coastguard Worker Input yin("---\n"
2032*9880d681SAndroid Build Coastguard Worker "- 0x0012\n"
2033*9880d681SAndroid Build Coastguard Worker "- 0xFEFF\n"
2034*9880d681SAndroid Build Coastguard Worker "- 0x12345\n"
2035*9880d681SAndroid Build Coastguard Worker "...\n",
2036*9880d681SAndroid Build Coastguard Worker /*Ctxt=*/nullptr,
2037*9880d681SAndroid Build Coastguard Worker suppressErrorMessages);
2038*9880d681SAndroid Build Coastguard Worker yin >> seq;
2039*9880d681SAndroid Build Coastguard Worker
2040*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(!!yin.error());
2041*9880d681SAndroid Build Coastguard Worker }
2042*9880d681SAndroid Build Coastguard Worker
2043*9880d681SAndroid Build Coastguard Worker //
2044*9880d681SAndroid Build Coastguard Worker // Test error handling reading built-in Hex32 type
2045*9880d681SAndroid Build Coastguard Worker //
2046*9880d681SAndroid Build Coastguard Worker LLVM_YAML_IS_SEQUENCE_VECTOR(Hex32)
TEST(YAMLIO,TestReadBuiltInTypesHex32Error)2047*9880d681SAndroid Build Coastguard Worker TEST(YAMLIO, TestReadBuiltInTypesHex32Error) {
2048*9880d681SAndroid Build Coastguard Worker std::vector<Hex32> seq;
2049*9880d681SAndroid Build Coastguard Worker Input yin("---\n"
2050*9880d681SAndroid Build Coastguard Worker "- 0x0012\n"
2051*9880d681SAndroid Build Coastguard Worker "- 0xFEFF0000\n"
2052*9880d681SAndroid Build Coastguard Worker "- 0x1234556789\n"
2053*9880d681SAndroid Build Coastguard Worker "...\n",
2054*9880d681SAndroid Build Coastguard Worker /*Ctxt=*/nullptr,
2055*9880d681SAndroid Build Coastguard Worker suppressErrorMessages);
2056*9880d681SAndroid Build Coastguard Worker yin >> seq;
2057*9880d681SAndroid Build Coastguard Worker
2058*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(!!yin.error());
2059*9880d681SAndroid Build Coastguard Worker }
2060*9880d681SAndroid Build Coastguard Worker
2061*9880d681SAndroid Build Coastguard Worker //
2062*9880d681SAndroid Build Coastguard Worker // Test error handling reading built-in Hex64 type
2063*9880d681SAndroid Build Coastguard Worker //
2064*9880d681SAndroid Build Coastguard Worker LLVM_YAML_IS_SEQUENCE_VECTOR(Hex64)
TEST(YAMLIO,TestReadBuiltInTypesHex64Error)2065*9880d681SAndroid Build Coastguard Worker TEST(YAMLIO, TestReadBuiltInTypesHex64Error) {
2066*9880d681SAndroid Build Coastguard Worker std::vector<Hex64> seq;
2067*9880d681SAndroid Build Coastguard Worker Input yin("---\n"
2068*9880d681SAndroid Build Coastguard Worker "- 0x0012\n"
2069*9880d681SAndroid Build Coastguard Worker "- 0xFFEEDDCCBBAA9988\n"
2070*9880d681SAndroid Build Coastguard Worker "- 0x12345567890ABCDEF0\n"
2071*9880d681SAndroid Build Coastguard Worker "...\n",
2072*9880d681SAndroid Build Coastguard Worker /*Ctxt=*/nullptr,
2073*9880d681SAndroid Build Coastguard Worker suppressErrorMessages);
2074*9880d681SAndroid Build Coastguard Worker yin >> seq;
2075*9880d681SAndroid Build Coastguard Worker
2076*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(!!yin.error());
2077*9880d681SAndroid Build Coastguard Worker }
2078*9880d681SAndroid Build Coastguard Worker
TEST(YAMLIO,TestMalformedMapFailsGracefully)2079*9880d681SAndroid Build Coastguard Worker TEST(YAMLIO, TestMalformedMapFailsGracefully) {
2080*9880d681SAndroid Build Coastguard Worker FooBar doc;
2081*9880d681SAndroid Build Coastguard Worker {
2082*9880d681SAndroid Build Coastguard Worker // We pass the suppressErrorMessages handler to handle the error
2083*9880d681SAndroid Build Coastguard Worker // message generated in the constructor of Input.
2084*9880d681SAndroid Build Coastguard Worker Input yin("{foo:3, bar: 5}", /*Ctxt=*/nullptr, suppressErrorMessages);
2085*9880d681SAndroid Build Coastguard Worker yin >> doc;
2086*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(!!yin.error());
2087*9880d681SAndroid Build Coastguard Worker }
2088*9880d681SAndroid Build Coastguard Worker
2089*9880d681SAndroid Build Coastguard Worker {
2090*9880d681SAndroid Build Coastguard Worker Input yin("---\nfoo:3\nbar: 5\n...\n", /*Ctxt=*/nullptr, suppressErrorMessages);
2091*9880d681SAndroid Build Coastguard Worker yin >> doc;
2092*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(!!yin.error());
2093*9880d681SAndroid Build Coastguard Worker }
2094*9880d681SAndroid Build Coastguard Worker }
2095*9880d681SAndroid Build Coastguard Worker
2096*9880d681SAndroid Build Coastguard Worker struct OptionalTest {
2097*9880d681SAndroid Build Coastguard Worker std::vector<int> Numbers;
2098*9880d681SAndroid Build Coastguard Worker };
2099*9880d681SAndroid Build Coastguard Worker
2100*9880d681SAndroid Build Coastguard Worker struct OptionalTestSeq {
2101*9880d681SAndroid Build Coastguard Worker std::vector<OptionalTest> Tests;
2102*9880d681SAndroid Build Coastguard Worker };
2103*9880d681SAndroid Build Coastguard Worker
2104*9880d681SAndroid Build Coastguard Worker LLVM_YAML_IS_SEQUENCE_VECTOR(OptionalTest)
2105*9880d681SAndroid Build Coastguard Worker namespace llvm {
2106*9880d681SAndroid Build Coastguard Worker namespace yaml {
2107*9880d681SAndroid Build Coastguard Worker template <>
2108*9880d681SAndroid Build Coastguard Worker struct MappingTraits<OptionalTest> {
mappingllvm::yaml::MappingTraits2109*9880d681SAndroid Build Coastguard Worker static void mapping(IO& IO, OptionalTest &OT) {
2110*9880d681SAndroid Build Coastguard Worker IO.mapOptional("Numbers", OT.Numbers);
2111*9880d681SAndroid Build Coastguard Worker }
2112*9880d681SAndroid Build Coastguard Worker };
2113*9880d681SAndroid Build Coastguard Worker
2114*9880d681SAndroid Build Coastguard Worker template <>
2115*9880d681SAndroid Build Coastguard Worker struct MappingTraits<OptionalTestSeq> {
mappingllvm::yaml::MappingTraits2116*9880d681SAndroid Build Coastguard Worker static void mapping(IO &IO, OptionalTestSeq &OTS) {
2117*9880d681SAndroid Build Coastguard Worker IO.mapOptional("Tests", OTS.Tests);
2118*9880d681SAndroid Build Coastguard Worker }
2119*9880d681SAndroid Build Coastguard Worker };
2120*9880d681SAndroid Build Coastguard Worker }
2121*9880d681SAndroid Build Coastguard Worker }
2122*9880d681SAndroid Build Coastguard Worker
TEST(YAMLIO,SequenceElideTest)2123*9880d681SAndroid Build Coastguard Worker TEST(YAMLIO, SequenceElideTest) {
2124*9880d681SAndroid Build Coastguard Worker // Test that writing out a purely optional structure with its fields set to
2125*9880d681SAndroid Build Coastguard Worker // default followed by other data is properly read back in.
2126*9880d681SAndroid Build Coastguard Worker OptionalTestSeq Seq;
2127*9880d681SAndroid Build Coastguard Worker OptionalTest One, Two, Three, Four;
2128*9880d681SAndroid Build Coastguard Worker int N[] = {1, 2, 3};
2129*9880d681SAndroid Build Coastguard Worker Three.Numbers.assign(N, N + 3);
2130*9880d681SAndroid Build Coastguard Worker Seq.Tests.push_back(One);
2131*9880d681SAndroid Build Coastguard Worker Seq.Tests.push_back(Two);
2132*9880d681SAndroid Build Coastguard Worker Seq.Tests.push_back(Three);
2133*9880d681SAndroid Build Coastguard Worker Seq.Tests.push_back(Four);
2134*9880d681SAndroid Build Coastguard Worker
2135*9880d681SAndroid Build Coastguard Worker std::string intermediate;
2136*9880d681SAndroid Build Coastguard Worker {
2137*9880d681SAndroid Build Coastguard Worker llvm::raw_string_ostream ostr(intermediate);
2138*9880d681SAndroid Build Coastguard Worker Output yout(ostr);
2139*9880d681SAndroid Build Coastguard Worker yout << Seq;
2140*9880d681SAndroid Build Coastguard Worker }
2141*9880d681SAndroid Build Coastguard Worker
2142*9880d681SAndroid Build Coastguard Worker Input yin(intermediate);
2143*9880d681SAndroid Build Coastguard Worker OptionalTestSeq Seq2;
2144*9880d681SAndroid Build Coastguard Worker yin >> Seq2;
2145*9880d681SAndroid Build Coastguard Worker
2146*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(yin.error());
2147*9880d681SAndroid Build Coastguard Worker
2148*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(4UL, Seq2.Tests.size());
2149*9880d681SAndroid Build Coastguard Worker
2150*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(Seq2.Tests[0].Numbers.empty());
2151*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(Seq2.Tests[1].Numbers.empty());
2152*9880d681SAndroid Build Coastguard Worker
2153*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(1, Seq2.Tests[2].Numbers[0]);
2154*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(2, Seq2.Tests[2].Numbers[1]);
2155*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(3, Seq2.Tests[2].Numbers[2]);
2156*9880d681SAndroid Build Coastguard Worker
2157*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(Seq2.Tests[3].Numbers.empty());
2158*9880d681SAndroid Build Coastguard Worker }
2159*9880d681SAndroid Build Coastguard Worker
TEST(YAMLIO,TestEmptyStringFailsForMapWithRequiredFields)2160*9880d681SAndroid Build Coastguard Worker TEST(YAMLIO, TestEmptyStringFailsForMapWithRequiredFields) {
2161*9880d681SAndroid Build Coastguard Worker FooBar doc;
2162*9880d681SAndroid Build Coastguard Worker Input yin("");
2163*9880d681SAndroid Build Coastguard Worker yin >> doc;
2164*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(!!yin.error());
2165*9880d681SAndroid Build Coastguard Worker }
2166*9880d681SAndroid Build Coastguard Worker
TEST(YAMLIO,TestEmptyStringSucceedsForMapWithOptionalFields)2167*9880d681SAndroid Build Coastguard Worker TEST(YAMLIO, TestEmptyStringSucceedsForMapWithOptionalFields) {
2168*9880d681SAndroid Build Coastguard Worker OptionalTest doc;
2169*9880d681SAndroid Build Coastguard Worker Input yin("");
2170*9880d681SAndroid Build Coastguard Worker yin >> doc;
2171*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(yin.error());
2172*9880d681SAndroid Build Coastguard Worker }
2173*9880d681SAndroid Build Coastguard Worker
TEST(YAMLIO,TestEmptyStringSucceedsForSequence)2174*9880d681SAndroid Build Coastguard Worker TEST(YAMLIO, TestEmptyStringSucceedsForSequence) {
2175*9880d681SAndroid Build Coastguard Worker std::vector<uint8_t> seq;
2176*9880d681SAndroid Build Coastguard Worker Input yin("", /*Ctxt=*/nullptr, suppressErrorMessages);
2177*9880d681SAndroid Build Coastguard Worker yin >> seq;
2178*9880d681SAndroid Build Coastguard Worker
2179*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(yin.error());
2180*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(seq.empty());
2181*9880d681SAndroid Build Coastguard Worker }
2182*9880d681SAndroid Build Coastguard Worker
2183*9880d681SAndroid Build Coastguard Worker struct FlowMap {
2184*9880d681SAndroid Build Coastguard Worker llvm::StringRef str1, str2, str3;
FlowMapFlowMap2185*9880d681SAndroid Build Coastguard Worker FlowMap(llvm::StringRef str1, llvm::StringRef str2, llvm::StringRef str3)
2186*9880d681SAndroid Build Coastguard Worker : str1(str1), str2(str2), str3(str3) {}
2187*9880d681SAndroid Build Coastguard Worker };
2188*9880d681SAndroid Build Coastguard Worker
2189*9880d681SAndroid Build Coastguard Worker struct FlowSeq {
2190*9880d681SAndroid Build Coastguard Worker llvm::StringRef str;
FlowSeqFlowSeq2191*9880d681SAndroid Build Coastguard Worker FlowSeq(llvm::StringRef S) : str(S) {}
2192*9880d681SAndroid Build Coastguard Worker FlowSeq() = default;
2193*9880d681SAndroid Build Coastguard Worker };
2194*9880d681SAndroid Build Coastguard Worker
2195*9880d681SAndroid Build Coastguard Worker namespace llvm {
2196*9880d681SAndroid Build Coastguard Worker namespace yaml {
2197*9880d681SAndroid Build Coastguard Worker template <>
2198*9880d681SAndroid Build Coastguard Worker struct MappingTraits<FlowMap> {
mappingllvm::yaml::MappingTraits2199*9880d681SAndroid Build Coastguard Worker static void mapping(IO &io, FlowMap &fm) {
2200*9880d681SAndroid Build Coastguard Worker io.mapRequired("str1", fm.str1);
2201*9880d681SAndroid Build Coastguard Worker io.mapRequired("str2", fm.str2);
2202*9880d681SAndroid Build Coastguard Worker io.mapRequired("str3", fm.str3);
2203*9880d681SAndroid Build Coastguard Worker }
2204*9880d681SAndroid Build Coastguard Worker
2205*9880d681SAndroid Build Coastguard Worker static const bool flow = true;
2206*9880d681SAndroid Build Coastguard Worker };
2207*9880d681SAndroid Build Coastguard Worker
2208*9880d681SAndroid Build Coastguard Worker template <>
2209*9880d681SAndroid Build Coastguard Worker struct ScalarTraits<FlowSeq> {
outputllvm::yaml::ScalarTraits2210*9880d681SAndroid Build Coastguard Worker static void output(const FlowSeq &value, void*, llvm::raw_ostream &out) {
2211*9880d681SAndroid Build Coastguard Worker out << value.str;
2212*9880d681SAndroid Build Coastguard Worker }
inputllvm::yaml::ScalarTraits2213*9880d681SAndroid Build Coastguard Worker static StringRef input(StringRef scalar, void*, FlowSeq &value) {
2214*9880d681SAndroid Build Coastguard Worker value.str = scalar;
2215*9880d681SAndroid Build Coastguard Worker return "";
2216*9880d681SAndroid Build Coastguard Worker }
2217*9880d681SAndroid Build Coastguard Worker
mustQuotellvm::yaml::ScalarTraits2218*9880d681SAndroid Build Coastguard Worker static bool mustQuote(StringRef S) { return false; }
2219*9880d681SAndroid Build Coastguard Worker };
2220*9880d681SAndroid Build Coastguard Worker }
2221*9880d681SAndroid Build Coastguard Worker }
2222*9880d681SAndroid Build Coastguard Worker
2223*9880d681SAndroid Build Coastguard Worker LLVM_YAML_IS_FLOW_SEQUENCE_VECTOR(FlowSeq)
2224*9880d681SAndroid Build Coastguard Worker
TEST(YAMLIO,TestWrapFlow)2225*9880d681SAndroid Build Coastguard Worker TEST(YAMLIO, TestWrapFlow) {
2226*9880d681SAndroid Build Coastguard Worker std::string out;
2227*9880d681SAndroid Build Coastguard Worker llvm::raw_string_ostream ostr(out);
2228*9880d681SAndroid Build Coastguard Worker FlowMap Map("This is str1", "This is str2", "This is str3");
2229*9880d681SAndroid Build Coastguard Worker std::vector<FlowSeq> Seq;
2230*9880d681SAndroid Build Coastguard Worker Seq.emplace_back("This is str1");
2231*9880d681SAndroid Build Coastguard Worker Seq.emplace_back("This is str2");
2232*9880d681SAndroid Build Coastguard Worker Seq.emplace_back("This is str3");
2233*9880d681SAndroid Build Coastguard Worker
2234*9880d681SAndroid Build Coastguard Worker {
2235*9880d681SAndroid Build Coastguard Worker // 20 is just bellow the total length of the first mapping field.
2236*9880d681SAndroid Build Coastguard Worker // We should wreap at every element.
2237*9880d681SAndroid Build Coastguard Worker Output yout(ostr, nullptr, 15);
2238*9880d681SAndroid Build Coastguard Worker
2239*9880d681SAndroid Build Coastguard Worker yout << Map;
2240*9880d681SAndroid Build Coastguard Worker ostr.flush();
2241*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(out,
2242*9880d681SAndroid Build Coastguard Worker "---\n"
2243*9880d681SAndroid Build Coastguard Worker "{ str1: This is str1, \n"
2244*9880d681SAndroid Build Coastguard Worker " str2: This is str2, \n"
2245*9880d681SAndroid Build Coastguard Worker " str3: This is str3 }\n"
2246*9880d681SAndroid Build Coastguard Worker "...\n");
2247*9880d681SAndroid Build Coastguard Worker out.clear();
2248*9880d681SAndroid Build Coastguard Worker
2249*9880d681SAndroid Build Coastguard Worker yout << Seq;
2250*9880d681SAndroid Build Coastguard Worker ostr.flush();
2251*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(out,
2252*9880d681SAndroid Build Coastguard Worker "---\n"
2253*9880d681SAndroid Build Coastguard Worker "[ This is str1, \n"
2254*9880d681SAndroid Build Coastguard Worker " This is str2, \n"
2255*9880d681SAndroid Build Coastguard Worker " This is str3 ]\n"
2256*9880d681SAndroid Build Coastguard Worker "...\n");
2257*9880d681SAndroid Build Coastguard Worker out.clear();
2258*9880d681SAndroid Build Coastguard Worker }
2259*9880d681SAndroid Build Coastguard Worker {
2260*9880d681SAndroid Build Coastguard Worker // 25 will allow the second field to be output on the first line.
2261*9880d681SAndroid Build Coastguard Worker Output yout(ostr, nullptr, 25);
2262*9880d681SAndroid Build Coastguard Worker
2263*9880d681SAndroid Build Coastguard Worker yout << Map;
2264*9880d681SAndroid Build Coastguard Worker ostr.flush();
2265*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(out,
2266*9880d681SAndroid Build Coastguard Worker "---\n"
2267*9880d681SAndroid Build Coastguard Worker "{ str1: This is str1, str2: This is str2, \n"
2268*9880d681SAndroid Build Coastguard Worker " str3: This is str3 }\n"
2269*9880d681SAndroid Build Coastguard Worker "...\n");
2270*9880d681SAndroid Build Coastguard Worker out.clear();
2271*9880d681SAndroid Build Coastguard Worker
2272*9880d681SAndroid Build Coastguard Worker yout << Seq;
2273*9880d681SAndroid Build Coastguard Worker ostr.flush();
2274*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(out,
2275*9880d681SAndroid Build Coastguard Worker "---\n"
2276*9880d681SAndroid Build Coastguard Worker "[ This is str1, This is str2, \n"
2277*9880d681SAndroid Build Coastguard Worker " This is str3 ]\n"
2278*9880d681SAndroid Build Coastguard Worker "...\n");
2279*9880d681SAndroid Build Coastguard Worker out.clear();
2280*9880d681SAndroid Build Coastguard Worker }
2281*9880d681SAndroid Build Coastguard Worker {
2282*9880d681SAndroid Build Coastguard Worker // 0 means no wrapping.
2283*9880d681SAndroid Build Coastguard Worker Output yout(ostr, nullptr, 0);
2284*9880d681SAndroid Build Coastguard Worker
2285*9880d681SAndroid Build Coastguard Worker yout << Map;
2286*9880d681SAndroid Build Coastguard Worker ostr.flush();
2287*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(out,
2288*9880d681SAndroid Build Coastguard Worker "---\n"
2289*9880d681SAndroid Build Coastguard Worker "{ str1: This is str1, str2: This is str2, str3: This is str3 }\n"
2290*9880d681SAndroid Build Coastguard Worker "...\n");
2291*9880d681SAndroid Build Coastguard Worker out.clear();
2292*9880d681SAndroid Build Coastguard Worker
2293*9880d681SAndroid Build Coastguard Worker yout << Seq;
2294*9880d681SAndroid Build Coastguard Worker ostr.flush();
2295*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(out,
2296*9880d681SAndroid Build Coastguard Worker "---\n"
2297*9880d681SAndroid Build Coastguard Worker "[ This is str1, This is str2, This is str3 ]\n"
2298*9880d681SAndroid Build Coastguard Worker "...\n");
2299*9880d681SAndroid Build Coastguard Worker out.clear();
2300*9880d681SAndroid Build Coastguard Worker }
2301*9880d681SAndroid Build Coastguard Worker }
2302