spectests.cpp 43 KB
Newer Older
1
#include "spectests.h"
2
3
#include "specexamples.h"
#include "yaml-cpp/yaml.h"
4
#include <iostream>
5
6

#define YAML_ASSERT(cond) do { if(!(cond)) return "  Assert failed: " #cond; } while(false)
7

8
9
10
namespace Test
{
	namespace Spec
11
	{
12
		// 2.1
13
		TEST SeqScalars() {
14
			YAML::Node doc = YAML::Load(ex2_1);
15
			YAML_ASSERT(doc.IsSequence());
16
17
18
19
20
21
			YAML_ASSERT(doc.size() == 3);
			YAML_ASSERT(doc[0].as<std::string>() == "Mark McGwire");
			YAML_ASSERT(doc[1].as<std::string>() == "Sammy Sosa");
			YAML_ASSERT(doc[2].as<std::string>() == "Ken Griffey");
			return true;
		}
22
23
		
		// 2.2
24
		TEST MappingScalarsToScalars() {
25
			YAML::Node doc = YAML::Load(ex2_2);
26
			YAML_ASSERT(doc.IsMap());
27
28
29
30
31
32
			YAML_ASSERT(doc.size() == 3);
			YAML_ASSERT(doc["hr"].as<std::string>() == "65");
			YAML_ASSERT(doc["avg"].as<std::string>() == "0.278");
			YAML_ASSERT(doc["rbi"].as<std::string>() == "147");
			return true;
		}
33
34
		
		// 2.3
35
		TEST MappingScalarsToSequences() {
36
			YAML::Node doc = YAML::Load(ex2_3);
37
			YAML_ASSERT(doc.IsMap());
38
39
40
41
42
43
44
45
46
47
48
			YAML_ASSERT(doc.size() == 2);
			YAML_ASSERT(doc["american"].size() == 3);
			YAML_ASSERT(doc["american"][0].as<std::string>() == "Boston Red Sox");
			YAML_ASSERT(doc["american"][1].as<std::string>() == "Detroit Tigers");
			YAML_ASSERT(doc["american"][2].as<std::string>() == "New York Yankees");
			YAML_ASSERT(doc["national"].size() == 3);
			YAML_ASSERT(doc["national"][0].as<std::string>() == "New York Mets");
			YAML_ASSERT(doc["national"][1].as<std::string>() == "Chicago Cubs");
			YAML_ASSERT(doc["national"][2].as<std::string>() == "Atlanta Braves");
			return true;
		}
49
50
		
		// 2.4
51
		TEST SequenceOfMappings() {
52
			YAML::Node doc = YAML::Load(ex2_4);
53
54
55
56
57
58
59
60
61
62
63
			YAML_ASSERT(doc.size() == 2);
			YAML_ASSERT(doc[0].size() == 3);
			YAML_ASSERT(doc[0]["name"].as<std::string>() == "Mark McGwire");
			YAML_ASSERT(doc[0]["hr"].as<std::string>() == "65");
			YAML_ASSERT(doc[0]["avg"].as<std::string>() == "0.278");
			YAML_ASSERT(doc[1].size() == 3);
			YAML_ASSERT(doc[1]["name"].as<std::string>() == "Sammy Sosa");
			YAML_ASSERT(doc[1]["hr"].as<std::string>() == "63");
			YAML_ASSERT(doc[1]["avg"].as<std::string>() == "0.288");
			return true;
		}
64
65
		
		// 2.5
66
		TEST SequenceOfSequences() {
67
			YAML::Node doc = YAML::Load(ex2_5);
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
			YAML_ASSERT(doc.size() == 3);
			YAML_ASSERT(doc[0].size() == 3);
			YAML_ASSERT(doc[0][0].as<std::string>() == "name");
			YAML_ASSERT(doc[0][1].as<std::string>() == "hr");
			YAML_ASSERT(doc[0][2].as<std::string>() == "avg");
			YAML_ASSERT(doc[1].size() == 3);
			YAML_ASSERT(doc[1][0].as<std::string>() == "Mark McGwire");
			YAML_ASSERT(doc[1][1].as<std::string>() == "65");
			YAML_ASSERT(doc[1][2].as<std::string>() == "0.278");
			YAML_ASSERT(doc[2].size() == 3);
			YAML_ASSERT(doc[2][0].as<std::string>() == "Sammy Sosa");
			YAML_ASSERT(doc[2][1].as<std::string>() == "63");
			YAML_ASSERT(doc[2][2].as<std::string>() == "0.288");
			return true;
		}
83
84
		
		// 2.6
85
		TEST MappingOfMappings() {
86
			YAML::Node doc = YAML::Load(ex2_6);
87
88
89
90
91
92
93
94
95
			YAML_ASSERT(doc.size() == 2);
			YAML_ASSERT(doc["Mark McGwire"].size() == 2);
			YAML_ASSERT(doc["Mark McGwire"]["hr"].as<std::string>() == "65");
			YAML_ASSERT(doc["Mark McGwire"]["avg"].as<std::string>() == "0.278");
			YAML_ASSERT(doc["Sammy Sosa"].size() == 2);
			YAML_ASSERT(doc["Sammy Sosa"]["hr"].as<std::string>() == "63");
			YAML_ASSERT(doc["Sammy Sosa"]["avg"].as<std::string>() == "0.288");
			return true;
		}
96
97
		
		// 2.7
98
		TEST TwoDocumentsInAStream() {
Jesse Beder's avatar
Jesse Beder committed
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
			std::vector<YAML::Node> docs = YAML::LoadAll(ex2_7);
			YAML_ASSERT(docs.size() == 2);
			
			{
				YAML::Node doc = docs[0];
				YAML_ASSERT(doc.size() == 3);
				YAML_ASSERT(doc[0].as<std::string>() == "Mark McGwire");
				YAML_ASSERT(doc[1].as<std::string>() == "Sammy Sosa");
				YAML_ASSERT(doc[2].as<std::string>() == "Ken Griffey");
			}

			{
				YAML::Node doc = docs[1];
				YAML_ASSERT(doc.size() == 2);
				YAML_ASSERT(doc[0].as<std::string>() == "Chicago Cubs");
				YAML_ASSERT(doc[1].as<std::string>() == "St Louis Cardinals");
			}
			return true;
117
		}
118
119
		
		// 2.8
120
		TEST PlayByPlayFeed() {
Jesse Beder's avatar
Jesse Beder committed
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
			std::vector<YAML::Node> docs = YAML::LoadAll(ex2_8);
			YAML_ASSERT(docs.size() == 2);
			
			{
				YAML::Node doc = docs[0];
				YAML_ASSERT(doc.size() == 3);
				YAML_ASSERT(doc["time"].as<std::string>() == "20:03:20");
				YAML_ASSERT(doc["player"].as<std::string>() == "Sammy Sosa");
				YAML_ASSERT(doc["action"].as<std::string>() == "strike (miss)");
			}

			{
				YAML::Node doc = docs[1];
				YAML_ASSERT(doc.size() == 3);
				YAML_ASSERT(doc["time"].as<std::string>() == "20:03:47");
				YAML_ASSERT(doc["player"].as<std::string>() == "Sammy Sosa");
				YAML_ASSERT(doc["action"].as<std::string>() == "grand slam");
			}
			return true;
140
		}
141
142
		
		// 2.9
143
		TEST SingleDocumentWithTwoComments() {
144
			YAML::Node doc = YAML::Load(ex2_9);
145
146
147
148
149
150
151
152
153
			YAML_ASSERT(doc.size() == 2);
			YAML_ASSERT(doc["hr"].size() == 2);
			YAML_ASSERT(doc["hr"][0].as<std::string>() == "Mark McGwire");
			YAML_ASSERT(doc["hr"][1].as<std::string>() == "Sammy Sosa");
			YAML_ASSERT(doc["rbi"].size() == 2);
			YAML_ASSERT(doc["rbi"][0].as<std::string>() == "Sammy Sosa");
			YAML_ASSERT(doc["rbi"][1].as<std::string>() == "Ken Griffey");
			return true;
		}
154
155
		
		// 2.10
156
		TEST SimpleAnchor() {
157
			YAML::Node doc = YAML::Load(ex2_10);
158
159
160
161
162
163
164
165
166
			YAML_ASSERT(doc.size() == 2);
			YAML_ASSERT(doc["hr"].size() == 2);
			YAML_ASSERT(doc["hr"][0].as<std::string>() == "Mark McGwire");
			YAML_ASSERT(doc["hr"][1].as<std::string>() == "Sammy Sosa");
			YAML_ASSERT(doc["rbi"].size() == 2);
			YAML_ASSERT(doc["rbi"][0].as<std::string>() == "Sammy Sosa");
			YAML_ASSERT(doc["rbi"][1].as<std::string>() == "Ken Griffey");
			return true;
		}
167
168
		
		// 2.11
169
		TEST MappingBetweenSequences() {
170
			YAML::Node doc = YAML::Load(ex2_11);
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189

			std::vector<std::string> tigers_cubs;
			tigers_cubs.push_back("Detroit Tigers");
			tigers_cubs.push_back("Chicago cubs");
			
			std::vector<std::string> yankees_braves;
			yankees_braves.push_back("New York Yankees");
			yankees_braves.push_back("Atlanta Braves");
			
			
			YAML_ASSERT(doc.size() == 2);
			YAML_ASSERT(doc[tigers_cubs].size() == 1);
			YAML_ASSERT(doc[tigers_cubs][0].as<std::string>() == "2001-07-23");
			YAML_ASSERT(doc[yankees_braves].size() == 3);
			YAML_ASSERT(doc[yankees_braves][0].as<std::string>() == "2001-07-02");
			YAML_ASSERT(doc[yankees_braves][1].as<std::string>() == "2001-08-12");
			YAML_ASSERT(doc[yankees_braves][2].as<std::string>() == "2001-08-14");
			return true;
		}
190
191
		
		// 2.12
192
		TEST CompactNestedMapping() {
193
			YAML::Node doc = YAML::Load(ex2_12);
194
195
196
197
198
199
200
201
202
203
204
205
			YAML_ASSERT(doc.size() == 3);
			YAML_ASSERT(doc[0].size() == 2);
			YAML_ASSERT(doc[0]["item"].as<std::string>() == "Super Hoop");
			YAML_ASSERT(doc[0]["quantity"].as<int>() == 1);
			YAML_ASSERT(doc[1].size() == 2);
			YAML_ASSERT(doc[1]["item"].as<std::string>() == "Basketball");
			YAML_ASSERT(doc[1]["quantity"].as<int>() == 4);
			YAML_ASSERT(doc[2].size() == 2);
			YAML_ASSERT(doc[2]["item"].as<std::string>() == "Big Shoes");
			YAML_ASSERT(doc[2]["quantity"].as<int>() == 1);
			return true;
		}
206
207
		
		// 2.13
208
		TEST InLiteralsNewlinesArePreserved() {
209
			YAML::Node doc = YAML::Load(ex2_13);
210
211
212
213
214
			YAML_ASSERT(doc.as<std::string>() ==
						"\\//||\\/||\n"
						"// ||  ||__");
			return true;
		}
215
216
		
		// 2.14
217
		TEST InFoldedScalarsNewlinesBecomeSpaces() {
218
			YAML::Node doc = YAML::Load(ex2_14);
219
220
221
			YAML_ASSERT(doc.as<std::string>() == "Mark McGwire's year was crippled by a knee injury.");
			return true;
		}
222
223
		
		// 2.15
224
		TEST FoldedNewlinesArePreservedForMoreIndentedAndBlankLines() {
225
			YAML::Node doc = YAML::Load(ex2_15);
226
227
228
229
230
231
232
			YAML_ASSERT(doc.as<std::string>() ==
						"Sammy Sosa completed another fine season with great stats.\n\n"
						"  63 Home Runs\n"
						"  0.288 Batting Average\n\n"
						"What a year!");
			return true;
		}
233
234
		
		// 2.16
235
		TEST IndentationDeterminesScope() {
236
			YAML::Node doc = YAML::Load(ex2_16);
237
238
239
240
241
242
			YAML_ASSERT(doc.size() == 3);
			YAML_ASSERT(doc["name"].as<std::string>() == "Mark McGwire");
			YAML_ASSERT(doc["accomplishment"].as<std::string>() == "Mark set a major league home run record in 1998.\n");
			YAML_ASSERT(doc["stats"].as<std::string>() == "65 Home Runs\n0.278 Batting Average\n");
			return true;
		}
243
244
		
		// 2.17
245
		TEST QuotedScalars() {
246
			YAML::Node doc = YAML::Load(ex2_17);
247
248
249
250
251
252
253
254
255
			YAML_ASSERT(doc.size() == 6);
			YAML_ASSERT(doc["unicode"].as<std::string>() == "Sosa did fine.\xe2\x98\xba");
			YAML_ASSERT(doc["control"].as<std::string>() == "\b1998\t1999\t2000\n");
			YAML_ASSERT(doc["hex esc"].as<std::string>() == "\x0d\x0a is \r\n");
			YAML_ASSERT(doc["single"].as<std::string>() == "\"Howdy!\" he cried.");
			YAML_ASSERT(doc["quoted"].as<std::string>() == " # Not a 'comment'.");
			YAML_ASSERT(doc["tie-fighter"].as<std::string>() == "|\\-*-/|");
			return true;
		}
256
257
		
		// 2.18
258
		TEST MultiLineFlowScalars() {
259
			YAML::Node doc = YAML::Load(ex2_18);
260
261
262
263
264
			YAML_ASSERT(doc.size() == 2);
			YAML_ASSERT(doc["plain"].as<std::string>() == "This unquoted scalar spans many lines.");
			YAML_ASSERT(doc["quoted"].as<std::string>() == "So does this quoted scalar.\n");
			return true;
		}
265
266
267
268
		
		// TODO: 2.19 - 2.22 schema tags
		
		// 2.23
Jesse Beder's avatar
Jesse Beder committed
269
		TEST VariousExplicitTags() {
270
			YAML::Node doc = YAML::Load(ex2_23);
Jesse Beder's avatar
Jesse Beder committed
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
			YAML_ASSERT(doc.size() == 3);
			YAML_ASSERT(doc["not-date"].Tag() == "tag:yaml.org,2002:str");
			YAML_ASSERT(doc["not-date"].as<std::string>() == "2002-04-28");
			YAML_ASSERT(doc["picture"].Tag() == "tag:yaml.org,2002:binary");
			YAML_ASSERT(doc["picture"].as<std::string>() ==
						"R0lGODlhDAAMAIQAAP//9/X\n"
						"17unp5WZmZgAAAOfn515eXv\n"
						"Pz7Y6OjuDg4J+fn5OTk6enp\n"
						"56enmleECcgggoBADs=\n"
						);
			YAML_ASSERT(doc["application specific tag"].Tag() == "!something");
			YAML_ASSERT(doc["application specific tag"].as<std::string>() ==
						"The semantics of the tag\n"
						"above may be different for\n"
						"different documents."
						);
			return true;
		}
289
290
		
		// 2.24
Jesse Beder's avatar
Jesse Beder committed
291
		TEST GlobalTags() {
292
			YAML::Node doc = YAML::Load(ex2_24);
Jesse Beder's avatar
Jesse Beder committed
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
			YAML_ASSERT(doc.Tag() == "tag:clarkevans.com,2002:shape");
			YAML_ASSERT(doc.size() == 3);
			YAML_ASSERT(doc[0].Tag() == "tag:clarkevans.com,2002:circle");
			YAML_ASSERT(doc[0].size() == 2);
			YAML_ASSERT(doc[0]["center"].size() == 2);
			YAML_ASSERT(doc[0]["center"]["x"].as<int>() == 73);
			YAML_ASSERT(doc[0]["center"]["y"].as<int>() == 129);
			YAML_ASSERT(doc[0]["radius"].as<int>() == 7);
			YAML_ASSERT(doc[1].Tag() == "tag:clarkevans.com,2002:line");
			YAML_ASSERT(doc[1].size() == 2);
			YAML_ASSERT(doc[1]["start"].size() == 2);
			YAML_ASSERT(doc[1]["start"]["x"].as<int>() == 73);
			YAML_ASSERT(doc[1]["start"]["y"].as<int>() == 129);
			YAML_ASSERT(doc[1]["finish"].size() == 2);
			YAML_ASSERT(doc[1]["finish"]["x"].as<int>() == 89);
			YAML_ASSERT(doc[1]["finish"]["y"].as<int>() == 102);
			YAML_ASSERT(doc[2].Tag() == "tag:clarkevans.com,2002:label");
			YAML_ASSERT(doc[2].size() == 3);
			YAML_ASSERT(doc[2]["start"].size() == 2);
			YAML_ASSERT(doc[2]["start"]["x"].as<int>() == 73);
			YAML_ASSERT(doc[2]["start"]["y"].as<int>() == 129);
			YAML_ASSERT(doc[2]["color"].as<std::string>() == "0xFFEEBB");
			YAML_ASSERT(doc[2]["text"].as<std::string>() == "Pretty vector drawing.");
			return true;
		}
318
319
		
		// 2.25
Jesse Beder's avatar
Jesse Beder committed
320
		TEST UnorderedSets() {
321
			YAML::Node doc = YAML::Load(ex2_25);
Jesse Beder's avatar
Jesse Beder committed
322
323
			YAML_ASSERT(doc.Tag() == "tag:yaml.org,2002:set");
			YAML_ASSERT(doc.size() == 3);
324
325
326
			YAML_ASSERT(doc["Mark McGwire"].IsNull());
			YAML_ASSERT(doc["Sammy Sosa"].IsNull());
			YAML_ASSERT(doc["Ken Griffey"].IsNull());
Jesse Beder's avatar
Jesse Beder committed
327
328
			return true;
		}
329
330
		
		// 2.26
Jesse Beder's avatar
Jesse Beder committed
331
		TEST OrderedMappings() {
332
			YAML::Node doc = YAML::Load(ex2_26);
Jesse Beder's avatar
Jesse Beder committed
333
334
335
336
337
338
339
340
341
342
			YAML_ASSERT(doc.Tag() == "tag:yaml.org,2002:omap");
			YAML_ASSERT(doc.size() == 3);
			YAML_ASSERT(doc[0].size() == 1);
			YAML_ASSERT(doc[0]["Mark McGwire"].as<int>() == 65);
			YAML_ASSERT(doc[1].size() == 1);
			YAML_ASSERT(doc[1]["Sammy Sosa"].as<int>() == 63);
			YAML_ASSERT(doc[2].size() == 1);
			YAML_ASSERT(doc[2]["Ken Griffey"].as<int>() == 58);
			return true;
		}
343
344
		
		// 2.27
Jesse Beder's avatar
Jesse Beder committed
345
		TEST Invoice() {
346
			YAML::Node doc = YAML::Load(ex2_27);
Jesse Beder's avatar
Jesse Beder committed
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
			YAML_ASSERT(doc.Tag() == "tag:clarkevans.com,2002:invoice");
			YAML_ASSERT(doc.size() == 8);
			YAML_ASSERT(doc["invoice"].as<int>() == 34843);
			YAML_ASSERT(doc["date"].as<std::string>() == "2001-01-23");
			YAML_ASSERT(doc["bill-to"].size() == 3);
			YAML_ASSERT(doc["bill-to"]["given"].as<std::string>() == "Chris");
			YAML_ASSERT(doc["bill-to"]["family"].as<std::string>() == "Dumars");
			YAML_ASSERT(doc["bill-to"]["address"].size() == 4);
			YAML_ASSERT(doc["bill-to"]["address"]["lines"].as<std::string>() == "458 Walkman Dr.\nSuite #292\n");
			YAML_ASSERT(doc["bill-to"]["address"]["city"].as<std::string>() == "Royal Oak");
			YAML_ASSERT(doc["bill-to"]["address"]["state"].as<std::string>() == "MI");
			YAML_ASSERT(doc["bill-to"]["address"]["postal"].as<std::string>() == "48046");
			YAML_ASSERT(doc["ship-to"].size() == 3);
			YAML_ASSERT(doc["ship-to"]["given"].as<std::string>() == "Chris");
			YAML_ASSERT(doc["ship-to"]["family"].as<std::string>() == "Dumars");
			YAML_ASSERT(doc["ship-to"]["address"].size() == 4);
			YAML_ASSERT(doc["ship-to"]["address"]["lines"].as<std::string>() == "458 Walkman Dr.\nSuite #292\n");
			YAML_ASSERT(doc["ship-to"]["address"]["city"].as<std::string>() == "Royal Oak");
			YAML_ASSERT(doc["ship-to"]["address"]["state"].as<std::string>() == "MI");
			YAML_ASSERT(doc["ship-to"]["address"]["postal"].as<std::string>() == "48046");
			YAML_ASSERT(doc["product"].size() == 2);
			YAML_ASSERT(doc["product"][0].size() == 4);
			YAML_ASSERT(doc["product"][0]["sku"].as<std::string>() == "BL394D");
			YAML_ASSERT(doc["product"][0]["quantity"].as<int>() == 4);
			YAML_ASSERT(doc["product"][0]["description"].as<std::string>() == "Basketball");
			YAML_ASSERT(doc["product"][0]["price"].as<std::string>() == "450.00");
			YAML_ASSERT(doc["product"][1].size() == 4);
			YAML_ASSERT(doc["product"][1]["sku"].as<std::string>() == "BL4438H");
			YAML_ASSERT(doc["product"][1]["quantity"].as<int>() == 1);
			YAML_ASSERT(doc["product"][1]["description"].as<std::string>() == "Super Hoop");
			YAML_ASSERT(doc["product"][1]["price"].as<std::string>() == "2392.00");
			YAML_ASSERT(doc["tax"].as<std::string>() == "251.42");
			YAML_ASSERT(doc["total"].as<std::string>() == "4443.52");
			YAML_ASSERT(doc["comments"].as<std::string>() == "Late afternoon is best. Backup contact is Nancy Billsmer @ 338-4338.");
			return true;
		}
383
384
		
		// 2.28
Jesse Beder's avatar
Jesse Beder committed
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
		TEST LogFile() {
			std::vector<YAML::Node> docs = YAML::LoadAll(ex2_28);
			YAML_ASSERT(docs.size() == 3);

			{
				YAML::Node doc = docs[0];
				YAML_ASSERT(doc.size() == 3);
				YAML_ASSERT(doc["Time"].as<std::string>() == "2001-11-23 15:01:42 -5");
				YAML_ASSERT(doc["User"].as<std::string>() == "ed");
				YAML_ASSERT(doc["Warning"].as<std::string>() == "This is an error message for the log file");
			}

			{
				YAML::Node doc = docs[1];
				YAML_ASSERT(doc.size() == 3);
				YAML_ASSERT(doc["Time"].as<std::string>() == "2001-11-23 15:02:31 -5");
				YAML_ASSERT(doc["User"].as<std::string>() == "ed");
				YAML_ASSERT(doc["Warning"].as<std::string>() == "A slightly different error message.");
			}

			{
				YAML::Node doc = docs[2];
				YAML_ASSERT(doc.size() == 4);
				YAML_ASSERT(doc["Date"].as<std::string>() == "2001-11-23 15:03:17 -5");
				YAML_ASSERT(doc["User"].as<std::string>() == "ed");
				YAML_ASSERT(doc["Fatal"].as<std::string>() == "Unknown variable \"bar\"");
				YAML_ASSERT(doc["Stack"].size() == 2);
				YAML_ASSERT(doc["Stack"][0].size() == 3);
				YAML_ASSERT(doc["Stack"][0]["file"].as<std::string>() == "TopClass.py");
				YAML_ASSERT(doc["Stack"][0]["line"].as<std::string>() == "23");
				YAML_ASSERT(doc["Stack"][0]["code"].as<std::string>() == "x = MoreObject(\"345\\n\")\n");
				YAML_ASSERT(doc["Stack"][1].size() == 3);
				YAML_ASSERT(doc["Stack"][1]["file"].as<std::string>() == "MoreClass.py");
				YAML_ASSERT(doc["Stack"][1]["line"].as<std::string>() == "58");
				YAML_ASSERT(doc["Stack"][1]["code"].as<std::string>() == "foo = bar");
			}
			return true;
		}
423
424
425
426
		
		// TODO: 5.1 - 5.2 BOM
		
		// 5.3
Jesse Beder's avatar
Jesse Beder committed
427
		TEST BlockStructureIndicators() {
428
			YAML::Node doc = YAML::Load(ex5_3);
Jesse Beder's avatar
Jesse Beder committed
429
430
431
432
433
434
435
436
437
			YAML_ASSERT(doc.size() == 2);
			YAML_ASSERT(doc["sequence"].size() == 2);
			YAML_ASSERT(doc["sequence"][0].as<std::string>() == "one");
			YAML_ASSERT(doc["sequence"][1].as<std::string>() == "two");
			YAML_ASSERT(doc["mapping"].size() == 2);
			YAML_ASSERT(doc["mapping"]["sky"].as<std::string>() == "blue");
			YAML_ASSERT(doc["mapping"]["sea"].as<std::string>() == "green");
			return true;
		}
438
439
		
		// 5.4
Jesse Beder's avatar
Jesse Beder committed
440
		TEST FlowStructureIndicators() {
441
			YAML::Node doc = YAML::Load(ex5_4);
Jesse Beder's avatar
Jesse Beder committed
442
443
444
445
446
447
448
449
450
			YAML_ASSERT(doc.size() == 2);
			YAML_ASSERT(doc["sequence"].size() == 2);
			YAML_ASSERT(doc["sequence"][0].as<std::string>() == "one");
			YAML_ASSERT(doc["sequence"][1].as<std::string>() == "two");
			YAML_ASSERT(doc["mapping"].size() == 2);
			YAML_ASSERT(doc["mapping"]["sky"].as<std::string>() == "blue");
			YAML_ASSERT(doc["mapping"]["sea"].as<std::string>() == "green");
			return true;
		}
451
452
		
		// 5.5
Jesse Beder's avatar
Jesse Beder committed
453
		TEST CommentIndicator() {
454
			YAML::Node doc = YAML::Load(ex5_5);
455
			YAML_ASSERT(doc.IsNull());
Jesse Beder's avatar
Jesse Beder committed
456
457
			return true;
		}
458
459
		
		// 5.6
Jesse Beder's avatar
Jesse Beder committed
460
		TEST NodePropertyIndicators() {
461
			YAML::Node doc = YAML::Load(ex5_6);
Jesse Beder's avatar
Jesse Beder committed
462
463
464
465
466
			YAML_ASSERT(doc.size() == 2);
			YAML_ASSERT(doc["anchored"].as<std::string>() == "value"); // TODO: assert tag
			YAML_ASSERT(doc["alias"].as<std::string>() == "value");
			return true;
		}
467
468
		
		// 5.7
Jesse Beder's avatar
Jesse Beder committed
469
		TEST BlockScalarIndicators() {
470
			YAML::Node doc = YAML::Load(ex5_7);
Jesse Beder's avatar
Jesse Beder committed
471
472
473
474
475
			YAML_ASSERT(doc.size() == 2);
			YAML_ASSERT(doc["literal"].as<std::string>() == "some\ntext\n");
			YAML_ASSERT(doc["folded"].as<std::string>() == "some text\n");
			return true;
		}
476
477
		
		// 5.8
Jesse Beder's avatar
Jesse Beder committed
478
		TEST QuotedScalarIndicators() {
479
			YAML::Node doc = YAML::Load(ex5_8);
Jesse Beder's avatar
Jesse Beder committed
480
481
482
483
484
			YAML_ASSERT(doc.size() == 2);
			YAML_ASSERT(doc["single"].as<std::string>() == "text");
			YAML_ASSERT(doc["double"].as<std::string>() == "text");
			return true;
		}
485
486
487
488
489
		
		// TODO: 5.9 directive
		// TODO: 5.10 reserved indicator
		
		// 5.11
Jesse Beder's avatar
Jesse Beder committed
490
		TEST LineBreakCharacters() {
491
			YAML::Node doc = YAML::Load(ex5_11);
Jesse Beder's avatar
Jesse Beder committed
492
493
494
			YAML_ASSERT(doc.as<std::string>() == "Line break (no glyph)\nLine break (glyphed)\n");
			return true;
		}
495
496
		
		// 5.12
Jesse Beder's avatar
Jesse Beder committed
497
		TEST TabsAndSpaces() {
498
			YAML::Node doc = YAML::Load(ex5_12);
Jesse Beder's avatar
Jesse Beder committed
499
500
501
502
503
504
505
506
			YAML_ASSERT(doc.size() == 2);
			YAML_ASSERT(doc["quoted"].as<std::string>() == "Quoted\t");
			YAML_ASSERT(doc["block"].as<std::string>() ==
						"void main() {\n"
						"\tprintf(\"Hello, world!\\n\");\n"
						"}");
			return true;
		}
507
508
		
		// 5.13
Jesse Beder's avatar
Jesse Beder committed
509
		TEST EscapedCharacters() {
510
			YAML::Node doc = YAML::Load(ex5_13);
Jesse Beder's avatar
Jesse Beder committed
511
512
513
			YAML_ASSERT(doc.as<std::string>() == "Fun with \x5C \x22 \x07 \x08 \x1B \x0C \x0A \x0D \x09 \x0B " + std::string("\x00", 1) + " \x20 \xA0 \x85 \xe2\x80\xa8 \xe2\x80\xa9 A A A");
			return true;
		}
514
515
		
		// 5.14
Jesse Beder's avatar
Jesse Beder committed
516
517
		TEST InvalidEscapedCharacters() {
			try {
518
				YAML::Load(ex5_14);
Jesse Beder's avatar
Jesse Beder committed
519
520
521
522
523
524
525
			} catch(const YAML::ParserException& e) {
				YAML_ASSERT(e.msg == std::string(YAML::ErrorMsg::INVALID_ESCAPE) + "c");
				return true;
			}
			
			return false;
		}
526
527
		
		// 6.1
528
		TEST IndentationSpaces() {
529
			YAML::Node doc = YAML::Load(ex6_1);
530
531
532
533
534
535
536
537
538
			YAML_ASSERT(doc.size() == 1);
			YAML_ASSERT(doc["Not indented"].size() == 2);
			YAML_ASSERT(doc["Not indented"]["By one space"].as<std::string>() == "By four\n  spaces\n");
			YAML_ASSERT(doc["Not indented"]["Flow style"].size() == 3);
			YAML_ASSERT(doc["Not indented"]["Flow style"][0].as<std::string>() == "By two");
			YAML_ASSERT(doc["Not indented"]["Flow style"][1].as<std::string>() == "Also by two");
			YAML_ASSERT(doc["Not indented"]["Flow style"][2].as<std::string>() == "Still by two");
			return true;
		}
539
540
		
		// 6.2
541
		TEST IndentationIndicators() {
542
			YAML::Node doc = YAML::Load(ex6_2);
543
544
545
546
547
548
549
550
			YAML_ASSERT(doc.size() == 1);
			YAML_ASSERT(doc["a"].size() == 2);
			YAML_ASSERT(doc["a"][0].as<std::string>() == "b");
			YAML_ASSERT(doc["a"][1].size() == 2);
			YAML_ASSERT(doc["a"][1][0].as<std::string>() == "c");
			YAML_ASSERT(doc["a"][1][1].as<std::string>() == "d");
			return true;
		}
551
552
		
		// 6.3
553
		TEST SeparationSpaces() {
554
			YAML::Node doc = YAML::Load(ex6_3);
555
556
557
558
559
560
561
562
			YAML_ASSERT(doc.size() == 2);
			YAML_ASSERT(doc[0].size() == 1);
			YAML_ASSERT(doc[0]["foo"].as<std::string>() == "bar");
			YAML_ASSERT(doc[1].size() == 2);
			YAML_ASSERT(doc[1][0].as<std::string>() == "baz");
			YAML_ASSERT(doc[1][1].as<std::string>() == "baz");
			return true;
		}
563
564
		
		// 6.4
565
		TEST LinePrefixes() {
566
			YAML::Node doc = YAML::Load(ex6_4);
567
568
569
570
571
572
			YAML_ASSERT(doc.size() == 3);
			YAML_ASSERT(doc["plain"].as<std::string>() == "text lines");
			YAML_ASSERT(doc["quoted"].as<std::string>() == "text lines");
			YAML_ASSERT(doc["block"].as<std::string>() == "text\n \tlines\n");
			return true;
		}
573
574
		
		// 6.5
575
		TEST EmptyLines() {
576
			YAML::Node doc = YAML::Load(ex6_5);
577
578
579
580
581
			YAML_ASSERT(doc.size() == 2);
			YAML_ASSERT(doc["Folding"].as<std::string>() == "Empty line\nas a line feed");
			YAML_ASSERT(doc["Chomping"].as<std::string>() == "Clipped empty lines\n");
			return true;
		}
582
583
		
		// 6.6
584
		TEST LineFolding() {
585
			YAML::Node doc = YAML::Load(ex6_6);
586
587
588
			YAML_ASSERT(doc.as<std::string>() == "trimmed\n\n\nas space");
			return true;
		}
589
590
		
		// 6.7
591
		TEST BlockFolding() {
592
			YAML::Node doc = YAML::Load(ex6_7);
593
594
595
			YAML_ASSERT(doc.as<std::string>() == "foo \n\n\t bar\n\nbaz\n");
			return true;
		}
596
597
		
		// 6.8
598
		TEST FlowFolding() {
599
			YAML::Node doc = YAML::Load(ex6_8);
600
601
602
			YAML_ASSERT(doc.as<std::string>() == " foo\nbar\nbaz ");
			return true;
		}
603
604
		
		// 6.9
605
		TEST SeparatedComment() {
606
			YAML::Node doc = YAML::Load(ex6_9);
607
608
609
610
			YAML_ASSERT(doc.size() == 1);
			YAML_ASSERT(doc["key"].as<std::string>() == "value");
			return true;
		}
611
612
		
		// 6.10
613
		TEST CommentLines() {
614
			YAML::Node doc = YAML::Load(ex6_10);
615
			YAML_ASSERT(doc.IsNull());
616
617
			return true;
		}
618
619
		
		// 6.11
620
		TEST MultiLineComments() {
621
			YAML::Node doc = YAML::Load(ex6_11);
622
623
624
625
			YAML_ASSERT(doc.size() == 1);
			YAML_ASSERT(doc["key"].as<std::string>() == "value");
			return true;
		}
626
627
		
		// 6.12
628
		TEST SeparationSpacesII() {
629
			YAML::Node doc = YAML::Load(ex6_12);
630
631
632
633
634
635
636
637
638
639
640
			
			std::map<std::string, std::string> sammy;
			sammy["first"] = "Sammy";
			sammy["last"] = "Sosa";
			
			YAML_ASSERT(doc.size() == 1);
			YAML_ASSERT(doc[sammy].size() == 2);
			YAML_ASSERT(doc[sammy]["hr"].as<int>() == 65);
			YAML_ASSERT(doc[sammy]["avg"].as<std::string>() == "0.278");
			return true;
		}
641
642
		
		// 6.13
643
		TEST ReservedDirectives() {
644
			YAML::Node doc = YAML::Load(ex6_13);
645
646
647
			YAML_ASSERT(doc.as<std::string>() == "foo");
			return true;
		}
648
649
		
		// 6.14
650
		TEST YAMLDirective() {
651
			YAML::Node doc = YAML::Load(ex6_14);
652
653
654
			YAML_ASSERT(doc.as<std::string>() == "foo");
			return true;
		}
655
656
		
		// 6.15
657
658
		TEST InvalidRepeatedYAMLDirective() {
			try {
659
				YAML::Load(ex6_15);
660
661
662
663
664
665
666
			} catch(const YAML::ParserException& e) {
				YAML_ASSERT(e.msg == YAML::ErrorMsg::REPEATED_YAML_DIRECTIVE);
				return true;
			}
			
			return "  No exception was thrown";
		}
667
668
		
		// 6.16
Jesse Beder's avatar
Jesse Beder committed
669
		TEST TagDirective() {
670
			YAML::Node doc = YAML::Load(ex6_16);
Jesse Beder's avatar
Jesse Beder committed
671
672
673
674
			YAML_ASSERT(doc.Tag() == "tag:yaml.org,2002:str");
			YAML_ASSERT(doc.as<std::string>() == "foo");
			return true;
		}
675
676
		
		// 6.17
Jesse Beder's avatar
Jesse Beder committed
677
678
		TEST InvalidRepeatedTagDirective() {
			try {
679
				YAML::Load(ex6_17);
Jesse Beder's avatar
Jesse Beder committed
680
681
682
683
684
685
686
687
688
			} catch(const YAML::ParserException& e) {
				if(e.msg == YAML::ErrorMsg::REPEATED_TAG_DIRECTIVE)
					return true;
				
				throw;
			}
			
			return "  No exception was thrown";
		}
689
690
		
		// 6.18
Jesse Beder's avatar
Jesse Beder committed
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
		TEST PrimaryTagHandle() {
			std::vector<YAML::Node> docs = YAML::LoadAll(ex6_18);
			YAML_ASSERT(docs.size() == 2);
			
			{
				YAML::Node doc = docs[0];
				YAML_ASSERT(doc.Tag() == "!foo");
				YAML_ASSERT(doc.as<std::string>() == "bar");
			}

			{
				YAML::Node doc = docs[1];
				YAML_ASSERT(doc.Tag() == "tag:example.com,2000:app/foo");
				YAML_ASSERT(doc.as<std::string>() == "bar");
			}
			return true;
		}
708
709
		
		// 6.19
Jesse Beder's avatar
Jesse Beder committed
710
		TEST SecondaryTagHandle() {
711
			YAML::Node doc = YAML::Load(ex6_19);
Jesse Beder's avatar
Jesse Beder committed
712
713
714
715
			YAML_ASSERT(doc.Tag() == "tag:example.com,2000:app/int");
			YAML_ASSERT(doc.as<std::string>() == "1 - 3");
			return true;
		}
716
717
		
		// 6.20
Jesse Beder's avatar
Jesse Beder committed
718
		TEST TagHandles() {
719
			YAML::Node doc = YAML::Load(ex6_20);
Jesse Beder's avatar
Jesse Beder committed
720
721
722
723
			YAML_ASSERT(doc.Tag() == "tag:example.com,2000:app/foo");
			YAML_ASSERT(doc.as<std::string>() == "bar");
			return true;
		}
724
725
		
		// 6.21
Jesse Beder's avatar
Jesse Beder committed
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
		TEST LocalTagPrefix() {
			std::vector<YAML::Node> docs = YAML::LoadAll(ex6_21);
			YAML_ASSERT(docs.size() == 2);
			
			{
				YAML::Node doc = docs[0];
				YAML_ASSERT(doc.Tag() == "!my-light");
				YAML_ASSERT(doc.as<std::string>() == "fluorescent");
			}

			{
				YAML::Node doc = docs[1];
				YAML_ASSERT(doc.Tag() == "!my-light");
				YAML_ASSERT(doc.as<std::string>() == "green");
			}
			return true;
		}
743
744
		
		// 6.22
Jesse Beder's avatar
Jesse Beder committed
745
		TEST GlobalTagPrefix() {
746
			YAML::Node doc = YAML::Load(ex6_22);
Jesse Beder's avatar
Jesse Beder committed
747
748
749
750
751
			YAML_ASSERT(doc.size() == 1);
			YAML_ASSERT(doc[0].Tag() == "tag:example.com,2000:app/foo");
			YAML_ASSERT(doc[0].as<std::string>() == "bar");
			return true;
		}
752
753
		
		// 6.23
Jesse Beder's avatar
Jesse Beder committed
754
		TEST NodeProperties() {
755
			YAML::Node doc = YAML::Load(ex6_23);
Jesse Beder's avatar
Jesse Beder committed
756
757
758
759
760
761
762
763
764
765
766
767
768
769
			YAML_ASSERT(doc.size() == 2);
			for(YAML::const_iterator it=doc.begin();it!=doc.end();++it) {
				if(it->first.as<std::string>() == "foo") {
					YAML_ASSERT(it->first.Tag() == "tag:yaml.org,2002:str");
					YAML_ASSERT(it->second.Tag() == "tag:yaml.org,2002:str");
					YAML_ASSERT(it->second.as<std::string>() == "bar");
				} else if(it->first.as<std::string>() == "baz") {
					YAML_ASSERT(it->second.as<std::string>() == "foo");
				} else
					return "  unknown key";
			}
			
			return true;
		}
770
771
		
		// 6.24
Jesse Beder's avatar
Jesse Beder committed
772
		TEST VerbatimTags() {
773
			YAML::Node doc = YAML::Load(ex6_24);
Jesse Beder's avatar
Jesse Beder committed
774
775
776
777
778
779
780
781
782
			YAML_ASSERT(doc.size() == 1);
			for(YAML::const_iterator it=doc.begin();it!=doc.end();++it) {
				YAML_ASSERT(it->first.Tag() == "tag:yaml.org,2002:str");
				YAML_ASSERT(it->first.as<std::string>() == "foo");
				YAML_ASSERT(it->second.Tag() == "!bar");
				YAML_ASSERT(it->second.as<std::string>() == "baz");
			}
			return true;
		}
783
784
		
		// 6.25
Jesse Beder's avatar
Jesse Beder committed
785
		TEST InvalidVerbatimTags() {
786
			YAML::Node doc = YAML::Load(ex6_25);
Jesse Beder's avatar
Jesse Beder committed
787
788
			return "  not implemented yet"; // TODO: check tags (but we probably will say these are valid, I think)
		}
789
790
		
		// 6.26
Jesse Beder's avatar
Jesse Beder committed
791
		TEST TagShorthands() {
792
			YAML::Node doc = YAML::Load(ex6_26);
Jesse Beder's avatar
Jesse Beder committed
793
794
795
796
797
798
799
800
801
			YAML_ASSERT(doc.size() == 3);
			YAML_ASSERT(doc[0].Tag() == "!local");
			YAML_ASSERT(doc[0].as<std::string>() == "foo");
			YAML_ASSERT(doc[1].Tag() == "tag:yaml.org,2002:str");
			YAML_ASSERT(doc[1].as<std::string>() == "bar");
			YAML_ASSERT(doc[2].Tag() == "tag:example.com,2000:app/tag%21");
			YAML_ASSERT(doc[2].as<std::string>() == "baz");
			return true;
		}
802
803
		
		// 6.27
Jesse Beder's avatar
Jesse Beder committed
804
805
806
		TEST InvalidTagShorthands() {
			bool threw = false;
			try {
807
				YAML::Load(ex6_27a);
Jesse Beder's avatar
Jesse Beder committed
808
809
810
811
812
813
814
815
816
			} catch(const YAML::ParserException& e) {
				threw = true;
				if(e.msg != YAML::ErrorMsg::TAG_WITH_NO_SUFFIX)
					throw;
			}
			
			if(!threw)
				return "  No exception was thrown for a tag with no suffix";
			
817
			YAML::Load(ex6_27b); // TODO: should we reject this one (since !h! is not declared)?
Jesse Beder's avatar
Jesse Beder committed
818
819
			return "  not implemented yet";
		}
820
821
		
		// 6.28
Jesse Beder's avatar
Jesse Beder committed
822
		TEST NonSpecificTags() {
823
			YAML::Node doc = YAML::Load(ex6_28);
Jesse Beder's avatar
Jesse Beder committed
824
825
826
827
828
829
			YAML_ASSERT(doc.size() == 3);
			YAML_ASSERT(doc[0].as<std::string>() == "12"); // TODO: check tags. How?
			YAML_ASSERT(doc[1].as<int>() == 12);
			YAML_ASSERT(doc[2].as<std::string>() == "12");
			return true;
		}
830
831
		
		// 6.29
832
		TEST NodeAnchors() {
833
			YAML::Node doc = YAML::Load(ex6_29);
834
835
836
837
838
			YAML_ASSERT(doc.size() == 2);
			YAML_ASSERT(doc["First occurrence"].as<std::string>() == "Value");
			YAML_ASSERT(doc["Second occurrence"].as<std::string>() == "Value");
			return true;
		}
839
840
		
		// 7.1
841
		TEST AliasNodes() {
842
			YAML::Node doc = YAML::Load(ex7_1);
843
844
845
846
847
848
849
			YAML_ASSERT(doc.size() == 4);
			YAML_ASSERT(doc["First occurrence"].as<std::string>() == "Foo");
			YAML_ASSERT(doc["Second occurrence"].as<std::string>() == "Foo");
			YAML_ASSERT(doc["Override anchor"].as<std::string>() == "Bar");
			YAML_ASSERT(doc["Reuse anchor"].as<std::string>() == "Bar");
			return true;
		}
850
851
		
		// 7.2
852
		TEST EmptyNodes() {
853
			YAML::Node doc = YAML::Load(ex7_2);
854
855
856
857
858
859
860
861
862
863
864
865
866
			YAML_ASSERT(doc.size() == 2);
			for(YAML::const_iterator it=doc.begin();it!=doc.end();++it) {
				if(it->first.as<std::string>() == "foo") {
					YAML_ASSERT(it->second.Tag() == "tag:yaml.org,2002:str");
					YAML_ASSERT(it->second.as<std::string>() == "");
				} else if(it->first.as<std::string>() == "") {
					YAML_ASSERT(it->first.Tag() == "tag:yaml.org,2002:str");
					YAML_ASSERT(it->second.as<std::string>() == "bar");
				} else
					return "  unexpected key";
			}
			return true;
		}
867
868
		
		// 7.3
869
		TEST CompletelyEmptyNodes() {
870
			YAML::Node doc = YAML::Load(ex7_3);
871
			YAML_ASSERT(doc.size() == 2);
872
			YAML_ASSERT(doc["foo"].IsNull());
873
			YAML_ASSERT(doc[YAML::Null].as<std::string>() == "bar");
874
875
			return true;
		}
876
877
		
		// 7.4
878
		TEST DoubleQuotedImplicitKeys() {
879
			YAML::Node doc = YAML::Load(ex7_4);
880
881
882
883
884
885
			YAML_ASSERT(doc.size() == 1);
			YAML_ASSERT(doc["implicit block key"].size() == 1);
			YAML_ASSERT(doc["implicit block key"][0].size() == 1);
			YAML_ASSERT(doc["implicit block key"][0]["implicit flow key"].as<std::string>() == "value");
			return true;
		}
886
887
		
		// 7.5
888
		TEST DoubleQuotedLineBreaks() {
889
			YAML::Node doc = YAML::Load(ex7_5);
890
891
892
			YAML_ASSERT(doc.as<std::string>() == "folded to a space,\nto a line feed, or \t \tnon-content");
			return true;
		}
893
894
		
		// 7.6
895
		TEST DoubleQuotedLines() {
896
			YAML::Node doc = YAML::Load(ex7_6);
897
898
899
			YAML_ASSERT(doc.as<std::string>() == " 1st non-empty\n2nd non-empty 3rd non-empty ");
			return true;
		}
900
901
		
		// 7.7
902
		TEST SingleQuotedCharacters() {
903
			YAML::Node doc = YAML::Load(ex7_7);
904
905
906
			YAML_ASSERT(doc.as<std::string>() == "here's to \"quotes\"");
			return true;
		}
907
908
		
		// 7.8
909
		TEST SingleQuotedImplicitKeys() {
910
			YAML::Node doc = YAML::Load(ex7_8);
911
912
913
914
915
916
			YAML_ASSERT(doc.size() == 1);
			YAML_ASSERT(doc["implicit block key"].size() == 1);
			YAML_ASSERT(doc["implicit block key"][0].size() == 1);
			YAML_ASSERT(doc["implicit block key"][0]["implicit flow key"].as<std::string>() == "value");
			return true;
		}
917
918
		
		// 7.9
919
		TEST SingleQuotedLines() {
920
			YAML::Node doc = YAML::Load(ex7_9);
921
922
923
			YAML_ASSERT(doc.as<std::string>() == " 1st non-empty\n2nd non-empty 3rd non-empty ");
			return true;
		}
924
925
		
		// 7.10
926
		TEST PlainCharacters() {
927
			YAML::Node doc = YAML::Load(ex7_10);
928
929
930
931
932
933
934
935
936
937
938
939
940
941
			YAML_ASSERT(doc.size() == 6);
			YAML_ASSERT(doc[0].as<std::string>() == "::vector");
			YAML_ASSERT(doc[1].as<std::string>() == ": - ()");
			YAML_ASSERT(doc[2].as<std::string>() == "Up, up, and away!");
			YAML_ASSERT(doc[3].as<int>() == -123);
			YAML_ASSERT(doc[4].as<std::string>() == "http://example.com/foo#bar");
			YAML_ASSERT(doc[5].size() == 5);
			YAML_ASSERT(doc[5][0].as<std::string>() == "::vector");
			YAML_ASSERT(doc[5][1].as<std::string>() == ": - ()");
			YAML_ASSERT(doc[5][2].as<std::string>() == "Up, up, and away!");
			YAML_ASSERT(doc[5][3].as<int>() == -123);
			YAML_ASSERT(doc[5][4].as<std::string>() == "http://example.com/foo#bar");
			return true;
		}
942
943
		
		// 7.11
944
		TEST PlainImplicitKeys() {
945
			YAML::Node doc = YAML::Load(ex7_11);
946
947
948
949
950
951
			YAML_ASSERT(doc.size() == 1);
			YAML_ASSERT(doc["implicit block key"].size() == 1);
			YAML_ASSERT(doc["implicit block key"][0].size() == 1);
			YAML_ASSERT(doc["implicit block key"][0]["implicit flow key"].as<std::string>() == "value");
			return true;
		}
952
953
		
		// 7.12
954
		TEST PlainLines() {
955
			YAML::Node doc = YAML::Load(ex7_12);
956
957
958
			YAML_ASSERT(doc.as<std::string>() == "1st non-empty\n2nd non-empty 3rd non-empty");
			return true;
		}
959
960
		
		// 7.13
961
		TEST FlowSequence() {
962
			YAML::Node doc = YAML::Load(ex7_13);
963
964
965
966
967
968
969
970
971
			YAML_ASSERT(doc.size() == 2);
			YAML_ASSERT(doc[0].size() == 2);
			YAML_ASSERT(doc[0][0].as<std::string>() == "one");
			YAML_ASSERT(doc[0][1].as<std::string>() == "two");
			YAML_ASSERT(doc[1].size() == 2);
			YAML_ASSERT(doc[1][0].as<std::string>() == "three");
			YAML_ASSERT(doc[1][1].as<std::string>() == "four");
			return true;
		}
972
973
		
		// 7.14
974
		TEST FlowSequenceEntries() {
975
			YAML::Node doc = YAML::Load(ex7_14);
976
977
978
979
980
981
982
983
984
985
			YAML_ASSERT(doc.size() == 5);
			YAML_ASSERT(doc[0].as<std::string>() == "double quoted");
			YAML_ASSERT(doc[1].as<std::string>() == "single quoted");
			YAML_ASSERT(doc[2].as<std::string>() == "plain text");
			YAML_ASSERT(doc[3].size() == 1);
			YAML_ASSERT(doc[3][0].as<std::string>() == "nested");
			YAML_ASSERT(doc[4].size() == 1);
			YAML_ASSERT(doc[4]["single"].as<std::string>() == "pair");
			return true;
		}
986
987
		
		// 7.15
988
		TEST FlowMappings() {
989
			YAML::Node doc = YAML::Load(ex7_15);
990
991
992
993
994
995
996
997
998
			YAML_ASSERT(doc.size() == 2);
			YAML_ASSERT(doc[0].size() == 2);
			YAML_ASSERT(doc[0]["one"].as<std::string>() == "two");
			YAML_ASSERT(doc[0]["three"].as<std::string>() == "four");
			YAML_ASSERT(doc[1].size() == 2);
			YAML_ASSERT(doc[1]["five"].as<std::string>() == "six");
			YAML_ASSERT(doc[1]["seven"].as<std::string>() == "eight");
			return true;
		}
999
1000
		
		// 7.16
1001
		TEST FlowMappingEntries() {
1002
			YAML::Node doc = YAML::Load(ex7_16);
1003
1004
1005
			YAML_ASSERT(doc.size() == 3);
			YAML_ASSERT(doc["explicit"].as<std::string>() == "entry");
			YAML_ASSERT(doc["implicit"].as<std::string>() == "entry");
1006
			YAML_ASSERT(doc[YAML::Null].IsNull());
1007
1008
			return true;
		}
1009
1010
		
		// 7.17
1011
		TEST FlowMappingSeparateValues() {
1012
			YAML::Node doc = YAML::Load(ex7_17);
1013
1014
			YAML_ASSERT(doc.size() == 4);
			YAML_ASSERT(doc["unquoted"].as<std::string>() == "separate");
1015
1016
			YAML_ASSERT(doc["http://foo.com"].IsNull());
			YAML_ASSERT(doc["omitted value"].IsNull());
1017
			YAML_ASSERT(doc[YAML::Null].as<std::string>() == "omitted key");
1018
1019
			return true;
		}
1020
1021
		
		// 7.18
1022
		TEST FlowMappingAdjacentValues() {
1023
			YAML::Node doc = YAML::Load(ex7_18);
1024
1025
1026
			YAML_ASSERT(doc.size() == 3);
			YAML_ASSERT(doc["adjacent"].as<std::string>() == "value");
			YAML_ASSERT(doc["readable"].as<std::string>() == "value");
1027
			YAML_ASSERT(doc["empty"].IsNull());
1028
1029
			return true;
		}
1030
1031
		
		// 7.19
1032
		TEST SinglePairFlowMappings() {
1033
			YAML::Node doc = YAML::Load(ex7_19);
1034
1035
1036
1037
1038
			YAML_ASSERT(doc.size() == 1);
			YAML_ASSERT(doc[0].size() == 1);
			YAML_ASSERT(doc[0]["foo"].as<std::string>() == "bar");
			return true;
		}
1039
1040
		
		// 7.20
1041
		TEST SinglePairExplicitEntry() {
1042
			YAML::Node doc = YAML::Load(ex7_20);
1043
1044
1045
1046
1047
			YAML_ASSERT(doc.size() == 1);
			YAML_ASSERT(doc[0].size() == 1);
			YAML_ASSERT(doc[0]["foo bar"].as<std::string>() == "baz");
			return true;
		}
1048
1049
		
		// 7.21
1050
		TEST SinglePairImplicitEntries() {
1051
			YAML::Node doc = YAML::Load(ex7_21);
1052
1053
1054
1055
1056
1057
			YAML_ASSERT(doc.size() == 3);
			YAML_ASSERT(doc[0].size() == 1);
			YAML_ASSERT(doc[0][0].size() == 1);
			YAML_ASSERT(doc[0][0]["YAML"].as<std::string>() == "separate");
			YAML_ASSERT(doc[1].size() == 1);
			YAML_ASSERT(doc[1][0].size() == 1);
1058
			YAML_ASSERT(doc[1][0][YAML::Null].as<std::string>() == "empty key entry");
1059
1060
1061
1062
1063
1064
1065
1066
			YAML_ASSERT(doc[2].size() == 1);
			YAML_ASSERT(doc[2][0].size() == 1);
			
			std::map<std::string, std::string> key;
			key["JSON"] = "like";
			YAML_ASSERT(doc[2][0][key].as<std::string>() == "adjacent");
			return true;
		}
1067
1068
		
		// 7.22
1069
1070
		TEST InvalidImplicitKeys() {
			try {
1071
				YAML::Load(ex7_22);
1072
1073
1074
1075
1076
1077
1078
1079
			} catch(const YAML::Exception& e) {
				if(e.msg == YAML::ErrorMsg::END_OF_SEQ_FLOW)
					return true;
				
				throw;
			}
			return "  no exception thrown";
		}
1080
1081
		
		// 7.23
1082
		TEST FlowContent() {
1083
			YAML::Node doc = YAML::Load(ex7_23);
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
			YAML_ASSERT(doc.size() == 5);
			YAML_ASSERT(doc[0].size() == 2);
			YAML_ASSERT(doc[0][0].as<std::string>() == "a");
			YAML_ASSERT(doc[0][1].as<std::string>() == "b");
			YAML_ASSERT(doc[1].size() == 1);
			YAML_ASSERT(doc[1]["a"].as<std::string>() == "b");
			YAML_ASSERT(doc[2].as<std::string>() == "a");
			YAML_ASSERT(doc[3].as<char>() == 'b');
			YAML_ASSERT(doc[4].as<std::string>() == "c");
			return true;
		}
1095
1096
		
		// 7.24
1097
		TEST FlowNodes() {
1098
			YAML::Node doc = YAML::Load(ex7_24);
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
			YAML_ASSERT(doc.size() == 5);
			YAML_ASSERT(doc[0].Tag() == "tag:yaml.org,2002:str");
			YAML_ASSERT(doc[0].as<std::string>() == "a");
			YAML_ASSERT(doc[1].as<char>() == 'b');
			YAML_ASSERT(doc[2].as<std::string>() == "c");
			YAML_ASSERT(doc[3].as<std::string>() == "c");
			YAML_ASSERT(doc[4].Tag() == "tag:yaml.org,2002:str");
			YAML_ASSERT(doc[4].as<std::string>() == "");
			return true;
		}
1109

1110
		// 8.1
1111
		TEST BlockScalarHeader() {
1112
			YAML::Node doc = YAML::Load(ex8_1);
1113
1114
1115
1116
1117
1118
1119
			YAML_ASSERT(doc.size() == 4);
			YAML_ASSERT(doc[0].as<std::string>() == "literal\n");
			YAML_ASSERT(doc[1].as<std::string>() == " folded\n");
			YAML_ASSERT(doc[2].as<std::string>() == "keep\n\n");
			YAML_ASSERT(doc[3].as<std::string>() == " strip");
			return true;
		}
1120
1121
		
		// 8.2
1122
		TEST BlockIndentationHeader() {
1123
			YAML::Node doc = YAML::Load(ex8_2);
1124
1125
1126
1127
1128
1129
1130
			YAML_ASSERT(doc.size() == 4);
			YAML_ASSERT(doc[0].as<std::string>() == "detected\n");
			YAML_ASSERT(doc[1].as<std::string>() == "\n\n# detected\n");
			YAML_ASSERT(doc[2].as<std::string>() == " explicit\n");
			YAML_ASSERT(doc[3].as<std::string>() == "\t\ndetected\n");
			return true;
		}
1131
1132
		
		// 8.3
1133
1134
1135
1136
		TEST InvalidBlockScalarIndentationIndicators() {
			{
				bool threw = false;
				try {
1137
					YAML::Load(ex8_3a);
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
				} catch(const YAML::Exception& e) {
					if(e.msg != YAML::ErrorMsg::END_OF_SEQ)
						throw;
					
					threw = true;
				}
				
				if(!threw)
					return "  no exception thrown for less indented auto-detecting indentation for a literal block scalar";
			}
			
			{
				bool threw = false;
				try {
1152
					YAML::Load(ex8_3b);
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
				} catch(const YAML::Exception& e) {
					if(e.msg != YAML::ErrorMsg::END_OF_SEQ)
						throw;
					
					threw = true;
				}
				
				if(!threw)
					return "  no exception thrown for less indented auto-detecting indentation for a folded block scalar";
			}
			
			{
				bool threw = false;
				try {
1167
					YAML::Load(ex8_3c);
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
				} catch(const YAML::Exception& e) {
					if(e.msg != YAML::ErrorMsg::END_OF_SEQ)
						throw;
					
					threw = true;
				}
				
				if(!threw)
					return "  no exception thrown for less indented explicit indentation for a literal block scalar";
			}
			
			return true;
		}
1181
1182
		
		// 8.4
1183
		TEST ChompingFinalLineBreak() {
1184
			YAML::Node doc = YAML::Load(ex8_4);
1185
1186
1187
1188
1189
1190
			YAML_ASSERT(doc.size() == 3);
			YAML_ASSERT(doc["strip"].as<std::string>() == "text");
			YAML_ASSERT(doc["clip"].as<std::string>() == "text\n");
			YAML_ASSERT(doc["keep"].as<std::string>() == "text\n");
			return true;
		}
1191
1192
		
		// 8.5
1193
		TEST ChompingTrailingLines() {
1194
			YAML::Node doc = YAML::Load(ex8_5);
1195
1196
1197
1198
1199
1200
			YAML_ASSERT(doc.size() == 3);
			YAML_ASSERT(doc["strip"].as<std::string>() == "# text");
			YAML_ASSERT(doc["clip"].as<std::string>() == "# text\n");
			YAML_ASSERT(doc["keep"].as<std::string>() == "# text\n"); // Note: I believe this is a bug in the YAML spec - it should be "# text\n\n"
			return true;
		}
1201
1202
		
		// 8.6
1203
		TEST EmptyScalarChomping() {
1204
			YAML::Node doc = YAML::Load(ex8_6);
1205
1206
1207
1208
1209
1210
			YAML_ASSERT(doc.size() == 3);
			YAML_ASSERT(doc["strip"].as<std::string>() == "");
			YAML_ASSERT(doc["clip"].as<std::string>() == "");
			YAML_ASSERT(doc["keep"].as<std::string>() == "\n");
			return true;
		}
1211
1212
		
		// 8.7
1213
		TEST LiteralScalar() {
1214
			YAML::Node doc = YAML::Load(ex8_7);
1215
1216
1217
			YAML_ASSERT(doc.as<std::string>() == "literal\n\ttext\n");
			return true;
		}
1218
1219
		
		// 8.8
1220
		TEST LiteralContent() {
1221
			YAML::Node doc = YAML::Load(ex8_8);
1222
1223
1224
			YAML_ASSERT(doc.as<std::string>() == "\n\nliteral\n \n\ntext\n");
			return true;
		}
1225
1226
		
		// 8.9
1227
		TEST FoldedScalar() {
1228
			YAML::Node doc = YAML::Load(ex8_9);
1229
1230
1231
			YAML_ASSERT(doc.as<std::string>() == "folded text\n");
			return true;
		}
1232
1233
		
		// 8.10
1234
		TEST FoldedLines() {
1235
			YAML::Node doc = YAML::Load(ex8_10);
1236
1237
1238
			YAML_ASSERT(doc.as<std::string>() == "\nfolded line\nnext line\n  * bullet\n\n  * list\n  * lines\n\nlast line\n");
			return true;
		}
1239
1240
		
		// 8.11
1241
		TEST MoreIndentedLines() {
1242
			YAML::Node doc = YAML::Load(ex8_11);
1243
1244
1245
			YAML_ASSERT(doc.as<std::string>() == "\nfolded line\nnext line\n  * bullet\n\n  * list\n  * lines\n\nlast line\n");
			return true;
		}
1246
1247
		
		// 8.12
1248
		TEST EmptySeparationLines() {
1249
			YAML::Node doc = YAML::Load(ex8_12);
1250
1251
1252
			YAML_ASSERT(doc.as<std::string>() == "\nfolded line\nnext line\n  * bullet\n\n  * list\n  * lines\n\nlast line\n");
			return true;
		}
1253
1254
		
		// 8.13
1255
		TEST FinalEmptyLines() {
1256
			YAML::Node doc = YAML::Load(ex8_13);
1257
1258
1259
			YAML_ASSERT(doc.as<std::string>() == "\nfolded line\nnext line\n  * bullet\n\n  * list\n  * lines\n\nlast line\n");
			return true;
		}
1260
1261
		
		// 8.14
1262
		TEST BlockSequence() {
1263
			YAML::Node doc = YAML::Load(ex8_14);
1264
1265
1266
1267
1268
1269
1270
			YAML_ASSERT(doc.size() == 1);
			YAML_ASSERT(doc["block sequence"].size() == 2);
			YAML_ASSERT(doc["block sequence"][0].as<std::string>() == "one");
			YAML_ASSERT(doc["block sequence"][1].size() == 1);
			YAML_ASSERT(doc["block sequence"][1]["two"].as<std::string>() == "three");
			return true;
		}
1271
1272
		
		// 8.15
1273
		TEST BlockSequenceEntryTypes() {
1274
			YAML::Node doc = YAML::Load(ex8_15);
1275
			YAML_ASSERT(doc.size() == 4);
1276
			YAML_ASSERT(doc[0].IsNull());
1277
1278
1279
1280
1281
1282
1283
1284
			YAML_ASSERT(doc[1].as<std::string>() == "block node\n");
			YAML_ASSERT(doc[2].size() == 2);
			YAML_ASSERT(doc[2][0].as<std::string>() == "one");
			YAML_ASSERT(doc[2][1].as<std::string>() == "two");
			YAML_ASSERT(doc[3].size() == 1);
			YAML_ASSERT(doc[3]["one"].as<std::string>() == "two");
			return true;
		}
1285
1286
		
		// 8.16
1287
		TEST BlockMappings() {
1288
			YAML::Node doc = YAML::Load(ex8_16);
1289
1290
1291
1292
1293
			YAML_ASSERT(doc.size() == 1);
			YAML_ASSERT(doc["block mapping"].size() == 1);
			YAML_ASSERT(doc["block mapping"]["key"].as<std::string>() == "value");
			return true;
		}
1294
1295
		
		// 8.17
1296
		TEST ExplicitBlockMappingEntries() {
1297
			YAML::Node doc = YAML::Load(ex8_17);
1298
			YAML_ASSERT(doc.size() == 2);
1299
			YAML_ASSERT(doc["explicit key"].IsNull());
1300
1301
1302
1303
1304
			YAML_ASSERT(doc["block key\n"].size() == 2);
			YAML_ASSERT(doc["block key\n"][0].as<std::string>() == "one");
			YAML_ASSERT(doc["block key\n"][1].as<std::string>() == "two");
			return true;
		}
1305
1306
		
		// 8.18
1307
		TEST ImplicitBlockMappingEntries() {
1308
			YAML::Node doc = YAML::Load(ex8_18);
1309
1310
			YAML_ASSERT(doc.size() == 3);
			YAML_ASSERT(doc["plain key"].as<std::string>() == "in-line value");
1311
			YAML_ASSERT(doc[YAML::Null].IsNull());
1312
1313
1314
1315
			YAML_ASSERT(doc["quoted key"].size() == 1);
			YAML_ASSERT(doc["quoted key"][0].as<std::string>() == "entry");
			return true;
		}
1316
1317
		
		// 8.19
1318
		TEST CompactBlockMappings() {
1319
			YAML::Node doc = YAML::Load(ex8_19);
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
			YAML_ASSERT(doc.size() == 2);
			YAML_ASSERT(doc[0].size() == 1);
			YAML_ASSERT(doc[0]["sun"].as<std::string>() == "yellow");
			YAML_ASSERT(doc[1].size() == 1);
			std::map<std::string, std::string> key;
			key["earth"] = "blue";
			YAML_ASSERT(doc[1][key].size() == 1);
			YAML_ASSERT(doc[1][key]["moon"].as<std::string>() == "white");
			return true;
		}
1330
1331
		
		// 8.20
1332
		TEST BlockNodeTypes() {
1333
			YAML::Node doc = YAML::Load(ex8_20);
1334
1335
1336
1337
1338
1339
1340
			YAML_ASSERT(doc.size() == 3);
			YAML_ASSERT(doc[0].as<std::string>() == "flow in block");
			YAML_ASSERT(doc[1].as<std::string>() == "Block scalar\n");
			YAML_ASSERT(doc[2].size() == 1);
			YAML_ASSERT(doc[2]["foo"].as<std::string>() == "bar");
			return true;
		}
1341
1342
		
		// 8.21
1343
		TEST BlockScalarNodes() {
1344
			YAML::Node doc = YAML::Load(ex8_21);
1345
1346
1347
1348
1349
1350
			YAML_ASSERT(doc.size() == 2);
			YAML_ASSERT(doc["literal"].as<std::string>() == "value"); // Note: I believe this is a bug in the YAML spec - it should be "value\n"
			YAML_ASSERT(doc["folded"].as<std::string>() == "value");
			YAML_ASSERT(doc["folded"].Tag() == "!foo");
			return true;
		}
1351
1352
		
		// 8.22
1353
		TEST BlockCollectionNodes() {
1354
			YAML::Node doc = YAML::Load(ex8_22);
1355
1356
1357
1358
1359
1360
1361
1362
1363
			YAML_ASSERT(doc.size() == 2);
			YAML_ASSERT(doc["sequence"].size() == 2);
			YAML_ASSERT(doc["sequence"][0].as<std::string>() == "entry");
			YAML_ASSERT(doc["sequence"][1].size() == 1);
			YAML_ASSERT(doc["sequence"][1][0].as<std::string>() == "nested");
			YAML_ASSERT(doc["mapping"].size() == 1);
			YAML_ASSERT(doc["mapping"]["foo"].as<std::string>() == "bar");
			return true;
		}
1364
1365
	}
}