Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(70)

Unified Diff: pkg/js_ast/test/string_escape_test.dart

Issue 1520033002: js_ast: Better escaping of strings in preparation for utf8 file encoding (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « pkg/js_ast/lib/src/builder.dart ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/js_ast/test/string_escape_test.dart
diff --git a/pkg/js_ast/test/string_escape_test.dart b/pkg/js_ast/test/string_escape_test.dart
new file mode 100644
index 0000000000000000000000000000000000000000..38116295a6e21d2d60ac192d585e256d67dd4218
--- /dev/null
+++ b/pkg/js_ast/test/string_escape_test.dart
@@ -0,0 +1,149 @@
+// Copyright (c) 2015, 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.
+
+library js_ast.string_escape_test;
+
+import 'package:js_ast/js_ast.dart';
+import 'package:js_ast/src/characters.dart';
+import 'package:unittest/unittest.dart';
+
+const int $LCURLY = $OPEN_CURLY_BRACKET;
+const int $RCURLY = $CLOSE_CURLY_BRACKET;
+
+void main() {
+ check(input, expected, {ascii: false, utf8: false}) {
+ if (input is List) input = new String.fromCharCodes(input);
+ String actual = js.escapedString(input, ascii: ascii, utf8: utf8).value;
+ if (expected is List) {
+ expect(actual.codeUnits, expected);
+ } else {
+ expect(actual, expected);
+ }
+ }
+
+ test('simple', () {
+ check('', [$DQ, $DQ]);
+ check('a', [$DQ, $a, $DQ]);
+ });
+
+ test('simple-escapes', () {
+ check([$BS], [$DQ, $BACKSLASH, $b, $DQ]);
+ check([$BS], [$DQ, $BACKSLASH, $b, $DQ], ascii: true);
+ check([$BS], [$DQ, $BACKSLASH, $b, $DQ], utf8: true);
+
+ check([$LF], [$DQ, $BACKSLASH, $n, $DQ]);
+ check([$LF], [$DQ, $BACKSLASH, $n, $DQ], ascii: true);
+ check([$LF], [$DQ, $BACKSLASH, $n, $DQ], utf8: true);
+
+ check([$FF], [$DQ, $FF, $DQ]);
+ check([$FF], [$DQ, $BACKSLASH, $f, $DQ], ascii: true);
+ check([$FF], [$DQ, $BACKSLASH, $f, $DQ], utf8: true);
+
+ check([$CR], [$DQ, $BACKSLASH, $r, $DQ]);
+ check([$CR], [$DQ, $BACKSLASH, $r, $DQ], ascii: true);
+ check([$CR], [$DQ, $BACKSLASH, $r, $DQ], utf8: true);
+
+ check([$TAB], [$DQ, $BACKSLASH, $t, $DQ]);
+ check([$TAB], [$DQ, $BACKSLASH, $t, $DQ], ascii: true);
+ check([$TAB], [$DQ, $BACKSLASH, $t, $DQ], utf8: true);
+
+ check([$VTAB], [$DQ, $BACKSLASH, $v, $DQ]);
+ check([$VTAB], [$DQ, $BACKSLASH, $v, $DQ], ascii: true);
+ check([$VTAB], [$DQ, $BACKSLASH, $v, $DQ], utf8: true);
+ });
+
+ test('unnamed-control-codes-escapes', () {
+ check([0, 1, 2, 3], [$DQ, 0, 1, 2, 3, $DQ]);
+ check([0, 1, 2, 3], r'''"\x00\x01\x02\x03"''', ascii: true);
+ check([0, 1, 2, 3], [$DQ, 0, 1, 2, 3, $DQ], utf8: true);
+ });
+
+
+ test('line-separator', () {
+ // Legacy escaper is broken.
+ // check([$LS], [$DQ, $BACKSLASH, $u, $2, $0, $2, $8, $DQ]);
+ check([$LS], [$DQ, $BACKSLASH, $u, $2, $0, $2, $8, $DQ], ascii: true);
+ check([$LS], [$DQ, $BACKSLASH, $u, $2, $0, $2, $8, $DQ], utf8: true);
+ });
+
+ test('page-separator', () {
+ // Legacy escaper is broken.
+ // check([$PS], [$DQ, $BACKSLASH, $u, $2, $0, $2, $9, $DQ]);
+ check([$PS], [$DQ, $BACKSLASH, $u, $2, $0, $2, $9, $DQ], ascii: true);
+ check([$PS], [$DQ, $BACKSLASH, $u, $2, $0, $2, $9, $DQ], utf8: true);
+ });
+
+ test('legacy-escaper-is-broken', () {
+ check([$LS], [$DQ, 0x2028, $DQ]);
+ check([$PS], [$DQ, 0x2029, $DQ]);
+ });
+
+ test('choose-quotes', () {
+ check('\'', [$DQ, $SQ, $DQ]);
+ check('"', [$SQ, $DQ, $SQ], ascii: true);
+ check("'", [$DQ, $SQ, $DQ], ascii: true);
+ // Legacy always double-quotes
+ check([$DQ, $DQ, $SQ],
+ [$DQ, $BACKSLASH, $DQ, $BACKSLASH, $DQ, $SQ, $DQ]);
+ // Using single quotes saves us one backslash:
+ check([$DQ, $DQ, $SQ],
+ [$SQ, $DQ, $DQ, $BACKSLASH, $SQ, $SQ],
+ ascii: true);
+ check([$DQ, $SQ, $SQ],
+ [$DQ, $BACKSLASH, $DQ, $SQ, $SQ, $DQ],
+ ascii: true);
+ });
+
+ test('u1234', () {
+ check('\u1234', [$DQ, 0x1234, $DQ]);
+ check('\u1234', [$DQ, $BACKSLASH, $u, $1, $2, $3, $4, $DQ], ascii: true);
+ check('\u1234', [$DQ, 0x1234, $DQ], utf8: true);
+ });
+
+ test('u12345', () {
+ check([0x12345], [$DQ, 55304, 57157, $DQ]);
+ // TODO: ES6 option:
+ //check([0x12345],
+ // [$DQ, $BACKSLASH, $u, $LCURLY, $1, $2, $3, $4, $5, $RCURLY, $DQ],
+ // ascii: true);
+ check([0x12345], r'''"\ud808\udf45"''', ascii: true);
+ check([0x12345],
+ [$DQ, $BACKSLASH, $u, $d, $8, $0, $8,
+ $BACKSLASH, $u, $d, $f, $4, $5, $DQ],
+ ascii: true);
+ check([0x12345], [$DQ, 55304, 57157, $DQ], utf8: true);
+ });
+
+ test('unpaired-surrogate', () {
+ // (0xD834, 0xDD1E) = 0x1D11E
+ // Strings containing unpaired surrogates must be encoded to prevent
+ // problems with the utf8 file-level encoding.
+ check([0xD834], [$DQ, 0xD834, $DQ]); // Legacy escapedString broken.
+ check([0xD834], [$DQ, $BACKSLASH, $u, $d, $8, $3, $4, $DQ], ascii: true);
+ check([0xD834], [$DQ, $BACKSLASH, $u, $d, $8, $3, $4, $DQ], utf8: true);
+
+ check([0xDD1E], [$DQ, 0xDD1E, $DQ]); // Legacy escapedString broken.
+ check([0xDD1E], [$DQ, $BACKSLASH, $u, $d, $d, $1, $e, $DQ], ascii: true);
+ check([0xDD1E], [$DQ, $BACKSLASH, $u, $d, $d, $1, $e, $DQ], utf8: true);
+
+ check([0xD834, $A],
+ [$DQ, 0xD834, $A, $DQ]); // Legacy escapedString broken.
+ check([0xD834, $A],
+ [$DQ, $BACKSLASH, $u, $d, $8, $3, $4, $A, $DQ],
+ ascii: true);
+ check([0xD834, $A],
+ [$DQ, $BACKSLASH, $u, $d, $8, $3, $4, $A, $DQ],
+ utf8: true);
+
+ check([0xD834, 0xDD1E], [$DQ, 0xD834, 0xDD1E, $DQ]); // Legacy ok.
+ check([0xD834, 0xDD1E],
+ [$DQ,
+ $BACKSLASH, $u, $d, $8, $3, $4,
+ $BACKSLASH, $u, $d, $d, $1, $e,
+ $DQ],
+ ascii: true);
+ check([0xD834, 0xDD1E], r'''"\ud834\udd1e"''', ascii: true);
+ check([0xD834, 0xDD1E], [$DQ, 0xD834, 0xDD1E, $DQ], utf8: true);
+ });
+}
« no previous file with comments | « pkg/js_ast/lib/src/builder.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698