file_test.go 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320
  1. package hercules
  2. import (
  3. "testing"
  4. "github.com/stretchr/testify/assert"
  5. )
  6. func fixture() (*File, map[int]int64) {
  7. status := map[int]int64{}
  8. file := NewFile(0, 100, status)
  9. return file, status
  10. }
  11. func TestInitialize(t *testing.T) {
  12. file, status := fixture()
  13. dump := file.Dump()
  14. // Output:
  15. // 0 0
  16. // 100 -1
  17. assert.Equal(t, "0 0\n100 -1\n", dump)
  18. assert.Equal(t, int64(100), status[0])
  19. }
  20. func testPanic(t *testing.T, method func(*File), msg string) {
  21. defer func() {
  22. r := recover()
  23. assert.NotNil(t, r, "not panic()-ed")
  24. assert.IsType(t, "", r)
  25. assert.Contains(t, r.(string), msg)
  26. }()
  27. file, _ := fixture()
  28. method(file)
  29. }
  30. func TestBullshit(t *testing.T) {
  31. testPanic(t, func(file *File) { file.Update(1, -10, 10, 0) }, "insert")
  32. testPanic(t, func(file *File) { file.Update(1, 110, 10, 0) }, "insert")
  33. testPanic(t, func(file *File) { file.Update(1, -10, 0, 10) }, "delete")
  34. testPanic(t, func(file *File) { file.Update(1, 100, 0, 10) }, "delete")
  35. testPanic(t, func(file *File) { file.Update(1, 0, -10, 0) }, "length")
  36. testPanic(t, func(file *File) { file.Update(1, 0, 0, -10) }, "length")
  37. testPanic(t, func(file *File) { file.Update(1, 0, -10, -10) }, "length")
  38. testPanic(t, func(file *File) { file.Update(-1, 0, 10, 10) }, "time")
  39. file, status := fixture()
  40. file.Update(1, 10, 0, 0)
  41. assert.Equal(t, int64(100), status[0])
  42. assert.Equal(t, int64(0), status[1])
  43. }
  44. func TestLen(t *testing.T) {
  45. file, _ := fixture()
  46. assert.Equal(t, 100, file.Len())
  47. }
  48. func TestInsert(t *testing.T) {
  49. file, status := fixture()
  50. file.Update(1, 10, 10, 0)
  51. dump := file.Dump()
  52. // Output:
  53. // 0 0
  54. // 10 1
  55. // 20 0
  56. // 110 -1
  57. assert.Equal(t, "0 0\n10 1\n20 0\n110 -1\n", dump)
  58. assert.Equal(t, int64(100), status[0])
  59. assert.Equal(t, int64(10), status[1])
  60. }
  61. func TestZeroInitialize(t *testing.T) {
  62. status := map[int]int64{}
  63. file := NewFile(0, 0, status)
  64. assert.NotContains(t, status, 0)
  65. dump := file.Dump()
  66. // Output:
  67. // 0 -1
  68. assert.Equal(t, "0 -1\n", dump)
  69. file.Update(1, 0, 10, 0)
  70. dump = file.Dump()
  71. // Output:
  72. // 0 1
  73. // 10 -1
  74. assert.Equal(t, "0 1\n10 -1\n", dump)
  75. assert.Equal(t, int64(10), status[1])
  76. }
  77. func TestDelete(t *testing.T) {
  78. file, status := fixture()
  79. file.Update(1, 10, 0, 10)
  80. dump := file.Dump()
  81. // Output:
  82. // 0 0
  83. // 90 -1
  84. assert.Equal(t, "0 0\n90 -1\n", dump)
  85. assert.Equal(t, int64(90), status[0])
  86. assert.Equal(t, int64(0), status[1])
  87. }
  88. func TestFused(t *testing.T) {
  89. file, status := fixture()
  90. file.Update(1, 10, 6, 7)
  91. dump := file.Dump()
  92. // Output:
  93. // 0 0
  94. // 10 1
  95. // 16 0
  96. // 99 -1
  97. assert.Equal(t, "0 0\n10 1\n16 0\n99 -1\n", dump)
  98. assert.Equal(t, int64(93), status[0])
  99. assert.Equal(t, int64(6), status[1])
  100. }
  101. func TestInsertSameTime(t *testing.T) {
  102. file, status := fixture()
  103. file.Update(0, 5, 10, 0)
  104. dump := file.Dump()
  105. // Output:
  106. // 0 0
  107. // 110 -1
  108. assert.Equal(t, "0 0\n110 -1\n", dump)
  109. assert.Equal(t, int64(110), status[0])
  110. }
  111. func TestInsertSameStart(t *testing.T) {
  112. file, status := fixture()
  113. file.Update(1, 10, 10, 0)
  114. file.Update(2, 10, 10, 0)
  115. dump := file.Dump()
  116. // Output:
  117. // 0 0
  118. // 10 2
  119. // 20 1
  120. // 30 0
  121. // 120 -1
  122. assert.Equal(t, "0 0\n10 2\n20 1\n30 0\n120 -1\n", dump)
  123. assert.Equal(t, int64(100), status[0])
  124. assert.Equal(t, int64(10), status[1])
  125. assert.Equal(t, int64(10), status[2])
  126. }
  127. func TestInsertEnd(t *testing.T) {
  128. file, status := fixture()
  129. file.Update(1, 100, 10, 0)
  130. dump := file.Dump()
  131. // Output:
  132. // 0 0
  133. // 100 1
  134. // 110 -1
  135. assert.Equal(t, "0 0\n100 1\n110 -1\n", dump)
  136. assert.Equal(t, int64(100), status[0])
  137. assert.Equal(t, int64(10), status[1])
  138. }
  139. func TestDeleteSameStart0(t *testing.T) {
  140. file, status := fixture()
  141. file.Update(1, 0, 0, 10)
  142. dump := file.Dump()
  143. // Output:
  144. // 0 0
  145. // 90 -1
  146. assert.Equal(t, "0 0\n90 -1\n", dump)
  147. assert.Equal(t, int64(90), status[0])
  148. assert.Equal(t, int64(0), status[1])
  149. }
  150. func TestDeleteSameStartMiddle(t *testing.T) {
  151. file, status := fixture()
  152. file.Update(1, 10, 10, 0)
  153. file.Update(2, 10, 0, 5)
  154. dump := file.Dump()
  155. // Output:
  156. // 0 0
  157. // 10 1
  158. // 15 0
  159. // 105 -1
  160. assert.Equal(t, "0 0\n10 1\n15 0\n105 -1\n", dump)
  161. assert.Equal(t, int64(100), status[0])
  162. assert.Equal(t, int64(5), status[1])
  163. }
  164. func TestDeleteIntersection(t *testing.T) {
  165. file, status := fixture()
  166. file.Update(1, 10, 10, 0)
  167. file.Update(2, 15, 0, 10)
  168. dump := file.Dump()
  169. // Output:
  170. // 0 0
  171. // 10 1
  172. // 15 0
  173. // 100 -1
  174. assert.Equal(t, "0 0\n10 1\n15 0\n100 -1\n", dump)
  175. assert.Equal(t, int64(95), status[0])
  176. assert.Equal(t, int64(5), status[1])
  177. }
  178. func TestDeleteAll(t *testing.T) {
  179. file, status := fixture()
  180. file.Update(1, 0, 0, 100)
  181. // Output:
  182. // 0 -1
  183. dump := file.Dump()
  184. assert.Equal(t, "0 -1\n", dump)
  185. assert.Equal(t, int64(0), status[0])
  186. assert.Equal(t, int64(0), status[1])
  187. }
  188. func TestFusedIntersection(t *testing.T) {
  189. file, status := fixture()
  190. file.Update(1, 10, 10, 0)
  191. file.Update(2, 15, 3, 10)
  192. dump := file.Dump()
  193. // Output:
  194. // 0 0
  195. // 10 1
  196. // 15 2
  197. // 18 0
  198. // 103 -1
  199. assert.Equal(t, "0 0\n10 1\n15 2\n18 0\n103 -1\n", dump)
  200. assert.Equal(t, int64(95), status[0])
  201. assert.Equal(t, int64(5), status[1])
  202. assert.Equal(t, int64(3), status[2])
  203. }
  204. func TestTorture(t *testing.T) {
  205. file, status := fixture()
  206. // 0 0 | 100 -1 [0]: 100
  207. file.Update(1, 20, 30, 0)
  208. // 0 0 | 20 1 | 50 0 | 130 -1 [0]: 100, [1]: 30
  209. file.Update(2, 20, 0, 5)
  210. // 0 0 | 20 1 | 45 0 | 125 -1 [0]: 100, [1]: 25
  211. file.Update(3, 20, 0, 5)
  212. // 0 0 | 20 1 | 40 0 | 120 -1 [0]: 100, [1]: 20
  213. file.Update(4, 20, 10, 0)
  214. // 0 0 | 20 4 | 30 1 | 50 0 | 130 -1 [0]: 100, [1]: 20, [4]: 10
  215. file.Update(5, 45, 0, 10)
  216. // 0 0 | 20 4 | 30 1 | 45 0 | 120 -1 [0]: 95, [1]: 15, [4]: 10
  217. file.Update(6, 45, 5, 0)
  218. // 0 0 | 20 4 | 30 1 | 45 6 | 50 0 | 125 -1 [0]: 95, [1]: 15, [4]: 10, [6]: 5
  219. file.Update(7, 10, 0, 50)
  220. // 0 0 | 75 -1 [0]: 75
  221. file.Update(8, 0, 10, 10)
  222. // 0 8 | 10 0 | 75 -1 [0]: 65, [8]: 10
  223. dump := file.Dump()
  224. assert.Equal(t, "0 8\n10 0\n75 -1\n", dump)
  225. assert.Equal(t, int64(65), status[0])
  226. assert.Equal(t, int64(0), status[1])
  227. assert.Equal(t, int64(0), status[2])
  228. assert.Equal(t, int64(0), status[3])
  229. assert.Equal(t, int64(0), status[4])
  230. assert.Equal(t, int64(0), status[5])
  231. assert.Equal(t, int64(0), status[6])
  232. assert.Equal(t, int64(0), status[7])
  233. assert.Equal(t, int64(10), status[8])
  234. }
  235. func TestInsertDeleteSameTime(t *testing.T) {
  236. file, status := fixture()
  237. file.Update(0, 10, 10, 20)
  238. dump := file.Dump()
  239. assert.Equal(t, "0 0\n90 -1\n", dump)
  240. assert.Equal(t, int64(90), status[0])
  241. file.Update(0, 10, 20, 10)
  242. dump = file.Dump()
  243. assert.Equal(t, "0 0\n100 -1\n", dump)
  244. assert.Equal(t, int64(100), status[0])
  245. }
  246. func TestBug1(t *testing.T) {
  247. file, status := fixture()
  248. file.Update(316, 1, 86, 0)
  249. file.Update(316, 87, 0, 99)
  250. file.Update(251, 0, 1, 0)
  251. file.Update(251, 1, 0, 1)
  252. dump := file.Dump()
  253. assert.Equal(t, "0 251\n1 316\n87 -1\n", dump)
  254. assert.Equal(t, int64(1), status[251])
  255. assert.Equal(t, int64(86), status[316])
  256. file.Update(316, 0, 0, 1)
  257. file.Update(316, 0, 1, 0)
  258. dump = file.Dump()
  259. assert.Equal(t, "0 316\n87 -1\n", dump)
  260. assert.Equal(t, int64(0), status[251])
  261. assert.Equal(t, int64(87), status[316])
  262. }
  263. func TestBug2(t *testing.T) {
  264. file, status := fixture()
  265. file.Update(316, 1, 86, 0)
  266. file.Update(316, 87, 0, 99)
  267. file.Update(251, 0, 1, 0)
  268. file.Update(251, 1, 0, 1)
  269. dump := file.Dump()
  270. assert.Equal(t, "0 251\n1 316\n87 -1\n", dump)
  271. file.Update(316, 0, 1, 1)
  272. dump = file.Dump()
  273. assert.Equal(t, "0 316\n87 -1\n", dump)
  274. assert.Equal(t, int64(0), status[251])
  275. assert.Equal(t, int64(87), status[316])
  276. }
  277. func TestJoin(t *testing.T) {
  278. file, status := fixture()
  279. file.Update(1, 10, 10, 0)
  280. file.Update(1, 30, 10, 0)
  281. file.Update(1, 20, 10, 10)
  282. dump := file.Dump()
  283. assert.Equal(t, "0 0\n10 1\n40 0\n120 -1\n", dump)
  284. assert.Equal(t, int64(90), status[0])
  285. assert.Equal(t, int64(30), status[1])
  286. }
  287. func TestBug3(t *testing.T) {
  288. file, status := fixture()
  289. file.Update(0, 1, 0, 99)
  290. file.Update(0, 0, 1, 1)
  291. dump := file.Dump()
  292. assert.Equal(t, "0 0\n1 -1\n", dump)
  293. assert.Equal(t, int64(1), status[0])
  294. }