blob: 78bc7583db92591bdc513e11cad705b671718f1d [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, {bool utf8 = false}) {
if (input is List) input = String.fromCharCodes(input);
String actual = DebugPrint(js.string(input), utf8: utf8);
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], utf8: true);
check([$LF], [$DQ, $BACKSLASH, $n, $DQ]);
check([$LF], [$DQ, $BACKSLASH, $n, $DQ], utf8: true);
check([$FF], [$DQ, $BACKSLASH, $f, $DQ]);
check([$FF], [$DQ, $BACKSLASH, $f, $DQ], utf8: true);
check([$CR], [$DQ, $BACKSLASH, $r, $DQ]);
check([$CR], [$DQ, $BACKSLASH, $r, $DQ], utf8: true);
check([$TAB], [$DQ, $BACKSLASH, $t, $DQ]);
check([$TAB], [$DQ, $BACKSLASH, $t, $DQ], utf8: true);
check([$VTAB], [$DQ, $BACKSLASH, $v, $DQ]);
check([$VTAB], [$DQ, $BACKSLASH, $v, $DQ], utf8: true);
});
test('unnamed-control-codes-escapes', () {
check([0, 1, 2, 3], r'''"\x00\x01\x02\x03"''');
check([0, 1, 2, 3], [$DQ, 0, 1, 2, 3, $DQ], utf8: true);
});
test('line-separator', () {
check([$LS], [$DQ, $BACKSLASH, $u, $2, $0, $2, $8, $DQ]);
check([$LS], [$DQ, $BACKSLASH, $u, $2, $0, $2, $8, $DQ], utf8: true);
});
test('page-separator', () {
check([$PS], [$DQ, $BACKSLASH, $u, $2, $0, $2, $9, $DQ]);
check([$PS], [$DQ, $BACKSLASH, $u, $2, $0, $2, $9, $DQ], utf8: true);
});
test('choose-quotes', () {
check('"', [$SQ, $DQ, $SQ]);
check("'", [$DQ, $SQ, $DQ]);
// Using single quotes saves us one backslash:
check([$DQ, $DQ, $SQ], [$SQ, $DQ, $DQ, $BACKSLASH, $SQ, $SQ]);
check([$DQ, $SQ, $SQ], [$DQ, $BACKSLASH, $DQ, $SQ, $SQ, $DQ]);
});
test('u1234', () {
check('\u1234', [$DQ, $BACKSLASH, $u, $1, $2, $3, $4, $DQ]);
check('\u1234', [$DQ, 0x1234, $DQ], utf8: true);
});
test('u12345', () {
// TODO: ES6 option:
//check([0x12345],
// [$DQ, $BACKSLASH, $u, $LCURLY, $1, $2, $3, $4, $5, $RCURLY, $DQ]);
check([0x12345], r'''"\ud808\udf45"''');
check([
0x12345
], [
$DQ,
$BACKSLASH,
$u,
$d,
$8,
$0,
$8,
$BACKSLASH,
$u,
$d,
$f,
$4,
$5,
$DQ
]);
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, $BACKSLASH, $u, $d, $8, $3, $4, $DQ]);
check([0xD834], [$DQ, $BACKSLASH, $u, $d, $8, $3, $4, $DQ], utf8: true);
check([0xDD1E], [$DQ, $BACKSLASH, $u, $d, $d, $1, $e, $DQ]);
check([0xDD1E], [$DQ, $BACKSLASH, $u, $d, $d, $1, $e, $DQ], utf8: true);
check([0xD834, $A], [$DQ, $BACKSLASH, $u, $d, $8, $3, $4, $A, $DQ]);
check([0xD834, $A], [$DQ, $BACKSLASH, $u, $d, $8, $3, $4, $A, $DQ],
utf8: true);
check([
0xD834,
0xDD1E
], [
$DQ,
$BACKSLASH,
$u,
$d,
$8,
$3,
$4,
$BACKSLASH,
$u,
$d,
$d,
$1,
$e,
$DQ
]);
check([0xD834, 0xDD1E], r'''"\ud834\udd1e"''');
check([0xD834, 0xDD1E], [$DQ, 0xD834, 0xDD1E, $DQ], utf8: true);
});
}