st_test.exs 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. ExUnit.start()
  2. defmodule St.Test do
  3. use ExUnit.Case, async: false
  4. import Record
  5. require KVS
  6. defrecord(:msg, id: [], body: [])
  7. setup do: (on_exit(fn -> :ok = :kvs.leave();:ok = :kvs_rocks.destroy() end);:kvs.join())
  8. setup kvs, do: [
  9. ids: :lists.map(fn _ -> :kvs.append(msg(id: :kvs.seq([],[])), :feed) end, :lists.seq(1,10)),
  10. id0: :lists.map(fn _ -> :kvs.append(msg(id: :kvs.seq([],[])), "/crm/personal/Реєстратор А1/in/directory/duck") end, :lists.seq(1,10)),
  11. id1: :lists.map(fn _ -> :kvs.append(msg(id: :kvs.seq([],[])), "/crm/personal/Реєстратор А1/in/mail") end, :lists.seq(1,10)),
  12. id2: :lists.map(fn _ -> :kvs.append(msg(id: :kvs.seq([],[])), "/crm/personal/Реєстратор А1/in/doc") end, :lists.seq(1,10))]
  13. test "take-ø", kvs do
  14. r = KVS.reader() = :kvs.reader("/empty-feed")
  15. assert r1 = KVS.reader(feed: "//empty-feed", args: []) = :kvs.take(KVS.reader(r, args: 1))
  16. assert r1 = KVS.reader(feed: "//empty-feed", args: []) = :kvs.take(KVS.reader(r, args: 1, dir: 1))
  17. assert r2 = KVS.reader(feed: "//empty-feed", args: []) = :kvs.next(r)
  18. assert r3 = KVS.reader(feed: "//empty-feed", args: []) = :kvs.prev(r)
  19. assert r1 = KVS.reader(feed: "//empty-feed", args: []) = :kvs.take(KVS.reader(r, args: 100))
  20. assert r1 = KVS.reader(feed: "//empty-feed", args: []) = :kvs.take(KVS.reader(r, args: 100, dir: 1))
  21. KVS.reader(id: rid) = :kvs.save(r1)
  22. assert rs1 = KVS.reader(id: rid) = :kvs.load_reader(rid)
  23. assert KVS.reader(feed: "//empty-feed", args: []) = :kvs.take(KVS.reader(rs1, args: 5))
  24. assert KVS.reader(feed: "//empty-feed", args: []) = :kvs.take(KVS.reader(rs1, args: 5, dir: 1))
  25. assert KVS.reader(feed: "//empty-feed", args: []) = :kvs.next(rs1)
  26. assert KVS.reader(feed: "//empty-feed", args: []) = :kvs.prev(rs1)
  27. assert KVS.reader(feed: "//empty-feed", args: []) = :kvs.take(KVS.reader(rs1, args: 0))
  28. assert KVS.reader(feed: "//empty-feed", args: []) = :kvs.take(KVS.reader(rs1, args: 0, dir: 1))
  29. end
  30. test "take-0", kvs do
  31. feed = "//crm/personal/Реєстратор А1/in/doc"
  32. assert r = KVS.reader(id: rid, args: []) = :kvs.reader("/crm/personal/Реєстратор А1/in/doc")
  33. assert KVS.reader(id: ^rid, feed: ^feed, args: []) = :kvs.take(KVS.reader(r, args: 0, dir: 0))
  34. assert KVS.reader(id: ^rid, feed: ^feed, args: []) = :kvs.take(KVS.reader(r, args: -1, dir: 0))
  35. assert r1 = KVS.reader(id: ^rid, feed: ^feed, args: a01) = :kvs.take(KVS.reader(r, args: 10, dir: 0))
  36. assert kvs[:id2] |> Enum.map(&msg(id: &1)) == a01
  37. assert KVS.reader(id: ^rid, feed: ^feed, args: []) = :kvs.take(KVS.reader(r1, args: 10, dir: 0))
  38. assert KVS.reader(id: ^rid, feed: ^feed, args: af) = :kvs.take(KVS.reader(r, args: 100, dir: 0))
  39. assert kvs[:id2] |> Enum.map(&msg(id: &1)) == af
  40. assert r2 = KVS.reader(id: ^rid, feed: ^feed, args: a03) = :kvs.take(KVS.reader(r, args: 3, dir: 0))
  41. assert Enum.take(kvs[:id2],3) |> Enum.map(&msg(id: &1)) == a03
  42. assert KVS.reader(id: ^rid, feed: ^feed, args: a07) = :kvs.take(KVS.reader(r2, args: 7, dir: 0))
  43. assert Enum.drop(kvs[:id2],3) |> Enum.map(&msg(id: &1)) == a07
  44. assert KVS.reader(id: ^rid, feed: ^feed, args: a17) = :kvs.take(KVS.reader(r2, args: 100, dir: 0))
  45. assert Enum.drop(kvs[:id2],3) |> Enum.map(&msg(id: &1)) == a17
  46. end
  47. test "take-1", kvs do
  48. feed = "//crm/personal/Реєстратор А1/in/mail"
  49. top = Enum.at(kvs[:id1],0)
  50. bot = Enum.at(kvs[:id1],9)
  51. tpm = Enum.take(kvs[:id1],1) |> Enum.map(&msg(id: &1))
  52. assert r = KVS.reader(id: rid, args: [], cache: {:msg, ^top, ^feed}, count: 10) = :kvs.reader("/crm/personal/Реєстратор А1/in/mail")
  53. assert r = :kvs.top(r)
  54. assert KVS.reader(id: ^rid, feed: ^feed, args: ^tpm, dir: 1) = :kvs.take(KVS.reader(r, args: 1, dir: 1))
  55. assert KVS.reader(id: ^rid, feed: ^feed, args: ^tpm, dir: 1) = :kvs.take(KVS.reader(r, args: 100, dir: 1))
  56. assert r1 = KVS.reader(feed: ^feed, count: 10, args: [], cache: {:msg,^bot,^feed}) = :kvs.bot(r)
  57. assert r2 = KVS.reader(feed: ^feed, count: 10, args: a01) = :kvs.take(KVS.reader(r1, args: 5, dir: 1))
  58. x01 = Enum.drop(kvs[:id1],5) |> Enum.map(&msg(id: &1)) |> Enum.reverse
  59. assert x01 == a01
  60. assert r3 = KVS.reader(feed: ^feed, count: 10, args: a02) = :kvs.take(KVS.reader(r2, args: 10, dir: 1))
  61. x02 = Enum.take(kvs[:id1],5) |> Enum.map(&msg(id: &1)) |> Enum.reverse
  62. assert x02 == a02
  63. assert KVS.reader(feed: ^feed, count: 10, args: []) = :kvs.take(KVS.reader(r3, args: 20, dir: 1))
  64. end
  65. test "drop", kvs do
  66. feed = "/feed"
  67. assert r = KVS.reader(id: rid, args: []) = :kvs.save(:kvs.reader(:feed))
  68. assert r1 = KVS.reader(id: ^rid, feed: ^feed, args: []) = :kvs.drop(KVS.reader(r, args: 10, dir: 0))
  69. kvs[:ids] |> Enum.map(&msg(id: &1))
  70. |> Enum.each(&assert(
  71. KVS.reader(id: rid, feed: ^feed, args: [], cache: &1) =
  72. :kvs.save(:kvs.drop(KVS.reader(:kvs.load_reader(rid), args: 1, dir: 0)))))
  73. assert r2 = KVS.reader(id: ^rid, feed: ^feed, args: [], cache: c1) = :kvs.drop(KVS.reader(r, args: 1, dir: 0))
  74. assert {:msg, Enum.at(kvs[:ids], 1), feed} == c1
  75. assert KVS.reader(id: ^rid, feed: ^feed, args: [], cache: c2) = :kvs.drop(KVS.reader(r2, args: 5, dir: 0))
  76. assert {:msg, Enum.at(kvs[:ids], 6), feed} == c2
  77. assert KVS.reader(id: ^rid, feed: ^feed, args: []) = :kvs.drop(KVS.reader(r1, args: 100))
  78. end
  79. test "feed",kvs do
  80. docs = :kvs.all("/crm/personal/Реєстратор А1/in/doc")
  81. ducks = :kvs.all("/crm/personal/Реєстратор А1/in/directory/duck")
  82. mail = :kvs.all("/crm/personal/Реєстратор А1/in/mail")
  83. total = :kvs.all("/crm/personal/Реєстратор А1/in")
  84. assert ducks++docs++mail == total
  85. assert docs = :kvs.feed("/crm/personal/Реєстратор А1/in/doc")
  86. assert ducks = :kvs.feed("/crm/personal/Реєстратор А1/in/directory/duck")
  87. assert mail = :kvs.feed("/crm/personal/Реєстратор А1/in/mail")
  88. assert total = :kvs.feed("/crm/personal/Реєстратор А1/in")
  89. assert :kvs.feed("/crm/personal/Реєстратор А1/in/directory/duck")
  90. ++ :kvs.feed("/crm/personal/Реєстратор А1/in/doc")
  91. ++ :kvs.feed("/crm/personal/Реєстратор А1/in/mail") == :kvs.feed("/crm/personal/Реєстратор А1/in")
  92. end
  93. defp log(x), do: IO.puts '#{inspect(x)}'
  94. defp log(m, x), do: IO.puts '#{m} #{inspect(x)}'
  95. end