object_gomap_reflect_test.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. package goja
  2. import "testing"
  3. func TestGoMapReflectGetSet(t *testing.T) {
  4. const SCRIPT = `
  5. m.c = m.a + m.b;
  6. `
  7. vm := New()
  8. m := map[string]string{
  9. "a": "4",
  10. "b": "2",
  11. }
  12. vm.Set("m", m)
  13. _, err := vm.RunString(SCRIPT)
  14. if err != nil {
  15. t.Fatal(err)
  16. }
  17. if c := m["c"]; c != "42" {
  18. t.Fatalf("Unexpected value: '%s'", c)
  19. }
  20. }
  21. func TestGoMapReflectIntKey(t *testing.T) {
  22. const SCRIPT = `
  23. m[2] = m[0] + m[1];
  24. `
  25. vm := New()
  26. m := map[int]int{
  27. 0: 40,
  28. 1: 2,
  29. }
  30. vm.Set("m", m)
  31. _, err := vm.RunString(SCRIPT)
  32. if err != nil {
  33. t.Fatal(err)
  34. }
  35. if c := m[2]; c != 42 {
  36. t.Fatalf("Unexpected value: '%d'", c)
  37. }
  38. }
  39. func TestGoMapReflectDelete(t *testing.T) {
  40. const SCRIPT = `
  41. delete m.a;
  42. `
  43. vm := New()
  44. m := map[string]string{
  45. "a": "4",
  46. "b": "2",
  47. }
  48. vm.Set("m", m)
  49. _, err := vm.RunString(SCRIPT)
  50. if err != nil {
  51. t.Fatal(err)
  52. }
  53. if _, exists := m["a"]; exists {
  54. t.Fatal("a still exists")
  55. }
  56. if b := m["b"]; b != "2" {
  57. t.Fatalf("Unexpected b: '%s'", b)
  58. }
  59. }
  60. func TestGoMapReflectJSON(t *testing.T) {
  61. const SCRIPT = `
  62. function f(m) {
  63. return JSON.stringify(m);
  64. }
  65. `
  66. vm := New()
  67. m := map[string]string{
  68. "t": "42",
  69. }
  70. _, err := vm.RunString(SCRIPT)
  71. if err != nil {
  72. t.Fatal(err)
  73. }
  74. f := vm.Get("f")
  75. if call, ok := AssertFunction(f); ok {
  76. v, err := call(nil, ([]Value{vm.ToValue(m)})...)
  77. if err != nil {
  78. t.Fatal(err)
  79. }
  80. if !v.StrictEquals(asciiString(`{"t":"42"}`)) {
  81. t.Fatalf("Unexpected value: %v", v)
  82. }
  83. } else {
  84. t.Fatalf("Not a function: %v", f)
  85. }
  86. }
  87. func TestGoMapReflectProto(t *testing.T) {
  88. const SCRIPT = `
  89. m.hasOwnProperty("t");
  90. `
  91. vm := New()
  92. m := map[string]string{
  93. "t": "42",
  94. }
  95. vm.Set("m", m)
  96. v, err := vm.RunString(SCRIPT)
  97. if err != nil {
  98. t.Fatal(err)
  99. }
  100. if !v.StrictEquals(valueTrue) {
  101. t.Fatalf("Expected true, got %v", v)
  102. }
  103. }
  104. type gomapReflect_noMethods map[string]interface{}
  105. type gomapReflect_withMethods map[string]interface{}
  106. func (m gomapReflect_withMethods) Method() bool {
  107. return true
  108. }
  109. func TestGoMapReflectNoMethods(t *testing.T) {
  110. const SCRIPT = `
  111. typeof m === "object" && m.hasOwnProperty("t") && m.t === 42;
  112. `
  113. vm := New()
  114. m := make(gomapReflect_noMethods)
  115. m["t"] = 42
  116. vm.Set("m", m)
  117. v, err := vm.RunString(SCRIPT)
  118. if err != nil {
  119. t.Fatal(err)
  120. }
  121. if !v.StrictEquals(valueTrue) {
  122. t.Fatalf("Expected true, got %v", v)
  123. }
  124. }
  125. func TestGoMapReflectWithMethods(t *testing.T) {
  126. const SCRIPT = `
  127. typeof m === "object" && !m.hasOwnProperty("t") && m.hasOwnProperty("Method") && m.Method();
  128. `
  129. vm := New()
  130. m := make(gomapReflect_withMethods)
  131. m["t"] = 42
  132. vm.Set("m", m)
  133. v, err := vm.RunString(SCRIPT)
  134. if err != nil {
  135. t.Fatal(err)
  136. }
  137. if !v.StrictEquals(valueTrue) {
  138. t.Fatalf("Expected true, got %v", v)
  139. }
  140. }