test_helper.exs 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325
  1. require KVS
  2. :kvs.join()
  3. ExUnit.start()
  4. defmodule BPE.Test do
  5. use ExUnit.Case, async: true
  6. test "basic" do
  7. id1 = {:basic, :kvs.seq([], [])}
  8. id2 = {:basic, :kvs.seq([], [])}
  9. x = 5
  10. :kvs.save(:kvs.writer(id1))
  11. :kvs.save(:kvs.writer(id2))
  12. :lists.map(
  13. fn _ ->
  14. :kvs.save(:kvs.add(KVS.writer(:kvs.writer(id1), args: {:"$msg", [], [], [], [], []})))
  15. end,
  16. :lists.seq(1, x)
  17. )
  18. :lists.map(fn _ -> :kvs.append({:"$msg", [], [], [], [], []}, id2) end, :lists.seq(1, x))
  19. r1 = :kvs.save(:kvs.reader(id1))
  20. r2 = :kvs.save(:kvs.reader(id2))
  21. x1 = :kvs.take(KVS.reader(:kvs.load_reader(KVS.reader(r1, :id)), args: 20))
  22. x2 = :kvs.take(KVS.reader(:kvs.load_reader(KVS.reader(r2, :id)), args: 20))
  23. b = :kvs.feed(id1)
  24. case :application.get_env(:kvs, :dba_st, :kvs_st) do
  25. :kvs_st ->
  26. c = :kvs.all(id2)
  27. assert :lists.reverse(c) == KVS.reader(x2, :args)
  28. _ ->
  29. # mnesia doesn't support `all` over feeds (only for tables)
  30. []
  31. end
  32. assert KVS.reader(x1, :args) == b
  33. assert length(KVS.reader(x1, :args)) == length(KVS.reader(x2, :args))
  34. assert x == length(b)
  35. end
  36. test "sym" do
  37. id = {:sym, :kvs.seq([], [])}
  38. :kvs.save(:kvs.writer(id))
  39. x = 5
  40. :lists.map(
  41. fn
  42. z ->
  43. :kvs.remove(KVS.writer(z, :cache), id)
  44. end, :lists.map(
  45. fn _ ->
  46. :kvs.save(:kvs.add(KVS.writer(:kvs.writer(id), args: {:"$msg", [], [], [], [], []})))
  47. end,
  48. :lists.seq(1, x)
  49. )
  50. )
  51. {:ok, KVS.writer(count: 0)} = :kvs.get(:writer, id)
  52. end
  53. test "take" do
  54. id = {:partial, :kvs.seq([], [])}
  55. x = 5
  56. :kvs.save(:kvs.writer(id))
  57. :lists.map(fn _ -> :kvs.append({:"$msg", [], [], [], [], []}, id) end, :lists.seq(1, x))
  58. KVS.reader(id: rid) = :kvs.save(:kvs.reader(id))
  59. t = :kvs.take(KVS.reader(:kvs.load_reader(rid), args: 20))
  60. b = :kvs.feed(id)
  61. # mnesia
  62. assert KVS.reader(t, :args) == b
  63. end
  64. test "take back full" do
  65. log(:st, "take back full")
  66. id = {:partial, :kvs.seq([], [])}
  67. x = 5
  68. :kvs.save(:kvs.writer(id))
  69. :lists.map(fn _ -> :kvs.append({:"$msg", [], [], [], [], []}, id) end, :lists.seq(1, x))
  70. KVS.reader(id: rid) = :kvs.save(:kvs.reader(id))
  71. t = :kvs.take(KVS.reader(:kvs.load_reader(rid), args: 5))
  72. :kvs.save(KVS.reader(t, dir: 1))
  73. log("t:", t)
  74. n = :kvs.take(KVS.reader(:kvs.load_reader(rid), args: 5))
  75. b = :kvs.feed(id)
  76. log("n:", n)
  77. assert KVS.reader(n, :args) == KVS.reader(t, :args)
  78. assert KVS.reader(t, :args) == b
  79. log(:end, "take back full")
  80. end
  81. test "partial take back" do
  82. id = {:partial, :kvs.seq([], [])}
  83. x = 3
  84. p = 2
  85. :kvs.save(:kvs.writer(id))
  86. :lists.map(fn _ -> :kvs.append({:"$msg", [], [], [], [], []}, id) end, :lists.seq(1, x))
  87. KVS.reader(id: rid) = :kvs.save(:kvs.reader(id))
  88. t = :kvs.take(KVS.reader(:kvs.load_reader(rid), args: p))
  89. :kvs.save(KVS.reader(t, dir: 1))
  90. n = :kvs.take(KVS.reader(:kvs.load_reader(rid), args: p + 1))
  91. assert KVS.reader(t, :args) == tl(KVS.reader(n, :args))
  92. end
  93. test "partial full bidirectional" do
  94. log(:st, "partial full bidirectional")
  95. id = {:partial, :kvs.seq([], [])}
  96. x = 5
  97. p =2
  98. :kvs.save(:kvs.writer(id))
  99. :lists.map(fn _ -> :kvs.append({:"$msg", :kvs.seq([],[]), [], [], [], []}, id) end, :lists.seq(1, x))
  100. r = :kvs.save(:kvs.reader(id))
  101. rid = KVS.reader(r, :id)
  102. t1 = :kvs.take(KVS.reader(:kvs.load_reader(rid), args: p, dir: 0))
  103. z1 = KVS.reader(t1, :args)
  104. IO.inspect :kvs.all(id)
  105. r = :kvs.save(t1)
  106. log("next t1:", t1)
  107. t2 = :kvs.take(KVS.reader(:kvs.load_reader(rid), args: p))
  108. z2 = KVS.reader(t2, :args)
  109. r = :kvs.save(t2)
  110. log("next t2:", t2)
  111. t3 = :kvs.take(KVS.reader(:kvs.load_reader(rid), args: p))
  112. z3 = KVS.reader(t3, :args)
  113. :kvs.save(KVS.reader(t3, dir: 1, pos: 0))
  114. log("next t3:", t3)
  115. n1 = :kvs.take(KVS.reader(:kvs.load_reader(rid), args: p))
  116. nz1 = KVS.reader(n1, :args)
  117. :kvs.save n1
  118. log("prev n1:", n1)
  119. n2 = :kvs.take(KVS.reader(:kvs.load_reader(rid), args: p))
  120. nz2 = KVS.reader(n2, :args)
  121. :kvs.save n2
  122. log("prev n2:", n2)
  123. n3 = :kvs.take(KVS.reader(:kvs.load_reader(rid), args: p))
  124. nz3 = KVS.reader(n3, :args)
  125. log("prev n3:", n3)
  126. assert z3 ++ z2 ++ z1 == nz1 ++ nz2 ++ nz3
  127. log(:end, "partial full bidirectional")
  128. end
  129. test "test bidirectional (new)" do
  130. log(:st, "test bidirectional (new)")
  131. id = {:partial, :kvs.seq([], [])}
  132. x = 6
  133. p = 3
  134. :kvs.save(:kvs.writer(id))
  135. :lists.map(fn _ -> :kvs.append({:"$msg", :kvs.seq([],[]), [], [], [], []}, id) end, :lists.seq(1, x))
  136. r = :kvs.save(:kvs.reader(id))
  137. rid = KVS.reader(r, :id)
  138. IO.inspect :kvs.all(id)
  139. t1 = :kvs.take(KVS.reader(:kvs.load_reader(rid), args: p, dir: 0))
  140. z1 = KVS.reader(t1, :args)
  141. r = :kvs.save(t1)
  142. log("next t1:", t1)
  143. t2 = :kvs.take(KVS.reader(:kvs.load_reader(rid), args: p))
  144. z2 = KVS.reader(t2, :args)
  145. r = :kvs.save(t2)
  146. log("next t2:", t2)
  147. t3 = :kvs.take(KVS.reader(:kvs.load_reader(rid), args: p))
  148. z3 = KVS.reader(t3, :args)
  149. :kvs.save(KVS.reader(t3, dir: 1, pos: 0))
  150. log("next t3:", t3)
  151. assert z3 == []
  152. n1 = :kvs.take(KVS.reader(:kvs.load_reader(rid), args: p))
  153. nz1 = KVS.reader(n1, :args)
  154. :kvs.save n1
  155. log("prev n1:", n1)
  156. n2 = :kvs.take(KVS.reader(:kvs.load_reader(rid), args: p))
  157. nz2 = KVS.reader(n2, :args)
  158. :kvs.save n2
  159. log("prev n2:", n2)
  160. n3 = :kvs.take(KVS.reader(:kvs.load_reader(rid), args: p))
  161. nz3 = KVS.reader(n3, :args)
  162. :kvs.save(KVS.reader(n3, dir: 0))
  163. log("prev n3:", n3)
  164. assert nz3 == []
  165. t4 = :kvs.take(KVS.reader(:kvs.load_reader(rid), args: p, dir: 0))
  166. z4 = KVS.reader(t4, :args)
  167. r = :kvs.save(t4)
  168. log("next t4:", t4)
  169. assert length(z4) == p
  170. log(:end, "test bidirectional (new)")
  171. end
  172. test "partial take forward full" do
  173. log(:st, "partial take forward full")
  174. id = {:partial, :kvs.seq([], [])}
  175. x = 7
  176. :kvs.save(:kvs.writer(id))
  177. :lists.map(fn _ -> :kvs.append({:"$msg", [], [], [], [], []}, id) end, :lists.seq(1, x))
  178. KVS.reader(id: rid) = :kvs.save(:kvs.reader(id))
  179. p = 3
  180. IO.inspect :kvs.all id
  181. t1 = :kvs.take(KVS.reader(:kvs.load_reader(rid), args: p))
  182. z1 = KVS.reader(t1, :args)
  183. :kvs.save(t1)
  184. log("next t1:", t1)
  185. t2 = :kvs.take(KVS.reader(:kvs.load_reader(rid), args: p))
  186. z2 = KVS.reader(t2, :args)
  187. :kvs.save(t2)
  188. log("next t2:", t2)
  189. t3 = :kvs.take(KVS.reader(:kvs.load_reader(rid), args: p))
  190. z3 = KVS.reader(t3, :args)
  191. :kvs.save(t3)
  192. log("next t3:", t3)
  193. assert length(z3) == 1
  194. assert :lists.reverse(z1) ++ :lists.reverse(z2) ++ z3 == :kvs.all(id)
  195. log(:end, "partial take forward full")
  196. end
  197. test "take with empy" do
  198. log(:st, "take with empy")
  199. id = {:partial, :kvs.seq([], [])}
  200. x = 6
  201. p = 3
  202. :kvs.save(:kvs.writer(id))
  203. :lists.map(fn _ -> :kvs.append({:"$msg", :kvs.seq([],[]), [], [], [], []}, id) end, :lists.seq(1, x))
  204. r = :kvs.save(:kvs.reader(id))
  205. IO.inspect :kvs.all(id)
  206. rid = KVS.reader(r, :id)
  207. t1 = :kvs.take(KVS.reader(:kvs.load_reader(rid), args: p, dir: 0))
  208. z1 = KVS.reader(t1, :args)
  209. r = :kvs.save(t1)
  210. log("next t1:", t1)
  211. t2 = :kvs.take(KVS.reader(:kvs.load_reader(rid), args: p))
  212. z2 = KVS.reader(t2, :args)
  213. r = :kvs.save(t2)
  214. log("next t2:", t2)
  215. t3 = :kvs.take(KVS.reader(:kvs.load_reader(rid), args: p))
  216. z3 = KVS.reader(t3, :args)
  217. r = :kvs.save(t3)
  218. log("next t3:", t3)
  219. assert z3 == []
  220. KVS.reader(id: tid) = :kvs.save(KVS.reader(t3, dir: 1, pos: 0))
  221. n1 = :kvs.take(KVS.reader(:kvs.load_reader(tid), args: p))
  222. nz1 = KVS.reader(n1, :args)
  223. :kvs.save n1
  224. log("prev b1:", n1)
  225. n2 = :kvs.take(KVS.reader(:kvs.load_reader(tid), args: p))
  226. nz2 = KVS.reader(n2, :args)
  227. :kvs.save n2
  228. log("prev b2:", n2)
  229. assert z2 ++ z1 == nz1 ++ nz2
  230. log(:end, "take with empy")
  231. end
  232. test "test prev" do
  233. log(:st, "test prev")
  234. id = {:partial, :kvs.seq([], [])}
  235. x = 6
  236. p = 3
  237. :kvs.save(:kvs.writer(id))
  238. :lists.map(fn _ -> :kvs.append({:"$msg", :kvs.seq([],[]), [], [], [], []}, id) end, :lists.seq(1, x))
  239. r = :kvs.save(:kvs.reader(id))
  240. rid = KVS.reader(r, :id)
  241. IO.inspect :kvs.all(id)
  242. t1 = :kvs.take(KVS.reader(:kvs.load_reader(rid), args: p, dir: 0))
  243. z1 = KVS.reader(t1, :args)
  244. r = :kvs.save(t1)
  245. log("next z1:", z1)
  246. t2 = :kvs.take(KVS.reader(:kvs.load_reader(rid), args: p))
  247. z2 = KVS.reader(t2, :args)
  248. KVS.reader(id: tid) = :kvs.save(KVS.reader(t2, dir: 1, pos: 0))
  249. log("next z2:", z2)
  250. n1 = :kvs.take(KVS.reader(:kvs.load_reader(tid), args: p))
  251. nz1 = tl(:lists.reverse(KVS.reader(n1, :args)))
  252. :kvs.save(n1)
  253. log("prev nz1:", nz1)
  254. n2 = :kvs.take(KVS.reader(:kvs.load_reader(tid), args: p))
  255. nz2 = KVS.reader(n2, :args)
  256. :kvs.save n2
  257. log("prev n2:", n2)
  258. assert length(nz2) == p
  259. assert nz2 == z1
  260. n3 = :kvs.take(KVS.reader(:kvs.load_reader(tid), args: p))
  261. nz3 = KVS.reader(n3, :args)
  262. :kvs.save(KVS.reader(n3, dir: 0))
  263. log("prev nz3:", nz3)
  264. assert nz3 = []
  265. log(:end, "test prev")
  266. end
  267. def log(x,cursor) do
  268. IO.inspect {x,cursor}
  269. end
  270. end