6 ($s
:expr
, $msg
:expr
) => ({
7 match $s
.parse
::<Value
>() {
8 Ok(s
) => panic
!("successfully parsed as {}", s
),
10 let e
= e
.to_string();
11 assert
!(e
.contains($msg
), "error: {}", e
);
23 version = \"0.1.0\"\r\n\
24 authors = [\"alex@crichton.co\"]\r\n\
28 path = \"lib.rs\"\r\n\
31 A Rust implementation of a TAR file reader and writer. This library does not\r\n\
32 currently handle compression, but it is abstract over all I/O readers and\r\n\
33 writers. Additionally, great lengths are taken to ensure that the entire\r\n\
34 contents are never required to be entirely resident in memory all at once.\r\n\
36 ".parse
::<Value
>().unwrap();
40 fn fun_with_strings() {
49 key4 = "The quick brown fox jumps over the lazy dog
."
61 # What you see is what you get.
62 winpath = 'C:\Users\nodejs\templates'
63 winpath2 = '\\ServerX\admin$\system32\'
64 quoted = 'Tom "Dubs
" Preston-Werner'
67 regex2 = '''I [dw]on't need \d{2} apples'''
70 trimmed in raw strings.
74 "#.parse::<Value>().unwrap();
75 assert_eq
!(table
["bar"].as_str(), Some("\0"));
76 assert_eq
!(table
["key1"].as_str(), Some("One\nTwo"));
77 assert_eq
!(table
["key2"].as_str(), Some("One\nTwo"));
78 assert_eq
!(table
["key3"].as_str(), Some("One\nTwo"));
80 let msg
= "The quick brown fox jumps over the lazy dog.";
81 assert_eq
!(table
["key4"].as_str(), Some(msg
));
82 assert_eq
!(table
["key5"].as_str(), Some(msg
));
83 assert_eq
!(table
["key6"].as_str(), Some(msg
));
85 assert_eq
!(table
["winpath"].as_str(), Some(r
"C:\Users\nodejs\templates"));
86 assert_eq
!(table
["winpath2"].as_str(), Some(r
"\\ServerX\admin$\system32\"));
87 assert_eq
!(table
["quoted"].as_str(), Some(r
#"Tom "Dubs" Preston-Werner"#));
88 assert_eq
!(table
["regex"].as_str(), Some(r
"<\i\c*\s*>"));
89 assert_eq
!(table
["regex2"].as_str(), Some(r
"I [dw]on't need \d{2} apples"));
90 assert_eq
!(table
["lines"].as_str(),
91 Some("The first newline is\n\
92 trimmed in raw strings.\n\
93 All other whitespace\n\
98 fn tables_in_arrays() {
109 "#.parse::<Value>().unwrap();
110 table
["foo"][0]["bar"].as_table().unwrap();
111 table
["foo"][1]["bar"].as_table().unwrap();
117 [foo]"#.parse::<Value>().unwrap();
118 table
["foo"].as_table().unwrap();
132 name = "red delicious"
135 name = "granny smith"
142 "#.parse::<Value>().unwrap();
143 assert_eq
!(table
["fruit"][0]["name"].as_str(), Some("apple"));
144 assert_eq
!(table
["fruit"][0]["physical"]["color"].as_str(), Some("red"));
145 assert_eq
!(table
["fruit"][0]["physical"]["shape"].as_str(), Some("round"));
146 assert_eq
!(table
["fruit"][0]["variety"][0]["name"].as_str(), Some("red delicious"));
147 assert_eq
!(table
["fruit"][0]["variety"][1]["name"].as_str(), Some("granny smith"));
148 assert_eq
!(table
["fruit"][1]["name"].as_str(), Some("banana"));
149 assert_eq
!(table
["fruit"][1]["variety"][0]["name"].as_str(), Some("plantain"));
154 "\r".parse
::<Value
>().unwrap_err();
155 "a = [ \r ]".parse
::<Value
>().unwrap_err();
156 "a = \"\"\"\r\"\"\"".parse
::<Value
>().unwrap_err();
157 "a = \"\"\"\\ \r \"\"\"".parse
::<Value
>().unwrap_err();
158 "a = '''\r'''".parse
::<Value
>().unwrap_err();
159 "a = '\r'".parse
::<Value
>().unwrap_err();
160 "a = \"\r\"".parse
::<Value
>().unwrap_err();
164 fn blank_literal_string() {
165 let table
= "foo = ''".parse
::<Value
>().unwrap();
166 assert_eq
!(table
["foo"].as_str(), Some(""));
171 let table
= "foo = \"\"\"\n\n\n\"\"\"".parse
::<Value
>().unwrap();
172 assert_eq
!(table
["foo"].as_str(), Some("\n\n"));
176 fn literal_eats_crlf() {
178 foo = \"\"\"\\\r\n\"\"\"
179 bar = \"\"\"\\\r\n \r\n \r\n a\"\"\"
180 ".parse
::<Value
>().unwrap();
181 assert_eq
!(table
["foo"].as_str(), Some(""));
182 assert_eq
!(table
["bar"].as_str(), Some("a"));
186 fn string_no_newline() {
187 "a = \"\n\"".parse
::<Value
>().unwrap_err();
188 "a = '\n'".parse
::<Value
>().unwrap_err();
192 fn bad_leading_zeros() {
193 "a = 00".parse
::<Value
>().unwrap_err();
194 "a = -00".parse
::<Value
>().unwrap_err();
195 "a = +00".parse
::<Value
>().unwrap_err();
196 "a = 00.0".parse
::<Value
>().unwrap_err();
197 "a = -00.0".parse
::<Value
>().unwrap_err();
198 "a = +00.0".parse
::<Value
>().unwrap_err();
199 "a = 9223372036854775808".parse
::<Value
>().unwrap_err();
200 "a = -9223372036854775809".parse
::<Value
>().unwrap_err();
205 "a = 0.".parse
::<Value
>().unwrap_err();
206 "a = 0.e".parse
::<Value
>().unwrap_err();
207 "a = 0.E".parse
::<Value
>().unwrap_err();
208 "a = 0.0E".parse
::<Value
>().unwrap_err();
209 "a = 0.0e".parse
::<Value
>().unwrap_err();
210 "a = 0.0e-".parse
::<Value
>().unwrap_err();
211 "a = 0.0e+".parse
::<Value
>().unwrap_err();
212 "a = 0.0e+00".parse
::<Value
>().unwrap_err();
218 ($actual
:expr
, $expected
:expr
) => ({
219 let f
= format
!("foo = {}", $actual
);
221 let a
= f
.parse
::<Value
>().unwrap();
222 assert_eq
!(a
["foo"].as_float().unwrap(), $expected
);
230 t
!("1.001e-0", 1.001);
235 t
!("2_0.0_0e1_0", 20.0e10
);
236 t
!("2_0.1_0e1_0", 20.1e10
);
240 fn bare_key_names() {
244 foo_-2--3--r23f--4-f2-4 = 3
252 \"character encoding\" = \"value\"
254 ".parse
::<Value
>().unwrap();
260 &a
["foo_-2--3--r23f--4-f2-4"];
264 &a
["character encoding"];
270 "key\n=3".parse
::<Value
>().unwrap_err();
271 "key=\n3".parse
::<Value
>().unwrap_err();
272 "key|=3".parse
::<Value
>().unwrap_err();
273 "\"\"=3".parse
::<Value
>().unwrap_err();
274 "=3".parse
::<Value
>().unwrap_err();
275 "\"\"|=3".parse
::<Value
>().unwrap_err();
276 "\"\n\"|=3".parse
::<Value
>().unwrap_err();
277 "\"\r\"|=3".parse
::<Value
>().unwrap_err();
281 fn bad_table_names() {
282 "[]".parse
::<Value
>().unwrap_err();
283 "[.]".parse
::<Value
>().unwrap_err();
284 "[\"\".\"\"]".parse
::<Value
>().unwrap_err();
285 "[a.]".parse
::<Value
>().unwrap_err();
286 "[\"\"]".parse
::<Value
>().unwrap_err();
287 "[!]".parse
::<Value
>().unwrap_err();
288 "[\"\n\"]".parse
::<Value
>().unwrap_err();
289 "[a.b]\n[a.\"b\"]".parse
::<Value
>().unwrap_err();
290 "[']".parse
::<Value
>().unwrap_err();
291 "[''']".parse
::<Value
>().unwrap_err();
292 "['''''']".parse
::<Value
>().unwrap_err();
293 "['\n']".parse
::<Value
>().unwrap_err();
294 "['\r\n']".parse
::<Value
>().unwrap_err();
306 ".parse
::<Value
>().unwrap();
316 fn invalid_bare_numeral() {
317 "4".parse
::<Value
>().unwrap_err();
322 "a = {}".parse
::<Value
>().unwrap();
323 "a = {b=1}".parse
::<Value
>().unwrap();
324 "a = { b = 1 }".parse
::<Value
>().unwrap();
325 "a = {a=1,b=2}".parse
::<Value
>().unwrap();
326 "a = {a=1,b=2,c={}}".parse
::<Value
>().unwrap();
327 "a = {a=1,}".parse
::<Value
>().unwrap_err();
328 "a = {,}".parse
::<Value
>().unwrap_err();
329 "a = {a=1,a=1}".parse
::<Value
>().unwrap_err();
330 "a = {\n}".parse
::<Value
>().unwrap_err();
331 "a = {".parse
::<Value
>().unwrap_err();
332 "a = {a=[\n]}".parse
::<Value
>().unwrap();
333 "a = {\"a\"=[\n]}".parse
::<Value
>().unwrap();
334 "a = [\n{},\n{},\n]".parse
::<Value
>().unwrap();
338 fn number_underscores() {
340 ($actual
:expr
, $expected
:expr
) => ({
341 let f
= format
!("foo = {}", $actual
);
342 let table
= f
.parse
::<Value
>().unwrap();
343 assert_eq
!(table
["foo"].as_integer().unwrap(), $expected
);
355 fn bad_underscores() {
356 bad
!("foo = 0_", "invalid number");
357 bad
!("foo = 0__0", "invalid number");
358 bad
!("foo = __0", "invalid number");
359 bad
!("foo = 1_0_", "invalid number");
363 fn bad_unicode_codepoint() {
364 bad
!("foo = \"\\uD800\"", "invalid escape value");
369 bad
!("foo = \"\\uxx\"", "invalid hex escape");
370 bad
!("foo = \"\\u\"", "invalid hex escape");
371 bad
!("foo = \"\\", "unterminated");
372 bad
!("foo = '", "unterminated");
377 assert_eq
!("foo = \"\"".parse
::<Value
>()
386 let table
= "foo = true".parse
::<Value
>().unwrap();
387 assert_eq
!(table
["foo"].as_bool(), Some(true));
389 let table
= "foo = false".parse
::<Value
>().unwrap();
390 assert_eq
!(table
["foo"].as_bool(), Some(false));
392 assert
!("foo = true2".parse
::<Value
>().is_err());
393 assert
!("foo = false2".parse
::<Value
>().is_err());
394 assert
!("foo = t1".parse
::<Value
>().is_err());
395 assert
!("foo = f2".parse
::<Value
>().is_err());
404 ", "duplicate key: `a`");
408 ", "duplicate key: `a`");
412 ", "duplicate key: `a`");
416 ", "duplicate key: `a`");
419 b = { c = 2, d = {} }
422 ", "duplicate key: `b`");
426 fn bad_table_redefine() {
433 ", "redefinition of table `a`");
437 b = { foo = \"bar\" }
439 ", "redefinition of table `a`");
444 ", "duplicate key: `b`");
450 ", "redefinition of table `a`");
457 let f
= format
!("foo = {}", $actual
);
458 let toml
= f
.parse
::<Value
>().expect(&format
!("failed: {}", f
));
459 assert_eq
!(toml
["foo"].as_datetime().unwrap().to_string(), $actual
);
463 t
!("2016-09-09T09:09:09Z");
464 t
!("2016-09-09T09:09:09.1Z");
465 t
!("2016-09-09T09:09:09.2+10:00");
466 t
!("2016-09-09T09:09:09.0123456789-02:00");
467 bad
!("foo = 2016-09-09T09:09:09.Z", "failed to parse date");
468 bad
!("foo = 2016-9-09T09:09:09Z", "failed to parse date");
469 bad
!("foo = 2016-09-09T09:09:09+2:00", "failed to parse date");
470 bad
!("foo = 2016-09-09T09:09:09-2:00", "failed to parse date");
471 bad
!("foo = 2016-09-09T09:09:09Z-2:00", "failed to parse date");
475 fn require_newline_after_value() {
476 bad
!("0=0r=false", "invalid number at line 1");
478 0=""o=""m=""r=""00="0"q="""0"""e="""0"""
479 "#, "expected newline");
485 "#, "expected newline");
487 0=[0]00=[0,0,0]t=["0","0","0"]s=[1000-00-00T00:00:00Z,2000-00-00T00:00:00Z]
488 "#, "expected newline");
491 "#, "invalid number at line 2");
493 0=0r0=0r=falsefal=false
494 "#, "invalid number at line 2");