// Copyright (c) 2018, 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.

// @dart = 2.9

import "package:expect/expect.dart";

var escapeChars = r"([)}{]?*+.$^|\";

var nonEscapeAscii = "\x00\x01\x02\x03\x04\x05\x06\x07" //
    "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f" //
    "\x10\x11\x12\x13\x14\x15\x16\x17" //
    "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f" //
    """ !"#%&',-/0123456789:;<=>""" //
    """@ABCDEFGHIJKLMNOPQRSTUVWXYZ_""" //
    """`abcdefghijklmnopqrstuvwxyz~\x7f""";
var someNonAscii =
    new String.fromCharCodes(new List.generate(0x1000 - 128, (x) => x + 128));

test(String string, [bool shouldEscape]) {
  var escape = RegExp.escape(string);
  Expect.isTrue(new RegExp(escape).hasMatch(string), "$escape");
  Expect.equals(string, new RegExp(escape).firstMatch(string)[0], "$escape");
  if (shouldEscape == true) {
    Expect.notEquals(string, escape);
  } else if (shouldEscape == false) {
    Expect.equals(string, escape);
  }
}

main() {
  for (var c in escapeChars.split("")) {
    test(c, true);
  }
  for (var c in nonEscapeAscii.split("")) {
    test(c, false);
  }
  test(escapeChars, true);
  test(nonEscapeAscii, false);
  test(someNonAscii, false);
  test((nonEscapeAscii + escapeChars) * 3, true);
  test(r'.abc', true); // First only.
  test(r'abc.', true); // Last only.
}
