// 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 Returns an ordered collection of matches of the regular expression
/// in [str]. The order in the collection is the order of the matches found
/// in [str].
/// @description Checks that all matches are returned in correct order
/// @author rodionov

import "../../../Utils/expect.dart";
 
main() {
  check(r"^[^\n\r]+$", "pilOt\nsoviet\trobot\r\nopenoffice", true, false,
      [[0, 5, "pilOt"], 
       [6, 18, "soviet\trobot"],
       [20, 30, "openoffice"]]);

  check(r"^(a+)\1*,\1+$", "aaaaaaaaa,aaaaaa\naa,aaaa\naaaaa,a", true, false,
      [[0, 16, "aaaaaaaaa,aaaaaa", "aaa"],
       [17, 24, "aa,aaaa", "aa"],
       [25, 32, "aaaaa,a", "a"]]);

  check(r"(ab|cd)+|ef", "AEKFCD", false, true,
       [[4, 6, "CD", "CD"]]);

  checkNeg(r"\bot", "pilot\nsoviet robot\topenoffice");
  checkNeg(r"\2", "");
  checkNeg(r"[A-Z]+", "ß", ignoreCase: true);
}
  
// expMatchesData is a list of matchData
// matchData is a list of the form [int, int, String, String*], where the ints
// correspond to start/end indices of the match, and the strings - to group
// values
void check(String pattern, String str, bool multiLine, bool ignoreCase,
    List expMatchesData) {
  RegExp re = new RegExp(pattern, multiLine: multiLine,
      caseSensitive: !ignoreCase);
  Iterable<Match> matches = re.allMatches(str);
  if(0 == matches.length) {
    Expect.fail("\"$pattern\" !~ \"$str\"");
  }
  Expect.equals(expMatchesData.length, matches.length);

  Iterator<Match> it = matches.iterator;
    expMatchesData.forEach((var expMatch) {
    it.moveNext();
    Match actMatch = it.current;
    
    Expect.equals(expMatch.length, actMatch.groupCount + 3);
    Expect.equals(str, actMatch.input);
    Expect.isTrue(actMatch.pattern.toString().contains(pattern));
    
    Expect.equals(expMatch[0], actMatch.start);
    Expect.equals(expMatch[1], actMatch.end);
    
    for(int i = 0; i <= actMatch.groupCount; i++) {
      String actMatchStr = actMatch.group(i) as String;
      
      String expMatchStr = expMatch[i + 2];
      
      if(expMatchStr != actMatchStr) {
        Expect.fail("Group $i incorrect: '$expMatchStr' expected instead "
            + "of '$actMatchStr'");
      }
    }
  });
}

void checkNeg(String pattern, String str, {bool multiLine: false,
    bool ignoreCase: false}) {
  RegExp re = new RegExp(pattern, multiLine: multiLine,
      caseSensitive: !ignoreCase);
  Iterable<Match> matches = re.allMatches(str);
  Expect.equals(0, matches.length);
}
