// 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.11: The production DecimalEscape :: DecimalIntegerLiteral
/// [lookahead not in DecimalDigit] evaluates as follows:
///   <ol>
///   <li>Let i be the MV of DecimalIntegerLiteral.</li>
///   <li>If i is zero, return the EscapeValue consisting of a <NUL> character
///   (Unicode value 0000).</li>
///   <li>Return the EscapeValue consisting of the integer i. </li>
///   </ol>
/// NOTE: If \ is followed by a decimal number n whose first digit is not 0, then
/// the escape sequence is considered to be a backreference. It is an error if n
/// is greater than the total number of left capturing parentheses in the entire
/// regular expression. \0 represents the NUL character and cannot be followed
/// by a decimal digit.
/// @description Checks that using a correct decimal number doesn't cause any
/// error.
/// @3rdparty sputnik-v1:S15.10.2.11_A1_T4.js - S15.10.2.11_A1_T9.js
/// @author rodionov

import "../../../../Utils/expect.dart";
 
main() {
  check(r"(A)\1", "AA");
  check(r"\1(A)", "AA");
  check(r"(A)\1(B)\2", "AABB");
  check(r"\1(A)(B)\2", "ABB");
  check(r"((((((((((A))))))))))\1\2\3\4\5\6\7\8\9\10", "AAAAAAAAAAA");
  check(r"((((((((((A))))))))))\10\9\8\7\6\5\4\3\2\1", "AAAAAAAAAAA");
}

void check(String pattern, String testStr) {
  RegExp re = new RegExp(pattern);
  Expect.isNotNull(re.firstMatch(testStr));
}
