map_test.go 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. package goja
  2. import (
  3. "hash/maphash"
  4. "math"
  5. "strconv"
  6. "testing"
  7. )
  8. func testMapHashVal(v1, v2 Value, expected bool, t *testing.T) {
  9. var h maphash.Hash
  10. actual := v1.hash(&h) == v2.hash(&h)
  11. if actual != expected {
  12. t.Fatalf("testMapHashVal failed for %v, %v", v1, v2)
  13. }
  14. }
  15. func TestMapHash(t *testing.T) {
  16. testMapHashVal(_NaN, _NaN, true, t)
  17. testMapHashVal(valueTrue, valueFalse, false, t)
  18. testMapHashVal(valueTrue, valueTrue, true, t)
  19. testMapHashVal(intToValue(0), _negativeZero, true, t)
  20. testMapHashVal(asciiString("Test"), asciiString("Test"), true, t)
  21. testMapHashVal(newStringValue("Тест"), newStringValue("Тест"), true, t)
  22. testMapHashVal(floatToValue(1.2345), floatToValue(1.2345), true, t)
  23. testMapHashVal(SymIterator, SymToStringTag, false, t)
  24. testMapHashVal(SymIterator, SymIterator, true, t)
  25. // The following tests introduce indeterministic behaviour
  26. //testMapHashVal(asciiString("Test"), asciiString("Test1"), false, t)
  27. //testMapHashVal(newStringValue("Тест"), asciiString("Test"), false, t)
  28. //testMapHashVal(newStringValue("Тест"), newStringValue("Тест1"), false, t)
  29. }
  30. func TestOrderedMap(t *testing.T) {
  31. m := newOrderedMap(&maphash.Hash{})
  32. for i := int64(0); i < 50; i++ {
  33. m.set(intToValue(i), asciiString(strconv.FormatInt(i, 10)))
  34. }
  35. if m.size != 50 {
  36. t.Fatalf("Unexpected size: %d", m.size)
  37. }
  38. for i := int64(0); i < 50; i++ {
  39. expected := asciiString(strconv.FormatInt(i, 10))
  40. actual := m.get(intToValue(i))
  41. if !expected.SameAs(actual) {
  42. t.Fatalf("Wrong value for %d", i)
  43. }
  44. }
  45. for i := int64(0); i < 50; i += 2 {
  46. if !m.remove(intToValue(i)) {
  47. t.Fatalf("remove(%d) return false", i)
  48. }
  49. }
  50. if m.size != 25 {
  51. t.Fatalf("Unexpected size: %d", m.size)
  52. }
  53. iter := m.newIter()
  54. count := 0
  55. for {
  56. entry := iter.next()
  57. if entry == nil {
  58. break
  59. }
  60. m.remove(entry.key)
  61. count++
  62. }
  63. if count != 25 {
  64. t.Fatalf("Unexpected iter count: %d", count)
  65. }
  66. if m.size != 0 {
  67. t.Fatalf("Unexpected size: %d", m.size)
  68. }
  69. }
  70. func TestOrderedMapCollision(t *testing.T) {
  71. m := newOrderedMap(&maphash.Hash{})
  72. n1 := uint64(123456789)
  73. n2 := math.Float64frombits(n1)
  74. n1Key := intToValue(int64(n1))
  75. n2Key := floatToValue(n2)
  76. m.set(n1Key, asciiString("n1"))
  77. m.set(n2Key, asciiString("n2"))
  78. if m.size == len(m.hashTable) {
  79. t.Fatal("Expected a collision but there wasn't one")
  80. }
  81. if n2Val := m.get(n2Key); !asciiString("n2").SameAs(n2Val) {
  82. t.Fatalf("unexpected n2Val: %v", n2Val)
  83. }
  84. if n1Val := m.get(n1Key); !asciiString("n1").SameAs(n1Val) {
  85. t.Fatalf("unexpected nVal: %v", n1Val)
  86. }
  87. if !m.remove(n1Key) {
  88. t.Fatal("removing n1Key returned false")
  89. }
  90. if n2Val := m.get(n2Key); !asciiString("n2").SameAs(n2Val) {
  91. t.Fatalf("2: unexpected n2Val: %v", n2Val)
  92. }
  93. }
  94. func TestOrderedMapIter(t *testing.T) {
  95. m := newOrderedMap(&maphash.Hash{})
  96. iter := m.newIter()
  97. ent := iter.next()
  98. if ent != nil {
  99. t.Fatal("entry should be nil")
  100. }
  101. iter1 := m.newIter()
  102. m.set(intToValue(1), valueTrue)
  103. ent = iter.next()
  104. if ent != nil {
  105. t.Fatal("2: entry should be nil")
  106. }
  107. ent = iter1.next()
  108. if ent == nil {
  109. t.Fatal("entry is nil")
  110. }
  111. if !intToValue(1).SameAs(ent.key) {
  112. t.Fatal("unexpected key")
  113. }
  114. if !valueTrue.SameAs(ent.value) {
  115. t.Fatal("unexpected value")
  116. }
  117. }
  118. func TestOrderedMapIterVisitAfterReAdd(t *testing.T) {
  119. m := newOrderedMap(&maphash.Hash{})
  120. one := intToValue(1)
  121. two := intToValue(2)
  122. m.set(one, valueTrue)
  123. m.set(two, valueTrue)
  124. iter := m.newIter()
  125. entry := iter.next()
  126. if !one.SameAs(entry.key) {
  127. t.Fatalf("1: unexpected key: %v", entry.key)
  128. }
  129. if !m.remove(one) {
  130. t.Fatal("remove returned false")
  131. }
  132. entry = iter.next()
  133. if !two.SameAs(entry.key) {
  134. t.Fatalf("2: unexpected key: %v", entry.key)
  135. }
  136. m.set(one, valueTrue)
  137. entry = iter.next()
  138. if entry == nil {
  139. t.Fatal("entry is nil")
  140. }
  141. if !one.SameAs(entry.key) {
  142. t.Fatalf("3: unexpected key: %v", entry.key)
  143. }
  144. }
  145. func TestOrderedMapIterAddAfterClear(t *testing.T) {
  146. m := newOrderedMap(&maphash.Hash{})
  147. one := intToValue(1)
  148. m.set(one, valueTrue)
  149. iter := m.newIter()
  150. iter.next()
  151. m.clear()
  152. m.set(one, valueTrue)
  153. entry := iter.next()
  154. if entry == nil {
  155. t.Fatal("entry is nil")
  156. }
  157. if entry.key != one {
  158. t.Fatalf("unexpected key: %v", entry.key)
  159. }
  160. entry = iter.next()
  161. if entry != nil {
  162. t.Fatalf("entry is not nil: %v", entry)
  163. }
  164. }
  165. func TestOrderedMapIterDeleteCurrent(t *testing.T) {
  166. m := newOrderedMap(&maphash.Hash{})
  167. one := intToValue(1)
  168. two := intToValue(2)
  169. iter := m.newIter()
  170. m.set(one, valueTrue)
  171. m.set(two, valueTrue)
  172. entry := iter.next()
  173. if entry.key != one {
  174. t.Fatalf("unexpected key: %v", entry.key)
  175. }
  176. m.remove(one)
  177. entry = iter.next()
  178. if entry.key != two {
  179. t.Fatalf("2: unexpected key: %v", entry.key)
  180. }
  181. }