0456f6c95a
Change-Id: I9cf43c37e425b8c6e48a6c24edce888137dc3560 Reviewed-on: https://dart-review.googlesource.com/35463 Reviewed-by: Keerti Parthasarathy <keertip@google.com> Commit-Queue: Gary Roumanis <grouma@google.com>
168 lines
5.3 KiB
Dart
168 lines
5.3 KiB
Dart
// 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:test/test.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);
|
|
});
|
|
}
|