object_goslice_reflect_test.go 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. package goja
  2. import "testing"
  3. func TestGoSliceReflectBasic(t *testing.T) {
  4. const SCRIPT = `
  5. var sum = 0;
  6. for (var i = 0; i < a.length; i++) {
  7. sum += a[i];
  8. }
  9. sum;
  10. `
  11. r := New()
  12. r.Set("a", []int{1, 2, 3, 4})
  13. v, err := r.RunString(SCRIPT)
  14. if err != nil {
  15. t.Fatal(err)
  16. }
  17. if i := v.ToInteger(); i != 10 {
  18. t.Fatalf("Expected 10, got: %d", i)
  19. }
  20. }
  21. func TestGoSliceReflectIn(t *testing.T) {
  22. const SCRIPT = `
  23. var idx = "";
  24. for (var i in a) {
  25. idx += i;
  26. }
  27. idx;
  28. `
  29. r := New()
  30. r.Set("a", []int{1, 2, 3, 4})
  31. v, err := r.RunString(SCRIPT)
  32. if err != nil {
  33. t.Fatal(err)
  34. }
  35. if i := v.String(); i != "0123" {
  36. t.Fatalf("Expected '0123', got: '%s'", i)
  37. }
  38. }
  39. func TestGoSliceReflectSet(t *testing.T) {
  40. const SCRIPT = `
  41. a[0] = 33;
  42. a[1] = 333;
  43. a[2] = "42";
  44. a[3] = {};
  45. a[4] = 0;
  46. `
  47. r := New()
  48. a := []int8{1, 2, 3, 4}
  49. r.Set("a", a)
  50. _, err := r.RunString(SCRIPT)
  51. if err != nil {
  52. t.Fatal(err)
  53. }
  54. if a[0] != 33 {
  55. t.Fatalf("a[0] = %d, expected 33", a[0])
  56. }
  57. if a[1] != 77 {
  58. t.Fatalf("a[1] = %d, expected 77", a[0])
  59. }
  60. if a[2] != 42 {
  61. t.Fatalf("a[2] = %d, expected 42", a[0])
  62. }
  63. if a[3] != 0 {
  64. t.Fatalf("a[3] = %d, expected 0", a[0])
  65. }
  66. }
  67. func TestGoSliceReflectProto(t *testing.T) {
  68. const SCRIPT = `
  69. a.join(",")
  70. `
  71. r := New()
  72. a := []int8{1, 2, 3, 4}
  73. r.Set("a", a)
  74. ret, err := r.RunString(SCRIPT)
  75. if err != nil {
  76. t.Fatal(err)
  77. }
  78. if s := ret.String(); s != "1,2,3,4" {
  79. t.Fatalf("Unexpected result: '%s'", s)
  80. }
  81. }
  82. type gosliceReflect_withMethods []interface{}
  83. func (s gosliceReflect_withMethods) Method() bool {
  84. return true
  85. }
  86. func TestGoSliceReflectMethod(t *testing.T) {
  87. const SCRIPT = `
  88. typeof a === "object" && a[0] === 42 && a.Method() === true;
  89. `
  90. vm := New()
  91. a := make(gosliceReflect_withMethods, 1)
  92. a[0] = 42
  93. vm.Set("a", a)
  94. v, err := vm.RunString(SCRIPT)
  95. if err != nil {
  96. t.Fatal(err)
  97. }
  98. if !v.StrictEquals(valueTrue) {
  99. t.Fatalf("Expected true, got %v", v)
  100. }
  101. }