array_test.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. package goja
  2. import (
  3. "reflect"
  4. "testing"
  5. )
  6. func TestArray1(t *testing.T) {
  7. r := &Runtime{}
  8. a := r.newArray(nil)
  9. a.setOwnIdx(valueInt(0), asciiString("test"), true)
  10. if l := a.getStr("length", nil).ToInteger(); l != 1 {
  11. t.Fatalf("Unexpected length: %d", l)
  12. }
  13. }
  14. func TestArrayExportProps(t *testing.T) {
  15. vm := New()
  16. arr := vm.NewArray()
  17. err := arr.DefineDataProperty("0", vm.ToValue(true), FLAG_TRUE, FLAG_FALSE, FLAG_TRUE)
  18. if err != nil {
  19. t.Fatal(err)
  20. }
  21. actual := arr.Export()
  22. expected := []interface{}{true}
  23. if !reflect.DeepEqual(actual, expected) {
  24. t.Fatalf("Expected: %#v, actual: %#v", expected, actual)
  25. }
  26. }
  27. func TestArrayCanonicalIndex(t *testing.T) {
  28. const SCRIPT = `
  29. var a = [];
  30. a["00"] = 1;
  31. a["01"] = 2;
  32. if (a[0] !== undefined) {
  33. throw new Error("a[0]");
  34. }
  35. `
  36. testScript(SCRIPT, _undefined, t)
  37. }
  38. func BenchmarkArrayGetStr(b *testing.B) {
  39. b.StopTimer()
  40. r := New()
  41. v := &Object{runtime: r}
  42. a := &arrayObject{
  43. baseObject: baseObject{
  44. val: v,
  45. extensible: true,
  46. },
  47. }
  48. v.self = a
  49. a.init()
  50. v.setOwn(valueInt(0), asciiString("test"), false)
  51. b.StartTimer()
  52. for i := 0; i < b.N; i++ {
  53. a.getStr("0", nil)
  54. }
  55. }
  56. func BenchmarkArrayGet(b *testing.B) {
  57. b.StopTimer()
  58. r := New()
  59. v := &Object{runtime: r}
  60. a := &arrayObject{
  61. baseObject: baseObject{
  62. val: v,
  63. extensible: true,
  64. },
  65. }
  66. v.self = a
  67. a.init()
  68. var idx Value = valueInt(0)
  69. v.setOwn(idx, asciiString("test"), false)
  70. b.StartTimer()
  71. for i := 0; i < b.N; i++ {
  72. v.get(idx, nil)
  73. }
  74. }
  75. func BenchmarkArrayPut(b *testing.B) {
  76. b.StopTimer()
  77. r := New()
  78. v := &Object{runtime: r}
  79. a := &arrayObject{
  80. baseObject: baseObject{
  81. val: v,
  82. extensible: true,
  83. },
  84. }
  85. v.self = a
  86. a.init()
  87. var idx Value = valueInt(0)
  88. var val Value = asciiString("test")
  89. b.StartTimer()
  90. for i := 0; i < b.N; i++ {
  91. v.setOwn(idx, val, false)
  92. }
  93. }
  94. func BenchmarkArraySetEmpty(b *testing.B) {
  95. r := New()
  96. _ = r.Get("Array").(*Object).Get("prototype").String() // materialise Array.prototype
  97. a := r.NewArray(0, 0)
  98. values := a.self.(*arrayObject).values
  99. b.ResetTimer()
  100. for i := 0; i < b.N; i++ {
  101. values[0] = nil
  102. a.self.setOwnIdx(0, valueTrue, true)
  103. }
  104. }