1 | var toml = require('../');
|
2 | var fs = require('fs');
|
3 |
|
4 | var exampleExpected = {
|
5 | title: "TOML Example",
|
6 | owner: {
|
7 | name: "Tom Preston-Werner",
|
8 | organization: "GitHub",
|
9 | bio: "GitHub Cofounder & CEO\n\tLikes \"tater tots\" and beer and backslashes: \\",
|
10 | dob: new Date("1979-05-27T07:32:00Z")
|
11 | },
|
12 | database: {
|
13 | server: "192.168.1.1",
|
14 | ports: [8001, 8001, 8003],
|
15 | connection_max: 5000,
|
16 | connection_min: -2,
|
17 | max_temp: 87.1,
|
18 | min_temp: -17.76,
|
19 | enabled: true
|
20 | },
|
21 | servers: {
|
22 | alpha: {
|
23 | ip: "10.0.0.1",
|
24 | dc: "eqdc10"
|
25 | },
|
26 | beta: {
|
27 | ip: "10.0.0.2",
|
28 | dc: "eqdc10"
|
29 | }
|
30 | },
|
31 | clients: {
|
32 | data: [ ["gamma", "delta"], [1, 2] ]
|
33 | }
|
34 | };
|
35 |
|
36 | var hardExampleExpected = {
|
37 | the: {
|
38 | hard: {
|
39 | another_test_string: ' Same thing, but with a string #',
|
40 | 'bit#': {
|
41 | multi_line_array: [']'],
|
42 | 'what?': "You don't think some user won't do that?"
|
43 | },
|
44 | harder_test_string: " And when \"'s are in the string, along with # \"",
|
45 | test_array: ['] ', ' # '],
|
46 | test_array2: ['Test #11 ]proved that', 'Experiment #9 was a success']
|
47 | },
|
48 | test_string: "You'll hate me after this - #"
|
49 | }
|
50 | };
|
51 |
|
52 | var easyTableArrayExpected = {
|
53 | "products": [
|
54 | { "name": "Hammer", "sku": 738594937 },
|
55 | { },
|
56 | { "name": "Nail", "sku": 284758393, "color": "gray" }
|
57 | ]
|
58 | };
|
59 |
|
60 | var hardTableArrayExpected = {
|
61 | "fruit": [
|
62 | {
|
63 | "name": "apple",
|
64 | "physical": {
|
65 | "color": "red",
|
66 | "shape": "round"
|
67 | },
|
68 | "variety": [
|
69 | { "name": "red delicious" },
|
70 | { "name": "granny smith" }
|
71 | ]
|
72 | },
|
73 | {},
|
74 | {
|
75 | "name": "banana",
|
76 | "variety": [
|
77 | { "name": "plantain" }
|
78 | ]
|
79 | },
|
80 | {
|
81 | "name": "orange",
|
82 | "physical": {
|
83 | "color": "orange",
|
84 | "shape": "round"
|
85 | }
|
86 | }
|
87 | ]
|
88 | }
|
89 |
|
90 | var badInputs = [
|
91 | '[error] if you didn\'t catch this, your parser is broken',
|
92 | 'string = "Anything other than tabs, spaces and newline after a table or key value pair has ended should produce an error unless it is a comment" like this',
|
93 | 'array = [\n \"This might most likely happen in multiline arrays\",\n Like here,\n \"or here,\n and here\"\n ] End of array comment, forgot the #',
|
94 | 'number = 3.14 pi <--again forgot the #'
|
95 | ];
|
96 |
|
97 | exports.testParsesExample = function(test) {
|
98 | var str = fs.readFileSync(__dirname + "/example.toml", 'utf-8')
|
99 | test.deepEqual(toml.parse(str), exampleExpected);
|
100 | test.done();
|
101 | };
|
102 |
|
103 | exports.testParsesHardExample = function(test) {
|
104 | var str = fs.readFileSync(__dirname + "/hard_example.toml", 'utf-8')
|
105 | test.deepEqual(toml.parse(str), hardExampleExpected);
|
106 | test.done();
|
107 | };
|
108 |
|
109 | exports.testEasyTableArrays = function(test) {
|
110 | var str = fs.readFileSync(__dirname + "/table_arrays_easy.toml", 'utf8')
|
111 | test.deepEqual(toml.parse(str), easyTableArrayExpected);
|
112 | test.done();
|
113 | };
|
114 |
|
115 | exports.testHarderTableArrays = function(test) {
|
116 | var str = fs.readFileSync(__dirname + "/table_arrays_hard.toml", 'utf8')
|
117 | test.deepEqual(toml.parse(str), hardTableArrayExpected);
|
118 | test.done();
|
119 | };
|
120 |
|
121 | exports.testSupportsTrailingCommasInArrays = function(test) {
|
122 | var str = 'arr = [1, 2, 3,]';
|
123 | var expected = { arr: [1, 2, 3] };
|
124 | var results = toml.parse(str);
|
125 | test.deepEqual(results, expected);
|
126 | test.done();
|
127 | };
|
128 |
|
129 | exports.testSingleElementArrayWithNoTrailingComma = function(test) {
|
130 | var str = "a = [1]";
|
131 | test.deepEqual(toml.parse(str), {
|
132 | a: [1]
|
133 | });
|
134 | test.done();
|
135 | };
|
136 |
|
137 | exports.testEmptyArray = function(test) {
|
138 | var str = "a = []";
|
139 | test.deepEqual(toml.parse(str), {
|
140 | a: []
|
141 | });
|
142 | test.done();
|
143 | };
|
144 |
|
145 | exports.testArrayWithWhitespace = function(test) {
|
146 | var str = "[versions]\nfiles = [\n 3, \n 5 \n\n ]";
|
147 | test.deepEqual(toml.parse(str), {
|
148 | versions: {
|
149 | files: [3, 5]
|
150 | }
|
151 | });
|
152 | test.done();
|
153 | };
|
154 |
|
155 | exports.testEmptyArrayWithWhitespace = function(test) {
|
156 | var str = "[versions]\nfiles = [\n \n ]";
|
157 | test.deepEqual(toml.parse(str), {
|
158 | versions: {
|
159 | files: []
|
160 | }
|
161 | });
|
162 | test.done();
|
163 | };
|
164 |
|
165 | exports.textDefineOnSuperkey = function(test) {
|
166 | var str = "[a.b]\nc = 1\n\n[a]\nd = 2";
|
167 | var expected = {
|
168 | a: {
|
169 | b: {
|
170 | c: 1
|
171 | },
|
172 | d: 2
|
173 | }
|
174 | };
|
175 | test.deepEqual(toml.parse(str), expected);
|
176 | test.done();
|
177 | };
|
178 |
|
179 | exports.testWhitespace = function(test) {
|
180 | var str = "a = 1\n \n b = 2 ";
|
181 | test.deepEqual(toml.parse(str), {
|
182 | a: 1, b: 2
|
183 | });
|
184 | test.done();
|
185 | };
|
186 |
|
187 | exports.testUnicode = function(test) {
|
188 | var str = "str = \"My name is Jos\\u00E9\"";
|
189 | test.deepEqual(toml.parse(str), {
|
190 | str: "My name is Jos\u00E9"
|
191 | });
|
192 |
|
193 | var str = "str = \"My name is Jos\\U000000E9\"";
|
194 | test.deepEqual(toml.parse(str), {
|
195 | str: "My name is Jos\u00E9"
|
196 | });
|
197 | test.done();
|
198 | };
|
199 |
|
200 | exports.testMultilineStrings = function(test) {
|
201 | var str = fs.readFileSync(__dirname + "/multiline_strings.toml", 'utf8');
|
202 | test.deepEqual(toml.parse(str), {
|
203 | key1: "One\nTwo",
|
204 | key2: "One\nTwo",
|
205 | key3: "One\nTwo"
|
206 | });
|
207 | test.done();
|
208 | };
|
209 |
|
210 | exports.testMultilineEatWhitespace = function(test) {
|
211 | var str = fs.readFileSync(__dirname + "/multiline_eat_whitespace.toml", 'utf8');
|
212 | test.deepEqual(toml.parse(str), {
|
213 | key1: "The quick brown fox jumps over the lazy dog.",
|
214 | key2: "The quick brown fox jumps over the lazy dog.",
|
215 | key3: "The quick brown fox jumps over the lazy dog."
|
216 | });
|
217 | test.done();
|
218 | };
|
219 |
|
220 | exports.testLiteralStrings = function(test) {
|
221 | var str = fs.readFileSync(__dirname + "/literal_strings.toml", 'utf8');
|
222 | test.deepEqual(toml.parse(str), {
|
223 | winpath: "C:\\Users\\nodejs\\templates",
|
224 | winpath2: "\\\\ServerX\\admin$\\system32\\",
|
225 | quoted: "Tom \"Dubs\" Preston-Werner",
|
226 | regex: "<\\i\\c*\\s*>"
|
227 | });
|
228 | test.done();
|
229 | };
|
230 |
|
231 | exports.testMultilineLiteralStrings = function(test) {
|
232 | var str = fs.readFileSync(__dirname + "/multiline_literal_strings.toml", 'utf8');
|
233 | test.deepEqual(toml.parse(str), {
|
234 | regex2: "I [dw]on't need \\d{2} apples",
|
235 | lines: "The first newline is\ntrimmed in raw strings.\n All other whitespace\n is preserved.\n"
|
236 | });
|
237 | test.done();
|
238 | };
|
239 |
|
240 | exports.testIntegerFormats = function(test) {
|
241 | var str = "a = +99\nb = 42\nc = 0\nd = -17\ne = 1_000_001\nf = 1_2_3_4_5 # why u do dis";
|
242 | test.deepEqual(toml.parse(str), {
|
243 | a: 99,
|
244 | b: 42,
|
245 | c: 0,
|
246 | d: -17,
|
247 | e: 1000001,
|
248 | f: 12345
|
249 | });
|
250 | test.done();
|
251 | };
|
252 |
|
253 | exports.testFloatFormats = function(test) {
|
254 | var str = "a = +1.0\nb = 3.1415\nc = -0.01\n" +
|
255 | "d = 5e+22\ne = 1e6\nf = -2E-2\n" +
|
256 | "g = 6.626e-34\n" +
|
257 | "h = 9_224_617.445_991_228_313\n" +
|
258 | "i = 1e1_000";
|
259 | test.deepEqual(toml.parse(str), {
|
260 | a: 1.0,
|
261 | b: 3.1415,
|
262 | c: -0.01,
|
263 | d: 5e22,
|
264 | e: 1e6,
|
265 | f: -2e-2,
|
266 | g: 6.626e-34,
|
267 | h: 9224617.445991228313,
|
268 | i: 1e1000
|
269 | });
|
270 | test.done();
|
271 | };
|
272 |
|
273 | exports.testDate = function(test) {
|
274 | var date = new Date("1979-05-27T07:32:00Z");
|
275 | test.deepEqual(toml.parse("a = 1979-05-27T07:32:00Z"), {
|
276 | a: date
|
277 | });
|
278 | test.done();
|
279 | };
|
280 |
|
281 | exports.testDateWithOffset = function(test) {
|
282 | var date1 = new Date("1979-05-27T07:32:00-07:00"),
|
283 | date2 = new Date("1979-05-27T07:32:00+02:00");
|
284 | test.deepEqual(toml.parse("a = 1979-05-27T07:32:00-07:00\nb = 1979-05-27T07:32:00+02:00"), {
|
285 | a: date1,
|
286 | b: date2
|
287 | });
|
288 | test.done();
|
289 | };
|
290 |
|
291 | exports.testDateWithSecondFraction = function(test) {
|
292 | var date = new Date("1979-05-27T00:32:00.999999-07:00");
|
293 | test.deepEqual(toml.parse("a = 1979-05-27T00:32:00.999999-07:00"), {
|
294 | a: date
|
295 | });
|
296 | test.done();
|
297 | };
|
298 |
|
299 | exports.testDateFromIsoString = function(test) {
|
300 |
|
301 | var date = new Date(),
|
302 | dateStr = date.toISOString(),
|
303 | tomlStr = "a = " + dateStr;
|
304 |
|
305 | test.deepEqual(toml.parse(tomlStr), {
|
306 | a: date
|
307 | });
|
308 | test.done();
|
309 | };
|
310 |
|
311 | exports.testInlineTables = function(test) {
|
312 | var str = fs.readFileSync(__dirname + "/inline_tables.toml", 'utf8'),
|
313 | parsed = toml.parse(str);
|
314 | test.deepEqual(parsed, {
|
315 | name: {
|
316 | first: "Tom",
|
317 | last: "Preston-Werner"
|
318 | },
|
319 | point: {
|
320 | x: 1,
|
321 | y: 2
|
322 | },
|
323 | nested: {
|
324 | x: {
|
325 | a: {
|
326 | b: 3
|
327 | }
|
328 | }
|
329 | },
|
330 | points: [
|
331 | { x: 1, y: 2, z: 3 },
|
332 | { x: 7, y: 8, z: 9 },
|
333 | { x: 2, y: 4, z: 8 }
|
334 | ],
|
335 | arrays: [
|
336 | { x: [1, 2, 3], y: [4, 5, 6] },
|
337 | { x: [7, 8, 9], y: [0, 1, 2] }
|
338 | ]
|
339 | });
|
340 | test.done();
|
341 | };
|
342 |
|
343 | exports.testErrorOnBadUnicode = function(test) {
|
344 | var str = "str = \"My name is Jos\\uD800\"";
|
345 | test.throws(function() {
|
346 | toml.parse(str);
|
347 | });
|
348 | test.done();
|
349 | };
|
350 |
|
351 | exports.testErrorOnDotAtStartOfKey = function(test) {
|
352 | test.throws(function() {
|
353 | var str = "[.a]\nb = 1";
|
354 | toml.parse(str);
|
355 | });
|
356 | test.done()
|
357 | };
|
358 |
|
359 | exports.testErrorOnDotAtEndOfKey = function(test) {
|
360 | test.throws(function() {
|
361 | var str = "[.a]\nb = 1";
|
362 | toml.parse(str);
|
363 | });
|
364 | test.done()
|
365 | };
|
366 |
|
367 | exports.testErrorOnTableOverride = function(test) {
|
368 | test.throws(function() {
|
369 | var str = "[a]\nb = 1\n\n[a]\nc = 2";
|
370 | toml.parse(str);
|
371 | });
|
372 | test.done()
|
373 | };
|
374 |
|
375 | exports.testErrorOnKeyOverride = function(test) {
|
376 | test.throws(function() {
|
377 | var str = "[a]\nb = 1\n[a.b]\nc = 2";
|
378 | toml.parse(str);
|
379 | });
|
380 | test.done()
|
381 | };
|
382 |
|
383 | exports.testErrorOnKeyOverrideWithArrayTable = function(test) {
|
384 | test.throws(function() {
|
385 | var str = "[a]\nb = 1\n[[a]]\nc = 2";
|
386 | toml.parse(str);
|
387 | });
|
388 | test.done()
|
389 | };
|
390 |
|
391 | exports.testErrorOnKeyReplace = function(test) {
|
392 | test.throws(function() {
|
393 | var str = "[a]\nb = 1\nb = 2";
|
394 | toml.parse(str);
|
395 | });
|
396 | test.done()
|
397 | };
|
398 |
|
399 | exports.testErrorOnArrayMismatch = function(test) {
|
400 | test.throws(function() {
|
401 | var str = 'data = [1, 2, "test"]'
|
402 | toml.parse(str);
|
403 | });
|
404 | test.done();
|
405 | };
|
406 |
|
407 | exports.textErrorOnBadInputs = function(test) {
|
408 | var count = 0;
|
409 | for (i in badInputs) {
|
410 | (function(num) {
|
411 | test.throws(function() {
|
412 | toml.parse(badInputs[num]);
|
413 | });
|
414 | })(i);
|
415 | }
|
416 | test.done();
|
417 | };
|
418 |
|
419 | exports.testErrorsHaveCorrectLineAndColumn = function(test) {
|
420 | var str = "[a]\nb = 1\n [a.b]\nc = 2";
|
421 | try { toml.parse(str); }
|
422 | catch (e) {
|
423 | test.equal(e.line, 3);
|
424 | test.equal(e.column, 2);
|
425 | test.done();
|
426 | }
|
427 | };
|