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

/**
 * @assertion 15.10.2.6: The production Assertion :: $ evaluates by returning an
 * internal AssertionTester closure that takes a State argument x and performs
 * the following:
 *   <ol>
 *   <li>Let e be x's endIndex. </li>
 *   <li>If e is equal to InputLength, return true.</li>
 *   <li>If multiline is false, return false. </li>
 *   <li>If the character Input[e] is one of LineTerminator, return true.</li>
 *   <li>Return false.</li>
 *   </ol>
 * @description Checks that the $ assertion is interpreted correctly.
 * @3rdparty sputnik-v1:S15.10.2.6_A1_T1.js-S15.10.2.6_A1_T5.js
 * @author rodionov
 */
import "../../../../Utils/expect.dart";
 

main() {
  checkNeg(r"s$", "pairs\nmakes\tdouble");
  check(r"e$", "pairs\nmakes\tdouble");
  check(r"s$", "pairs\nmakes\tdouble", multiLine: true);
  check(r"[^e]$", "pairs\nmakes\tdouble", multiLine: true);
  check(r"es$", "pairs\nmakes\tdoubl\u0065s", multiLine: true);
  check(r"\$+$", "\$\$\$\$\$\$");
}

void check(String pattern, String str, {bool multiLine: false,
    bool ignoreCase: false}) {
  RegExp re = new RegExp(pattern, multiLine: multiLine,
      caseSensitive: !ignoreCase);
  Expect.isNotNull(re.firstMatch(str), "\"$pattern\" !~ \"$str\"");
}

void checkNeg(String pattern, String str, {bool multiLine: false,
    bool ignoreCase: false}) {
  RegExp re = new RegExp(pattern, multiLine: multiLine,
      caseSensitive: !ignoreCase);
  Expect.isNull(re.firstMatch(str), "\"$pattern\" ~ \"$str\"");
}
