// 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.

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.
}
