blob: 9277ed658c371ade7d4e9f5d8ba76aa964a0af52 [file] [log] [blame]
// 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);
});
}