sassc 1.11.1 → 1.11.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (85) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +2 -2
  3. data/README.md +3 -2
  4. data/ext/libsass/Makefile.conf +2 -1
  5. data/ext/libsass/appveyor.yml +10 -5
  6. data/ext/libsass/docs/dev-ast-memory.md +223 -0
  7. data/ext/libsass/include/sass/base.h +2 -0
  8. data/ext/libsass/script/bootstrap +7 -4
  9. data/ext/libsass/script/ci-build-libsass +3 -3
  10. data/ext/libsass/script/ci-install-compiler +2 -0
  11. data/ext/libsass/script/ci-report-coverage +2 -1
  12. data/ext/libsass/script/test-leaks.pl +103 -0
  13. data/ext/libsass/src/ast.cpp +621 -495
  14. data/ext/libsass/src/ast.hpp +801 -367
  15. data/ext/libsass/src/ast_def_macros.hpp +5 -5
  16. data/ext/libsass/src/ast_fwd_decl.hpp +312 -14
  17. data/ext/libsass/src/bind.cpp +54 -51
  18. data/ext/libsass/src/bind.hpp +3 -7
  19. data/ext/libsass/src/check_nesting.cpp +117 -120
  20. data/ext/libsass/src/check_nesting.hpp +38 -34
  21. data/ext/libsass/src/color_maps.cpp +3 -3
  22. data/ext/libsass/src/color_maps.hpp +3 -3
  23. data/ext/libsass/src/context.cpp +33 -34
  24. data/ext/libsass/src/context.hpp +12 -14
  25. data/ext/libsass/src/cssize.cpp +200 -228
  26. data/ext/libsass/src/cssize.hpp +49 -49
  27. data/ext/libsass/src/debugger.hpp +260 -241
  28. data/ext/libsass/src/emitter.cpp +6 -6
  29. data/ext/libsass/src/emitter.hpp +7 -7
  30. data/ext/libsass/src/environment.cpp +2 -2
  31. data/ext/libsass/src/environment.hpp +0 -2
  32. data/ext/libsass/src/error_handling.cpp +5 -5
  33. data/ext/libsass/src/error_handling.hpp +12 -12
  34. data/ext/libsass/src/eval.cpp +412 -401
  35. data/ext/libsass/src/eval.hpp +61 -62
  36. data/ext/libsass/src/expand.cpp +223 -204
  37. data/ext/libsass/src/expand.hpp +42 -42
  38. data/ext/libsass/src/extend.cpp +198 -201
  39. data/ext/libsass/src/extend.hpp +12 -14
  40. data/ext/libsass/src/file.hpp +4 -5
  41. data/ext/libsass/src/functions.cpp +413 -418
  42. data/ext/libsass/src/functions.hpp +7 -10
  43. data/ext/libsass/src/inspect.cpp +115 -109
  44. data/ext/libsass/src/inspect.hpp +69 -69
  45. data/ext/libsass/src/listize.cpp +31 -33
  46. data/ext/libsass/src/listize.hpp +8 -10
  47. data/ext/libsass/src/memory/SharedPtr.cpp +116 -0
  48. data/ext/libsass/src/memory/SharedPtr.hpp +202 -0
  49. data/ext/libsass/src/node.cpp +45 -43
  50. data/ext/libsass/src/node.hpp +15 -15
  51. data/ext/libsass/src/operation.hpp +136 -136
  52. data/ext/libsass/src/output.cpp +48 -49
  53. data/ext/libsass/src/output.hpp +14 -14
  54. data/ext/libsass/src/parser.cpp +530 -554
  55. data/ext/libsass/src/parser.hpp +91 -96
  56. data/ext/libsass/src/prelexer.cpp +13 -10
  57. data/ext/libsass/src/remove_placeholders.cpp +25 -21
  58. data/ext/libsass/src/remove_placeholders.hpp +7 -7
  59. data/ext/libsass/src/sass2scss.cpp +2 -1
  60. data/ext/libsass/src/sass_context.cpp +125 -107
  61. data/ext/libsass/src/sass_context.hpp +1 -1
  62. data/ext/libsass/src/sass_util.hpp +5 -5
  63. data/ext/libsass/src/sass_values.cpp +27 -27
  64. data/ext/libsass/src/source_map.cpp +2 -2
  65. data/ext/libsass/src/source_map.hpp +2 -2
  66. data/ext/libsass/src/subset_map.cpp +57 -0
  67. data/ext/libsass/src/subset_map.hpp +8 -76
  68. data/ext/libsass/src/to_c.cpp +13 -13
  69. data/ext/libsass/src/to_c.hpp +14 -14
  70. data/ext/libsass/src/to_value.cpp +20 -20
  71. data/ext/libsass/src/to_value.hpp +20 -21
  72. data/ext/libsass/src/util.cpp +55 -88
  73. data/ext/libsass/src/util.hpp +9 -13
  74. data/ext/libsass/src/values.cpp +27 -26
  75. data/ext/libsass/src/values.hpp +2 -2
  76. data/ext/libsass/test/test_subset_map.cpp +69 -69
  77. data/ext/libsass/win/libsass.targets +3 -2
  78. data/ext/libsass/win/libsass.vcxproj.filters +9 -6
  79. data/lib/sassc/version.rb +1 -1
  80. data/sassc.gemspec +0 -1
  81. data/test/native_test.rb +1 -1
  82. metadata +7 -5
  83. data/ext/libsass/src/ast_factory.hpp +0 -92
  84. data/ext/libsass/src/memory_manager.cpp +0 -77
  85. data/ext/libsass/src/memory_manager.hpp +0 -48
