blob: bc6d27d49674173d536e5a85ad213b9fe7825652 [file] [log] [blame]
// 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.13: The production CharacterClass :: [ [lookahead not in
/// {^}] ClassRanges ] evaluates by evaluating ClassRanges to obtain a CharSet
/// and returning that CharSet and the Boolean false.<br/>
/// The production ClassRanges :: [empty] evaluates by returning the empty
/// CharSet.<br/>
/// The production ClassRanges :: NonemptyClassRanges evaluates by evaluating
/// NonemptyClassRanges to obtain a CharSet and returning that CharSet. <br/>
/// NonemptyClassRanges ::<br/>
/// ClassAtom <br/>
/// ClassAtom NonemptyClassRangesNoDash<br/>
/// ClassAtom - ClassAtom ClassRanges<br/>
/// <br/>
/// NonemptyClassRangesNoDash :: <br/>
/// ClassAtom <br/>
/// ClassAtomNoDash NonemptyClassRangesNoDash<br/>
/// ClassAtomNoDash - ClassAtom ClassRanges <br/>
/// <br/>
/// ClassAtom :: <br/> - <br/>
/// ClassAtomNoDash<br/><br/> ClassAtomNoDash :: <br/>
/// SourceCharacter <b>but not one of \ or ] or -</b><br/>
/// \ ClassEscape <br/>
/// <br/>
/// ClassEscape :: <br/>
/// DecimalEscape <br/>
/// b <br/>
/// CharacterEscape<br/>
/// CharacterClassEscape <br/>
/// @description Checks that a valid CharacterClass ([..]) pattern works as
/// described.
/// @3rdparty sputnik-v1:S15.10.2.13_A1_T1.js-S15.10.2.13_A1_T17.js
/// @author rodionov
/// @Issue 1297
import "../../../../Utils/expect.dart";
main() {
check("q[ax-zb](?=\\s+)", "qYqy ");
check("q[ax-zb](?=\\s+)", "tqaqy ");
check("q[ax-zb](?=\\s+)", "tqa\t qy ");
check("ab[ercst]de", "abcde");
check("[d-h]+", "abcdefghijkl");
check("[1234567].{2}", "abc6defghijkl");
check("[a-c\\d]+", "\n\nabc324234\n");
check("ab[.]?c", "abc");
check("a[b]c", "abc");
check("[a-z][^1-9][a-z]", "a1b b2c c3d def f4g");
check(r"[\*&$]{3}", r"123*&$abc");
check(r"[\d][\n][^\d]", "line1\nline2");
check(r"[\+--]", ",");
check("[--0]", "/");
check("[---]", "-");
check("[a-cA-C]", "bB");
check(r"[\u0061-\u007A]", "f");
checkNeg("[]", "a[b\n[]\tc]d");
checkNeg("[]a", "\0a\0a");
checkNeg("a[]", "\0a\0a");
checkNeg("ab[erst]de", "abcde");
// check(r"[\d][\12-\14]{1,}[^\d]", "line1\n\n\n\n\nline2");
// check(r"[\d][\0012-\0014]{1,}[^\d]", "line1\n\n\n\n\nline2"); // issue 1297
}
void check(String pattern, String str) {
RegExp re = new RegExp(pattern);
Expect.isNotNull(re.firstMatch(str), "\"$pattern\" !~ \"$str\"");
}
void checkNeg(String pattern, String str) {
RegExp re = new RegExp(pattern);
Expect.isNull(re.firstMatch(str), "\"$pattern\" ~ \"$str\"");
}