sequence_test.go 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375
  1. package bitseq
  2. import (
  3. "testing"
  4. )
  5. func TestSequenceGetAvailableBit(t *testing.T) {
  6. input := []struct {
  7. head *Sequence
  8. bytePos int
  9. bitPos int
  10. }{
  11. {&Sequence{Block: 0x0, Count: 0}, -1, -1},
  12. {&Sequence{Block: 0x0, Count: 1}, 0, 0},
  13. {&Sequence{Block: 0x0, Count: 100}, 0, 0},
  14. {&Sequence{Block: 0x80000000, Count: 0}, -1, -1},
  15. {&Sequence{Block: 0x80000000, Count: 1}, 0, 1},
  16. {&Sequence{Block: 0x80000000, Count: 100}, 0, 1},
  17. {&Sequence{Block: 0xFF000000, Count: 0}, -1, -1},
  18. {&Sequence{Block: 0xFF000000, Count: 1}, 1, 0},
  19. {&Sequence{Block: 0xFF000000, Count: 100}, 1, 0},
  20. {&Sequence{Block: 0xFF800000, Count: 0}, -1, -1},
  21. {&Sequence{Block: 0xFF800000, Count: 1}, 1, 1},
  22. {&Sequence{Block: 0xFF800000, Count: 100}, 1, 1},
  23. {&Sequence{Block: 0xFFC0FF00, Count: 0}, -1, -1},
  24. {&Sequence{Block: 0xFFC0FF00, Count: 1}, 1, 2},
  25. {&Sequence{Block: 0xFFC0FF00, Count: 100}, 1, 2},
  26. {&Sequence{Block: 0xFFE0FF00, Count: 0}, -1, -1},
  27. {&Sequence{Block: 0xFFE0FF00, Count: 1}, 1, 3},
  28. {&Sequence{Block: 0xFFE0FF00, Count: 100}, 1, 3},
  29. {&Sequence{Block: 0xFFFEFF00, Count: 0}, -1, -1},
  30. {&Sequence{Block: 0xFFFEFF00, Count: 1}, 1, 7},
  31. {&Sequence{Block: 0xFFFEFF00, Count: 100}, 1, 7},
  32. {&Sequence{Block: 0xFFFFC0FF, Count: 0}, -1, -1},
  33. {&Sequence{Block: 0xFFFFC0FF, Count: 1}, 2, 2},
  34. {&Sequence{Block: 0xFFFFC0FF, Count: 100}, 2, 2},
  35. {&Sequence{Block: 0xFFFFFF00, Count: 0}, -1, -1},
  36. {&Sequence{Block: 0xFFFFFF00, Count: 1}, 3, 0},
  37. {&Sequence{Block: 0xFFFFFF00, Count: 100}, 3, 0},
  38. {&Sequence{Block: 0xFFFFFFFE, Count: 0}, -1, -1},
  39. {&Sequence{Block: 0xFFFFFFFE, Count: 1}, 3, 7},
  40. {&Sequence{Block: 0xFFFFFFFE, Count: 100}, 3, 7},
  41. {&Sequence{Block: 0xFFFFFFFF, Count: 0}, -1, -1},
  42. {&Sequence{Block: 0xFFFFFFFF, Count: 1}, -1, -1},
  43. {&Sequence{Block: 0xFFFFFFFF, Count: 100}, -1, -1},
  44. }
  45. for n, i := range input {
  46. b, bb := i.head.GetAvailableBit()
  47. if b != i.bytePos || bb != i.bitPos {
  48. t.Fatalf("Error in Sequence.getAvailableBit() (%d).\nExp: (%d, %d)\nGot: (%d, %d),", n, i.bytePos, i.bitPos, b, bb)
  49. }
  50. }
  51. }
  52. func TestSequenceEqual(t *testing.T) {
  53. input := []struct {
  54. first *Sequence
  55. second *Sequence
  56. areEqual bool
  57. }{
  58. {&Sequence{Block: 0x0, Count: 8, Next: nil}, &Sequence{Block: 0x0, Count: 8}, true},
  59. {&Sequence{Block: 0x0, Count: 0, Next: nil}, &Sequence{Block: 0x0, Count: 0}, true},
  60. {&Sequence{Block: 0x0, Count: 2, Next: nil}, &Sequence{Block: 0x0, Count: 1, Next: &Sequence{Block: 0x0, Count: 1}}, false},
  61. {&Sequence{Block: 0x0, Count: 2, Next: &Sequence{Block: 0x1, Count: 1}}, &Sequence{Block: 0x0, Count: 2}, false},
  62. {&Sequence{Block: 0x12345678, Count: 8, Next: nil}, &Sequence{Block: 0x12345678, Count: 8}, true},
  63. {&Sequence{Block: 0x12345678, Count: 8, Next: nil}, &Sequence{Block: 0x12345678, Count: 9}, false},
  64. {&Sequence{Block: 0x12345678, Count: 1, Next: &Sequence{Block: 0XFFFFFFFF, Count: 1}}, &Sequence{Block: 0x12345678, Count: 1}, false},
  65. {&Sequence{Block: 0x12345678, Count: 1}, &Sequence{Block: 0x12345678, Count: 1, Next: &Sequence{Block: 0XFFFFFFFF, Count: 1}}, false},
  66. }
  67. for n, i := range input {
  68. if i.areEqual != i.first.Equal(i.second) {
  69. t.Fatalf("Error in Sequence.Equal() (%d).\nExp: %t\nGot: %t,", n, i.areEqual, !i.areEqual)
  70. }
  71. }
  72. }
  73. func TestGetFirstAvailable(t *testing.T) {
  74. input := []struct {
  75. mask *Sequence
  76. bytePos int
  77. bitPos int
  78. }{
  79. {&Sequence{Block: 0xffffffff, Count: 2048}, -1, -1},
  80. {&Sequence{Block: 0x0, Count: 8}, 0, 0},
  81. {&Sequence{Block: 0x80000000, Count: 8}, 0, 1},
  82. {&Sequence{Block: 0xC0000000, Count: 8}, 0, 2},
  83. {&Sequence{Block: 0xE0000000, Count: 8}, 0, 3},
  84. {&Sequence{Block: 0xF0000000, Count: 8}, 0, 4},
  85. {&Sequence{Block: 0xF8000000, Count: 8}, 0, 5},
  86. {&Sequence{Block: 0xFC000000, Count: 8}, 0, 6},
  87. {&Sequence{Block: 0xFE000000, Count: 8}, 0, 7},
  88. {&Sequence{Block: 0xffffffff, Count: 1, Next: &Sequence{Block: 0x00000000, Count: 1, Next: &Sequence{Block: 0xffffffff, Count: 6}}}, 4, 0},
  89. {&Sequence{Block: 0xffffffff, Count: 1, Next: &Sequence{Block: 0x80000000, Count: 1, Next: &Sequence{Block: 0xffffffff, Count: 6}}}, 4, 1},
  90. {&Sequence{Block: 0xffffffff, Count: 1, Next: &Sequence{Block: 0xC0000000, Count: 1, Next: &Sequence{Block: 0xffffffff, Count: 6}}}, 4, 2},
  91. {&Sequence{Block: 0xffffffff, Count: 1, Next: &Sequence{Block: 0xE0000000, Count: 1, Next: &Sequence{Block: 0xffffffff, Count: 6}}}, 4, 3},
  92. {&Sequence{Block: 0xffffffff, Count: 1, Next: &Sequence{Block: 0xF0000000, Count: 1, Next: &Sequence{Block: 0xffffffff, Count: 6}}}, 4, 4},
  93. {&Sequence{Block: 0xffffffff, Count: 1, Next: &Sequence{Block: 0xF8000000, Count: 1, Next: &Sequence{Block: 0xffffffff, Count: 6}}}, 4, 5},
  94. {&Sequence{Block: 0xffffffff, Count: 1, Next: &Sequence{Block: 0xFC000000, Count: 1, Next: &Sequence{Block: 0xffffffff, Count: 6}}}, 4, 6},
  95. {&Sequence{Block: 0xffffffff, Count: 1, Next: &Sequence{Block: 0xFE000000, Count: 1, Next: &Sequence{Block: 0xffffffff, Count: 6}}}, 4, 7},
  96. {&Sequence{Block: 0xffffffff, Count: 1, Next: &Sequence{Block: 0xFF000000, Count: 1, Next: &Sequence{Block: 0xffffffff, Count: 6}}}, 5, 0},
  97. {&Sequence{Block: 0xffffffff, Count: 1, Next: &Sequence{Block: 0xFF800000, Count: 1, Next: &Sequence{Block: 0xffffffff, Count: 6}}}, 5, 1},
  98. {&Sequence{Block: 0xffffffff, Count: 1, Next: &Sequence{Block: 0xFFC00000, Count: 1, Next: &Sequence{Block: 0xffffffff, Count: 6}}}, 5, 2},
  99. {&Sequence{Block: 0xffffffff, Count: 1, Next: &Sequence{Block: 0xFFE00000, Count: 1, Next: &Sequence{Block: 0xffffffff, Count: 6}}}, 5, 3},
  100. {&Sequence{Block: 0xffffffff, Count: 1, Next: &Sequence{Block: 0xFFF00000, Count: 1, Next: &Sequence{Block: 0xffffffff, Count: 6}}}, 5, 4},
  101. {&Sequence{Block: 0xffffffff, Count: 1, Next: &Sequence{Block: 0xFFF80000, Count: 1, Next: &Sequence{Block: 0xffffffff, Count: 6}}}, 5, 5},
  102. {&Sequence{Block: 0xffffffff, Count: 1, Next: &Sequence{Block: 0xFFFC0000, Count: 1, Next: &Sequence{Block: 0xffffffff, Count: 6}}}, 5, 6},
  103. {&Sequence{Block: 0xffffffff, Count: 1, Next: &Sequence{Block: 0xFFFE0000, Count: 1, Next: &Sequence{Block: 0xffffffff, Count: 6}}}, 5, 7},
  104. {&Sequence{Block: 0xffffffff, Count: 1, Next: &Sequence{Block: 0xfffffffe, Count: 1, Next: &Sequence{Block: 0xffffffff, Count: 6}}}, 7, 7},
  105. {&Sequence{Block: 0xffffffff, Count: 2, Next: &Sequence{Block: 0x0, Count: 6}}, 8, 0},
  106. }
  107. for n, i := range input {
  108. bytePos, bitPos := GetFirstAvailable(i.mask)
  109. if bytePos != i.bytePos || bitPos != i.bitPos {
  110. t.Fatalf("Error in (%d) getFirstAvailable(). Expected (%d, %d). Got (%d, %d)", n, i.bytePos, i.bitPos, bytePos, bitPos)
  111. }
  112. }
  113. }
  114. func TestFindSequence(t *testing.T) {
  115. input := []struct {
  116. head *Sequence
  117. bytePos int
  118. precBlocks uint32
  119. inBlockBytePos int
  120. }{
  121. {&Sequence{Block: 0xffffffff, Count: 0}, 0, 0, -1},
  122. {&Sequence{Block: 0xffffffff, Count: 0}, 31, 0, -1},
  123. {&Sequence{Block: 0xffffffff, Count: 0}, 100, 0, -1},
  124. {&Sequence{Block: 0x0, Count: 1}, 0, 0, 0},
  125. {&Sequence{Block: 0x0, Count: 1}, 1, 0, 1},
  126. {&Sequence{Block: 0x0, Count: 1}, 31, 0, -1},
  127. {&Sequence{Block: 0x0, Count: 1}, 60, 0, -1},
  128. {&Sequence{Block: 0xffffffff, Count: 10}, 0, 0, 0},
  129. {&Sequence{Block: 0xffffffff, Count: 10}, 3, 0, 3},
  130. {&Sequence{Block: 0xffffffff, Count: 10}, 4, 1, 0},
  131. {&Sequence{Block: 0xffffffff, Count: 10}, 7, 1, 3},
  132. {&Sequence{Block: 0xffffffff, Count: 10}, 8, 2, 0},
  133. {&Sequence{Block: 0xffffffff, Count: 10}, 39, 9, 3},
  134. {&Sequence{Block: 0xffffffff, Count: 10, Next: &Sequence{Block: 0xcc000000, Count: 10}}, 79, 9, 3},
  135. {&Sequence{Block: 0xffffffff, Count: 10, Next: &Sequence{Block: 0xcc000000, Count: 10}}, 80, 0, -1},
  136. }
  137. for n, i := range input {
  138. _, _, precBlocks, inBlockBytePos := findSequence(i.head, i.bytePos)
  139. if precBlocks != i.precBlocks || inBlockBytePos != i.inBlockBytePos {
  140. t.Fatalf("Error in (%d) findSequence(). Expected (%d, %d). Got (%d, %d)", n, i.precBlocks, i.inBlockBytePos, precBlocks, inBlockBytePos)
  141. }
  142. }
  143. }
  144. func TestCheckIfAvailable(t *testing.T) {
  145. input := []struct {
  146. head *Sequence
  147. ordinal int
  148. bytePos int
  149. bitPos int
  150. }{
  151. {&Sequence{Block: 0xffffffff, Count: 0}, 0, -1, -1},
  152. {&Sequence{Block: 0xffffffff, Count: 0}, 31, -1, -1},
  153. {&Sequence{Block: 0xffffffff, Count: 0}, 100, -1, -1},
  154. {&Sequence{Block: 0x0, Count: 1}, 0, 0, 0},
  155. {&Sequence{Block: 0x0, Count: 1}, 1, 0, 1},
  156. {&Sequence{Block: 0x0, Count: 1}, 31, 3, 7},
  157. {&Sequence{Block: 0x0, Count: 1}, 60, -1, -1},
  158. {&Sequence{Block: 0xffffffff, Count: 1, Next: &Sequence{Block: 0x800000ff, Count: 1}}, 31, -1, -1},
  159. {&Sequence{Block: 0xffffffff, Count: 1, Next: &Sequence{Block: 0x800000ff, Count: 1}}, 32, -1, -1},
  160. {&Sequence{Block: 0xffffffff, Count: 1, Next: &Sequence{Block: 0x800000ff, Count: 1}}, 33, 4, 1},
  161. {&Sequence{Block: 0xffffffff, Count: 1, Next: &Sequence{Block: 0xC00000ff, Count: 1}}, 33, -1, -1},
  162. {&Sequence{Block: 0xffffffff, Count: 1, Next: &Sequence{Block: 0xC00000ff, Count: 1}}, 34, 4, 2},
  163. {&Sequence{Block: 0xffffffff, Count: 1, Next: &Sequence{Block: 0xC00000ff, Count: 1, Next: &Sequence{Block: 0x0, Count: 1}}}, 55, 6, 7},
  164. {&Sequence{Block: 0xffffffff, Count: 1, Next: &Sequence{Block: 0xC00000ff, Count: 1, Next: &Sequence{Block: 0x0, Count: 1}}}, 56, -1, -1},
  165. {&Sequence{Block: 0xffffffff, Count: 1, Next: &Sequence{Block: 0xC00000ff, Count: 1, Next: &Sequence{Block: 0x0, Count: 1}}}, 63, -1, -1},
  166. {&Sequence{Block: 0xffffffff, Count: 1, Next: &Sequence{Block: 0xC00000ff, Count: 1, Next: &Sequence{Block: 0x0, Count: 1}}}, 64, 8, 0},
  167. {&Sequence{Block: 0xffffffff, Count: 1, Next: &Sequence{Block: 0xC00000ff, Count: 1, Next: &Sequence{Block: 0x0, Count: 1}}}, 95, 11, 7},
  168. {&Sequence{Block: 0xffffffff, Count: 1, Next: &Sequence{Block: 0xC00000ff, Count: 1, Next: &Sequence{Block: 0x0, Count: 1}}}, 96, -1, -1},
  169. }
  170. for n, i := range input {
  171. bytePos, bitPos := CheckIfAvailable(i.head, i.ordinal)
  172. if bytePos != i.bytePos || bitPos != i.bitPos {
  173. t.Fatalf("Error in (%d) checkIfAvailable(ord:%d). Expected (%d, %d). Got (%d, %d)", n, i.ordinal, i.bytePos, i.bitPos, bytePos, bitPos)
  174. }
  175. }
  176. }
  177. func TestMergeSequences(t *testing.T) {
  178. input := []struct {
  179. original *Sequence
  180. merged *Sequence
  181. }{
  182. {&Sequence{Block: 0xFE000000, Count: 8, Next: &Sequence{Block: 0xFE000000, Count: 2}}, &Sequence{Block: 0xFE000000, Count: 10}},
  183. {&Sequence{Block: 0xFFFFFFFF, Count: 8, Next: &Sequence{Block: 0xFFFFFFFF, Count: 1}}, &Sequence{Block: 0xFFFFFFFF, Count: 9}},
  184. {&Sequence{Block: 0xFFFFFFFF, Count: 1, Next: &Sequence{Block: 0xFFFFFFFF, Count: 8}}, &Sequence{Block: 0xFFFFFFFF, Count: 9}},
  185. {&Sequence{Block: 0xFFFFFFF0, Count: 8, Next: &Sequence{Block: 0xFFFFFFF0, Count: 1}}, &Sequence{Block: 0xFFFFFFF0, Count: 9}},
  186. {&Sequence{Block: 0xFFFFFFF0, Count: 1, Next: &Sequence{Block: 0xFFFFFFF0, Count: 8}}, &Sequence{Block: 0xFFFFFFF0, Count: 9}},
  187. {&Sequence{Block: 0xFE, Count: 8, Next: &Sequence{Block: 0xFE, Count: 1, Next: &Sequence{Block: 0xFE, Count: 5}}}, &Sequence{Block: 0xFE, Count: 14}},
  188. {&Sequence{Block: 0xFE, Count: 8, Next: &Sequence{Block: 0xFE, Count: 1, Next: &Sequence{Block: 0xFE, Count: 5, Next: &Sequence{Block: 0xFF, Count: 1}}}},
  189. &Sequence{Block: 0xFE, Count: 14, Next: &Sequence{Block: 0xFF, Count: 1}}},
  190. // No merge
  191. {&Sequence{Block: 0xFE, Count: 8, Next: &Sequence{Block: 0xF8, Count: 1, Next: &Sequence{Block: 0xFE, Count: 5}}},
  192. &Sequence{Block: 0xFE, Count: 8, Next: &Sequence{Block: 0xF8, Count: 1, Next: &Sequence{Block: 0xFE, Count: 5}}}},
  193. // No merge from head: // Merge function tries to merge from passed head. If it can't merge with Next, it does not reattempt with Next as head
  194. {&Sequence{Block: 0xFE, Count: 8, Next: &Sequence{Block: 0xFF, Count: 1, Next: &Sequence{Block: 0xFF, Count: 5}}},
  195. &Sequence{Block: 0xFE, Count: 8, Next: &Sequence{Block: 0xFF, Count: 6}}},
  196. }
  197. for n, i := range input {
  198. mergeSequences(i.original)
  199. for !i.merged.Equal(i.original) {
  200. t.Fatalf("Error in (%d) mergeSequences().\nExp: %s\nGot: %s,", n, i.merged, i.original)
  201. }
  202. }
  203. }
  204. func TestPushReservation(t *testing.T) {
  205. input := []struct {
  206. mask *Sequence
  207. bytePos int
  208. bitPos int
  209. newMask *Sequence
  210. }{
  211. // Create first Sequence and fill in 8 addresses starting from address 0
  212. {&Sequence{Block: 0x0, Count: 8, Next: nil}, 0, 0, &Sequence{Block: 0x80000000, Count: 1, Next: &Sequence{Block: 0x0, Count: 7, Next: nil}}},
  213. {&Sequence{Block: 0x80000000, Count: 8}, 0, 1, &Sequence{Block: 0xC0000000, Count: 1, Next: &Sequence{Block: 0x80000000, Count: 7, Next: nil}}},
  214. {&Sequence{Block: 0xC0000000, Count: 8}, 0, 2, &Sequence{Block: 0xE0000000, Count: 1, Next: &Sequence{Block: 0xC0000000, Count: 7, Next: nil}}},
  215. {&Sequence{Block: 0xE0000000, Count: 8}, 0, 3, &Sequence{Block: 0xF0000000, Count: 1, Next: &Sequence{Block: 0xE0000000, Count: 7, Next: nil}}},
  216. {&Sequence{Block: 0xF0000000, Count: 8}, 0, 4, &Sequence{Block: 0xF8000000, Count: 1, Next: &Sequence{Block: 0xF0000000, Count: 7, Next: nil}}},
  217. {&Sequence{Block: 0xF8000000, Count: 8}, 0, 5, &Sequence{Block: 0xFC000000, Count: 1, Next: &Sequence{Block: 0xF8000000, Count: 7, Next: nil}}},
  218. {&Sequence{Block: 0xFC000000, Count: 8}, 0, 6, &Sequence{Block: 0xFE000000, Count: 1, Next: &Sequence{Block: 0xFC000000, Count: 7, Next: nil}}},
  219. {&Sequence{Block: 0xFE000000, Count: 8}, 0, 7, &Sequence{Block: 0xFF000000, Count: 1, Next: &Sequence{Block: 0xFE000000, Count: 7, Next: nil}}},
  220. {&Sequence{Block: 0x80000000, Count: 1, Next: &Sequence{Block: 0x0, Count: 7}}, 0, 1, &Sequence{Block: 0xC0000000, Count: 1, Next: &Sequence{Block: 0x0, Count: 7, Next: nil}}},
  221. // Create second Sequence and fill in 8 addresses starting from address 32
  222. {&Sequence{Block: 0xffffffff, Count: 1, Next: &Sequence{Block: 0x00000000, Count: 1, Next: &Sequence{Block: 0xffffffff, Count: 6, Next: nil}}}, 4, 0,
  223. &Sequence{Block: 0xffffffff, Count: 1, Next: &Sequence{Block: 0x80000000, Count: 1, Next: &Sequence{Block: 0xffffffff, Count: 6}}}},
  224. {&Sequence{Block: 0xffffffff, Count: 1, Next: &Sequence{Block: 0x80000000, Count: 1, Next: &Sequence{Block: 0xffffffff, Count: 6}}}, 4, 1,
  225. &Sequence{Block: 0xffffffff, Count: 1, Next: &Sequence{Block: 0xC0000000, Count: 1, Next: &Sequence{Block: 0xffffffff, Count: 6}}}},
  226. {&Sequence{Block: 0xffffffff, Count: 1, Next: &Sequence{Block: 0xC0000000, Count: 1, Next: &Sequence{Block: 0xffffffff, Count: 6}}}, 4, 2,
  227. &Sequence{Block: 0xffffffff, Count: 1, Next: &Sequence{Block: 0xE0000000, Count: 1, Next: &Sequence{Block: 0xffffffff, Count: 6}}}},
  228. {&Sequence{Block: 0xffffffff, Count: 1, Next: &Sequence{Block: 0xE0000000, Count: 1, Next: &Sequence{Block: 0xffffffff, Count: 6}}}, 4, 3,
  229. &Sequence{Block: 0xffffffff, Count: 1, Next: &Sequence{Block: 0xF0000000, Count: 1, Next: &Sequence{Block: 0xffffffff, Count: 6}}}},
  230. {&Sequence{Block: 0xffffffff, Count: 1, Next: &Sequence{Block: 0xF0000000, Count: 1, Next: &Sequence{Block: 0xffffffff, Count: 6}}}, 4, 4,
  231. &Sequence{Block: 0xffffffff, Count: 1, Next: &Sequence{Block: 0xF8000000, Count: 1, Next: &Sequence{Block: 0xffffffff, Count: 6}}}},
  232. {&Sequence{Block: 0xffffffff, Count: 1, Next: &Sequence{Block: 0xF8000000, Count: 1, Next: &Sequence{Block: 0xffffffff, Count: 6}}}, 4, 5,
  233. &Sequence{Block: 0xffffffff, Count: 1, Next: &Sequence{Block: 0xFC000000, Count: 1, Next: &Sequence{Block: 0xffffffff, Count: 6}}}},
  234. {&Sequence{Block: 0xffffffff, Count: 1, Next: &Sequence{Block: 0xFC000000, Count: 1, Next: &Sequence{Block: 0xffffffff, Count: 6}}}, 4, 6,
  235. &Sequence{Block: 0xffffffff, Count: 1, Next: &Sequence{Block: 0xFE000000, Count: 1, Next: &Sequence{Block: 0xffffffff, Count: 6}}}},
  236. {&Sequence{Block: 0xffffffff, Count: 1, Next: &Sequence{Block: 0xFE000000, Count: 1, Next: &Sequence{Block: 0xffffffff, Count: 6}}}, 4, 7,
  237. &Sequence{Block: 0xffffffff, Count: 1, Next: &Sequence{Block: 0xFF000000, Count: 1, Next: &Sequence{Block: 0xffffffff, Count: 6}}}},
  238. // fill in 8 addresses starting from address 40
  239. {&Sequence{Block: 0xffffffff, Count: 1, Next: &Sequence{Block: 0xFF000000, Count: 1, Next: &Sequence{Block: 0xffffffff, Count: 6}}}, 5, 0,
  240. &Sequence{Block: 0xffffffff, Count: 1, Next: &Sequence{Block: 0xFF800000, Count: 1, Next: &Sequence{Block: 0xffffffff, Count: 6}}}},
  241. {&Sequence{Block: 0xffffffff, Count: 1, Next: &Sequence{Block: 0xFF800000, Count: 1, Next: &Sequence{Block: 0xffffffff, Count: 6}}}, 5, 1,
  242. &Sequence{Block: 0xffffffff, Count: 1, Next: &Sequence{Block: 0xFFC00000, Count: 1, Next: &Sequence{Block: 0xffffffff, Count: 6}}}},
  243. {&Sequence{Block: 0xffffffff, Count: 1, Next: &Sequence{Block: 0xFFC00000, Count: 1, Next: &Sequence{Block: 0xffffffff, Count: 6}}}, 5, 2,
  244. &Sequence{Block: 0xffffffff, Count: 1, Next: &Sequence{Block: 0xFFE00000, Count: 1, Next: &Sequence{Block: 0xffffffff, Count: 6}}}},
  245. {&Sequence{Block: 0xffffffff, Count: 1, Next: &Sequence{Block: 0xFFE00000, Count: 1, Next: &Sequence{Block: 0xffffffff, Count: 6}}}, 5, 3,
  246. &Sequence{Block: 0xffffffff, Count: 1, Next: &Sequence{Block: 0xFFF00000, Count: 1, Next: &Sequence{Block: 0xffffffff, Count: 6}}}},
  247. {&Sequence{Block: 0xffffffff, Count: 1, Next: &Sequence{Block: 0xFFF00000, Count: 1, Next: &Sequence{Block: 0xffffffff, Count: 6}}}, 5, 4,
  248. &Sequence{Block: 0xffffffff, Count: 1, Next: &Sequence{Block: 0xFFF80000, Count: 1, Next: &Sequence{Block: 0xffffffff, Count: 6}}}},
  249. {&Sequence{Block: 0xffffffff, Count: 1, Next: &Sequence{Block: 0xFFF80000, Count: 1, Next: &Sequence{Block: 0xffffffff, Count: 6}}}, 5, 5,
  250. &Sequence{Block: 0xffffffff, Count: 1, Next: &Sequence{Block: 0xFFFC0000, Count: 1, Next: &Sequence{Block: 0xffffffff, Count: 6}}}},
  251. {&Sequence{Block: 0xffffffff, Count: 1, Next: &Sequence{Block: 0xFFFC0000, Count: 1, Next: &Sequence{Block: 0xffffffff, Count: 6}}}, 5, 6,
  252. &Sequence{Block: 0xffffffff, Count: 1, Next: &Sequence{Block: 0xFFFE0000, Count: 1, Next: &Sequence{Block: 0xffffffff, Count: 6}}}},
  253. {&Sequence{Block: 0xffffffff, Count: 1, Next: &Sequence{Block: 0xFFFE0000, Count: 1, Next: &Sequence{Block: 0xffffffff, Count: 6}}}, 5, 7,
  254. &Sequence{Block: 0xffffffff, Count: 1, Next: &Sequence{Block: 0xFFFF0000, Count: 1, Next: &Sequence{Block: 0xffffffff, Count: 6}}}},
  255. // Insert new Sequence
  256. {&Sequence{Block: 0xffffffff, Count: 2, Next: &Sequence{Block: 0x0, Count: 6}}, 8, 0,
  257. &Sequence{Block: 0xffffffff, Count: 2, Next: &Sequence{Block: 0x80000000, Count: 1, Next: &Sequence{Block: 0x0, Count: 5}}}},
  258. {&Sequence{Block: 0xffffffff, Count: 2, Next: &Sequence{Block: 0x80000000, Count: 1, Next: &Sequence{Block: 0x0, Count: 5}}}, 8, 1,
  259. &Sequence{Block: 0xffffffff, Count: 2, Next: &Sequence{Block: 0xC0000000, Count: 1, Next: &Sequence{Block: 0x0, Count: 5}}}},
  260. // Merge affected with Next
  261. {&Sequence{Block: 0xffffffff, Count: 7, Next: &Sequence{Block: 0xfffffffe, Count: 2, Next: &Sequence{Block: 0xffffffff, Count: 1}}}, 31, 7,
  262. &Sequence{Block: 0xffffffff, Count: 8, Next: &Sequence{Block: 0xfffffffe, Count: 1, Next: &Sequence{Block: 0xffffffff, Count: 1}}}},
  263. {&Sequence{Block: 0xffffffff, Count: 1, Next: &Sequence{Block: 0xfffffffc, Count: 1, Next: &Sequence{Block: 0xfffffffe, Count: 6}}}, 7, 6,
  264. &Sequence{Block: 0xffffffff, Count: 1, Next: &Sequence{Block: 0xfffffffe, Count: 7}}},
  265. // Merge affected with Next and Next.Next
  266. {&Sequence{Block: 0xffffffff, Count: 7, Next: &Sequence{Block: 0xfffffffe, Count: 1, Next: &Sequence{Block: 0xffffffff, Count: 1}}}, 31, 7,
  267. &Sequence{Block: 0xffffffff, Count: 9}},
  268. {&Sequence{Block: 0xffffffff, Count: 7, Next: &Sequence{Block: 0xfffffffe, Count: 1}}, 31, 7,
  269. &Sequence{Block: 0xffffffff, Count: 8}},
  270. // Merge affected with previous and Next
  271. {&Sequence{Block: 0xffffffff, Count: 7, Next: &Sequence{Block: 0xfffffffe, Count: 1, Next: &Sequence{Block: 0xffffffff, Count: 1}}}, 31, 7,
  272. &Sequence{Block: 0xffffffff, Count: 9}},
  273. // Redundant push: No change
  274. {&Sequence{Block: 0xffff0000, Count: 1}, 0, 0, &Sequence{Block: 0xffff0000, Count: 1}},
  275. {&Sequence{Block: 0xffff0000, Count: 7}, 25, 7, &Sequence{Block: 0xffff0000, Count: 7}},
  276. {&Sequence{Block: 0xffffffff, Count: 7, Next: &Sequence{Block: 0xfffffffe, Count: 1, Next: &Sequence{Block: 0xffffffff, Count: 1}}}, 7, 7,
  277. &Sequence{Block: 0xffffffff, Count: 7, Next: &Sequence{Block: 0xfffffffe, Count: 1, Next: &Sequence{Block: 0xffffffff, Count: 1}}}},
  278. }
  279. for n, i := range input {
  280. mask := PushReservation(i.bytePos, i.bitPos, i.mask, false)
  281. if !mask.Equal(i.newMask) {
  282. t.Fatalf("Error in (%d) pushReservation():\n%s + (%d,%d):\nExp: %s\nGot: %s,", n, i.mask, i.bytePos, i.bitPos, i.newMask, mask)
  283. }
  284. }
  285. }
  286. func TestSerializeDeserialize(t *testing.T) {
  287. s := &Sequence{
  288. Block: 0xffffffff,
  289. Count: 1,
  290. Next: &Sequence{
  291. Block: 0xFF000000,
  292. Count: 1,
  293. Next: &Sequence{
  294. Block: 0xffffffff,
  295. Count: 6,
  296. Next: &Sequence{
  297. Block: 0xffffffff,
  298. Count: 1,
  299. Next: &Sequence{
  300. Block: 0xFF800000,
  301. Count: 1,
  302. Next: &Sequence{
  303. Block: 0xffffffff,
  304. Count: 6,
  305. },
  306. },
  307. },
  308. },
  309. },
  310. }
  311. data, err := s.ToByteArray()
  312. if err != nil {
  313. t.Fatal(err)
  314. }
  315. r := &Sequence{}
  316. err = r.FromByteArray(data)
  317. if err != nil {
  318. t.Fatal(err)
  319. }
  320. if !s.Equal(r) {
  321. t.Fatalf("Sequences are different: \n%v\n%v", s, r)
  322. }
  323. }