mirror of https://github.com/svaarala/duktape.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
118 lines
2.1 KiB
118 lines
2.1 KiB
/*
|
|
* RegExp toString() has strict semantics, although the output is not
|
|
* uniquely defined. The specification only requires that the regexp
|
|
* can be compiled and will be semantically equivalent.
|
|
*
|
|
* Hence, e.g. /\n[a-c]/i.toString() might result in:
|
|
*
|
|
* 1. /\n[a-c]/i
|
|
* 2. /\n(?:a|b|c)/i
|
|
* 3. /\u000a[A-C]/i
|
|
*
|
|
* or one of many other alternatives. Here, though, the expected string
|
|
* is written to match what we -want- to see.
|
|
*
|
|
* Also note that output flag order is strictly specified.
|
|
*/
|
|
|
|
var r;
|
|
|
|
/*
|
|
* Test various regexp constructs and their escaping. Pattern
|
|
* syntax is defined in E5 Section 15.10.1.
|
|
*/
|
|
|
|
/*===
|
|
/(?:)/
|
|
/^$\b\B(?=foo)(?!bar)/
|
|
/a*b*?c+d+?e?f??/
|
|
/a{3}b{3}?c{3,}d{3,}?e{3,10}f{3,10}?/
|
|
/a.\0\cD\xde\u1234\u00de\=/
|
|
/[abc-d][^abc-d]/
|
|
/fOO/i
|
|
===*/
|
|
|
|
try {
|
|
r = new RegExp(''); /* empty regexp is a special case */
|
|
print(r.toString());
|
|
} catch (e) {
|
|
print(e.name);
|
|
}
|
|
|
|
try {
|
|
r = /^$\b\B(?=foo)(?!bar)/;
|
|
print(r.toString());
|
|
} catch (e) {
|
|
print(e.name);
|
|
}
|
|
|
|
try {
|
|
r = /a*b*?c+d+?e?f??/;
|
|
print(r.toString());
|
|
} catch (e) {
|
|
print(e.name);
|
|
}
|
|
|
|
try {
|
|
r = /a{3}b{3}?c{3,}d{3,}?e{3,10}f{3,10}?/;
|
|
print(r.toString());
|
|
} catch (e) {
|
|
print(e.name);
|
|
}
|
|
|
|
try {
|
|
/* '\cD' is a ControlLetter escape
|
|
*.
|
|
* \= is an IdentityEscape, whose and should match '='.
|
|
* Note that an IdentityEscape cannot be an IdentifierPart
|
|
* (e.g. 'z').
|
|
*/
|
|
r = /a.\0\cD\xde\u1234\u00de\=/;
|
|
print(r.toString());
|
|
} catch (e) {
|
|
print(e.name);
|
|
}
|
|
|
|
try {
|
|
/* FIXME: much to expand here */
|
|
r = /[abc-d][^abc-d]/;
|
|
print(r.toString());
|
|
} catch (e) {
|
|
print(e.name);
|
|
}
|
|
|
|
try {
|
|
/* case normalization would be allowed in pattern here */
|
|
r = /fOO/i;
|
|
print(r.toString());
|
|
} catch (e) {
|
|
print(e.name);
|
|
}
|
|
|
|
/*
|
|
* Flags
|
|
*/
|
|
|
|
/*===
|
|
/foo/g
|
|
/foo/i
|
|
/foo/m
|
|
/foo/gim
|
|
===*/
|
|
|
|
try {
|
|
r = /foo/g;
|
|
print(r.toString());
|
|
|
|
r = /foo/i;
|
|
print(r.toString());
|
|
|
|
r = /foo/m;
|
|
print(r.toString());
|
|
|
|
/* Note: input flag order differs from -required- output (E5 Section 15.10.6.4) */
|
|
r = /foo/mig;
|
|
print(r.toString());
|
|
} catch (e) {
|
|
print(e.name);
|
|
}
|
|
|