blob: 9f7c685c5021e75018f1842ee22a026f1fa8fb09 [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 :: [ ^ ClassRanges ]
* evaluates by evaluating ClassRanges to obtain a CharSet and returning that
* CharSet and the Boolean true. <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_A2_T1.js-S15.10.2.13_A2_T8.js
* @author rodionov
*/
import "../../../../Utils/expect.dart";
main() {
check("[^]a", "a\naba");
check("a[^]", " a\t\n");
check(r"a[^b-z]\s+", "ab an az aY n");
check("a[^1-9]c", "abc");
checkNeg("a[^b]c", "abc");
check("[^a-z]{4}", r"abc#$%def%&*@ghi");
check("[^]", r"abc#$%def%&*@ghi");
check(r"[^\b]+", "easy\bto\u0008ride");
}
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\"");
}