123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184 |
- 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)
- }
- }
|