object_test.go 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296
  1. package goja
  2. import "testing"
  3. func TestArray1(t *testing.T) {
  4. r := &Runtime{}
  5. a := r.newArray(nil)
  6. a.put(valueInt(0), asciiString("test"), true)
  7. if l := a.getStr("length").ToInteger(); l != 1 {
  8. t.Fatalf("Unexpected length: %d", l)
  9. }
  10. }
  11. func TestDefineProperty(t *testing.T) {
  12. r := New()
  13. o := r.NewObject()
  14. err := o.DefineDataProperty("data", r.ToValue(42), FLAG_TRUE, FLAG_TRUE, FLAG_TRUE)
  15. if err != nil {
  16. t.Fatal(err)
  17. }
  18. err = o.DefineAccessorProperty("accessor_ro", r.ToValue(func() int {
  19. return 1
  20. }), nil, FLAG_TRUE, FLAG_TRUE)
  21. if err != nil {
  22. t.Fatal(err)
  23. }
  24. err = o.DefineAccessorProperty("accessor_rw",
  25. r.ToValue(func(call FunctionCall) Value {
  26. return o.Get("__hidden")
  27. }),
  28. r.ToValue(func(call FunctionCall) (ret Value) {
  29. o.Set("__hidden", call.Argument(0))
  30. return
  31. }),
  32. FLAG_TRUE, FLAG_TRUE)
  33. if err != nil {
  34. t.Fatal(err)
  35. }
  36. if v := o.Get("accessor_ro"); v.ToInteger() != 1 {
  37. t.Fatalf("Unexpected accessor value: %v", v)
  38. }
  39. err = o.Set("accessor_ro", r.ToValue(2))
  40. if err == nil {
  41. t.Fatal("Expected an error")
  42. }
  43. if ex, ok := err.(*Exception); ok {
  44. if msg := ex.Error(); msg != "TypeError: Cannot assign to read only property 'accessor_ro'" {
  45. t.Fatalf("Unexpected error: '%s'", msg)
  46. }
  47. } else {
  48. t.Fatalf("Unexected error type: %T", err)
  49. }
  50. err = o.Set("accessor_rw", 42)
  51. if err != nil {
  52. t.Fatal(err)
  53. }
  54. if v := o.Get("accessor_rw"); v.ToInteger() != 42 {
  55. t.Fatalf("Unexpected value: %v", v)
  56. }
  57. }
  58. func BenchmarkPut(b *testing.B) {
  59. v := &Object{}
  60. o := &baseObject{
  61. val: v,
  62. extensible: true,
  63. }
  64. v.self = o
  65. o.init()
  66. var key Value = asciiString("test")
  67. var val Value = valueInt(123)
  68. for i := 0; i < b.N; i++ {
  69. o.put(key, val, false)
  70. }
  71. }
  72. func BenchmarkPutStr(b *testing.B) {
  73. v := &Object{}
  74. o := &baseObject{
  75. val: v,
  76. extensible: true,
  77. }
  78. o.init()
  79. v.self = o
  80. var val Value = valueInt(123)
  81. for i := 0; i < b.N; i++ {
  82. o.putStr("test", val, false)
  83. }
  84. }
  85. func BenchmarkGet(b *testing.B) {
  86. v := &Object{}
  87. o := &baseObject{
  88. val: v,
  89. extensible: true,
  90. }
  91. o.init()
  92. v.self = o
  93. var n Value = asciiString("test")
  94. for i := 0; i < b.N; i++ {
  95. o.get(n)
  96. }
  97. }
  98. func BenchmarkGetStr(b *testing.B) {
  99. v := &Object{}
  100. o := &baseObject{
  101. val: v,
  102. extensible: true,
  103. }
  104. v.self = o
  105. o.init()
  106. for i := 0; i < b.N; i++ {
  107. o.getStr("test")
  108. }
  109. }
  110. func _toString(v Value) string {
  111. switch v := v.(type) {
  112. case asciiString:
  113. return string(v)
  114. default:
  115. return ""
  116. }
  117. }
  118. func BenchmarkToString1(b *testing.B) {
  119. v := asciiString("test")
  120. for i := 0; i < b.N; i++ {
  121. v.ToString()
  122. }
  123. }
  124. func BenchmarkToString2(b *testing.B) {
  125. v := asciiString("test")
  126. for i := 0; i < b.N; i++ {
  127. _toString(v)
  128. }
  129. }
  130. func BenchmarkConv(b *testing.B) {
  131. count := int64(0)
  132. for i := 0; i < b.N; i++ {
  133. count += valueInt(123).ToInteger()
  134. }
  135. if count == 0 {
  136. b.Fatal("zero")
  137. }
  138. }
  139. func BenchmarkArrayGetStr(b *testing.B) {
  140. b.StopTimer()
  141. r := New()
  142. v := &Object{runtime: r}
  143. a := &arrayObject{
  144. baseObject: baseObject{
  145. val: v,
  146. extensible: true,
  147. },
  148. }
  149. v.self = a
  150. a.init()
  151. a.put(valueInt(0), asciiString("test"), false)
  152. b.StartTimer()
  153. for i := 0; i < b.N; i++ {
  154. a.getStr("0")
  155. }
  156. }
  157. func BenchmarkArrayGet(b *testing.B) {
  158. b.StopTimer()
  159. r := New()
  160. v := &Object{runtime: r}
  161. a := &arrayObject{
  162. baseObject: baseObject{
  163. val: v,
  164. extensible: true,
  165. },
  166. }
  167. v.self = a
  168. a.init()
  169. var idx Value = valueInt(0)
  170. a.put(idx, asciiString("test"), false)
  171. b.StartTimer()
  172. for i := 0; i < b.N; i++ {
  173. a.get(idx)
  174. }
  175. }
  176. func BenchmarkArrayPut(b *testing.B) {
  177. b.StopTimer()
  178. r := New()
  179. v := &Object{runtime: r}
  180. a := &arrayObject{
  181. baseObject: baseObject{
  182. val: v,
  183. extensible: true,
  184. },
  185. }
  186. v.self = a
  187. a.init()
  188. var idx Value = valueInt(0)
  189. var val Value = asciiString("test")
  190. b.StartTimer()
  191. for i := 0; i < b.N; i++ {
  192. a.put(idx, val, false)
  193. }
  194. }
  195. func BenchmarkToUTF8String(b *testing.B) {
  196. var s valueString = asciiString("test")
  197. for i := 0; i < b.N; i++ {
  198. _ = s.String()
  199. }
  200. }
  201. func BenchmarkAdd(b *testing.B) {
  202. var x, y Value
  203. x = valueInt(2)
  204. y = valueInt(2)
  205. for i := 0; i < b.N; i++ {
  206. if xi, ok := x.assertInt(); ok {
  207. if yi, ok := y.assertInt(); ok {
  208. x = valueInt(xi + yi)
  209. }
  210. }
  211. }
  212. }
  213. func BenchmarkAddString(b *testing.B) {
  214. var x, y Value
  215. tst := asciiString("22")
  216. x = asciiString("2")
  217. y = asciiString("2")
  218. for i := 0; i < b.N; i++ {
  219. var z Value
  220. if xi, ok := x.assertString(); ok {
  221. if yi, ok := y.assertString(); ok {
  222. z = xi.concat(yi)
  223. }
  224. }
  225. if !z.StrictEquals(tst) {
  226. b.Fatalf("Unexpected result %v", x)
  227. }
  228. }
  229. }