vector_test.go 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369
  1. // Copyright (C) 2015 The Protocol Authors.
  2. package protocol
  3. import (
  4. "math"
  5. "testing"
  6. )
  7. func TestUpdate(t *testing.T) {
  8. var v Vector
  9. // Append
  10. v = v.Update(42)
  11. expected := Vector{[]Counter{{42, 1}}}
  12. if v.Compare(expected) != Equal {
  13. t.Errorf("Update error, %+v != %+v", v, expected)
  14. }
  15. // Insert at front
  16. v = v.Update(36)
  17. expected = Vector{[]Counter{{36, 1}, {42, 1}}}
  18. if v.Compare(expected) != Equal {
  19. t.Errorf("Update error, %+v != %+v", v, expected)
  20. }
  21. // Insert in moddle
  22. v = v.Update(37)
  23. expected = Vector{[]Counter{{36, 1}, {37, 1}, {42, 1}}}
  24. if v.Compare(expected) != Equal {
  25. t.Errorf("Update error, %+v != %+v", v, expected)
  26. }
  27. // Update existing
  28. v = v.Update(37)
  29. expected = Vector{[]Counter{{36, 1}, {37, 2}, {42, 1}}}
  30. if v.Compare(expected) != Equal {
  31. t.Errorf("Update error, %+v != %+v", v, expected)
  32. }
  33. }
  34. func TestCopy(t *testing.T) {
  35. v0 := Vector{[]Counter{{42, 1}}}
  36. v1 := v0.Copy()
  37. v1.Update(42)
  38. if v0.Compare(v1) != Lesser {
  39. t.Errorf("Copy error, %+v should be ancestor of %+v", v0, v1)
  40. }
  41. }
  42. func TestMerge(t *testing.T) {
  43. testcases := []struct {
  44. a, b, m Vector
  45. }{
  46. // No-ops
  47. {
  48. Vector{},
  49. Vector{},
  50. Vector{},
  51. },
  52. {
  53. Vector{[]Counter{{22, 1}, {42, 1}}},
  54. Vector{[]Counter{{22, 1}, {42, 1}}},
  55. Vector{[]Counter{{22, 1}, {42, 1}}},
  56. },
  57. // Appends
  58. {
  59. Vector{},
  60. Vector{[]Counter{{22, 1}, {42, 1}}},
  61. Vector{[]Counter{{22, 1}, {42, 1}}},
  62. },
  63. {
  64. Vector{[]Counter{{22, 1}}},
  65. Vector{[]Counter{{42, 1}}},
  66. Vector{[]Counter{{22, 1}, {42, 1}}},
  67. },
  68. {
  69. Vector{[]Counter{{22, 1}}},
  70. Vector{[]Counter{{22, 1}, {42, 1}}},
  71. Vector{[]Counter{{22, 1}, {42, 1}}},
  72. },
  73. // Insert
  74. {
  75. Vector{[]Counter{{22, 1}, {42, 1}}},
  76. Vector{[]Counter{{22, 1}, {23, 2}, {42, 1}}},
  77. Vector{[]Counter{{22, 1}, {23, 2}, {42, 1}}},
  78. },
  79. {
  80. Vector{[]Counter{{42, 1}}},
  81. Vector{[]Counter{{22, 1}}},
  82. Vector{[]Counter{{22, 1}, {42, 1}}},
  83. },
  84. // Update
  85. {
  86. Vector{[]Counter{{22, 1}, {42, 2}}},
  87. Vector{[]Counter{{22, 2}, {42, 1}}},
  88. Vector{[]Counter{{22, 2}, {42, 2}}},
  89. },
  90. // All of the above
  91. {
  92. Vector{[]Counter{{10, 1}, {20, 2}, {30, 1}}},
  93. Vector{[]Counter{{5, 1}, {10, 2}, {15, 1}, {20, 1}, {25, 1}, {35, 1}}},
  94. Vector{[]Counter{{5, 1}, {10, 2}, {15, 1}, {20, 2}, {25, 1}, {30, 1}, {35, 1}}},
  95. },
  96. }
  97. for i, tc := range testcases {
  98. if m := tc.a.Merge(tc.b); m.Compare(tc.m) != Equal {
  99. t.Errorf("%d: %+v.Merge(%+v) == %+v (expected %+v)", i, tc.a, tc.b, m, tc.m)
  100. }
  101. }
  102. }
  103. func TestCounterValue(t *testing.T) {
  104. v0 := Vector{[]Counter{{42, 1}, {64, 5}}}
  105. if v0.Counter(42) != 1 {
  106. t.Errorf("Counter error, %d != %d", v0.Counter(42), 1)
  107. }
  108. if v0.Counter(64) != 5 {
  109. t.Errorf("Counter error, %d != %d", v0.Counter(64), 5)
  110. }
  111. if v0.Counter(72) != 0 {
  112. t.Errorf("Counter error, %d != %d", v0.Counter(72), 0)
  113. }
  114. }
  115. func TestCompare(t *testing.T) {
  116. testcases := []struct {
  117. a, b Vector
  118. r Ordering
  119. }{
  120. // Empty vectors are identical
  121. {Vector{}, Vector{}, Equal},
  122. {Vector{}, Vector{[]Counter{{42, 0}}}, Equal},
  123. {Vector{[]Counter{{42, 0}}}, Vector{}, Equal},
  124. // Zero is the implied value for a missing Counter
  125. {
  126. Vector{[]Counter{{42, 0}}},
  127. Vector{[]Counter{{77, 0}}},
  128. Equal,
  129. },
  130. // Equal vectors are equal
  131. {
  132. Vector{[]Counter{{42, 33}}},
  133. Vector{[]Counter{{42, 33}}},
  134. Equal,
  135. },
  136. {
  137. Vector{[]Counter{{42, 33}, {77, 24}}},
  138. Vector{[]Counter{{42, 33}, {77, 24}}},
  139. Equal,
  140. },
  141. // These a-vectors are all greater than the b-vector
  142. {
  143. Vector{[]Counter{{42, 1}}},
  144. Vector{},
  145. Greater,
  146. },
  147. {
  148. Vector{[]Counter{{0, 1}}},
  149. Vector{[]Counter{{0, 0}}},
  150. Greater,
  151. },
  152. {
  153. Vector{[]Counter{{42, 1}}},
  154. Vector{[]Counter{{42, 0}}},
  155. Greater,
  156. },
  157. {
  158. Vector{[]Counter{{math.MaxUint64, 1}}},
  159. Vector{[]Counter{{math.MaxUint64, 0}}},
  160. Greater,
  161. },
  162. {
  163. Vector{[]Counter{{0, math.MaxUint64}}},
  164. Vector{[]Counter{{0, 0}}},
  165. Greater,
  166. },
  167. {
  168. Vector{[]Counter{{42, math.MaxUint64}}},
  169. Vector{[]Counter{{42, 0}}},
  170. Greater,
  171. },
  172. {
  173. Vector{[]Counter{{math.MaxUint64, math.MaxUint64}}},
  174. Vector{[]Counter{{math.MaxUint64, 0}}},
  175. Greater,
  176. },
  177. {
  178. Vector{[]Counter{{0, math.MaxUint64}}},
  179. Vector{[]Counter{{0, math.MaxUint64 - 1}}},
  180. Greater,
  181. },
  182. {
  183. Vector{[]Counter{{42, math.MaxUint64}}},
  184. Vector{[]Counter{{42, math.MaxUint64 - 1}}},
  185. Greater,
  186. },
  187. {
  188. Vector{[]Counter{{math.MaxUint64, math.MaxUint64}}},
  189. Vector{[]Counter{{math.MaxUint64, math.MaxUint64 - 1}}},
  190. Greater,
  191. },
  192. {
  193. Vector{[]Counter{{42, 2}}},
  194. Vector{[]Counter{{42, 1}}},
  195. Greater,
  196. },
  197. {
  198. Vector{[]Counter{{22, 22}, {42, 2}}},
  199. Vector{[]Counter{{22, 22}, {42, 1}}},
  200. Greater,
  201. },
  202. {
  203. Vector{[]Counter{{42, 2}, {77, 3}}},
  204. Vector{[]Counter{{42, 1}, {77, 3}}},
  205. Greater,
  206. },
  207. {
  208. Vector{[]Counter{{22, 22}, {42, 2}, {77, 3}}},
  209. Vector{[]Counter{{22, 22}, {42, 1}, {77, 3}}},
  210. Greater,
  211. },
  212. {
  213. Vector{[]Counter{{22, 23}, {42, 2}, {77, 4}}},
  214. Vector{[]Counter{{22, 22}, {42, 1}, {77, 3}}},
  215. Greater,
  216. },
  217. // These a-vectors are all lesser than the b-vector
  218. {Vector{}, Vector{[]Counter{{42, 1}}}, Lesser},
  219. {
  220. Vector{[]Counter{{42, 0}}},
  221. Vector{[]Counter{{42, 1}}},
  222. Lesser,
  223. },
  224. {
  225. Vector{[]Counter{{42, 1}}},
  226. Vector{[]Counter{{42, 2}}},
  227. Lesser,
  228. },
  229. {
  230. Vector{[]Counter{{22, 22}, {42, 1}}},
  231. Vector{[]Counter{{22, 22}, {42, 2}}},
  232. Lesser,
  233. },
  234. {
  235. Vector{[]Counter{{42, 1}, {77, 3}}},
  236. Vector{[]Counter{{42, 2}, {77, 3}}},
  237. Lesser,
  238. },
  239. {
  240. Vector{[]Counter{{22, 22}, {42, 1}, {77, 3}}},
  241. Vector{[]Counter{{22, 22}, {42, 2}, {77, 3}}},
  242. Lesser,
  243. },
  244. {
  245. Vector{[]Counter{{22, 22}, {42, 1}, {77, 3}}},
  246. Vector{[]Counter{{22, 23}, {42, 2}, {77, 4}}},
  247. Lesser,
  248. },
  249. // These are all in conflict
  250. {
  251. Vector{[]Counter{{42, 2}}},
  252. Vector{[]Counter{{43, 1}}},
  253. ConcurrentGreater,
  254. },
  255. {
  256. Vector{[]Counter{{43, 1}}},
  257. Vector{[]Counter{{42, 2}}},
  258. ConcurrentLesser,
  259. },
  260. {
  261. Vector{[]Counter{{22, 23}, {42, 1}}},
  262. Vector{[]Counter{{22, 22}, {42, 2}}},
  263. ConcurrentGreater,
  264. },
  265. {
  266. Vector{[]Counter{{22, 21}, {42, 2}}},
  267. Vector{[]Counter{{22, 22}, {42, 1}}},
  268. ConcurrentLesser,
  269. },
  270. {
  271. Vector{[]Counter{{22, 21}, {42, 2}, {43, 1}}},
  272. Vector{[]Counter{{20, 1}, {22, 22}, {42, 1}}},
  273. ConcurrentLesser,
  274. },
  275. }
  276. for i, tc := range testcases {
  277. // Test real Compare
  278. if r := tc.a.Compare(tc.b); r != tc.r {
  279. t.Errorf("%d: %+v.Compare(%+v) == %v (expected %v)", i, tc.a, tc.b, r, tc.r)
  280. }
  281. // Test convenience functions
  282. switch tc.r {
  283. case Greater:
  284. if tc.a.Equal(tc.b) {
  285. t.Errorf("%+v == %+v", tc.a, tc.b)
  286. }
  287. if tc.a.Concurrent(tc.b) {
  288. t.Errorf("%+v concurrent %+v", tc.a, tc.b)
  289. }
  290. if !tc.a.GreaterEqual(tc.b) {
  291. t.Errorf("%+v not >= %+v", tc.a, tc.b)
  292. }
  293. if tc.a.LesserEqual(tc.b) {
  294. t.Errorf("%+v <= %+v", tc.a, tc.b)
  295. }
  296. case Lesser:
  297. if tc.a.Concurrent(tc.b) {
  298. t.Errorf("%+v concurrent %+v", tc.a, tc.b)
  299. }
  300. if tc.a.Equal(tc.b) {
  301. t.Errorf("%+v == %+v", tc.a, tc.b)
  302. }
  303. if tc.a.GreaterEqual(tc.b) {
  304. t.Errorf("%+v >= %+v", tc.a, tc.b)
  305. }
  306. if !tc.a.LesserEqual(tc.b) {
  307. t.Errorf("%+v not <= %+v", tc.a, tc.b)
  308. }
  309. case Equal:
  310. if tc.a.Concurrent(tc.b) {
  311. t.Errorf("%+v concurrent %+v", tc.a, tc.b)
  312. }
  313. if !tc.a.Equal(tc.b) {
  314. t.Errorf("%+v not == %+v", tc.a, tc.b)
  315. }
  316. if !tc.a.GreaterEqual(tc.b) {
  317. t.Errorf("%+v not <= %+v", tc.a, tc.b)
  318. }
  319. if !tc.a.LesserEqual(tc.b) {
  320. t.Errorf("%+v not <= %+v", tc.a, tc.b)
  321. }
  322. case ConcurrentLesser, ConcurrentGreater:
  323. if !tc.a.Concurrent(tc.b) {
  324. t.Errorf("%+v not concurrent %+v", tc.a, tc.b)
  325. }
  326. if tc.a.Equal(tc.b) {
  327. t.Errorf("%+v == %+v", tc.a, tc.b)
  328. }
  329. if tc.a.GreaterEqual(tc.b) {
  330. t.Errorf("%+v >= %+v", tc.a, tc.b)
  331. }
  332. if tc.a.LesserEqual(tc.b) {
  333. t.Errorf("%+v <= %+v", tc.a, tc.b)
  334. }
  335. }
  336. }
  337. }