// 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 \B inside a ClassAtom doesn't cause an error.
 * @author rodionov
 * @note issue 1299
 */
import "../../../../Utils/expect.dart";
 
main() {
  checkNeg(r"[\B]", "a");
  checkNeg(r"[a\B]", "a");
  checkNeg(r"[\B-\B]", "a");
  checkNeg(r"[\B]?", "a");
  checkNeg(r"(a)[\B]?", "aa");
}

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