blob: 2e2122d6f5c9dc1cadcdcf8949404c2a050d292a [file] [log] [blame]
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +01001package yaml_test
2
3import (
Marcel van Lohuizen2156c812018-12-10 16:05:07 +01004 "bytes"
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +01005 "errors"
Marcel van Lohuizen2156c812018-12-10 16:05:07 +01006 "flag"
7 "fmt"
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +01008 "io"
Marcel van Lohuizen2156c812018-12-10 16:05:07 +01009 "io/ioutil"
10 "strconv"
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +010011 "strings"
Marcel van Lohuizen2156c812018-12-10 16:05:07 +010012 "testing"
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +010013
Marcel van Lohuizen2156c812018-12-10 16:05:07 +010014 "cuelang.org/go/cue/ast"
15 "cuelang.org/go/cue/format"
16 "cuelang.org/go/cue/token"
17 "cuelang.org/go/internal/third_party/yaml"
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +010018)
19
Marcel van Lohuizen2156c812018-12-10 16:05:07 +010020var update = flag.Bool("update", false, "update test data")
21
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +010022var unmarshalIntTest = 123
23
24var unmarshalTests = []struct {
Marcel van Lohuizen2156c812018-12-10 16:05:07 +010025 data string
26 want string
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +010027}{
28 {
29 "",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +010030 "",
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +010031 },
32 {
Marcel van Lohuizen2156c812018-12-10 16:05:07 +010033 "{}",
34 "",
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +010035 }, {
36 "v: hi",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +010037 `v: "hi"`,
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +010038 }, {
Marcel van Lohuizen2156c812018-12-10 16:05:07 +010039 "v: hi",
40 `v: "hi"`,
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +010041 }, {
42 "v: true",
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +010043 "v: true",
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +010044 }, {
45 "v: 10",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +010046 "v: 10",
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +010047 }, {
48 "v: 0b10",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +010049 "v: 0b10",
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +010050 }, {
51 "v: 0xA",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +010052 "v: 0xA",
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +010053 }, {
54 "v: 4294967296",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +010055 "v: 4294967296",
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +010056 }, {
57 "v: 0.1",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +010058 "v: 0.1",
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +010059 }, {
60 "v: .1",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +010061 "v: .1",
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +010062 }, {
63 "v: .Inf",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +010064 "v: +Inf",
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +010065 }, {
66 "v: -.Inf",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +010067 "v: -Inf",
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +010068 }, {
69 "v: -10",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +010070 "v: -10",
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +010071 }, {
72 "v: -.1",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +010073 "v: -.1",
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +010074 },
75
76 // Simple values.
77 {
78 "123",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +010079 "123",
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +010080 },
81
82 // Floats from spec
83 {
84 "canonical: 6.8523e+5",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +010085 "canonical: 6.8523e+5",
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +010086 }, {
87 "expo: 685.230_15e+03",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +010088 "expo: 685.230_15e+03",
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +010089 }, {
90 "fixed: 685_230.15",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +010091 "fixed: 685_230.15",
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +010092 }, {
93 "neginf: -.inf",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +010094 "neginf: -Inf",
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +010095 }, {
96 "fixed: 685_230.15",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +010097 "fixed: 685_230.15",
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +010098 },
99 //{"sexa: 190:20:30.15", map[string]interface{}{"sexa": 0}}, // Unsupported
100 //{"notanum: .NaN", map[string]interface{}{"notanum": math.NaN()}}, // Equality of NaN fails.
101
102 // Bools from spec
103 {
104 "canonical: y",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100105 "canonical: true",
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100106 }, {
107 "answer: NO",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100108 "answer: false",
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100109 }, {
110 "logical: True",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100111 "logical: true",
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100112 }, {
113 "option: on",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100114 "option: true",
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100115 },
116 // Ints from spec
117 {
118 "canonical: 685230",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100119 "canonical: 685230",
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100120 }, {
121 "decimal: +685_230",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100122 "decimal: +685_230",
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100123 }, {
124 "octal: 02472256",
Marcel van Lohuizenfc6303c2019-02-07 17:49:04 +0100125 "octal: 0o2472256",
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100126 }, {
127 "hexa: 0x_0A_74_AE",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100128 "hexa: 0x_0A_74_AE",
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100129 }, {
130 "bin: 0b1010_0111_0100_1010_1110",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100131 "bin: 0b1010_0111_0100_1010_1110",
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100132 }, {
133 "bin: -0b101010",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100134 "bin: -0b101010",
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100135 }, {
136 "bin: -0b1000000000000000000000000000000000000000000000000000000000000000",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100137 "bin: -0b1000000000000000000000000000000000000000000000000000000000000000",
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100138 }, {
139 "decimal: +685_230",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100140 "decimal: +685_230",
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100141 },
142
143 //{"sexa: 190:20:30", map[string]interface{}{"sexa": 0}}, // Unsupported
144
145 // Nulls from spec
146 {
147 "empty:",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100148 "empty: null",
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100149 }, {
150 "canonical: ~",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100151 "canonical: null",
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100152 }, {
153 "english: null",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100154 "english: null",
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100155 }, {
156 "~: null key",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100157 `"~": "null key"`,
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100158 },
159
160 // Flow sequence
161 {
162 "seq: [A,B]",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100163 `seq: ["A", "B"]`,
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100164 }, {
165 "seq: [A,B,C,]",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100166 `seq: ["A", "B", "C"]`,
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100167 }, {
168 "seq: [A,1,C]",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100169 `seq: ["A", 1, "C"]`,
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100170 },
171 // Block sequence
172 {
173 "seq:\n - A\n - B",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100174 `seq: ["A", "B"]`,
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100175 }, {
176 "seq:\n - A\n - B\n - C",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100177 `seq: ["A", "B", "C"]`,
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100178 }, {
179 "seq:\n - A\n - 1\n - C",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100180 `seq: ["A", 1, "C"]`,
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100181 },
182
183 // Literal block scalar
184 {
185 "scalar: | # Comment\n\n literal\n\n \ttext\n\n",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100186 `scalar: """
187
188 literal
189
190 \ttext
191
192 """`,
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100193 },
194
195 // Folded block scalar
196 {
197 "scalar: > # Comment\n\n folded\n line\n \n next\n line\n * one\n * two\n\n last\n line\n\n",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100198 `scalar: """
199
200 folded line
201 next line
202 * one
203 * two
204
205 last line
206
207 """`,
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100208 },
209
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100210 // Structs
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100211 {
212 "a: {b: c}",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100213 `a b: "c"`,
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100214 },
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100215 {
216 "hello: world",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100217 `hello: "world"`,
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100218 }, {
219 "a:",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100220 "a: null",
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100221 }, {
222 "a: 1",
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100223 "a: 1",
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100224 }, {
225 "a: 1.0",
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100226 "a: 1.0",
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100227 }, {
228 "a: [1, 2]",
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100229 "a: [1, 2]",
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100230 }, {
231 "a: y",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100232 "a: true",
233 }, {
234 "{ a: 1, b: {c: 1} }",
235 "a: 1\nb c: 1",
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100236 },
237
238 // Some cross type conversions
239 {
240 "v: 42",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100241 "v: 42",
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100242 }, {
243 "v: -42",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100244 "v: -42",
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100245 }, {
246 "v: 4294967296",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100247 "v: 4294967296",
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100248 }, {
249 "v: -4294967296",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100250 "v: -4294967296",
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100251 },
252
253 // int
254 {
255 "int_max: 2147483647",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100256 "int_max: 2147483647",
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100257 },
258 {
259 "int_min: -2147483648",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100260 "int_min: -2147483648",
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100261 },
262 {
263 "int_overflow: 9223372036854775808", // math.MaxInt64 + 1
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100264 "int_overflow: 9223372036854775808", // math.MaxInt64 + 1
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100265 },
266
267 // int64
268 {
269 "int64_max: 9223372036854775807",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100270 "int64_max: 9223372036854775807",
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100271 },
272 {
273 "int64_max_base2: 0b111111111111111111111111111111111111111111111111111111111111111",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100274 "int64_max_base2: 0b111111111111111111111111111111111111111111111111111111111111111",
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100275 },
276 {
277 "int64_min: -9223372036854775808",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100278 "int64_min: -9223372036854775808",
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100279 },
280 {
281 "int64_neg_base2: -0b111111111111111111111111111111111111111111111111111111111111111",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100282 "int64_neg_base2: -0b111111111111111111111111111111111111111111111111111111111111111",
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100283 },
284 {
285 "int64_overflow: 9223372036854775808", // math.MaxInt64 + 1
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100286 "int64_overflow: 9223372036854775808", // math.MaxInt64 + 1
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100287 },
288
289 // uint
290 {
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100291 "uint_max: 4294967295",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100292 "uint_max: 4294967295",
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100293 },
294
295 // uint64
296 {
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100297 "uint64_max: 18446744073709551615",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100298 "uint64_max: 18446744073709551615",
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100299 },
300 {
301 "uint64_max_base2: 0b1111111111111111111111111111111111111111111111111111111111111111",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100302 "uint64_max_base2: 0b1111111111111111111111111111111111111111111111111111111111111111",
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100303 },
304 {
305 "uint64_maxint64: 9223372036854775807",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100306 "uint64_maxint64: 9223372036854775807",
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100307 },
308
309 // float32
310 {
311 "float32_max: 3.40282346638528859811704183484516925440e+38",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100312 "float32_max: 3.40282346638528859811704183484516925440e+38",
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100313 },
314 {
315 "float32_nonzero: 1.401298464324817070923729583289916131280e-45",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100316 "float32_nonzero: 1.401298464324817070923729583289916131280e-45",
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100317 },
318 {
319 "float32_maxuint64: 18446744073709551615",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100320 "float32_maxuint64: 18446744073709551615",
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100321 },
322 {
323 "float32_maxuint64+1: 18446744073709551616",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100324 `"float32_maxuint64+1": 18446744073709551616`,
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100325 },
326
327 // float64
328 {
329 "float64_max: 1.797693134862315708145274237317043567981e+308",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100330 "float64_max: 1.797693134862315708145274237317043567981e+308",
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100331 },
332 {
333 "float64_nonzero: 4.940656458412465441765687928682213723651e-324",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100334 "float64_nonzero: 4.940656458412465441765687928682213723651e-324",
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100335 },
336 {
337 "float64_maxuint64: 18446744073709551615",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100338 "float64_maxuint64: 18446744073709551615",
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100339 },
340 {
341 "float64_maxuint64+1: 18446744073709551616",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100342 `"float64_maxuint64+1": 18446744073709551616`,
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100343 },
344
345 // Overflow cases.
346 {
347 "v: 4294967297",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100348 "v: 4294967297",
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100349 }, {
350 "v: 128",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100351 "v: 128",
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100352 },
353
354 // Quoted values.
355 {
356 "'1': '\"2\"'",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100357 `"1": "\"2\""`,
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100358 }, {
359 "v:\n- A\n- 'B\n\n C'\n",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100360 `v: ["A", """
361 B
362 C
363 """]`,
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100364 },
365
366 // Explicit tags.
367 {
368 "v: !!float '1.1'",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100369 "v: 1.1",
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100370 }, {
371 "v: !!float 0",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100372 "v: float & 0", // Should this be 0.0?
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100373 }, {
374 "v: !!float -1",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100375 "v: float & -1", // Should this be -1.0?
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100376 }, {
377 "v: !!null ''",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100378 "v: null",
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100379 }, {
380 "%TAG !y! tag:yaml.org,2002:\n---\nv: !y!int '1'",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100381 "v: 1",
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100382 },
383
384 // Non-specific tag (Issue #75)
385 {
386 "v: ! test",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100387 // TODO: map[string]interface{}{"v": "test"},
388 "",
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100389 },
390
391 // Anchors and aliases.
392 {
393 "a: &x 1\nb: &y 2\nc: *x\nd: *y\n",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100394 `a: 1
395b: 2
396c: 1
397d: 2`,
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100398 }, {
399 "a: &a {c: 1}\nb: *a",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100400 "a c: 1\nb c: 1",
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100401 }, {
402 "a: &a [1, 2]\nb: *a",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100403 "a: [1, 2]\nb: [1, 2]", // TODO: a: [1, 2], b: a
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100404 },
405
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100406 {
407 "foo: ''",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100408 `foo: ""`,
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100409 }, {
410 "foo: null",
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100411 "foo: null",
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100412 },
413
414 // Support for ~
415 {
416 "foo: ~",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100417 "foo: null",
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100418 },
419
420 // Bug #1191981
421 {
422 "" +
423 "%YAML 1.1\n" +
424 "--- !!str\n" +
425 `"Generic line break (no glyph)\n\` + "\n" +
426 ` Generic line break (glyphed)\n\` + "\n" +
427 ` Line separator\u2028\` + "\n" +
428 ` Paragraph separator\u2029"` + "\n",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100429 `"""
430 Generic line break (no glyph)
431 Generic line break (glyphed)
432 Line separator\u2028Paragraph separator\u2029
433 """`,
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100434 },
435
436 // bug 1243827
437 {
438 "a: -b_c",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100439 `a: "-b_c"`,
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100440 },
441 {
442 "a: +b_c",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100443 `a: "+b_c"`,
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100444 },
445 {
446 "a: 50cent_of_dollar",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100447 `a: "50cent_of_dollar"`,
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100448 },
449
450 // issue #295 (allow scalars with colons in flow mappings and sequences)
451 {
452 "a: {b: https://github.com/go-yaml/yaml}",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100453 `a b: "https://github.com/go-yaml/yaml"`,
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100454 },
455 {
456 "a: [https://github.com/go-yaml/yaml]",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100457 `a: ["https://github.com/go-yaml/yaml"]`,
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100458 },
459
460 // Duration
461 {
462 "a: 3s",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100463 `a: "3s"`, // for now
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100464 },
465
466 // Issue #24.
467 {
468 "a: <foo>",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100469 `a: "<foo>"`,
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100470 },
471
472 // Base 60 floats are obsolete and unsupported.
473 {
474 "a: 1:1\n",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100475 `a: "1:1"`,
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100476 },
477
478 // Binary data.
479 {
480 "a: !!binary gIGC\n",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100481 `a: '\x80\x81\x82'`,
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100482 }, {
483 "a: !!binary |\n " + strings.Repeat("kJCQ", 17) + "kJ\n CQ\n",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100484 "a: '" + strings.Repeat(`\x90`, 54) + "'",
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100485 }, {
486 "a: !!binary |\n " + strings.Repeat("A", 70) + "\n ==\n",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100487 "a: '" + strings.Repeat(`\x00`, 52) + "'",
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100488 },
489
490 // Ordered maps.
491 {
492 "{b: 2, a: 1, d: 4, c: 3, sub: {e: 5}}",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100493 `b: 2
494a: 1
495d: 4
496c: 3
497sub e: 5`,
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100498 },
499
500 // Issue #39.
501 {
502 "a:\n b:\n c: d\n",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100503 `a b c: "d"`,
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100504 },
505
506 // Timestamps
507 {
508 // Date only.
509 "a: 2015-01-01\n",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100510 `a: "2015-01-01"`,
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100511 },
512 {
513 // RFC3339
514 "a: 2015-02-24T18:19:39.12Z\n",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100515 `a: "2015-02-24T18:19:39.12Z"`,
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100516 },
517 {
518 // RFC3339 with short dates.
519 "a: 2015-2-3T3:4:5Z",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100520 `a: "2015-2-3T3:4:5Z"`,
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100521 },
522 {
523 // ISO8601 lower case t
524 "a: 2015-02-24t18:19:39Z\n",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100525 `a: "2015-02-24t18:19:39Z"`,
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100526 },
527 {
528 // space separate, no time zone
529 "a: 2015-02-24 18:19:39\n",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100530 `a: "2015-02-24 18:19:39"`,
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100531 },
532 // Some cases not currently handled. Uncomment these when
533 // the code is fixed.
534 // {
535 // // space separated with time zone
536 // "a: 2001-12-14 21:59:43.10 -5",
537 // map[string]interface{}{"a": time.Date(2001, 12, 14, 21, 59, 43, .1e9, time.UTC)},
538 // },
539 // {
540 // // arbitrary whitespace between fields
541 // "a: 2001-12-14 \t\t \t21:59:43.10 \t Z",
542 // map[string]interface{}{"a": time.Date(2001, 12, 14, 21, 59, 43, .1e9, time.UTC)},
543 // },
544 {
545 // explicit string tag
546 "a: !!str 2015-01-01",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100547 `a: "2015-01-01"`,
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100548 },
549 {
550 // explicit timestamp tag on quoted string
551 "a: !!timestamp \"2015-01-01\"",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100552 `a: "2015-01-01"`,
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100553 },
554 {
555 // explicit timestamp tag on unquoted string
556 "a: !!timestamp 2015-01-01",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100557 `a: "2015-01-01"`,
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100558 },
559 {
560 // quoted string that's a valid timestamp
561 "a: \"2015-01-01\"",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100562 "a: \"2015-01-01\"",
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100563 },
564
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100565 // Empty list
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100566 {
567 "a: []",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100568 "a: []",
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100569 },
570
571 // UTF-16-LE
572 {
573 "\xff\xfe\xf1\x00o\x00\xf1\x00o\x00:\x00 \x00v\x00e\x00r\x00y\x00 \x00y\x00e\x00s\x00\n\x00",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100574 `ñoño: "very yes"`,
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100575 },
576 // UTF-16-LE with surrogate.
577 {
578 "\xff\xfe\xf1\x00o\x00\xf1\x00o\x00:\x00 \x00v\x00e\x00r\x00y\x00 \x00y\x00e\x00s\x00 \x00=\xd8\xd4\xdf\n\x00",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100579 `ñoño: "very yes 🟔"`,
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100580 },
581
582 // UTF-16-BE
583 {
584 "\xfe\xff\x00\xf1\x00o\x00\xf1\x00o\x00:\x00 \x00v\x00e\x00r\x00y\x00 \x00y\x00e\x00s\x00\n",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100585 `ñoño: "very yes"`,
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100586 },
587 // UTF-16-BE with surrogate.
588 {
589 "\xfe\xff\x00\xf1\x00o\x00\xf1\x00o\x00:\x00 \x00v\x00e\x00r\x00y\x00 \x00y\x00e\x00s\x00 \xd8=\xdf\xd4\x00\n",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100590 `ñoño: "very yes 🟔"`,
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100591 },
592
593 // YAML Float regex shouldn't match this
594 {
595 "a: 123456e1\n",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100596 `a: "123456e1"`,
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100597 }, {
598 "a: 123456E1\n",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100599 `a: "123456E1"`,
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100600 },
601 // yaml-test-suite 3GZX: Spec Example 7.1. Alias Nodes
602 {
603 "First occurrence: &anchor Foo\nSecond occurrence: *anchor\nOverride anchor: &anchor Bar\nReuse anchor: *anchor\n",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100604 `"First occurrence": "Foo"
605"Second occurrence": "Foo"
606"Override anchor": "Bar"
607"Reuse anchor": "Bar"`,
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100608 },
609 // Single document with garbage following it.
610 {
611 "---\nhello\n...\n}not yaml",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100612 `"hello"`,
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100613 },
614}
615
616type M map[interface{}]interface{}
617
618type inlineB struct {
619 B int
620 inlineC `yaml:",inline"`
621}
622
623type inlineC struct {
624 C int
625}
626
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100627var fset = token.NewFileSet()
628
629func cueStr(node ast.Node) string {
630 if s, ok := node.(*ast.StructLit); ok {
631 node = &ast.File{
632 Decls: s.Elts,
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100633 }
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100634 }
635 buf := bytes.Buffer{}
636 format.Node(&buf, node)
637 return strings.TrimSpace(buf.String())
638}
639
640func newDecoder(t *testing.T, data string) *yaml.Decoder {
641 dec, err := yaml.NewDecoder(fset, "test.yaml", strings.NewReader(data))
642 if err != nil {
643 t.Fatal(err)
644 }
645 return dec
646}
647
648func callUnmarshal(t *testing.T, data string) (ast.Expr, error) {
649 return yaml.Unmarshal(fset, "test.yaml", []byte(data))
650}
651
652func TestUnmarshal(t *testing.T) {
653 for i, item := range unmarshalTests {
654 t.Run(strconv.Itoa(i), func(t *testing.T) {
655 t.Logf("test %d: %q", i, item.data)
656 expr, err := callUnmarshal(t, item.data)
657 if _, ok := err.(*yaml.TypeError); !ok && err != nil {
658 t.Fatal("expected error to be nil")
659 }
660 if got := cueStr(expr); got != item.want {
661 t.Errorf("\n got: %v;\nwant: %v", got, item.want)
662 }
663 })
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100664 }
665}
666
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100667// // TODO(v3): This test should also work when unmarshaling onto an interface{}.
668// func (s *S) TestUnmarshalFullTimestamp(c *C) {
669// // Full timestamp in same format as encoded. This is confirmed to be
670// // properly decoded by Python as a timestamp as well.
671// var str = "2015-02-24T18:19:39.123456789-03:00"
672// expr, err := yaml.Unmarshal([]byte(str))
673// c.Assert(err, IsNil)
674// c.Assert(t, Equals, time.Date(2015, 2, 24, 18, 19, 39, 123456789, t.Location()))
675// c.Assert(t.In(time.UTC), Equals, time.Date(2015, 2, 24, 21, 19, 39, 123456789, time.UTC))
676// }
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100677
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100678func TestDecoderSingleDocument(t *testing.T) {
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100679 // Test that Decoder.Decode works as expected on
680 // all the unmarshal tests.
681 for i, item := range unmarshalTests {
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100682 t.Run(fmt.Sprintf("test %d: %q", i, item.data), func(t *testing.T) {
683 if item.data == "" {
684 // Behaviour differs when there's no YAML.
685 return
686 }
687 expr, err := newDecoder(t, item.data).Decode()
688 if _, ok := err.(*yaml.TypeError); !ok && err != nil {
689 t.Errorf("err should be nil, was %v", err)
690 }
691 if got := cueStr(expr); got != item.want {
692 t.Errorf("\n got: %v;\nwant: %v", got, item.want)
693 }
694 })
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100695 }
696}
697
698var decoderTests = []struct {
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100699 data string
700 want string
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100701}{{
702 "",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100703 "",
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100704}, {
705 "a: b",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100706 `a: "b"`,
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100707}, {
708 "---\na: b\n...\n",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100709 `a: "b"`,
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100710}, {
711 "---\n'hello'\n...\n---\ngoodbye\n...\n",
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100712 `"hello"` + "\n" + `"goodbye"`,
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100713}}
714
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100715func TestDecoder(t *testing.T) {
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100716 for i, item := range decoderTests {
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100717 t.Run(fmt.Sprintf("test %d: %q", i, item.data), func(t *testing.T) {
718 var values []string
719 dec := newDecoder(t, item.data)
720 for {
721 expr, err := dec.Decode()
722 if err == io.EOF {
723 break
724 }
725 if err != nil {
726 t.Errorf("err should be nil, was %v", err)
727 }
728 values = append(values, cueStr(expr))
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100729 }
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100730 got := strings.Join(values, "\n")
731 if got != item.want {
732 t.Errorf("\n got: %v;\nwant: %v", got, item.want)
733 }
734 })
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100735 }
736}
737
738type errReader struct{}
739
740func (errReader) Read([]byte) (int, error) {
741 return 0, errors.New("some read error")
742}
743
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100744func TestUnmarshalNaN(t *testing.T) {
745 expr, err := callUnmarshal(t, "notanum: .NaN")
746 if err != nil {
747 t.Fatal("unexpected error", err)
748 }
749 got := cueStr(expr)
750 want := "notanum: NaN"
751 if got != want {
752 t.Errorf("got %v; want %v", got, want)
753 }
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100754}
755
756var unmarshalErrorTests = []struct {
757 data, error string
758}{
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100759 {"\nv: !!float 'error'", "test.yaml:2: cannot decode !!str `error` as a !!float"},
760 {"v: [A,", "test.yaml:1: did not find expected node content"},
761 {"v:\n- [A,", "test.yaml:2: did not find expected node content"},
762 {"a:\n- b: *,", "test.yaml:2: did not find expected alphabetic or numeric character"},
763 {"a: *b\n", "test.yaml:1: unknown anchor 'b' referenced"},
764 {"a: &a\n b: *a\n", "test.yaml:2: anchor 'a' value contains itself"},
765 {"value: -", "test.yaml:1: block sequence entries are not allowed in this context"},
766 {"a: !!binary ==", "test.yaml:1: !!binary value contains invalid base64 data"},
767 {"{[.]}", `test.yaml:1: invalid map key: sequence`},
768 {"{{.}}", `test.yaml:1: invalid map key: map`},
769 {"b: *a\na: &a {c: 1}", `test.yaml:1: unknown anchor 'a' referenced`},
770 {"%TAG !%79! tag:yaml.org,2002:\n---\nv: !%79!int '1'", "test.yaml:1: did not find expected whitespace"},
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100771}
772
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100773func TestUnmarshalErrors(t *testing.T) {
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100774 for i, item := range unmarshalErrorTests {
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100775 t.Run(fmt.Sprintf("test %d: %q", i, item.data), func(t *testing.T) {
776 expr, err := callUnmarshal(t, item.data)
777 val := ""
778 if expr != nil {
779 val = cueStr(expr)
780 }
781 if err == nil || err.Error() != item.error {
782 t.Errorf("got %v; want %v; (value %v)", err, item.error, val)
783 }
784 })
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100785 }
786}
787
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100788func TestDecoderErrors(t *testing.T) {
789 for i, item := range unmarshalErrorTests {
790 t.Run(fmt.Sprintf("test %d: %q", i, item.data), func(t *testing.T) {
791 _, err := newDecoder(t, item.data).Decode()
792 if err == nil || err.Error() != item.error {
793 t.Errorf("got %v; want %v", err, item.error)
794 }
795 })
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100796 }
797}
798
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100799func TestFiles(t *testing.T) {
800 files := []string{"merge"}
801 for _, test := range files {
802 t.Run(test, func(t *testing.T) {
803 testname := fmt.Sprintf("testdata/%s.test", test)
804 filename := fmt.Sprintf("testdata/%s.out", test)
805 mergeTests, err := ioutil.ReadFile(testname)
806 if err != nil {
807 t.Fatal(err)
808 }
809 expr, err := yaml.Unmarshal(fset, "test.yaml", mergeTests)
810 if err != nil {
811 t.Fatal(err)
812 }
813 got := cueStr(expr)
814 if *update {
815 ioutil.WriteFile(filename, []byte(got), 0644)
816 return
817 }
818 b, err := ioutil.ReadFile(filename)
819 if err != nil {
820 t.Fatal(err)
821 }
822 if want := string(b); got != want {
823 t.Errorf("\n got: %v;\nwant: %v", got, want)
824 }
825 })
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100826 }
827}
828
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100829func TestFuzzCrashers(t *testing.T) {
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100830 cases := []string{
831 // runtime error: index out of range
832 "\"\\0\\\r\n",
833
834 // should not happen
835 " 0: [\n] 0",
836 "? ? \"\n\" 0",
837 " - {\n000}0",
838 "0:\n 0: [0\n] 0",
839 " - \"\n000\"0",
840 " - \"\n000\"\"",
841 "0:\n - {\n000}0",
842 "0:\n - \"\n000\"0",
843 "0:\n - \"\n000\"\"",
844
845 // runtime error: index out of range
846 " \ufeff\n",
847 "? \ufeff\n",
848 "? \ufeff:\n",
849 "0: \ufeff\n",
850 "? \ufeff: \ufeff\n",
851 }
852 for _, data := range cases {
Marcel van Lohuizen2156c812018-12-10 16:05:07 +0100853 _, _ = callUnmarshal(t, data)
Marcel van Lohuizen07ee2ab2018-12-10 15:57:15 +0100854 }
855}
856
857//var data []byte
858//func init() {
859// var err error
860// data, err = ioutil.ReadFile("/tmp/file.yaml")
861// if err != nil {
862// panic(err)
863// }
864//}
865//
866//func (s *S) BenchmarkUnmarshal(c *C) {
867// var err error
868// for i := 0; i < c.N; i++ {
869// var v map[string]interface{}
870// err = yaml.Unmarshal(data, &v)
871// }
872// if err != nil {
873// panic(err)
874// }
875//}
876//
877//func (s *S) BenchmarkMarshal(c *C) {
878// var v map[string]interface{}
879// yaml.Unmarshal(data, &v)
880// c.ResetTimer()
881// for i := 0; i < c.N; i++ {
882// yaml.Marshal(&v)
883// }
884//}