OLD | NEW |
(Empty) | |
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. |
| 4 |
| 5 library json_test; |
| 6 |
| 7 import "package:expect/expect.dart"; |
| 8 import "dart:convert"; |
| 9 |
| 10 bool badFormat(e) => e is FormatException; |
| 11 |
| 12 jsonTest(testName, expect, action(sink)) { |
| 13 var sink = new ChunkedConversionSink.withCallback((values) { |
| 14 var value = values[0]; |
| 15 Expect.equals(expect, value, "$testName:$value"); |
| 16 }); |
| 17 var decoderSink = JSON.decoder.startChunkedConversion(sink); |
| 18 action(decoderSink); |
| 19 } |
| 20 |
| 21 jsonThrowsTest(testName, action(sink)) { |
| 22 var sink = new ChunkedConversionSink.withCallback((values) { |
| 23 Expect.fail("Should have thrown: $testName"); |
| 24 }); |
| 25 var decoderSink = JSON.decoder.startChunkedConversion(sink); |
| 26 Expect.throws(() { action(decoderSink); }, (e) => e is FormatException, |
| 27 testName); |
| 28 } |
| 29 |
| 30 main() { |
| 31 testNumbers(); |
| 32 testStrings(); |
| 33 testKeywords(); |
| 34 } |
| 35 |
| 36 void testStrings() { |
| 37 var s = r'"abc\f\n\r\t\b\"\/\\\u0001\u9999\uffff"'; |
| 38 var expected = "abc\f\n\r\t\b\"\/\\\u0001\u9999\uffff"; |
| 39 for (var i = 1; i < s.length - 1; i++) { |
| 40 var s1 = s.substring(0, i); |
| 41 var s2 = s.substring(i); |
| 42 jsonTest("$s1|$s2", expected, (sink) { |
| 43 sink.add(s1); |
| 44 sink.add(s2); |
| 45 sink.close(); |
| 46 }); |
| 47 jsonTest("$s1|$s2", expected, (sink) { |
| 48 sink.addSlice(s, 0, i, false); |
| 49 sink.addSlice(s, i, s.length, true); |
| 50 }); |
| 51 for (var j = i; j < s.length - 1; j++) { |
| 52 var s2a = s.substring(i, j); |
| 53 var s2b = s.substring(j); |
| 54 jsonTest("$s1|$s2a|$s2b", expected, (sink) { |
| 55 sink.add(s1); |
| 56 sink.add(s2a); |
| 57 sink.add(s2b); |
| 58 sink.close(); |
| 59 }); |
| 60 } |
| 61 } |
| 62 } |
| 63 |
| 64 void testNumbers() { |
| 65 void testNumber(number) { |
| 66 var expected = num.parse(number); |
| 67 for (int i = 1; i < number.length - 1; i++) { |
| 68 var p1 = number.substring(0, i); |
| 69 var p2 = number.substring(i); |
| 70 jsonTest("$p1|$p2", expected, (sink) { |
| 71 sink.add(p1); |
| 72 sink.add(p2); |
| 73 sink.close(); |
| 74 }); |
| 75 |
| 76 jsonTest("$p1|$p2/slice", expected, (sink) { |
| 77 sink.addSlice(number, 0, i, false); |
| 78 sink.addSlice(number, i, number.length, true); |
| 79 }); |
| 80 |
| 81 for (int j = i; j < number.length - 1; j++) { |
| 82 var p2a = number.substring(i, j); |
| 83 var p2b = number.substring(j); |
| 84 jsonTest("$p1|$p2a|$p2b", expected, (sink) { |
| 85 sink.add(p1); |
| 86 sink.add(p2a); |
| 87 sink.add(p2b); |
| 88 sink.close(); |
| 89 }); |
| 90 } |
| 91 } |
| 92 } |
| 93 for (var sign in ["-", ""]) { |
| 94 for (var intPart in ["0", "1", "99"]) { |
| 95 for (var decimalPoint in [".", ""]) { |
| 96 for (var decimals in decimalPoint.isEmpty ? [""] : ["0", "99"]) { |
| 97 for (var e in ["e", "e-", "e+", ""]) { |
| 98 for (var exp in e.isEmpty ? [""] : ["0", "2", "22", "34"]) { |
| 99 testNumber("$sign$intPart$decimalPoint$decimals$e$exp"); |
| 100 } |
| 101 } |
| 102 } |
| 103 } |
| 104 } |
| 105 } |
| 106 |
| 107 void negativeTest(number) { |
| 108 for (int i = 1; i < number.length - 1; i++) { |
| 109 var p1 = number.substring(0, i); |
| 110 var p2 = number.substring(i); |
| 111 jsonThrowsTest("$p1|$p2", (sink) { |
| 112 sink.add(p1); |
| 113 sink.add(p2); |
| 114 sink.close(); |
| 115 }); |
| 116 |
| 117 jsonThrowsTest("$p1|$p2/slice", (sink) { |
| 118 sink.addSlice(number, 0, i, false); |
| 119 sink.addSlice(number, i, number.length, true); |
| 120 }); |
| 121 |
| 122 for (int j = i; j < number.length - 1; j++) { |
| 123 var p2a = number.substring(i, j); |
| 124 var p2b = number.substring(j); |
| 125 jsonThrowsTest("$p1|$p2a|$p2b", (sink) { |
| 126 sink.add(p1); |
| 127 sink.add(p2a); |
| 128 sink.add(p2b); |
| 129 sink.close(); |
| 130 }); |
| 131 } |
| 132 } |
| 133 } |
| 134 |
| 135 negativeTest("+1e"); |
| 136 negativeTest("-00"); |
| 137 negativeTest("01"); |
| 138 negativeTest(".1"); |
| 139 negativeTest("0."); |
| 140 negativeTest("0.e1"); |
| 141 negativeTest("1e"); |
| 142 negativeTest("1e+"); |
| 143 negativeTest("1e-"); |
| 144 } |
| 145 |
| 146 void testKeywords() { |
| 147 for (var expected in [null, true, false]) { |
| 148 var s = "$expected"; |
| 149 for (int i = 1; i < s.length - 1; i++) { |
| 150 var s1 = s.substring(0, i); |
| 151 var s2 = s.substring(i); |
| 152 jsonTest("$s1|$s2", expected, (sink) { |
| 153 sink.add(s1); |
| 154 sink.add(s2); |
| 155 sink.close(); |
| 156 }); |
| 157 jsonTest("$s1|$s2", expected, (sink) { |
| 158 sink.addSlice(s, 0, i, false); |
| 159 sink.addSlice(s, i, s.length, true); |
| 160 }); |
| 161 for (var j = i; j < s.length - 1; j++) { |
| 162 var s2a = s.substring(i, j); |
| 163 var s2b = s.substring(j); |
| 164 jsonTest("$s1|$s2a|$s2b", expected, (sink) { |
| 165 sink.add(s1); |
| 166 sink.add(s2a); |
| 167 sink.add(s2b); |
| 168 sink.close(); |
| 169 }); |
| 170 } |
| 171 } |
| 172 } |
| 173 } |
OLD | NEW |