123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326 |
- package goja
- import "testing"
- func TestArray1(t *testing.T) {
- r := &Runtime{}
- a := r.newArray(nil)
- a.setOwnIdx(valueInt(0), asciiString("test"), true)
- if l := a.getStr("length", nil).ToInteger(); l != 1 {
- t.Fatalf("Unexpected length: %d", l)
- }
- }
- func TestDefineProperty(t *testing.T) {
- r := New()
- o := r.NewObject()
- err := o.DefineDataProperty("data", r.ToValue(42), FLAG_TRUE, FLAG_TRUE, FLAG_TRUE)
- if err != nil {
- t.Fatal(err)
- }
- err = o.DefineAccessorProperty("accessor_ro", r.ToValue(func() int {
- return 1
- }), nil, FLAG_TRUE, FLAG_TRUE)
- if err != nil {
- t.Fatal(err)
- }
- err = o.DefineAccessorProperty("accessor_rw",
- r.ToValue(func(call FunctionCall) Value {
- return o.Get("__hidden")
- }),
- r.ToValue(func(call FunctionCall) (ret Value) {
- o.Set("__hidden", call.Argument(0))
- return
- }),
- FLAG_TRUE, FLAG_TRUE)
- if err != nil {
- t.Fatal(err)
- }
- if v := o.Get("accessor_ro"); v.ToInteger() != 1 {
- t.Fatalf("Unexpected accessor value: %v", v)
- }
- err = o.Set("accessor_ro", r.ToValue(2))
- if err == nil {
- t.Fatal("Expected an error")
- }
- if ex, ok := err.(*Exception); ok {
- if msg := ex.Error(); msg != "TypeError: Cannot assign to read only property 'accessor_ro'" {
- t.Fatalf("Unexpected error: '%s'", msg)
- }
- } else {
- t.Fatalf("Unexected error type: %T", err)
- }
- err = o.Set("accessor_rw", 42)
- if err != nil {
- t.Fatal(err)
- }
- if v := o.Get("accessor_rw"); v.ToInteger() != 42 {
- t.Fatalf("Unexpected value: %v", v)
- }
- }
- func TestPropertyOrder(t *testing.T) {
- const SCRIPT = `
- var o = {};
- var sym1 = Symbol(1);
- var sym2 = Symbol(2);
- o[sym2] = 1;
- o[4294967294] = 1;
- o[2] = 1;
- o[1] = 1;
- o[0] = 1;
- o["02"] = 1;
- o[4294967295] = 1;
- o["01"] = 1;
- o["00"] = 1;
- o[sym1] = 1;
- var expected = ["0", "1", "2", "4294967294", "02", "4294967295", "01", "00", sym2, sym1];
- var actual = Reflect.ownKeys(o);
- if (actual.length !== expected.length) {
- throw new Error("Unexpected length: "+actual.length);
- }
- for (var i = 0; i < actual.length; i++) {
- if (actual[i] !== expected[i]) {
- throw new Error("Unexpected list: " + actual);
- }
- }
- `
- testScript1(SCRIPT, _undefined, t)
- }
- func BenchmarkPut(b *testing.B) {
- v := &Object{}
- o := &baseObject{
- val: v,
- extensible: true,
- }
- v.self = o
- o.init()
- var key Value = asciiString("test")
- var val Value = valueInt(123)
- for i := 0; i < b.N; i++ {
- v.setOwn(key, val, false)
- }
- }
- func BenchmarkPutStr(b *testing.B) {
- v := &Object{}
- o := &baseObject{
- val: v,
- extensible: true,
- }
- o.init()
- v.self = o
- var val Value = valueInt(123)
- for i := 0; i < b.N; i++ {
- o.setOwnStr("test", val, false)
- }
- }
- func BenchmarkGet(b *testing.B) {
- v := &Object{}
- o := &baseObject{
- val: v,
- extensible: true,
- }
- o.init()
- v.self = o
- var n Value = asciiString("test")
- for i := 0; i < b.N; i++ {
- v.get(n, nil)
- }
- }
- func BenchmarkGetStr(b *testing.B) {
- v := &Object{}
- o := &baseObject{
- val: v,
- extensible: true,
- }
- v.self = o
- o.init()
- for i := 0; i < b.N; i++ {
- o.getStr("test", nil)
- }
- }
- func _toString(v Value) string {
- switch v := v.(type) {
- case asciiString:
- return string(v)
- default:
- return ""
- }
- }
- func BenchmarkToString1(b *testing.B) {
- v := asciiString("test")
- for i := 0; i < b.N; i++ {
- v.toString()
- }
- }
- func BenchmarkToString2(b *testing.B) {
- v := asciiString("test")
- for i := 0; i < b.N; i++ {
- _toString(v)
- }
- }
- func BenchmarkConv(b *testing.B) {
- count := int64(0)
- for i := 0; i < b.N; i++ {
- count += valueInt(123).ToInteger()
- }
- if count == 0 {
- b.Fatal("zero")
- }
- }
- func BenchmarkArrayGetStr(b *testing.B) {
- b.StopTimer()
- r := New()
- v := &Object{runtime: r}
- a := &arrayObject{
- baseObject: baseObject{
- val: v,
- extensible: true,
- },
- }
- v.self = a
- a.init()
- v.setOwn(valueInt(0), asciiString("test"), false)
- b.StartTimer()
- for i := 0; i < b.N; i++ {
- a.getStr("0", nil)
- }
- }
- func BenchmarkArrayGet(b *testing.B) {
- b.StopTimer()
- r := New()
- v := &Object{runtime: r}
- a := &arrayObject{
- baseObject: baseObject{
- val: v,
- extensible: true,
- },
- }
- v.self = a
- a.init()
- var idx Value = valueInt(0)
- v.setOwn(idx, asciiString("test"), false)
- b.StartTimer()
- for i := 0; i < b.N; i++ {
- v.get(idx, nil)
- }
- }
- func BenchmarkArrayPut(b *testing.B) {
- b.StopTimer()
- r := New()
- v := &Object{runtime: r}
- a := &arrayObject{
- baseObject: baseObject{
- val: v,
- extensible: true,
- },
- }
- v.self = a
- a.init()
- var idx Value = valueInt(0)
- var val Value = asciiString("test")
- b.StartTimer()
- for i := 0; i < b.N; i++ {
- v.setOwn(idx, val, false)
- }
- }
- func BenchmarkToUTF8String(b *testing.B) {
- var s valueString = asciiString("test")
- for i := 0; i < b.N; i++ {
- _ = s.String()
- }
- }
- func BenchmarkAdd(b *testing.B) {
- var x, y Value
- x = valueInt(2)
- y = valueInt(2)
- for i := 0; i < b.N; i++ {
- if xi, ok := x.(valueInt); ok {
- if yi, ok := y.(valueInt); ok {
- x = xi + yi
- }
- }
- }
- }
- func BenchmarkAddString(b *testing.B) {
- var x, y Value
- tst := asciiString("22")
- x = asciiString("2")
- y = asciiString("2")
- for i := 0; i < b.N; i++ {
- var z Value
- if xi, ok := x.(valueString); ok {
- if yi, ok := y.(valueString); ok {
- z = xi.concat(yi)
- }
- }
- if !z.StrictEquals(tst) {
- b.Fatalf("Unexpected result %v", x)
- }
- }
- }
|