aboutsummaryrefslogtreecommitdiffstats
path: root/Godeps/_workspace/src/github.com/robertkrimen/otto/regexp_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'Godeps/_workspace/src/github.com/robertkrimen/otto/regexp_test.go')
-rw-r--r--Godeps/_workspace/src/github.com/robertkrimen/otto/regexp_test.go290
1 files changed, 290 insertions, 0 deletions
diff --git a/Godeps/_workspace/src/github.com/robertkrimen/otto/regexp_test.go b/Godeps/_workspace/src/github.com/robertkrimen/otto/regexp_test.go
new file mode 100644
index 000000000..8e65ee46a
--- /dev/null
+++ b/Godeps/_workspace/src/github.com/robertkrimen/otto/regexp_test.go
@@ -0,0 +1,290 @@
+package otto
+
+import (
+ "fmt"
+ "testing"
+)
+
+func TestRegExp(t *testing.T) {
+ tt(t, func() {
+ test, _ := test()
+
+ test(`
+ [
+ /abc/.toString(),
+ /abc/gim.toString(),
+ ""+/abc/gi.toString(),
+ new RegExp("1(\\d+)").toString(),
+ ];
+ `, "/abc/,/abc/gim,/abc/gi,/1(\\d+)/")
+
+ test(`
+ [
+ new RegExp("abc").exec("123abc456"),
+ null === new RegExp("xyzzy").exec("123abc456"),
+ new RegExp("1(\\d+)").exec("123abc456"),
+ new RegExp("xyzzy").test("123abc456"),
+ new RegExp("1(\\d+)").test("123abc456"),
+ new RegExp("abc").exec("123abc456"),
+ ];
+ `, "abc,true,123,23,false,true,abc")
+
+ test(`new RegExp("abc").toString()`, "/abc/")
+ test(`new RegExp("abc", "g").toString()`, "/abc/g")
+ test(`new RegExp("abc", "mig").toString()`, "/abc/gim")
+
+ result := test(`/(a)?/.exec('b')`, ",")
+ is(result._object().get("0"), "")
+ is(result._object().get("1"), "undefined")
+ is(result._object().get("length"), 2)
+
+ result = test(`/(a)?(b)?/.exec('b')`, "b,,b")
+ is(result._object().get("0"), "b")
+ is(result._object().get("1"), "undefined")
+ is(result._object().get("2"), "b")
+ is(result._object().get("length"), 3)
+
+ test(`/\u0041/.source`, "\\u0041")
+ test(`/\a/.source`, "\\a")
+ test(`/\;/.source`, "\\;")
+
+ test(`/a\a/.source`, "a\\a")
+ test(`/,\;/.source`, ",\\;")
+ test(`/ \ /.source`, " \\ ")
+
+ // Start sanity check...
+ test("eval(\"/abc/\").source", "abc")
+ test("eval(\"/\u0023/\").source", "#")
+ test("eval(\"/\u0058/\").source", "X")
+ test("eval(\"/\\\u0023/\").source == \"\\\u0023\"", true)
+ test("'0x' + '0058'", "0x0058")
+ test("'\\\\' + '0x' + '0058'", "\\0x0058")
+ // ...stop sanity check
+
+ test(`abc = '\\' + String.fromCharCode('0x' + '0058'); eval('/' + abc + '/').source`, "\\X")
+ test(`abc = '\\' + String.fromCharCode('0x0058'); eval('/' + abc + '/').source == "\\\u0058"`, true)
+ test(`abc = '\\' + String.fromCharCode('0x0023'); eval('/' + abc + '/').source == "\\\u0023"`, true)
+ test(`abc = '\\' + String.fromCharCode('0x0078'); eval('/' + abc + '/').source == "\\\u0078"`, true)
+
+ test(`
+ var abc = Object.getOwnPropertyDescriptor(RegExp, "prototype");
+ [ [ typeof RegExp.prototype ],
+ [ abc.writable, abc.enumerable, abc.configurable ] ];
+ `, "object,false,false,false")
+ })
+}
+
+func TestRegExp_global(t *testing.T) {
+ tt(t, func() {
+ test, _ := test()
+
+ test(`
+ var abc = /(?:ab|cd)\d?/g;
+ var found = [];
+ do {
+ match = abc.exec("ab cd2 ab34 cd");
+ if (match !== null) {
+ found.push(match[0]);
+ } else {
+ break;
+ }
+ } while (true);
+ found;
+ `, "ab,cd2,ab3,cd")
+ })
+}
+
+func TestRegExp_exec(t *testing.T) {
+ tt(t, func() {
+ test, _ := test()
+
+ test(`
+ abc = /./g;
+ def = '123456';
+ ghi = 0;
+ while (ghi < 100 && abc.exec(def) !== null) {
+ ghi += 1;
+ }
+ [ ghi, def.length, ghi == def.length ];
+ `, "6,6,true")
+
+ test(`
+ abc = /[abc](\d)?/g;
+ def = 'a0 b c1 d3';
+ ghi = 0;
+ lastIndex = 0;
+ while (ghi < 100 && abc.exec(def) !== null) {
+ lastIndex = abc.lastIndex;
+ ghi += 1;
+
+ }
+ [ ghi, lastIndex ];
+ `, "3,7")
+
+ test(`
+ var abc = /[abc](\d)?/.exec("a0 b c1 d3");
+ [ abc.length, abc.input, abc.index, abc ];
+ `, "2,a0 b c1 d3,0,a0,0")
+
+ test(`raise:
+ var exec = RegExp.prototype.exec;
+ exec("Xyzzy");
+ `, "TypeError: Calling RegExp.exec on a non-RegExp object")
+
+ test(`
+ var abc = /\w{3}\d?/.exec("CE\uFFFFL\uFFDDbox127");
+ [ abc.input.length, abc.length, abc.input, abc.index, abc ];
+ `, "11,1,CE\uFFFFL\uFFDDbox127,5,box1")
+
+ test(`RegExp.prototype.exec.length`, 1)
+ test(`RegExp.prototype.exec.prototype`, "undefined")
+ })
+}
+
+func TestRegExp_test(t *testing.T) {
+ tt(t, func() {
+ test, _ := test()
+
+ test(`RegExp.prototype.test.length`, 1)
+ test(`RegExp.prototype.test.prototype`, "undefined")
+ })
+}
+
+func TestRegExp_toString(t *testing.T) {
+ tt(t, func() {
+ test, _ := test()
+
+ test(`RegExp.prototype.toString.length`, 0)
+ test(`RegExp.prototype.toString.prototype`, "undefined")
+ })
+}
+
+func TestRegExp_zaacbbbcac(t *testing.T) {
+ if true {
+ return
+ }
+
+ tt(t, func() {
+ test, _ := test()
+
+ // FIXME? TODO /(z)((a+)?(b+)?(c))*/.exec("zaacbbbcac")
+ test(`
+ var abc = /(z)((a+)?(b+)?(c))*/.exec("zaacbbbcac");
+ [ abc.length, abc.index, abc ];
+ `, "6,0,zaacbbbcac,z,ac,a,,c")
+ })
+}
+
+func TestRegExpCopying(t *testing.T) {
+ tt(t, func() {
+ test, _ := test()
+
+ test(`
+ abc = /xyzzy/i;
+ def = RegExp(abc);
+ abc.indicator = 1;
+ [ abc.indicator, def.indicator ];
+ `, "1,1")
+
+ test(`raise:
+ RegExp(new RegExp("\\d"), "1");
+ `, "TypeError: Cannot supply flags when constructing one RegExp from another")
+ })
+}
+
+func TestRegExp_multiline(t *testing.T) {
+ tt(t, func() {
+ test, _ := test()
+
+ test(`
+ var abc = /s$/m.exec("pairs\nmakes\tdouble");
+ [ abc.length, abc.index, abc ];
+ `, "1,4,s")
+ })
+}
+
+func TestRegExp_source(t *testing.T) {
+ tt(t, func() {
+ test, _ := test()
+
+ test(`
+ [ /xyzzy/i.source, /./i.source ];
+ `, "xyzzy,.")
+
+ test(`
+ var abc = /./i;
+ var def = new RegExp(abc);
+ [ abc.source, def.source, abc.source === def.source ];
+ `, ".,.,true")
+
+ test(`
+ var abc = /./i;
+ var def = abc.hasOwnProperty("source");
+ var ghi = abc.source;
+ abc.source = "xyzzy";
+ [ def, abc.source ];
+ `, "true,.")
+ })
+}
+
+func TestRegExp_newRegExp(t *testing.T) {
+ tt(t, func() {
+ test, _ := test()
+
+ test(`
+ Math.toString();
+ var abc = new RegExp(Math,eval("\"g\""));
+ [ abc, abc.global ];
+ `, "/[object Math]/g,true")
+ })
+}
+
+func TestRegExp_flags(t *testing.T) {
+ tt(t, func() {
+ test, _ := test()
+
+ test(`
+ var abc = /./i;
+ var def = new RegExp(abc);
+ [ abc.multiline == def.multiline, abc.global == def.global, abc.ignoreCase == def.ignoreCase ];
+ `, "true,true,true")
+ })
+}
+
+func TestRegExp_controlCharacter(t *testing.T) {
+ tt(t, func() {
+ test, _ := test()
+
+ for code := 0x41; code < 0x5a; code++ {
+ string_ := string(code - 64)
+ test(fmt.Sprintf(`
+ var code = 0x%x;
+ var string = String.fromCharCode(code %% 32);
+ var result = (new RegExp("\\c" + String.fromCharCode(code))).exec(string);
+ [ code, string, result ];
+ `, code), fmt.Sprintf("%d,%s,%s", code, string_, string_))
+ }
+ })
+}
+
+func TestRegExp_notNotEmptyCharacterClass(t *testing.T) {
+ tt(t, func() {
+ test, _ := test()
+
+ test(`
+ var abc = /[\s\S]a/m.exec("a\naba");
+ [ abc.length, abc.input, abc ];
+ `, "1,a\naba,\na")
+ })
+}
+
+func TestRegExp_compile(t *testing.T) {
+ tt(t, func() {
+ test, _ := test()
+
+ test(`
+ var abc = /[\s\S]a/;
+ abc.compile('^\w+');
+ `, "undefined")
+ })
+}