You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

192 lines
4.8 KiB

  1. package db
  2. import "testing"
  3. func mockDBWithStuff() DB {
  4. db := NewMemDB()
  5. // Under "key" prefix
  6. db.Set(bz("key"), bz("value"))
  7. db.Set(bz("key1"), bz("value1"))
  8. db.Set(bz("key2"), bz("value2"))
  9. db.Set(bz("key3"), bz("value3"))
  10. db.Set(bz("something"), bz("else"))
  11. db.Set(bz(""), bz(""))
  12. db.Set(bz("k"), bz("val"))
  13. db.Set(bz("ke"), bz("valu"))
  14. db.Set(bz("kee"), bz("valuu"))
  15. return db
  16. }
  17. func TestPrefixDBSimple(t *testing.T) {
  18. db := mockDBWithStuff()
  19. pdb := NewPrefixDB(db, bz("key"))
  20. checkValue(t, pdb, bz("key"), nil)
  21. checkValue(t, pdb, bz(""), bz("value"))
  22. checkValue(t, pdb, bz("key1"), nil)
  23. checkValue(t, pdb, bz("1"), bz("value1"))
  24. checkValue(t, pdb, bz("key2"), nil)
  25. checkValue(t, pdb, bz("2"), bz("value2"))
  26. checkValue(t, pdb, bz("key3"), nil)
  27. checkValue(t, pdb, bz("3"), bz("value3"))
  28. checkValue(t, pdb, bz("something"), nil)
  29. checkValue(t, pdb, bz("k"), nil)
  30. checkValue(t, pdb, bz("ke"), nil)
  31. checkValue(t, pdb, bz("kee"), nil)
  32. }
  33. func TestPrefixDBIterator1(t *testing.T) {
  34. db := mockDBWithStuff()
  35. pdb := NewPrefixDB(db, bz("key"))
  36. itr := pdb.Iterator(nil, nil)
  37. checkDomain(t, itr, nil, nil)
  38. checkItem(t, itr, bz(""), bz("value"))
  39. checkNext(t, itr, true)
  40. checkItem(t, itr, bz("1"), bz("value1"))
  41. checkNext(t, itr, true)
  42. checkItem(t, itr, bz("2"), bz("value2"))
  43. checkNext(t, itr, true)
  44. checkItem(t, itr, bz("3"), bz("value3"))
  45. checkNext(t, itr, false)
  46. checkInvalid(t, itr)
  47. itr.Close()
  48. }
  49. func TestPrefixDBIterator2(t *testing.T) {
  50. db := mockDBWithStuff()
  51. pdb := NewPrefixDB(db, bz("key"))
  52. itr := pdb.Iterator(nil, bz(""))
  53. checkDomain(t, itr, nil, bz(""))
  54. checkInvalid(t, itr)
  55. itr.Close()
  56. }
  57. func TestPrefixDBIterator3(t *testing.T) {
  58. db := mockDBWithStuff()
  59. pdb := NewPrefixDB(db, bz("key"))
  60. itr := pdb.Iterator(bz(""), nil)
  61. checkDomain(t, itr, bz(""), nil)
  62. checkItem(t, itr, bz(""), bz("value"))
  63. checkNext(t, itr, true)
  64. checkItem(t, itr, bz("1"), bz("value1"))
  65. checkNext(t, itr, true)
  66. checkItem(t, itr, bz("2"), bz("value2"))
  67. checkNext(t, itr, true)
  68. checkItem(t, itr, bz("3"), bz("value3"))
  69. checkNext(t, itr, false)
  70. checkInvalid(t, itr)
  71. itr.Close()
  72. }
  73. func TestPrefixDBIterator4(t *testing.T) {
  74. db := mockDBWithStuff()
  75. pdb := NewPrefixDB(db, bz("key"))
  76. itr := pdb.Iterator(bz(""), bz(""))
  77. checkDomain(t, itr, bz(""), bz(""))
  78. checkInvalid(t, itr)
  79. itr.Close()
  80. }
  81. func TestPrefixDBReverseIterator1(t *testing.T) {
  82. db := mockDBWithStuff()
  83. pdb := NewPrefixDB(db, bz("key"))
  84. itr := pdb.ReverseIterator(nil, nil)
  85. checkDomain(t, itr, nil, nil)
  86. checkItem(t, itr, bz("3"), bz("value3"))
  87. checkNext(t, itr, true)
  88. checkItem(t, itr, bz("2"), bz("value2"))
  89. checkNext(t, itr, true)
  90. checkItem(t, itr, bz("1"), bz("value1"))
  91. checkNext(t, itr, true)
  92. checkItem(t, itr, bz(""), bz("value"))
  93. checkNext(t, itr, false)
  94. checkInvalid(t, itr)
  95. itr.Close()
  96. }
  97. func TestPrefixDBReverseIterator2(t *testing.T) {
  98. db := mockDBWithStuff()
  99. pdb := NewPrefixDB(db, bz("key"))
  100. itr := pdb.ReverseIterator(bz(""), nil)
  101. checkDomain(t, itr, bz(""), nil)
  102. checkItem(t, itr, bz("3"), bz("value3"))
  103. checkNext(t, itr, true)
  104. checkItem(t, itr, bz("2"), bz("value2"))
  105. checkNext(t, itr, true)
  106. checkItem(t, itr, bz("1"), bz("value1"))
  107. checkNext(t, itr, true)
  108. checkItem(t, itr, bz(""), bz("value"))
  109. checkNext(t, itr, false)
  110. checkInvalid(t, itr)
  111. itr.Close()
  112. }
  113. func TestPrefixDBReverseIterator3(t *testing.T) {
  114. db := mockDBWithStuff()
  115. pdb := NewPrefixDB(db, bz("key"))
  116. itr := pdb.ReverseIterator(nil, bz(""))
  117. checkDomain(t, itr, nil, bz(""))
  118. checkInvalid(t, itr)
  119. itr.Close()
  120. }
  121. func TestPrefixDBReverseIterator4(t *testing.T) {
  122. db := mockDBWithStuff()
  123. pdb := NewPrefixDB(db, bz("key"))
  124. itr := pdb.ReverseIterator(bz(""), bz(""))
  125. checkDomain(t, itr, bz(""), bz(""))
  126. checkInvalid(t, itr)
  127. itr.Close()
  128. }
  129. func TestPrefixDBReverseIterator5(t *testing.T) {
  130. db := mockDBWithStuff()
  131. pdb := NewPrefixDB(db, bz("key"))
  132. itr := pdb.ReverseIterator(bz("1"), nil)
  133. checkDomain(t, itr, bz("1"), nil)
  134. checkItem(t, itr, bz("3"), bz("value3"))
  135. checkNext(t, itr, true)
  136. checkItem(t, itr, bz("2"), bz("value2"))
  137. checkNext(t, itr, true)
  138. checkItem(t, itr, bz("1"), bz("value1"))
  139. checkNext(t, itr, false)
  140. checkInvalid(t, itr)
  141. itr.Close()
  142. }
  143. func TestPrefixDBReverseIterator6(t *testing.T) {
  144. db := mockDBWithStuff()
  145. pdb := NewPrefixDB(db, bz("key"))
  146. itr := pdb.ReverseIterator(bz("2"), nil)
  147. checkDomain(t, itr, bz("2"), nil)
  148. checkItem(t, itr, bz("3"), bz("value3"))
  149. checkNext(t, itr, true)
  150. checkItem(t, itr, bz("2"), bz("value2"))
  151. checkNext(t, itr, false)
  152. checkInvalid(t, itr)
  153. itr.Close()
  154. }
  155. func TestPrefixDBReverseIterator7(t *testing.T) {
  156. db := mockDBWithStuff()
  157. pdb := NewPrefixDB(db, bz("key"))
  158. itr := pdb.ReverseIterator(nil, bz("2"))
  159. checkDomain(t, itr, nil, bz("2"))
  160. checkItem(t, itr, bz("1"), bz("value1"))
  161. checkNext(t, itr, true)
  162. checkItem(t, itr, bz(""), bz("value"))
  163. checkNext(t, itr, false)
  164. checkInvalid(t, itr)
  165. itr.Close()
  166. }