// 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.8: The form (?! Disjunction ) specifies a zero-width
 * negative lookahead. In order for it to succeed, the pattern inside
 * Disjunction must fail to match at the current position. The current position
 * is not advanced before matching the sequel. Disjunction can contain capturing
 * parentheses, but backreferences to them only make sense from within
 * Disjunction itself. Backreferences to these capturing parentheses from
 * elsewhere in the pattern always return undefined because the negative
 * lookahead must fail for the pattern to succeed.
 * @description Checks that this syntax works as specified.
 * @3rdparty sputnik-v1:S15.10.2.8_A2_T1.js-S15.10.2.8_A2_T11.js
 * @author rodionov
 */
import "../../../../Utils/expect.dart";

main() {
  check(r"Java(?!Script)([A-Z]\w*)", "using of JavaBeans technology", 9,
      ["JavaBeans", "Beans"]);
  checkNeg(r"Java(?!Script)([A-Z]\w*)", "using of Java language");
  checkNeg(r"Java(?!Script)([A-Z]\w*)", "I\"m a JavaScripter");
  check(r"Java(?!Script)([A-Z]\w*)", "JavaScr oops ipt ", 0, ["JavaScr", "Scr"]);
  check(r"(\.(?!com|org)|/)", "ah.info", 2, [".", "."]);
  check(r"(\.(?!com|org)|/)", "ah/info", 2, ["/", "/"]);
  checkNeg(r"(\.(?!com|org)|/)", "ah.com");
  check(r"(?!a|b)|c", "", 0, [""]);
  check(r"(?!a|b)|c", "bc", 1, [""]);
  check(r"(?!a|b)|c", "d", 0, [""]);
  
  check(r"(.*?)a(?!(a+)b\2c)\2(.*)", "baaabaac", 0, ["baaabaac", "ba", null,
    "abaac"]);
}

void check(String pattern, String str, int matchPos,
    List<String?> expectedGroups) {
  RegExp re = new RegExp(pattern);
  Expect.isNotNull(re.firstMatch(str), "\"$pattern\" !~ \"$str\"");
  Match fm = re.firstMatch(str) as Match;
  if(matchPos >= 0) {
    Expect.equals(matchPos, fm.start);
  }
  if(null != expectedGroups) {
    Expect.equals(expectedGroups.length, fm.groupCount + 1);
    
    for(int i = 0; i <= fm.groupCount; i++) {
      String? expGr = expectedGroups[i];
      String? actGr = fm.group(i);
      Expect.equals(expGr, actGr,
          "Mismatch at group $i: \"$expGr\" expected instead of \"$actGr\"");
    }
  }
}

void checkNeg(String pattern, String str) {
  RegExp re = new RegExp(pattern);
  Expect.isNull(re.firstMatch(str), "\"$pattern\" ~ \"$str\"");
}
