UNPKG

10.1 kBJavaScriptView Raw
1var toml = require('../');
2var fs = require('fs');
3
4var 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
36var 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
52var easyTableArrayExpected = {
53 "products": [
54 { "name": "Hammer", "sku": 738594937 },
55 { },
56 { "name": "Nail", "sku": 284758393, "color": "gray" }
57 ]
58};
59
60var 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
90var 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
97exports.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
103exports.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
109exports.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
115exports.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
121exports.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
129exports.testSingleElementArrayWithNoTrailingComma = function(test) {
130 var str = "a = [1]";
131 test.deepEqual(toml.parse(str), {
132 a: [1]
133 });
134 test.done();
135};
136
137exports.testEmptyArray = function(test) {
138 var str = "a = []";
139 test.deepEqual(toml.parse(str), {
140 a: []
141 });
142 test.done();
143};
144
145exports.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
155exports.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
165exports.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
179exports.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
187exports.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
200exports.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
210exports.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
220exports.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
231exports.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
240exports.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
253exports.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
273exports.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
281exports.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
291exports.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
299exports.testDateFromIsoString = function(test) {
300 // https://github.com/BinaryMuse/toml-node/issues/20
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
311exports.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
343exports.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
351exports.testErrorOnDotAtStartOfKey = function(test) {
352 test.throws(function() {
353 var str = "[.a]\nb = 1";
354 toml.parse(str);
355 });
356 test.done()
357};
358
359exports.testErrorOnDotAtEndOfKey = function(test) {
360 test.throws(function() {
361 var str = "[.a]\nb = 1";
362 toml.parse(str);
363 });
364 test.done()
365};
366
367exports.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
375exports.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
383exports.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
391exports.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
399exports.testErrorOnArrayMismatch = function(test) {
400 test.throws(function() {
401 var str = 'data = [1, 2, "test"]'
402 toml.parse(str);
403 });
404 test.done();
405};
406
407exports.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
419exports.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};