| // Copyright (c) 2014, 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. |
| |
| // Test that the fused UTF-8/JSON decoder accepts a leading BOM. |
| library test; |
| |
| import "package:expect/expect.dart"; |
| import "dart:convert"; |
| |
| void main() { |
| for (var parse in [parseFuse, parseSequence, parseChunked]) { |
| // Sanity checks. |
| Expect.isTrue(parse('true'.codeUnits.toList())); |
| Expect.isFalse(parse('false'.codeUnits.toList())); |
| Expect.equals(123, parse('123'.codeUnits.toList())); |
| Expect.listEquals([42], parse('[42]'.codeUnits.toList()) as List); |
| Expect.mapEquals({"x": 42}, parse('{"x":42}'.codeUnits.toList()) as Map); |
| |
| // String (0x22 = ") with UTF-8 encoded Unicode characters. |
| Expect.equals( |
| "A\xff\u1234\u{65555}", |
| parse([ |
| 0x22, |
| 0x41, |
| 0xc3, |
| 0xbf, |
| 0xe1, |
| 0x88, |
| 0xb4, |
| 0xf1, |
| 0xa5, |
| 0x95, |
| 0x95, |
| 0x22 |
| ])); |
| |
| // BOM followed by true. |
| Expect.isTrue(parse([0xEF, 0xBB, 0xBF, 0x74, 0x72, 0x75, 0x65])); |
| } |
| |
| // Do not accept BOM in non-UTF-8 decoder. |
| Expect.throws<FormatException>( |
| () => new JsonDecoder().convert("\xEF\xBB\xBFtrue")); |
| Expect.throws<FormatException>(() => new JsonDecoder().convert("\uFEFFtrue")); |
| |
| // Only accept BOM first. |
| Expect.throws<FormatException>( |
| () => parseFuse(" \xEF\xBB\xBFtrue".codeUnits.toList())); |
| // Only accept BOM first. |
| Expect.throws<FormatException>( |
| () => parseFuse(" true\xEF\xBB\xBF".codeUnits.toList())); |
| |
| Expect.throws<FormatException>( |
| () => parseFuse(" [\xEF\xBB\xBF]".codeUnits.toList())); |
| |
| // Regression test for dartbug.com/46205 |
| // Bug occurs in sound null safe mode only. |
| Expect.isNull(parseFuse("null".codeUnits.toList())); |
| } |
| |
| Object? parseFuse(List<int> text) { |
| return new Utf8Decoder().fuse(new JsonDecoder()).convert(text); |
| } |
| |
| Object? parseSequence(List<int> text) { |
| return new JsonDecoder().convert(new Utf8Decoder().convert(text)); |
| } |
| |
| Object? parseChunked(List<int> text) { |
| var result; |
| var sink = new Utf8Decoder().fuse(new JsonDecoder()).startChunkedConversion( |
| new ChunkedConversionSink.withCallback((List<Object?> values) { |
| result = values[0]; |
| })); |
| for (var i = 0; i < text.length; i++) { |
| sink.add([text[i]]); |
| } |
| sink.close(); |
| return result; |
| } |