// 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 production Atom :: . evaluates as follows:
///   <ol>
///   <li>Let A be the set of all characters except LineTerminator. </li>
///   <li>Call CharacterSetMatcher(A, false) and return its Matcher result.</li>
///   </ol>
/// @description Checks that this Atom is handled correctly.
/// @3rdparty sputnik-v1:S15.10.2.8_A4_T1.js-S15.10.2.8_A4_T9.js
/// @author rodionov

import "../../../../Utils/expect.dart";

main() {
  check(r"ab.de", "abcde", 0, ["abcde"]);
  check(r".+", "line 1\nline 2", 0, ["line 1"]);
  check(r".*a.*", "this is a test", 0, ["this is a test"]);
  check(r".+", r"this is a *&^%$# test", 0, [r"this is a *&^%$# test"]);
  check(r".+", "....", 0, ["...."]);
  check(r".+", "abcdefghijklmnopqrstuvwxyz", 0, ["abcdefghijklmnopqrstuvwxyz"]);
  check(r".+", "ABCDEFGHIJKLMNOPQRSTUVWXYZ", 0, ["ABCDEFGHIJKLMNOPQRSTUVWXYZ"]);
  check(r".+", r"`1234567890-=~!@#$%^&*()_+", 0,
      [r"`1234567890-=~!@#$%^&*()_+"]);
  check(r".+", r"""|\[{]};:"',<>.?/""", 0, [r"""|\[{]};:"',<>.?/"""]);
}

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