object_gomap_test.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. package goja
  2. import "testing"
  3. func TestGomapProp(t *testing.T) {
  4. const SCRIPT = `
  5. o.a + o.b;
  6. `
  7. r := New()
  8. r.Set("o", map[string]interface{}{
  9. "a": 40,
  10. "b": 2,
  11. })
  12. v, err := r.RunString(SCRIPT)
  13. if err != nil {
  14. t.Fatal(err)
  15. }
  16. if i := v.ToInteger(); i != 42 {
  17. t.Fatalf("Expected 42, got: %d", i)
  18. }
  19. }
  20. func TestGomapEnumerate(t *testing.T) {
  21. const SCRIPT = `
  22. var hasX = false;
  23. var hasY = false;
  24. for (var key in o) {
  25. switch (key) {
  26. case "x":
  27. if (hasX) {
  28. throw "Already have x";
  29. }
  30. hasX = true;
  31. break;
  32. case "y":
  33. if (hasY) {
  34. throw "Already have y";
  35. }
  36. hasY = true;
  37. break;
  38. default:
  39. throw "Unexpected property: " + key;
  40. }
  41. }
  42. hasX && hasY;
  43. `
  44. r := New()
  45. r.Set("o", map[string]interface{}{
  46. "x": 40,
  47. "y": 2,
  48. })
  49. v, err := r.RunString(SCRIPT)
  50. if err != nil {
  51. t.Fatal(err)
  52. }
  53. if !v.StrictEquals(valueTrue) {
  54. t.Fatalf("Expected true, got %v", v)
  55. }
  56. }
  57. func TestGomapDeleteWhileEnumerate(t *testing.T) {
  58. const SCRIPT = `
  59. var hasX = false;
  60. var hasY = false;
  61. for (var key in o) {
  62. switch (key) {
  63. case "x":
  64. if (hasX) {
  65. throw "Already have x";
  66. }
  67. hasX = true;
  68. delete o.y;
  69. break;
  70. case "y":
  71. if (hasY) {
  72. throw "Already have y";
  73. }
  74. hasY = true;
  75. delete o.x;
  76. break;
  77. default:
  78. throw "Unexpected property: " + key;
  79. }
  80. }
  81. hasX && !hasY || hasY && !hasX;
  82. `
  83. r := New()
  84. r.Set("o", map[string]interface{}{
  85. "x": 40,
  86. "y": 2,
  87. })
  88. v, err := r.RunString(SCRIPT)
  89. if err != nil {
  90. t.Fatal(err)
  91. }
  92. if !v.StrictEquals(valueTrue) {
  93. t.Fatalf("Expected true, got %v", v)
  94. }
  95. }
  96. func TestGomapInstanceOf(t *testing.T) {
  97. const SCRIPT = `
  98. (o instanceof Object) && !(o instanceof Error);
  99. `
  100. r := New()
  101. r.Set("o", map[string]interface{}{})
  102. v, err := r.RunString(SCRIPT)
  103. if err != nil {
  104. t.Fatal(err)
  105. }
  106. if !v.StrictEquals(valueTrue) {
  107. t.Fatalf("Expected true, got %v", v)
  108. }
  109. }
  110. func TestGomapTypeOf(t *testing.T) {
  111. const SCRIPT = `
  112. typeof o;
  113. `
  114. r := New()
  115. r.Set("o", map[string]interface{}{})
  116. v, err := r.RunString(SCRIPT)
  117. if err != nil {
  118. t.Fatal(err)
  119. }
  120. if !v.StrictEquals(asciiString("object")) {
  121. t.Fatalf("Expected object, got %v", v)
  122. }
  123. }
  124. func TestGomapProto(t *testing.T) {
  125. const SCRIPT = `
  126. o.hasOwnProperty("test");
  127. `
  128. r := New()
  129. r.Set("o", map[string]interface{}{
  130. "test": 42,
  131. })
  132. v, err := r.RunString(SCRIPT)
  133. if err != nil {
  134. t.Fatal(err)
  135. }
  136. if !v.StrictEquals(valueTrue) {
  137. t.Fatalf("Expected true, got %v", v)
  138. }
  139. }
  140. func TestGoMapExtensibility(t *testing.T) {
  141. const SCRIPT = `
  142. "use strict";
  143. o.test = 42;
  144. Object.preventExtensions(o);
  145. o.test = 43;
  146. try {
  147. o.test1 = 42;
  148. } catch (e) {
  149. if (!(e instanceof TypeError)) {
  150. throw e;
  151. }
  152. }
  153. o.test === 43 && o.test1 === undefined;
  154. `
  155. r := New()
  156. r.Set("o", map[string]interface{}{})
  157. v, err := r.RunString(SCRIPT)
  158. if err != nil {
  159. if ex, ok := err.(*Exception); ok {
  160. t.Fatal(ex.String())
  161. } else {
  162. t.Fatal(err)
  163. }
  164. }
  165. if !v.StrictEquals(valueTrue) {
  166. t.Fatalf("Expected true, got %v", v)
  167. }
  168. }