1 | define(["../main", "doh", "../json"], function(dojo, doh, JSON){ |
---|
2 | |
---|
3 | var mustThrow = function(json){ |
---|
4 | try{ |
---|
5 | JSON.parse(json, true); |
---|
6 | }catch(e){ |
---|
7 | return; |
---|
8 | } |
---|
9 | throw new Error("Invalid JSON " + json + " should have been rejected"); |
---|
10 | }; |
---|
11 | |
---|
12 | doh.register("tests.json", [ |
---|
13 | // all tests below are taken from #4.2 of the CSS3 Color Module |
---|
14 | function simpleString(t){ t.is("bar", JSON.parse('{"foo":"bar"}').foo)}, |
---|
15 | function simpleTrue(t){ t.is(true, JSON.parse('{"foo":true}').foo)}, |
---|
16 | function simpleFalse(t){ t.is(false, JSON.parse('{"foo":false}').foo)}, |
---|
17 | function simpleNull(t){ t.is(null, JSON.parse('{"foo":null}').foo)}, |
---|
18 | function simpleNumber(t){ t.is(3.3, JSON.parse('{"foo":3.3}', true).foo)}, |
---|
19 | function strictString(t){ t.is("bar", JSON.parse('{"foo":"bar"}', true).foo)}, |
---|
20 | function strictStringEsc(t){ t.is("b\n\t\"ar()", JSON.parse('{"foo":"b\\n\\t\\"ar()"}', true).foo)}, |
---|
21 | function strictTrue(t){ t.is(true, JSON.parse('{"foo":true}', true).foo)}, |
---|
22 | function strictFalse(t){ t.is(false, JSON.parse('{"foo":false}', true).foo)}, |
---|
23 | function strictNull(t){ t.is(null, JSON.parse('{"foo":null}', true).foo)}, |
---|
24 | function strictNumber(t){ t.is(3.3, JSON.parse('{"foo":3.3}', true).foo)}, |
---|
25 | function strictNumberNeg(t){ t.is(-3.3, JSON.parse('{"foo":-3.3}', true).foo)}, |
---|
26 | function exponentNegative(t){ t.is(3.3e-33, JSON.parse('{"foo":3.3e-33}', true).foo)}, |
---|
27 | function exponent(t){ t.is(3.3e33, JSON.parse('{"foo":3.3e33}', true).foo)}, |
---|
28 | function array(t){ t.is(3, JSON.parse('{"foo":[3,true,[]]}', true).foo[0])}, |
---|
29 | function badCall(t){ mustThrow('{"foo":alert()}')}, |
---|
30 | function badMath(t){ mustThrow('{"foo":3+4}')}, |
---|
31 | function badIndex(t){ mustThrow('{"foo":"bar"}[3]')}, |
---|
32 | function badKey(t){ mustThrow('{foo:"bar"}')}, |
---|
33 | //function badKey2(t){ mustThrow('{2:"bar"}')}, |
---|
34 | function badUnbalanced(t){ mustThrow('[')}, |
---|
35 | function badUnbalanced2(t){ mustThrow('}')}, |
---|
36 | function badType(t){ mustThrow('["foo":"bar"]')}, |
---|
37 | function badUnbalanced2(t){ mustThrow('}')}, |
---|
38 | function serializeString(t){ t.is('{"foo":"bar"}', JSON.stringify({"foo":"bar"}))}, |
---|
39 | function serializeNull(t){ t.is('{"foo":null}', JSON.stringify({"foo":null}))}, |
---|
40 | function serializeFunction(t){ t.is('{}', JSON.stringify({"foo":function(){}}))}, |
---|
41 | function serializeNaN(t){ t.is('{"foo":null}', JSON.stringify({"foo":NaN}))}, |
---|
42 | function serializeInfinity(t){ t.is('{"foo":null}', JSON.stringify({"foo":Infinity}))}, |
---|
43 | // there is differences in how many decimals of accuracies in seconds in how Dates are serialized between browsers |
---|
44 | function serializeDate(t){ t.t(/1970-01-01T00:00:00.*Z/.test(JSON.parse(JSON.stringify({"foo":new Date(1)})).foo));}, |
---|
45 | function serializeCircular(t){ |
---|
46 | try{ |
---|
47 | var a = {}; |
---|
48 | a.a = a; |
---|
49 | console.log("circular: " + JSON.stringify(a)); |
---|
50 | }catch(e){ |
---|
51 | return; |
---|
52 | } |
---|
53 | throw new Error("stringify must throw for circular references"); |
---|
54 | |
---|
55 | }, |
---|
56 | /*Apparently Firefox doesn't pass the key to the toJSON method*/ |
---|
57 | function serializeToJSON(t){ t.is('{"foo":{"name":"value"}}', JSON.stringify({foo:{toJSON:function(key){return {name:"value"};}}}))} |
---|
58 | ]); |
---|
59 | |
---|
60 | var smallDataSet = { |
---|
61 | prop1: null, |
---|
62 | prop2: true, |
---|
63 | prop3: [], |
---|
64 | prop4: 3.4325222223332266, |
---|
65 | prop5: 10003, |
---|
66 | prop6: "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean semper", |
---|
67 | prop7: "sagittis velit. Cras in mi. Duis porta mauris ut ligula. Proin porta rutrum", |
---|
68 | prop8: "lacus. Etiam consequat scelerisque quam. Nulla facilisi. Maecenas luctus", |
---|
69 | prop9: "venenatis nulla. In sit amet dui non mi semper iaculis. Sed molestie", |
---|
70 | prop10: "tortor at ipsum. Morbi dictum rutrum magna. Sed vitae risus." + |
---|
71 | "Aliquam vitae enim. Duis scelerisque metus auctor est venenatis imperdiet." + |
---|
72 | "Fusce dignissim porta augue. Nulla vestibulum. Integer lorem nunc," + |
---|
73 | "ullamcorper a, commodo ac, malesuada sed, dolor. Aenean id mi in massa" + |
---|
74 | "bibendum suscipit. Integer eros. Nullam suscipit mauris. In pellentesque." + |
---|
75 | "Mauris ipsum est, pharetra semper, pharetra in, viverra quis, tellus. Etiam" + |
---|
76 | "purus. Quisque egestas, tortor ac cursus lacinia, felis leo adipiscing" + |
---|
77 | "nisi, et rhoncus elit dolor eget eros. Fusce ut quam. Suspendisse eleifend" + |
---|
78 | "leo vitae ligula. Nulla facilisi." |
---|
79 | }; |
---|
80 | var smallJson = JSON.stringify(smallDataSet); |
---|
81 | |
---|
82 | var i, mediumDataSet = []; |
---|
83 | for(i = 0; i < 20; i++){ |
---|
84 | mediumDataSet.push({ |
---|
85 | prop1: null, |
---|
86 | prop2: true, |
---|
87 | prop3: false, |
---|
88 | prop4: 3.4325222223332266 - i, |
---|
89 | prop5: 10003 + i, |
---|
90 | prop6: "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean semper", |
---|
91 | prop7: "sagittis velit. Cras in mi. Duis porta mauris ut ligula. Proin porta rutrum", |
---|
92 | prop8: "lacus. Etiam consequat scelerisque quam. Nulla facilisi. Maecenas luctus", |
---|
93 | prop9: "venenatis nulla. In sit amet dui non mi semper iaculis. Sed molestie", |
---|
94 | prop10: "tortor at ipsum. Morbi dictum rutrum magna. Sed vitae risus." + |
---|
95 | "Aliquam vitae enim." |
---|
96 | }); |
---|
97 | } |
---|
98 | var mediumJson = JSON.stringify(mediumDataSet); |
---|
99 | |
---|
100 | var largeDataSet = []; |
---|
101 | for(i = 0; i < 100; i++){ |
---|
102 | largeDataSet.push({ |
---|
103 | prop1: null, |
---|
104 | prop2: true, |
---|
105 | prop3: false, |
---|
106 | prop4: 3.4325222223332266 - i, |
---|
107 | prop5: ["Mauris ipsum est, pharetra semper, pharetra in, viverra quis, tellus. Etiam" + |
---|
108 | "purus. Quisque egestas, tortor ac cursus lacinia, felis leo adipiscing", |
---|
109 | "nisi, et rhoncus elit dolor eget eros. Fusce ut quam. Suspendisse eleifend" + |
---|
110 | "leo vitae ligula. Nulla facilisi." |
---|
111 | ], |
---|
112 | prop6: "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean semper", |
---|
113 | prop7: "sagittis velit. Cras in mi. Duis porta mauris ut ligula. Proin porta rutrum", |
---|
114 | prop8: "lacus. Etiam consequat scelerisque quam. Nulla facilisi. Maecenas luctus", |
---|
115 | prop9: "venenatis nulla. In sit amet dui non mi semper iaculis. Sed molestie", |
---|
116 | prop10: "tortor at ipsum. Morbi dictum rutrum magna. Sed vitae risus." + |
---|
117 | "Aliquam vitae enim. Duis scelerisque metus auctor est venenatis imperdiet." + |
---|
118 | "Fusce dignissim porta augue. Nulla vestibulum. Integer lorem nunc," + |
---|
119 | "ullamcorper a, commodo ac, malesuada sed, dolor. Aenean id mi in massa" + |
---|
120 | "bibendum suscipit. Integer eros. Nullam suscipit mauris. In pellentesque." |
---|
121 | }); |
---|
122 | } |
---|
123 | var largeJson = JSON.stringify(largeDataSet); |
---|
124 | |
---|
125 | doh.register("tests.json.performance", [ |
---|
126 | // all tests below are taken from #4.2 of the CSS3 Color Module |
---|
127 | function small(){ |
---|
128 | var i = 10000; |
---|
129 | while(i-->0){ |
---|
130 | var result = JSON.parse(smallJson); |
---|
131 | } |
---|
132 | }, |
---|
133 | function strictSmall(){ |
---|
134 | var i = 10000; |
---|
135 | while(i-->0){ |
---|
136 | var result = JSON.parse(smallJson, true); |
---|
137 | } |
---|
138 | }, |
---|
139 | function medium(){ |
---|
140 | var i = 1000; |
---|
141 | while(i-->0){ |
---|
142 | var result = JSON.parse(mediumJson); |
---|
143 | } |
---|
144 | }, |
---|
145 | function strictMedium(){ |
---|
146 | var i = 1000; |
---|
147 | while(i-->0){ |
---|
148 | var result = JSON.parse(mediumJson, true); |
---|
149 | } |
---|
150 | }, |
---|
151 | function large(){ |
---|
152 | var i = 100; |
---|
153 | while(i-->0){ |
---|
154 | var result = JSON.parse(largeJson); |
---|
155 | } |
---|
156 | }, |
---|
157 | function strictLarge(){ |
---|
158 | var i = 100; |
---|
159 | while(i-->0){ |
---|
160 | var result = JSON.parse(largeJson, true); |
---|
161 | } |
---|
162 | } |
---|
163 | ]); |
---|
164 | |
---|
165 | }); |
---|
166 | |
---|