vector_compare_test.go 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. // Copyright (C) 2015 The Protocol Authors.
  2. package protocol
  3. import (
  4. "math"
  5. "testing"
  6. )
  7. func TestCompare(t *testing.T) {
  8. testcases := []struct {
  9. a, b Vector
  10. r Ordering
  11. }{
  12. // Empty vectors are identical
  13. {Vector{}, Vector{}, Equal},
  14. {Vector{}, nil, Equal},
  15. {nil, Vector{}, Equal},
  16. {nil, Vector{Counter{42, 0}}, Equal},
  17. {Vector{}, Vector{Counter{42, 0}}, Equal},
  18. {Vector{Counter{42, 0}}, nil, Equal},
  19. {Vector{Counter{42, 0}}, Vector{}, Equal},
  20. // Zero is the implied value for a missing Counter
  21. {
  22. Vector{Counter{42, 0}},
  23. Vector{Counter{77, 0}},
  24. Equal,
  25. },
  26. // Equal vectors are equal
  27. {
  28. Vector{Counter{42, 33}},
  29. Vector{Counter{42, 33}},
  30. Equal,
  31. },
  32. {
  33. Vector{Counter{42, 33}, Counter{77, 24}},
  34. Vector{Counter{42, 33}, Counter{77, 24}},
  35. Equal,
  36. },
  37. // These a-vectors are all greater than the b-vector
  38. {
  39. Vector{Counter{42, 1}},
  40. nil,
  41. Greater,
  42. },
  43. {
  44. Vector{Counter{42, 1}},
  45. Vector{},
  46. Greater,
  47. },
  48. {
  49. Vector{Counter{0, 1}},
  50. Vector{Counter{0, 0}},
  51. Greater,
  52. },
  53. {
  54. Vector{Counter{42, 1}},
  55. Vector{Counter{42, 0}},
  56. Greater,
  57. },
  58. {
  59. Vector{Counter{math.MaxUint64, 1}},
  60. Vector{Counter{math.MaxUint64, 0}},
  61. Greater,
  62. },
  63. {
  64. Vector{Counter{0, math.MaxUint64}},
  65. Vector{Counter{0, 0}},
  66. Greater,
  67. },
  68. {
  69. Vector{Counter{42, math.MaxUint64}},
  70. Vector{Counter{42, 0}},
  71. Greater,
  72. },
  73. {
  74. Vector{Counter{math.MaxUint64, math.MaxUint64}},
  75. Vector{Counter{math.MaxUint64, 0}},
  76. Greater,
  77. },
  78. {
  79. Vector{Counter{0, math.MaxUint64}},
  80. Vector{Counter{0, math.MaxUint64 - 1}},
  81. Greater,
  82. },
  83. {
  84. Vector{Counter{42, math.MaxUint64}},
  85. Vector{Counter{42, math.MaxUint64 - 1}},
  86. Greater,
  87. },
  88. {
  89. Vector{Counter{math.MaxUint64, math.MaxUint64}},
  90. Vector{Counter{math.MaxUint64, math.MaxUint64 - 1}},
  91. Greater,
  92. },
  93. {
  94. Vector{Counter{42, 2}},
  95. Vector{Counter{42, 1}},
  96. Greater,
  97. },
  98. {
  99. Vector{Counter{22, 22}, Counter{42, 2}},
  100. Vector{Counter{22, 22}, Counter{42, 1}},
  101. Greater,
  102. },
  103. {
  104. Vector{Counter{42, 2}, Counter{77, 3}},
  105. Vector{Counter{42, 1}, Counter{77, 3}},
  106. Greater,
  107. },
  108. {
  109. Vector{Counter{22, 22}, Counter{42, 2}, Counter{77, 3}},
  110. Vector{Counter{22, 22}, Counter{42, 1}, Counter{77, 3}},
  111. Greater,
  112. },
  113. {
  114. Vector{Counter{22, 23}, Counter{42, 2}, Counter{77, 4}},
  115. Vector{Counter{22, 22}, Counter{42, 1}, Counter{77, 3}},
  116. Greater,
  117. },
  118. // These a-vectors are all lesser than the b-vector
  119. {nil, Vector{Counter{42, 1}}, Lesser},
  120. {Vector{}, Vector{Counter{42, 1}}, Lesser},
  121. {
  122. Vector{Counter{42, 0}},
  123. Vector{Counter{42, 1}},
  124. Lesser,
  125. },
  126. {
  127. Vector{Counter{42, 1}},
  128. Vector{Counter{42, 2}},
  129. Lesser,
  130. },
  131. {
  132. Vector{Counter{22, 22}, Counter{42, 1}},
  133. Vector{Counter{22, 22}, Counter{42, 2}},
  134. Lesser,
  135. },
  136. {
  137. Vector{Counter{42, 1}, Counter{77, 3}},
  138. Vector{Counter{42, 2}, Counter{77, 3}},
  139. Lesser,
  140. },
  141. {
  142. Vector{Counter{22, 22}, Counter{42, 1}, Counter{77, 3}},
  143. Vector{Counter{22, 22}, Counter{42, 2}, Counter{77, 3}},
  144. Lesser,
  145. },
  146. {
  147. Vector{Counter{22, 22}, Counter{42, 1}, Counter{77, 3}},
  148. Vector{Counter{22, 23}, Counter{42, 2}, Counter{77, 4}},
  149. Lesser,
  150. },
  151. // These are all in conflict
  152. {
  153. Vector{Counter{42, 2}},
  154. Vector{Counter{43, 1}},
  155. ConcurrentGreater,
  156. },
  157. {
  158. Vector{Counter{43, 1}},
  159. Vector{Counter{42, 2}},
  160. ConcurrentLesser,
  161. },
  162. {
  163. Vector{Counter{22, 23}, Counter{42, 1}},
  164. Vector{Counter{22, 22}, Counter{42, 2}},
  165. ConcurrentGreater,
  166. },
  167. {
  168. Vector{Counter{22, 21}, Counter{42, 2}},
  169. Vector{Counter{22, 22}, Counter{42, 1}},
  170. ConcurrentLesser,
  171. },
  172. {
  173. Vector{Counter{22, 21}, Counter{42, 2}, Counter{43, 1}},
  174. Vector{Counter{20, 1}, Counter{22, 22}, Counter{42, 1}},
  175. ConcurrentLesser,
  176. },
  177. }
  178. for i, tc := range testcases {
  179. // Test real Compare
  180. if r := tc.a.Compare(tc.b); r != tc.r {
  181. t.Errorf("%d: %+v.Compare(%+v) == %v (expected %v)", i, tc.a, tc.b, r, tc.r)
  182. }
  183. // Test convenience functions
  184. switch tc.r {
  185. case Greater:
  186. if tc.a.Equal(tc.b) {
  187. t.Errorf("%+v == %+v", tc.a, tc.b)
  188. }
  189. if tc.a.Concurrent(tc.b) {
  190. t.Errorf("%+v concurrent %+v", tc.a, tc.b)
  191. }
  192. if !tc.a.GreaterEqual(tc.b) {
  193. t.Errorf("%+v not >= %+v", tc.a, tc.b)
  194. }
  195. if tc.a.LesserEqual(tc.b) {
  196. t.Errorf("%+v <= %+v", tc.a, tc.b)
  197. }
  198. case Lesser:
  199. if tc.a.Concurrent(tc.b) {
  200. t.Errorf("%+v concurrent %+v", tc.a, tc.b)
  201. }
  202. if tc.a.Equal(tc.b) {
  203. t.Errorf("%+v == %+v", tc.a, tc.b)
  204. }
  205. if tc.a.GreaterEqual(tc.b) {
  206. t.Errorf("%+v >= %+v", tc.a, tc.b)
  207. }
  208. if !tc.a.LesserEqual(tc.b) {
  209. t.Errorf("%+v not <= %+v", tc.a, tc.b)
  210. }
  211. case Equal:
  212. if tc.a.Concurrent(tc.b) {
  213. t.Errorf("%+v concurrent %+v", tc.a, tc.b)
  214. }
  215. if !tc.a.Equal(tc.b) {
  216. t.Errorf("%+v not == %+v", tc.a, tc.b)
  217. }
  218. if !tc.a.GreaterEqual(tc.b) {
  219. t.Errorf("%+v not <= %+v", tc.a, tc.b)
  220. }
  221. if !tc.a.LesserEqual(tc.b) {
  222. t.Errorf("%+v not <= %+v", tc.a, tc.b)
  223. }
  224. case ConcurrentLesser, ConcurrentGreater:
  225. if !tc.a.Concurrent(tc.b) {
  226. t.Errorf("%+v not concurrent %+v", tc.a, tc.b)
  227. }
  228. if tc.a.Equal(tc.b) {
  229. t.Errorf("%+v == %+v", tc.a, tc.b)
  230. }
  231. if tc.a.GreaterEqual(tc.b) {
  232. t.Errorf("%+v >= %+v", tc.a, tc.b)
  233. }
  234. if tc.a.LesserEqual(tc.b) {
  235. t.Errorf("%+v <= %+v", tc.a, tc.b)
  236. }
  237. }
  238. }
  239. }