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.
166 lines
3.7 KiB
166 lines
3.7 KiB
function test(this_val, regexp_val, arg_count) {
|
|
var t;
|
|
|
|
try {
|
|
if (arg_count === 0) {
|
|
t = String.prototype.search.call();
|
|
} else if (arg_count === 1) {
|
|
t = String.prototype.search.call(this_val);
|
|
} else {
|
|
t = String.prototype.search.call(this_val, regexp_val);
|
|
}
|
|
print(typeof t, t);
|
|
} catch (e) {
|
|
print(e.name);
|
|
}
|
|
}
|
|
|
|
/*===
|
|
basic
|
|
number 3
|
|
number -1
|
|
number 5
|
|
number 0
|
|
number 3
|
|
string 12345
|
|
number -1
|
|
string 12345
|
|
number 3
|
|
string 12345
|
|
number -1
|
|
string 12345
|
|
number 4
|
|
string 12345
|
|
number -1
|
|
number -1
|
|
number 3
|
|
number 0
|
|
===*/
|
|
|
|
print('basic');
|
|
|
|
function basicTest() {
|
|
// basic searches
|
|
test('foobar', 'bar');
|
|
test('foobar', 'quux');
|
|
|
|
// non-BMP, verify that char index is returned
|
|
test('\u1234\u0123foobar\udead\ubeef', 'bar');
|
|
|
|
// a string is always interpreted as a regexp, not literally
|
|
test('foo', '.');
|
|
|
|
// RegExp global flag and lastIndex are ignored and unaffected
|
|
re = /bar/;
|
|
re.lastIndex = '12345';
|
|
test('foobar', re);
|
|
print(typeof re.lastIndex, re.lastIndex);
|
|
|
|
re = /bar/;
|
|
re.lastIndex = '12345';
|
|
test('foobaz', re);
|
|
print(typeof re.lastIndex, re.lastIndex);
|
|
|
|
// RegExp multiline and ignoreCare work as expected
|
|
re = /bar/i;
|
|
re.lastIndex = '12345';
|
|
test('fooBaR', re);
|
|
print(typeof re.lastIndex, re.lastIndex);
|
|
|
|
re = /^bar/; // single line, does not match
|
|
re.lastIndex = '12345';
|
|
test('foo\nbar', re);
|
|
print(typeof re.lastIndex, re.lastIndex);
|
|
|
|
re = /^bar/m;
|
|
re.lastIndex = '12345';
|
|
test('foo\nbar', re);
|
|
print(typeof re.lastIndex, re.lastIndex);
|
|
|
|
// if regexp argument is not a RegExp, a fresh one is created; it will have
|
|
// no flags, so regexp flags will be: global=false, multiline=false, ignoreCase=false
|
|
|
|
test('Foo', 'foo'); // case sensitive -> no match
|
|
test('foo\nbar', '^bar'); // single line -> no match
|
|
|
|
// multiple matches -> report first
|
|
test('foobarfoobarfoo', 'bar');
|
|
|
|
// empty string and empty search string
|
|
test('', '');
|
|
}
|
|
|
|
try {
|
|
basicTest();
|
|
} catch (e) {
|
|
print(e);
|
|
}
|
|
|
|
/*===
|
|
coercion
|
|
TypeError
|
|
TypeError
|
|
TypeError
|
|
number 1
|
|
number 2
|
|
number 1
|
|
number 1
|
|
number 1
|
|
number 8
|
|
number 0
|
|
number 0
|
|
number 3
|
|
number 3
|
|
number 3
|
|
number 3
|
|
number 3
|
|
number 3
|
|
number 1
|
|
number -1
|
|
===*/
|
|
|
|
print('coercion');
|
|
|
|
function coercionTest() {
|
|
// this coercion
|
|
test(undefined, undefined, 0);
|
|
test(undefined, 'foo');
|
|
test(null, 'foo');
|
|
test(true, 'rue');
|
|
test(false, 'lse');
|
|
test(123, '2');
|
|
test('foo', 'oo');
|
|
test([1,2], ',2');
|
|
test({ foo: 1, bar: 2 }, 'Object');
|
|
|
|
// regexp coercion -- RegExps are accepted as is, everything else is
|
|
// handed over to the RegExp constructor (without coercion). The RegExp
|
|
// constructor coerces with ToString(), except that undefined values are
|
|
// coerced to the empty string (E5.1 Section 15.10.4.1).
|
|
//
|
|
// The undefined case should be same as an empty search string, i.e.
|
|
// match at index 0. Rhino will work correctly for the first test
|
|
// but if an explicit undefined argument is given, it will coerce it
|
|
// to 'undefined' search string.
|
|
|
|
test('fooundefinedbar', undefined, 1); // coerces to empty, match at 0
|
|
test('fooundefinedbar', undefined); // same
|
|
test('foonullbar', null);
|
|
test('footruebar', true);
|
|
test('foofalsebar', false);
|
|
test('foo123bar', 123);
|
|
test('fooquuxbar', 'quux');
|
|
test('foo1,2bar', [1,2]);
|
|
|
|
// interesting case: ToString(obj) will be '[object Object]' which is
|
|
// a RegExp class expression!
|
|
test('abcdefgh', { foo: 1, bar: 2 }); // match at offset 1 ('b')
|
|
test('xxxP', { foo: 1, bar: 2 }); // no match
|
|
}
|
|
|
|
try {
|
|
coercionTest();
|
|
} catch (e) {
|
|
print(e);
|
|
}
|
|
|
|
|