// 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 :: \ B 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>Call IsWordChar(e-1) and let a be the Boolean result.</li>
 *   <li>Call IsWordChar(e) and let b be the Boolean result.</li>
 *   <li>If a is true and b is false, return false.</li>
 *   <li>If a is false and b is true, return false.</li>
 *   <li>Return true. </li>
 *   </ol>
 * The abstract operation IsWordChar(e) returns true if and only if its argument
 * is between -1 and InputLength (exclusive) and the input character at the
 * position specified by e is one of: latin letters (both cases), arabic
 * numerals or the underscore.
 * @description Checks that the \B assertion is interpreted correctly.
 * @3rdparty sputnik-v1:S15.10.2.6_A4_T1.js-S15.10.2.6_A4_T8.js
 * @author rodionov
 */
import "../../../../Utils/expect.dart";
 

main() {
  check(r"\Bevil\B", "devils arise\tfor\nevil", matchPos: 1);
  check(r"[f-z]e\B", "devils arise\tfor\nrevil",  matchPos: 17);
  check(r"\Bo\B", "devils arise\tfOr\nrevil", ignoreCase: true, matchPos: 14);
  check(r"\B\w\B", "devils arise\tfor\nrevil", matchPos: 1);
  check(r"\w\B", "devils arise\tfor\nrevil", matchPos: 0);
  check(r"\B\w", "devils arise\tfor\nrevil", matchPos: 1);
  checkNeg(r"\B[a-yA-Y]{4}\B", "devil arise\tforzzx\nevils");
  check(r"\B\w{4}\B", "devil arise\tforzzx\nevils", matchPos: 13);
}

void check(String pattern, String str, {bool multiLine: false,
    bool ignoreCase: false, int matchPos: -1}) {
  RegExp re = new RegExp(pattern, multiLine: multiLine,
      caseSensitive: !ignoreCase);
  Match? fm = re.firstMatch(str);
  Expect.isNotNull(fm, "\"$pattern\" !~ \"$str\"");
  if(matchPos >= 0) {
    Expect.equals(matchPos, fm?.start);
  }
}

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\"");
}
