123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298 |
- package goja
- import (
- "testing"
- )
- func TestGoSliceBasic(t *testing.T) {
- const SCRIPT = `
- var sum = 0;
- for (var i = 0; i < a.length; i++) {
- sum += a[i];
- }
- sum;
- `
- r := New()
- r.Set("a", []interface{}{1, 2, 3, 4})
- v, err := r.RunString(SCRIPT)
- if err != nil {
- t.Fatal(err)
- }
- if i := v.ToInteger(); i != 10 {
- t.Fatalf("Expected 10, got: %d", i)
- }
- }
- func TestGoSliceIn(t *testing.T) {
- const SCRIPT = `
- var idx = "";
- for (var i in a) {
- idx += i;
- }
- idx;
- `
- r := New()
- r.Set("a", []interface{}{1, 2, 3, 4})
- v, err := r.RunString(SCRIPT)
- if err != nil {
- t.Fatal(err)
- }
- if i := v.String(); i != "0123" {
- t.Fatalf("Expected '0123', got: '%s'", i)
- }
- }
- func TestGoSliceExpand(t *testing.T) {
- const SCRIPT = `
- var l = a.length;
- for (var i = 0; i < l; i++) {
- a[l + i] = a[i] * 2;
- }
- var sum = 0;
- for (var i = 0; i < a.length; i++) {
- sum += a[i];
- }
- sum;
- `
- r := New()
- a := []interface{}{int64(1), int64(2), int64(3), int64(4)}
- r.Set("a", &a)
- v, err := r.RunString(SCRIPT)
- if err != nil {
- t.Fatal(err)
- }
- sum := int64(0)
- for _, v := range a {
- sum += v.(int64)
- }
- if i := v.ToInteger(); i != sum {
- t.Fatalf("Expected %d, got: %d", sum, i)
- }
- }
- func TestGoSliceProtoMethod(t *testing.T) {
- const SCRIPT = `
- a.join(",")
- `
- r := New()
- a := []interface{}{1, 2, 3, 4}
- r.Set("a", a)
- ret, err := r.RunString(SCRIPT)
- if err != nil {
- t.Fatal(err)
- }
- if s := ret.String(); s != "1,2,3,4" {
- t.Fatalf("Unexpected result: '%s'", s)
- }
- }
- func TestGoSliceSetLength(t *testing.T) {
- r := New()
- a := []interface{}{1, 2, 3, 4}
- r.Set("a", &a)
- _, err := r.RunString(`
- 'use strict';
- a.length = 3;
- if (a.length !== 3) {
- throw new Error("length="+a.length);
- }
- if (a[3] !== undefined) {
- throw new Error("a[3](1)="+a[3]);
- }
- a.length = 5;
- if (a.length !== 5) {
- throw new Error("length="+a.length);
- }
- if (a[3] !== null) {
- throw new Error("a[3](2)="+a[3]);
- }
- if (a[4] !== null) {
- throw new Error("a[4]="+a[4]);
- }
- `)
- if err != nil {
- t.Fatal(err)
- }
- }
- func TestGoSliceProto(t *testing.T) {
- r := New()
- a := []interface{}{1, nil, 3}
- r.Set("a", &a)
- r.testScriptWithTestLib(`
- var proto = [,2,,4];
- Object.setPrototypeOf(a, proto);
- assert.sameValue(a[1], null, "a[1]");
- assert.sameValue(a[3], 4, "a[3]");
- var desc = Object.getOwnPropertyDescriptor(a, "1");
- assert.sameValue(desc.value, null, "desc.value");
- assert(desc.writable, "writable");
- assert(desc.enumerable, "enumerable");
- assert(!desc.configurable, "configurable");
- var v5;
- Object.defineProperty(proto, "5", {
- set: function(v) {
- v5 = v;
- }
- });
- a[5] = "test";
- assert.sameValue(v5, "test", "v5");
- `, _undefined, t)
- }
- func TestGoSliceProtoProto(t *testing.T) {
- r := New()
- a := []interface{}{1, nil, 3}
- proto := []interface{}{1, 2, 3, 4}
- r.Set("a", &a)
- r.Set("proto", proto)
- _, err := r.RunString(`
- "use strict";
- var protoproto = Object.create(null);
- Object.defineProperty(protoproto, "3", {
- value: 42
- });
- Object.setPrototypeOf(proto, protoproto);
- Object.setPrototypeOf(a, proto);
- a[3] = 11;
- if (a[3] !== 11) {
- throw new Error("a[3]=" + a[3]);
- }
- `)
- if err != nil {
- t.Fatal(err)
- }
- }
- func TestGoSliceDelete(t *testing.T) {
- r := New()
- a := []interface{}{1, nil, 3}
- r.Set("a", a)
- v, err := r.RunString(`
- delete a[0] && delete a[1] && delete a[3];
- `)
- if err != nil {
- t.Fatal(err)
- }
- if v != valueTrue {
- t.Fatalf("not true: %v", v)
- }
- }
- func TestGoSlicePop(t *testing.T) {
- r := New()
- a := []interface{}{1, nil, 3}
- r.Set("a", &a)
- v, err := r.RunString(`
- a.pop()
- `)
- if err != nil {
- t.Fatal(err)
- }
- if !v.SameAs(intToValue(3)) {
- t.Fatal(v)
- }
- }
- func TestGoSlicePopNoPtr(t *testing.T) {
- r := New()
- a := []interface{}{1, nil, 3}
- r.Set("a", a)
- v, err := r.RunString(`
- a.pop()
- `)
- if err != nil {
- t.Fatal(err)
- }
- if !v.SameAs(intToValue(3)) {
- t.Fatal(v)
- }
- }
- func TestGoSliceShift(t *testing.T) {
- r := New()
- a := []interface{}{1, nil, 3}
- r.Set("a", &a)
- v, err := r.RunString(`
- a.shift()
- `)
- if err != nil {
- t.Fatal(err)
- }
- if !v.SameAs(intToValue(1)) {
- t.Fatal(v)
- }
- }
- func TestGoSliceLengthProperty(t *testing.T) {
- vm := New()
- vm.Set("s", []interface{}{2, 3, 4})
- _, err := vm.RunString(`
- if (!s.hasOwnProperty("length")) {
- throw new Error("hasOwnProperty() returned false");
- }
- let desc = Object.getOwnPropertyDescriptor(s, "length");
- if (desc.value !== 3 || !desc.writable || desc.enumerable || desc.configurable) {
- throw new Error("incorrect property descriptor: " + JSON.stringify(desc));
- }
- `)
- if err != nil {
- t.Fatal(err)
- }
- }
- func TestGoSliceSort(t *testing.T) {
- vm := New()
- s := []interface{}{4, 2, 3}
- vm.Set("s", &s)
- _, err := vm.RunString(`s.sort()`)
- if err != nil {
- t.Fatal(err)
- }
- if len(s) != 3 {
- t.Fatalf("len: %d", len(s))
- }
- if s[0] != 2 || s[1] != 3 || s[2] != 4 {
- t.Fatalf("val: %v", s)
- }
- }
- func TestGoSliceToString(t *testing.T) {
- vm := New()
- s := []interface{}{4, 2, 3}
- vm.Set("s", &s)
- res, err := vm.RunString("`${s}`")
- if err != nil {
- t.Fatal(err)
- }
- if exp := res.Export(); exp != "4,2,3" {
- t.Fatal(exp)
- }
- }
- func TestGoSliceExternalLenUpdate(t *testing.T) {
- data := &[]interface{}{1}
- vm := New()
- vm.Set("data", data)
- vm.Set("append", func(a *[]interface{}, v int) {
- if a != data {
- panic(vm.NewTypeError("a != data"))
- }
- *a = append(*a, v)
- })
- vm.testScriptWithTestLib(`
- assert.sameValue(data.length, 1);
- // modify with js
- data.push(1);
- assert.sameValue(data.length, 2);
- // modify with go
- append(data, 2);
- assert.sameValue(data.length, 3);
- `, _undefined, t)
- }
|