// 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);
  });
}
