123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328 |
- package goja
- import "testing"
- func TestGomapProp(t *testing.T) {
- const SCRIPT = `
- o.a + o.b;
- `
- r := New()
- r.Set("o", map[string]interface{}{
- "a": 40,
- "b": 2,
- })
- v, err := r.RunString(SCRIPT)
- if err != nil {
- t.Fatal(err)
- }
- if i := v.ToInteger(); i != 42 {
- t.Fatalf("Expected 42, got: %d", i)
- }
- }
- func TestGomapEnumerate(t *testing.T) {
- const SCRIPT = `
- var hasX = false;
- var hasY = false;
- for (var key in o) {
- switch (key) {
- case "x":
- if (hasX) {
- throw "Already have x";
- }
- hasX = true;
- break;
- case "y":
- if (hasY) {
- throw "Already have y";
- }
- hasY = true;
- break;
- default:
- throw "Unexpected property: " + key;
- }
- }
- hasX && hasY;
- `
- r := New()
- r.Set("o", map[string]interface{}{
- "x": 40,
- "y": 2,
- })
- v, err := r.RunString(SCRIPT)
- if err != nil {
- t.Fatal(err)
- }
- if !v.StrictEquals(valueTrue) {
- t.Fatalf("Expected true, got %v", v)
- }
- }
- func TestGomapDeleteWhileEnumerate(t *testing.T) {
- const SCRIPT = `
- var hasX = false;
- var hasY = false;
- for (var key in o) {
- switch (key) {
- case "x":
- if (hasX) {
- throw "Already have x";
- }
- hasX = true;
- delete o.y;
- break;
- case "y":
- if (hasY) {
- throw "Already have y";
- }
- hasY = true;
- delete o.x;
- break;
- default:
- throw "Unexpected property: " + key;
- }
- }
- hasX && !hasY || hasY && !hasX;
- `
- r := New()
- r.Set("o", map[string]interface{}{
- "x": 40,
- "y": 2,
- })
- v, err := r.RunString(SCRIPT)
- if err != nil {
- t.Fatal(err)
- }
- if !v.StrictEquals(valueTrue) {
- t.Fatalf("Expected true, got %v", v)
- }
- }
- func TestGomapInstanceOf(t *testing.T) {
- const SCRIPT = `
- (o instanceof Object) && !(o instanceof Error);
- `
- r := New()
- r.Set("o", map[string]interface{}{})
- v, err := r.RunString(SCRIPT)
- if err != nil {
- t.Fatal(err)
- }
- if !v.StrictEquals(valueTrue) {
- t.Fatalf("Expected true, got %v", v)
- }
- }
- func TestGomapTypeOf(t *testing.T) {
- const SCRIPT = `
- typeof o;
- `
- r := New()
- r.Set("o", map[string]interface{}{})
- v, err := r.RunString(SCRIPT)
- if err != nil {
- t.Fatal(err)
- }
- if !v.StrictEquals(asciiString("object")) {
- t.Fatalf("Expected object, got %v", v)
- }
- }
- func TestGomapProto(t *testing.T) {
- const SCRIPT = `
- o.hasOwnProperty("test");
- `
- r := New()
- r.Set("o", map[string]interface{}{
- "test": 42,
- })
- v, err := r.RunString(SCRIPT)
- if err != nil {
- t.Fatal(err)
- }
- if !v.StrictEquals(valueTrue) {
- t.Fatalf("Expected true, got %v", v)
- }
- }
- func TestGoMapExtensibility(t *testing.T) {
- const SCRIPT = `
- "use strict";
- o.test = 42;
- Object.preventExtensions(o);
- o.test = 43;
- try {
- o.test1 = 42;
- } catch (e) {
- if (!(e instanceof TypeError)) {
- throw e;
- }
- }
- o.test === 43 && o.test1 === undefined;
- `
- r := New()
- r.Set("o", map[string]interface{}{})
- v, err := r.RunString(SCRIPT)
- if err != nil {
- if ex, ok := err.(*Exception); ok {
- t.Fatal(ex.String())
- } else {
- t.Fatal(err)
- }
- }
- if !v.StrictEquals(valueTrue) {
- t.Fatalf("Expected true, got %v", v)
- }
- }
- func TestGoMapWithProto(t *testing.T) {
- vm := New()
- m := map[string]interface{}{
- "t": "42",
- }
- vm.Set("m", m)
- vm.testScriptWithTestLib(`
- (function() {
- 'use strict';
- var proto = {};
- var getterAllowed = false;
- var setterAllowed = false;
- var tHolder = "proto t";
- Object.defineProperty(proto, "t", {
- get: function() {
- if (!getterAllowed) throw new Error("getter is called");
- return tHolder;
- },
- set: function(v) {
- if (!setterAllowed) throw new Error("setter is called");
- tHolder = v;
- }
- });
- var t1Holder;
- Object.defineProperty(proto, "t1", {
- get: function() {
- return t1Holder;
- },
- set: function(v) {
- t1Holder = v;
- }
- });
- Object.setPrototypeOf(m, proto);
- assert.sameValue(m.t, "42");
- m.t = 43;
- assert.sameValue(m.t, 43);
- t1Holder = "test";
- assert.sameValue(m.t1, "test");
- m.t1 = "test1";
- assert.sameValue(m.t1, "test1");
- delete m.t;
- getterAllowed = true;
- assert.sameValue(m.t, "proto t", "after delete");
- setterAllowed = true;
- m.t = true;
- assert.sameValue(m.t, true);
- assert.sameValue(tHolder, true);
- Object.preventExtensions(m);
- assert.throws(TypeError, function() {
- m.t2 = 1;
- });
- m.t1 = "test2";
- assert.sameValue(m.t1, "test2");
- })();
- `, _undefined, t)
- }
- func TestGoMapProtoProp(t *testing.T) {
- const SCRIPT = `
- (function() {
- "use strict";
- var proto = {};
- Object.defineProperty(proto, "ro", {value: 42});
- Object.setPrototypeOf(m, proto);
- assert.throws(TypeError, function() {
- m.ro = 43;
- });
- Object.defineProperty(m, "ro", {value: 43});
- assert.sameValue(m.ro, 43);
- })();
- `
- r := New()
- r.Set("m", map[string]interface{}{})
- r.testScriptWithTestLib(SCRIPT, _undefined, t)
- }
- func TestGoMapProtoPropChain(t *testing.T) {
- const SCRIPT = `
- (function() {
- "use strict";
- var p1 = Object.create(null);
- m.__proto__ = p1;
-
- Object.defineProperty(p1, "test", {
- value: 42
- });
-
- Object.defineProperty(m, "test", {
- value: 43,
- writable: true,
- });
- var o = Object.create(m);
- o.test = 44;
- assert.sameValue(o.test, 44);
- var sym = Symbol(true);
- Object.defineProperty(p1, sym, {
- value: 42
- });
-
- Object.defineProperty(m, sym, {
- value: 43,
- writable: true,
- });
- o[sym] = 44;
- assert.sameValue(o[sym], 44);
- })();
- `
- r := New()
- r.Set("m", map[string]interface{}{})
- r.testScriptWithTestLib(SCRIPT, _undefined, t)
- }
- func TestGoMapUnicode(t *testing.T) {
- const SCRIPT = `
- Object.setPrototypeOf(m, s);
- if (m.Тест !== "passed") {
- throw new Error("m.Тест: " + m.Тест);
- }
- m["é"];
- `
- type S struct {
- Тест string
- }
- vm := New()
- m := map[string]interface{}{
- "é": 42,
- }
- s := S{
- Тест: "passed",
- }
- vm.Set("m", m)
- vm.Set("s", &s)
- res, err := vm.RunString(SCRIPT)
- if err != nil {
- t.Fatal(err)
- }
- if res == nil || !res.StrictEquals(valueInt(42)) {
- t.Fatalf("Unexpected value: %v", res)
- }
- }
|