/*
 * 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.15: The production NonemptyClassRanges :: ClassAtom -
 * ClassAtom ClassRanges evaluates as follows:
 *   <ol>
 *   <li>Evaluate the first ClassAtom to obtain a CharSet A. </li>
 *   <li>Evaluate the second ClassAtom to obtain a CharSet B.</li>
 *   <li>Evaluate ClassRanges to obtain a CharSet C. </li>
 *   <li>Call CharacterRange(A, B) and let D be the resulting CharSet.</li>
 *   <li>Return the union of CharSets D and C.</li>
 *   </ol>
 * <br/> The abstract operation CharacterRange takes two CharSet parameters A
 * and B and performs the following:
 *   <ol>
 *   <li>If A does not contain exactly one character or B does not contain
 *          exactly one character then throw a SyntaxError exception. </li>
 *   <li>Let a be the one character in CharSet A. </li>
 *   <li>Let b be the one character in CharSet B. </li>
 *   <li>Let i be the code unit value of character a. </li>
 *   <li>Let j be the code unit value of character b. </li>
 *   <li>If i > j then throw a SyntaxError exception. </li>
 *   <li>Return the set containing all characters numbered i through j,
 *       inclusive.</li>
 *   </ol>
 * <br/> 15.10.2.19: NOTE A ClassAtom can use any of the escape sequences that
 * are allowed in the rest of the regular expression except for \b, \B, and
 * backreferences. Inside a CharacterClass, \b means the backspace character,
 * while \B and backreferences raise errors. Using a backreference inside a
 * ClassAtom causes an error.
 *
 * @description Checks that using such ClassAtoms for a range specification that
 * the CU value of the beginning limit is greater than that of the end limit
 * while CharacterClass contains another atoms causes an error.
 * @3rdparty sputnik-v1:S15.10.2.15_A1_T1.js-S15.10.2.15_A1_T41.js
 * @author rodionov
 */
import "../../../../Utils/expect.dart";
 
main() {
  checkNeg(r"[\db-G]", "a");
  checkNeg(r"[\Db-G]", "a");
  checkNeg(r"[\sb-G]", "a");
  checkNeg(r"[\Sb-G]", "a");
  checkNeg(r"[\wb-G]", "a");
  checkNeg(r"[\Wb-G]", "a");
  checkNeg(r"[\0b-G]", "a");
  checkNeg(r"[\td-G]", "a");
  checkNeg(r"[\nd-G]", "a");
  checkNeg(r"[\vd-G]", "a");
  checkNeg(r"[\fd-G]", "a");
  checkNeg(r"[\rd-G]", "a");
  checkNeg(r"[\c0001d-G]", "a");
  checkNeg(r"[\u0061d-G]", "a");
  checkNeg(r"[\x0061d-G]", "a");
  
  checkNeg(r"[b-G\d]", "a");
  checkNeg(r"[b-G\D]", "a");
  checkNeg(r"[b-G\s]", "a");
  checkNeg(r"[b-G\S]", "a");
  checkNeg(r"[b-G\w]", "a");
  checkNeg(r"[b-G\W]", "a");
  checkNeg(r"[b-G\0]", "a");
  checkNeg(r"[d-G\t]", "a");
  checkNeg(r"[d-G\n]", "a");
  checkNeg(r"[d-G\r]", "a");
  checkNeg(r"[d-G\f]", "a");
  checkNeg(r"[d-G\v]", "a");
  checkNeg(r"[d-G\c0001]", "a");
  checkNeg(r"[d-G\u0061]", "a");
  checkNeg(r"[d-G\x0061]", "a");
}

void checkNeg(String pattern, [String testStr = ""]) {
  Expect.throws(() {
    RegExp re = new RegExp(pattern);
    re.firstMatch(testStr);
  });
}
