blob: 4c5b212d121dbf67bef94262910de5dc25786726 [file] [log] [blame]
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
// @dart = 2.9
library jsonTest;
import "package:expect/expect.dart";
import 'dart:convert';
main() {
testEscaping();
testParse();
testParseInvalid();
}
void testParse() {
// Scalars.
Expect.equals(5, json.decode(' 5 '));
Expect.equals(-42, json.decode(' -42 '));
Expect.equals(3, json.decode(' 3e0 '));
Expect.equals(3.14, json.decode(' 3.14 '));
Expect.equals(1.0E-06, json.decode(' 1.0E-06 '));
Expect.equals(0, json.decode("0"));
Expect.equals(1, json.decode("1"));
Expect.equals(0.1, json.decode("0.1"));
Expect.equals(1.1, json.decode("1.1"));
Expect.equals(1.1, json.decode("1.100000"));
Expect.equals(1.111111, json.decode("1.111111"));
Expect.equals(-0, json.decode("-0"));
Expect.equals(-1, json.decode("-1"));
Expect.equals(-0.1, json.decode("-0.1"));
Expect.equals(-1.1, json.decode("-1.1"));
Expect.equals(-1.1, json.decode("-1.100000"));
Expect.equals(-1.111111, json.decode("-1.111111"));
Expect.equals(11, json.decode("1.1e1"));
Expect.equals(11, json.decode("1.1e+1"));
Expect.equals(0.11, json.decode("1.1e-1"));
Expect.equals(11, json.decode("1.1E1"));
Expect.equals(11, json.decode("1.1E+1"));
Expect.equals(0.11, json.decode("1.1E-1"));
Expect.equals(1E0, json.decode(" 1E0"));
Expect.equals(1E+0, json.decode(" 1E+0"));
Expect.equals(1E-0, json.decode(" 1E-0"));
Expect.equals(1E00, json.decode(" 1E00"));
Expect.equals(1E+00, json.decode(" 1E+00"));
Expect.equals(1E-00, json.decode(" 1E-00"));
Expect.equals(1E+10, json.decode(" 1E+10"));
Expect.equals(1E+010, json.decode(" 1E+010"));
Expect.equals(1E+0010, json.decode(" 1E+0010"));
Expect.equals(1E10, json.decode(" 1E10"));
Expect.equals(1E010, json.decode(" 1E010"));
Expect.equals(1E0010, json.decode(" 1E0010"));
Expect.equals(1E-10, json.decode(" 1E-10"));
Expect.equals(1E-0010, json.decode(" 1E-0010"));
Expect.equals(1E0, json.decode(" 1e0"));
Expect.equals(1E+0, json.decode(" 1e+0"));
Expect.equals(1E-0, json.decode(" 1e-0"));
Expect.equals(1E00, json.decode(" 1e00"));
Expect.equals(1E+00, json.decode(" 1e+00"));
Expect.equals(1E-00, json.decode(" 1e-00"));
Expect.equals(1E+10, json.decode(" 1e+10"));
Expect.equals(1E+010, json.decode(" 1e+010"));
Expect.equals(1E+0010, json.decode(" 1e+0010"));
Expect.equals(1E10, json.decode(" 1e10"));
Expect.equals(1E010, json.decode(" 1e010"));
Expect.equals(1E0010, json.decode(" 1e0010"));
Expect.equals(1E-10, json.decode(" 1e-10"));
Expect.equals(1E-0010, json.decode(" 1e-0010"));
Expect.equals(true, json.decode(' true '));
Expect.equals(false, json.decode(' false'));
Expect.equals(null, json.decode(' null '));
Expect.equals(null, json.decode('\n\rnull\t'));
Expect.equals('hi there" bob', json.decode(' "hi there\\" bob" '));
Expect.equals('', json.decode(' "" '));
// Lists.
Expect.listEquals([], json.decode(' [] '));
Expect.listEquals(["entry"], json.decode(' ["entry"] '));
Expect.listEquals([true, false], json.decode(' [true, false] '));
Expect.listEquals([1, 2, 3], json.decode(' [ 1 , 2 , 3 ] '));
// Maps.
Expect.mapEquals({}, json.decode(' {} '));
Expect.mapEquals({"key": "value"}, json.decode(' {"key": "value" } '));
Expect.mapEquals(
{"key1": 1, "key2": 2}, json.decode(' {"key1": 1, "key2": 2} '));
Expect.mapEquals({"key1": 1}, json.decode(' { "key1" : 1 } '));
}
void testParseInvalid() {
void testString(String s) {
Expect.throwsFormatException(() => json.decode(s));
}
// Scalars
testString("");
testString("-");
testString("-.");
testString("3.a");
testString("{ key: value }");
testString("tru");
testString("1E--6");
testString("1E-+6");
testString("1E+-6");
testString("1E++6");
testString("1E6.6");
testString("1E-6.6");
testString("1E+6.6");
// JavaScript number literals not valid in JSON.
testString('[01]');
testString('[.1]');
testString('[1.]');
testString('[1.e1]');
testString('[-.1]');
testString('[-1.]');
// Plain invalid number literals.
testString('-');
testString('--1');
testString('-1e');
testString('1e--1]');
testString('1e+-1');
testString('1e-+1');
testString('1e++1');
// Lists
testString('[, ]');
testString('["", ]');
testString('["", "]');
testString('["" ""]');
// Maps
testString('{"" ""}');
testString('{"": "",}');
}
void testEscaping() {
Expect.stringEquals('""', json.encode(''));
Expect.stringEquals('"\\u0000"', json.encode('\u0000'));
Expect.stringEquals('"\\u0001"', json.encode('\u0001'));
Expect.stringEquals('"\\u0002"', json.encode('\u0002'));
Expect.stringEquals('"\\u0003"', json.encode('\u0003'));
Expect.stringEquals('"\\u0004"', json.encode('\u0004'));
Expect.stringEquals('"\\u0005"', json.encode('\u0005'));
Expect.stringEquals('"\\u0006"', json.encode('\u0006'));
Expect.stringEquals('"\\u0007"', json.encode('\u0007'));
Expect.stringEquals('"\\b"', json.encode('\u0008'));
Expect.stringEquals('"\\t"', json.encode('\u0009'));
Expect.stringEquals('"\\n"', json.encode('\u000a'));
Expect.stringEquals('"\\u000b"', json.encode('\u000b'));
Expect.stringEquals('"\\f"', json.encode('\u000c'));
Expect.stringEquals('"\\r"', json.encode('\u000d'));
Expect.stringEquals('"\\u000e"', json.encode('\u000e'));
Expect.stringEquals('"\\u000f"', json.encode('\u000f'));
Expect.stringEquals('"\\u0010"', json.encode('\u0010'));
Expect.stringEquals('"\\u0011"', json.encode('\u0011'));
Expect.stringEquals('"\\u0012"', json.encode('\u0012'));
Expect.stringEquals('"\\u0013"', json.encode('\u0013'));
Expect.stringEquals('"\\u0014"', json.encode('\u0014'));
Expect.stringEquals('"\\u0015"', json.encode('\u0015'));
Expect.stringEquals('"\\u0016"', json.encode('\u0016'));
Expect.stringEquals('"\\u0017"', json.encode('\u0017'));
Expect.stringEquals('"\\u0018"', json.encode('\u0018'));
Expect.stringEquals('"\\u0019"', json.encode('\u0019'));
Expect.stringEquals('"\\u001a"', json.encode('\u001a'));
Expect.stringEquals('"\\u001b"', json.encode('\u001b'));
Expect.stringEquals('"\\u001c"', json.encode('\u001c'));
Expect.stringEquals('"\\u001d"', json.encode('\u001d'));
Expect.stringEquals('"\\u001e"', json.encode('\u001e'));
Expect.stringEquals('"\\u001f"', json.encode('\u001f'));
Expect.stringEquals('"\\\""', json.encode('"'));
Expect.stringEquals('"\\\\"', json.encode('\\'));
Expect.stringEquals('"Got \\b, \\f, \\n, \\r, \\t, \\u0000, \\\\, and \\"."',
json.encode('Got \b, \f, \n, \r, \t, \u0000, \\, and ".'));
Expect.stringEquals('"Got \\b\\f\\n\\r\\t\\u0000\\\\\\"."',
json.encode('Got \b\f\n\r\t\u0000\\".'));
}