@@ -5,8 +5,8 @@
5
5
 
6
6
  namespace Sass {
7
7
 
8
- union Sass_Value* ast_node_to_sass_value (const Expression* val);
9
- Value* sass_value_to_ast_node (Memory_Manager& mem, const union Sass_Value* val);
8
+ union Sass_Value* ast_node_to_sass_value (const Expression_Ptr val);
9
+ Value_Ptr sass_value_to_ast_node (const union Sass_Value* val);
10
10
 
11
11
  }
12
12
  #endif
@@ -11,39 +11,39 @@ void assertEqual(string std::sExpected, std::string sResult);
11
11
 
12
12
  void setup() {
13
13
  ssm.clear();
14
-
14
+
15
15
  //@ssm[Set[1, 2]] = "Foo"
16
16
  std::vector<std::string> s1;
17
17
  s1.push_back("1");
18
18
  s1.push_back("2");
19
19
  ssm.put(s1, "Foo");
20
-
20
+
21
21
  //@ssm[Set["fizz", "fazz"]] = "Bar"
22
22
  std::vector<std::string> s2;
23
23
  s2.push_back("fizz");
24
24
  s2.push_back("fazz");
25
25
  ssm.put(s2, "Bar");
26
-
26
+
27
27
  //@ssm[Set[:foo, :bar]] = "Baz"
28
28
  std::vector<std::string> s3;
29
29
  s3.push_back(":foo");
30
30
  s3.push_back(":bar");
31
31
  ssm.put(s3, "Baz");
32
-
32
+
33
33
  //@ssm[Set[:foo, :bar, :baz]] = "Bang"
34
34
  std::vector<std::string> s4;
35
35
  s4.push_back(":foo");
36
36
  s4.push_back(":bar");
37
37
  s4.push_back(":baz");
38
38
  ssm.put(s4, "Bang");
39
-
39
+
40
40
  //@ssm[Set[:bip, :bop, :blip]] = "Qux"
41
41
  std::vector<std::string> s5;
42
42
  s5.push_back(":bip");
43
43
  s5.push_back(":bop");
44
44
  s5.push_back(":blip");
45
45
  ssm.put(s5, "Qux");
46
-
46
+
47
47
  //@ssm[Set[:bip, :bop]] = "Thram"
48
48
  std::vector<std::string> s6;
49
49
  s6.push_back(":bip");
@@ -53,119 +53,119 @@ void setup() {
53
53
 
54
54
  void testEqualKeys() {
55
55
  std::cout << "testEqualKeys" << std::endl;
56
-
56
+
57
57
  //assert_equal [["Foo", Set[1, 2]]], @ssm.get(Set[1, 2])
58
58
  std::vector<std::string> k1;
59
59
  k1.push_back("1");
60
60
  k1.push_back("2");
61
61
  assertEqual("[[Foo, Set[1, 2]]]", toString(ssm.get_kv(k1)));
62
-
62
+
63
63
  //assert_equal [["Bar", Set["fizz", "fazz"]]], @ssm.get(Set["fizz", "fazz"])
64
64
  std::vector<std::string> k2;
65
65
  k2.push_back("fizz");
66
66
  k2.push_back("fazz");
67
67
  assertEqual("[[Bar, Set[fizz, fazz]]]", toString(ssm.get_kv(k2)));
68
-
68
+
69
69
  std::cout << std::endl;
70
70
  }
71
71
 
72
72
  void testSubsetKeys() {
73
73
  std::cout << "testSubsetKeys" << std::endl;
74
-
74
+
75
75
  //assert_equal [["Foo", Set[1, 2]]], @ssm.get(Set[1, 2, "fuzz"])
76
76
  std::vector<std::string> k1;
77
77
  k1.push_back("1");
78
78
  k1.push_back("2");
79
79
  k1.push_back("fuzz");
80
80
  assertEqual("[[Foo, Set[1, 2]]]", toString(ssm.get_kv(k1)));
81
-
81
+
82
82
  //assert_equal [["Bar", Set["fizz", "fazz"]]], @ssm.get(Set["fizz", "fazz", 3])
83
83
  std::vector<std::string> k2;
84
84
  k2.push_back("fizz");
85
85
  k2.push_back("fazz");
86
86
  k2.push_back("3");
87
87
  assertEqual("[[Bar, Set[fizz, fazz]]]", toString(ssm.get_kv(k2)));
88
-
88
+
89
89
  std::cout << std::endl;
90
90
  }
91
91
 
92
92
  void testSupersetKeys() {
93
93
  std::cout << "testSupersetKeys" << std::endl;
94
-
94
+
95
95
  //assert_equal [], @ssm.get(Set[1])
96
96
  std::vector<std::string> k1;
97
97
  k1.push_back("1");
98
98
  assertEqual("[]", toString(ssm.get_kv(k1)));
99
-
99
+
100
100
  //assert_equal [], @ssm.get(Set[2])
101
101
  std::vector<std::string> k2;
102
102
  k2.push_back("2");
103
103
  assertEqual("[]", toString(ssm.get_kv(k2)));
104
-
104
+
105
105
  //assert_equal [], @ssm.get(Set["fizz"])
106
106
  std::vector<std::string> k3;
107
107
  k3.push_back("fizz");
108
108
  assertEqual("[]", toString(ssm.get_kv(k3)));
109
-
109
+
110
110
  //assert_equal [], @ssm.get(Set["fazz"])
111
111
  std::vector<std::string> k4;
112
112
  k4.push_back("fazz");
113
113
  assertEqual("[]", toString(ssm.get_kv(k4)));
114
-
114
+
115
115
  std::cout << std::endl;
116
116
  }
117
117
 
118
118
  void testDisjointKeys() {
119
119
  std::cout << "testDisjointKeys" << std::endl;
120
-
120
+
121
121
  //assert_equal [], @ssm.get(Set[3, 4])
122
122
  std::vector<std::string> k1;
123
123
  k1.push_back("3");
124
124
  k1.push_back("4");
125
125
  assertEqual("[]", toString(ssm.get_kv(k1)));
126
-
126
+
127
127
  //assert_equal [], @ssm.get(Set["fuzz", "frizz"])
128
128
  std::vector<std::string> k2;
129
129
  k2.push_back("fuzz");
130
130
  k2.push_back("frizz");
131
131
  assertEqual("[]", toString(ssm.get_kv(k2)));
132
-
132
+
133
133
  //assert_equal [], @ssm.get(Set["gran", 15])
134
134
  std::vector<std::string> k3;
135
135
  k3.push_back("gran");
136
136
  k3.push_back("15");
137
137
  assertEqual("[]", toString(ssm.get_kv(k3)));
138
-
138
+
139
139
  std::cout << std::endl;
140
140
  }
141
141
 
142
142
  void testSemiDisjointKeys() {
143
143
  std::cout << "testSemiDisjointKeys" << std::endl;
144
-
144
+
145
145
  //assert_equal [], @ssm.get(Set[2, 3])
146
146
  std::vector<std::string> k1;
147
147
  k1.push_back("2");
148
148
  k1.push_back("3");
149
149
  assertEqual("[]", toString(ssm.get_kv(k1)));
150
-
150
+
151
151
  //assert_equal [], @ssm.get(Set["fizz", "fuzz"])
152
152
  std::vector<std::string> k2;
153
153
  k2.push_back("fizz");
154
154
  k2.push_back("fuzz");
155
155
  assertEqual("[]", toString(ssm.get_kv(k2)));
156
-
156
+
157
157
  //assert_equal [], @ssm.get(Set[1, "fazz"])
158
158
  std::vector<std::string> k3;
159
159
  k3.push_back("1");
160
160
  k3.push_back("fazz");
161
161
  assertEqual("[]", toString(ssm.get_kv(k3)));
162
-
162
+
163
163
  std::cout << std::endl;
164
164
  }
165
165
 
166
166
  void testEmptyKeySet() {
167
167
  std::cout << "testEmptyKeySet" << std::endl;
168
-
168
+
169
169
  //assert_raises(ArgumentError) {@ssm[Set[]] = "Fail"}
170
170
  std::vector<std::string> s1;
171
171
  try {
@@ -178,16 +178,16 @@ void testEmptyKeySet() {
178
178
 
179
179
  void testEmptyKeyGet() {
180
180
  std::cout << "testEmptyKeyGet" << std::endl;
181
-
181
+
182
182
  //assert_equal [], @ssm.get(Set[])
183
183
  std::vector<std::string> k1;
184
184
  assertEqual("[]", toString(ssm.get_kv(k1)));
185
-
185
+
186
186
  std::cout << std::endl;
187
187
  }
188
188
  void testMultipleSubsets() {
189
189
  std::cout << "testMultipleSubsets" << std::endl;
190
-
190
+
191
191
  //assert_equal [["Foo", Set[1, 2]], ["Bar", Set["fizz", "fazz"]]], @ssm.get(Set[1, 2, "fizz", "fazz"])
192
192
  std::vector<std::string> k1;
193
193
  k1.push_back("1");
@@ -195,7 +195,7 @@ void testMultipleSubsets() {
195
195
  k1.push_back("fizz");
196
196
  k1.push_back("fazz");
197
197
  assertEqual("[[Foo, Set[1, 2]], [Bar, Set[fizz, fazz]]]", toString(ssm.get_kv(k1)));
198
-
198
+
199
199
  //assert_equal [["Foo", Set[1, 2]], ["Bar", Set["fizz", "fazz"]]], @ssm.get(Set[1, 2, 3, "fizz", "fazz", "fuzz"])
200
200
  std::vector<std::string> k2;
201
201
  k2.push_back("1");
@@ -205,51 +205,51 @@ void testMultipleSubsets() {
205
205
  k2.push_back("fazz");
206
206
  k2.push_back("fuzz");
207
207
  assertEqual("[[Foo, Set[1, 2]], [Bar, Set[fizz, fazz]]]", toString(ssm.get_kv(k2)));
208
-
208
+
209
209
  //assert_equal [["Baz", Set[:foo, :bar]]], @ssm.get(Set[:foo, :bar])
210
210
  std::vector<std::string> k3;
211
211
  k3.push_back(":foo");
212
212
  k3.push_back(":bar");
213
213
  assertEqual("[[Baz, Set[:foo, :bar]]]", toString(ssm.get_kv(k3)));
214
-
214
+
215
215
  //assert_equal [["Baz", Set[:foo, :bar]], ["Bang", Set[:foo, :bar, :baz]]], @ssm.get(Set[:foo, :bar, :baz])
216
216
  std::vector<std::string> k4;
217
217
  k4.push_back(":foo");
218
218
  k4.push_back(":bar");
219
219
  k4.push_back(":baz");
220
220
  assertEqual("[[Baz, Set[:foo, :bar]], [Bang, Set[:foo, :bar, :baz]]]", toString(ssm.get_kv(k4)));
221
-
221
+
222
222
  std::cout << std::endl;
223
223
  }
224
224
  void testBracketBracket() {
225
225
  std::cout << "testBracketBracket" << std::endl;
226
-
226
+
227
227
  //assert_equal ["Foo"], @ssm[Set[1, 2, "fuzz"]]
228
228
  std::vector<std::string> k1;
229
229
  k1.push_back("1");
230
230
  k1.push_back("2");
231
231
  k1.push_back("fuzz");
232
232
  assertEqual("[Foo]", toString(ssm.get_v(k1)));
233
-
233
+
234
234
  //assert_equal ["Baz", "Bang"], @ssm[Set[:foo, :bar, :baz]]
235
235
  std::vector<std::string> k2;
236
236
  k2.push_back(":foo");
237
237
  k2.push_back(":bar");
238
238
  k2.push_back(":baz");
239
239
  assertEqual("[Baz, Bang]", toString(ssm.get_v(k2)));
240
-
240
+
241
241
  std::cout << std::endl;
242
242
  }
243
243
 
244
244
  void testKeyOrder() {
245
245
  std::cout << "testEqualKeys" << std::endl;
246
-
246
+
247
247
  //assert_equal [["Foo", Set[1, 2]]], @ssm.get(Set[2, 1])
248
248
  std::vector<std::string> k1;
249
249
  k1.push_back("2");
250
250
  k1.push_back("1");
251
251
  assertEqual("[[Foo, Set[1, 2]]]", toString(ssm.get_kv(k1)));
252
-
252
+
253
253
  std::cout << std::endl;
254
254
  }
255
255
 
@@ -261,24 +261,24 @@ void testOrderPreserved() {
261
261
  s1.push_back("11");
262
262
  s1.push_back("12");
263
263
  ssm.put(s1, "1");
264
-
264
+
265
265
  //@ssm[Set[10, 11]] = 2
266
266
  std::vector<std::string> s2;
267
267
  s2.push_back("10");
268
268
  s2.push_back("11");
269
269
  ssm.put(s2, "2");
270
-
270
+
271
271
  //@ssm[Set[11]] = 3
272
272
  std::vector<std::string> s3;
273
273
  s3.push_back("11");
274
274
  ssm.put(s3, "3");
275
-
275
+
276
276
  //@ssm[Set[11, 12]] = 4
277
277
  std::vector<std::string> s4;
278
278
  s4.push_back("11");
279
279
  s4.push_back("12");
280
280
  ssm.put(s4, "4");
281
-
281
+
282
282
  //@ssm[Set[9, 10, 11, 12, 13]] = 5
283
283
  std::vector<std::string> s5;
284
284
  s5.push_back("9");
@@ -287,13 +287,13 @@ void testOrderPreserved() {
287
287
  s5.push_back("12");
288
288
  s5.push_back("13");
289
289
  ssm.put(s5, "5");
290
-
290
+
291
291
  //@ssm[Set[10, 13]] = 6
292
292
  std::vector<std::string> s6;
293
293
  s6.push_back("10");
294
294
  s6.push_back("13");
295
295
  ssm.put(s6, "6");
296
-
296
+
297
297
  //assert_equal([[1, Set[10, 11, 12]], [2, Set[10, 11]], [3, Set[11]], [4, Set[11, 12]], [5, Set[9, 10, 11, 12, 13]], [6, Set[10, 13]]], @ssm.get(Set[9, 10, 11, 12, 13]))
298
298
  std::vector<std::string> k1;
299
299
  k1.push_back("9");
@@ -302,7 +302,7 @@ void testOrderPreserved() {
302
302
  k1.push_back("12");
303
303
  k1.push_back("13");
304
304
  assertEqual("[[1, Set[10, 11, 12]], [2, Set[10, 11]], [3, Set[11]], [4, Set[11, 12]], [5, Set[9, 10, 11, 12, 13]], [6, Set[10, 13]]]", toString(ssm.get_kv(k1)));
305
-
305
+
306
306
  std::cout << std::endl;
307
307
  }
308
308
  void testMultipleEqualValues() {
@@ -312,25 +312,25 @@ void testMultipleEqualValues() {
312
312
  s1.push_back("11");
313
313
  s1.push_back("12");
314
314
  ssm.put(s1, "1");
315
-
315
+
316
316
  //@ssm[Set[12, 13]] = 2
317
317
  std::vector<std::string> s2;
318
318
  s2.push_back("12");
319
319
  s2.push_back("13");
320
320
  ssm.put(s2, "2");
321
-
321
+
322
322
  //@ssm[Set[13, 14]] = 1
323
323
  std::vector<std::string> s3;
324
324
  s3.push_back("13");
325
325
  s3.push_back("14");
326
326
  ssm.put(s3, "1");
327
-
327
+
328
328
  //@ssm[Set[14, 15]] = 1
329
329
  std::vector<std::string> s4;
330
330
  s4.push_back("14");
331
331
  s4.push_back("15");
332
332
  ssm.put(s4, "1");
333
-
333
+
334
334
  //assert_equal([[1, Set[11, 12]], [2, Set[12, 13]], [1, Set[13, 14]], [1, Set[14, 15]]], @ssm.get(Set[11, 12, 13, 14, 15]))
335
335
  std::vector<std::string> k1;
336
336
  k1.push_back("11");
@@ -339,7 +339,7 @@ void testMultipleEqualValues() {
339
339
  k1.push_back("14");
340
340
  k1.push_back("15");
341
341
  assertEqual("[[1, Set[11, 12]], [2, Set[12, 13]], [1, Set[13, 14]], [1, Set[14, 15]]]", toString(ssm.get_kv(k1)));
342
-
342
+
343
343
  std::cout << std::endl;
344
344
  }
345
345
 
@@ -348,66 +348,66 @@ int main()
348
348
  std::vector<std::string> s1;
349
349
  s1.push_back("1");
350
350
  s1.push_back("2");
351
-
351
+
352
352
  std::vector<std::string> s2;
353
353
  s2.push_back("2");
354
354
  s2.push_back("3");
355
-
355
+
356
356
  std::vector<std::string> s3;
357
357
  s3.push_back("3");
358
358
  s3.push_back("4");
359
-
359
+
360
360
  ssm.put(s1, "value1");
361
361
  ssm.put(s2, "value2");
362
362
  ssm.put(s3, "value3");
363
-
363
+
364
364
  std::vector<std::string> s4;
365
365
  s4.push_back("1");
366
366
  s4.push_back("2");
367
367
  s4.push_back("3");
368
-
368
+
369
369
  std::vector<std::pair<string, std::vector<std::string> > > fetched(ssm.get_kv(s4));
370
-
370
+
371
371
  std::cout << "PRINTING RESULTS:" << std::endl;
372
372
  for (size_t i = 0, S = fetched.size(); i < S; ++i) {
373
373
  std::cout << fetched[i].first << std::endl;
374
374
  }
375
-
375
+
376
376
  Subset_Map<string, string> ssm2;
377
377
  ssm2.put(s1, "foo");
378
378
  ssm2.put(s2, "bar");
379
379
  ssm2.put(s4, "hux");
380
-
380
+
381
381
  std::vector<std::pair<string, std::vector<std::string> > > fetched2(ssm2.get_kv(s4));
382
-
382
+
383
383
  std::cout << std::endl << "PRINTING RESULTS:" << std::endl;
384
384
  for (size_t i = 0, S = fetched2.size(); i < S; ++i) {
385
385
  std::cout << fetched2[i].first << std::endl;
386
386
  }
387
-
387
+
388
388
  std::cout << "TRYING ON A SELECTOR-LIKE OBJECT" << std::endl;
389
-
389
+
390
390
  Subset_Map<string, string> sel_ssm;
391
391
  std::vector<std::string> target;
392
392
  target.push_back("desk");
393
393
  target.push_back(".wood");
394
-
394
+
395
395
  std::vector<std::string> actual;
396
396
  actual.push_back("desk");
397
397
  actual.push_back(".wood");
398
398
  actual.push_back(".mine");
399
-
399
+
400
400
  sel_ssm.put(target, "has-aquarium");
401
401
  std::vector<std::pair<string, std::vector<std::string> > > fetched3(sel_ssm.get_kv(actual));
402
402
  std::cout << "RESULTS:" << std::endl;
403
403
  for (size_t i = 0, S = fetched3.size(); i < S; ++i) {
404
404
  std::cout << fetched3[i].first << std::endl;
405
405
  }
406
-
406
+
407
407
  std::cout << std::endl;
408
-
408
+
409
409
  // BEGIN PORTED RUBY TESTS FROM /test/sass/util/subset_map_test.rb
410
-
410
+
411
411
  setup();
412
412
  testEqualKeys();
413
413
  testSubsetKeys();
@@ -419,13 +419,13 @@ int main()
419
419
  testMultipleSubsets();
420
420
  testBracketBracket();
421
421
  testKeyOrder();
422
-
422
+
423
423
  setup();
424
424
  testOrderPreserved();
425
-
425
+
426
426
  setup();
427
427
  testMultipleEqualValues();
428
-
428
+
429
429
  return 0;
430
430
  }
431
431