You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

range_test.go 6.2 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332
  1. package cache
  2. import (
  3. "testing"
  4. . "github.com/smartystreets/goconvey/convey"
  5. )
  6. func Test_FirstContainsIndex(t *testing.T) {
  7. cases := []struct {
  8. title string
  9. arr []*Range
  10. pos int64
  11. want int
  12. }{
  13. {
  14. "空数组",
  15. []*Range{},
  16. 100,
  17. -1,
  18. },
  19. {
  20. "只有一个元素,pos在范围内",
  21. []*Range{{100, 100}},
  22. 100,
  23. 0,
  24. },
  25. {
  26. "区间不连续,但在范围内-奇数区间数",
  27. []*Range{{100, 100}, {300, 100}, {500, 100}},
  28. 350,
  29. 1,
  30. },
  31. {
  32. "区间不连续,但在范围内-偶数区间数",
  33. []*Range{{100, 100}, {300, 100}},
  34. 350,
  35. 1,
  36. },
  37. {
  38. "区间不连续,pos在最左边",
  39. []*Range{{100, 100}, {300, 100}, {500, 100}},
  40. 10,
  41. -1,
  42. },
  43. {
  44. "区间不连续,pos在靠左的第一个空洞中",
  45. []*Range{{100, 100}, {300, 100}, {500, 100}},
  46. 200,
  47. 0,
  48. },
  49. {
  50. "区间不连续,pos在靠左的第一个空洞中-偶数区间数",
  51. []*Range{{100, 100}, {300, 100}, {500, 100}, {700, 100}},
  52. 200,
  53. 0,
  54. },
  55. {
  56. "区间不连续,pos在最右边",
  57. []*Range{{100, 100}, {300, 100}, {500, 100}},
  58. 601,
  59. 2,
  60. },
  61. }
  62. for _, c := range cases {
  63. Convey(c.title, t, func() {
  64. got := FirstContainsIndex(c.arr, c.pos)
  65. So(got, ShouldEqual, c.want)
  66. })
  67. }
  68. }
  69. func Test_AddRange(t *testing.T) {
  70. cases := []struct {
  71. title string
  72. arr []*Range
  73. r *Range
  74. want []*Range
  75. }{
  76. {
  77. "空数组",
  78. []*Range{},
  79. &Range{100, 100},
  80. []*Range{{100, 100}},
  81. },
  82. {
  83. "单个区间,连接在左侧",
  84. []*Range{{100, 100}},
  85. &Range{0, 100},
  86. []*Range{{0, 200}},
  87. },
  88. {
  89. "单个区间,连接在右侧",
  90. []*Range{{100, 100}},
  91. &Range{200, 100},
  92. []*Range{{100, 200}},
  93. },
  94. {
  95. "单个区间,左边重叠了一部分",
  96. []*Range{{100, 100}},
  97. &Range{50, 100},
  98. []*Range{{50, 150}},
  99. },
  100. {
  101. "单个区间,右边重叠了一部分",
  102. []*Range{{100, 100}},
  103. &Range{150, 100},
  104. []*Range{{100, 150}},
  105. },
  106. {
  107. "单个区间,被新区间完全覆盖",
  108. []*Range{{100, 100}},
  109. &Range{50, 150},
  110. []*Range{{50, 150}},
  111. },
  112. {
  113. "单个区间,在左边但有空洞",
  114. []*Range{{100, 100}},
  115. &Range{0, 50},
  116. []*Range{{0, 50}, {100, 100}},
  117. },
  118. {
  119. "单个区间,在右边但有空洞",
  120. []*Range{{100, 100}},
  121. &Range{250, 50},
  122. []*Range{{100, 100}, {250, 50}},
  123. },
  124. {
  125. "恰好连接了两个区间",
  126. []*Range{{100, 100}, {300, 100}},
  127. &Range{200, 100},
  128. []*Range{{100, 300}},
  129. },
  130. {
  131. "连接了两个区间,但在左边有重叠",
  132. []*Range{{100, 100}, {300, 100}},
  133. &Range{150, 150},
  134. []*Range{{100, 300}},
  135. },
  136. {
  137. "连接了两个区间,但在右边有重叠",
  138. []*Range{{100, 100}, {300, 100}},
  139. &Range{150, 200},
  140. []*Range{{100, 300}},
  141. },
  142. {
  143. "覆盖了多个区间,但不是完全连接",
  144. []*Range{{100, 100}, {300, 100}, {500, 100}, {700, 100}},
  145. &Range{150, 400},
  146. []*Range{{100, 500}, {700, 100}},
  147. },
  148. {
  149. "完全覆盖所有区间",
  150. []*Range{{100, 100}, {300, 100}, {500, 100}, {700, 100}},
  151. &Range{0, 900},
  152. []*Range{{0, 900}},
  153. },
  154. }
  155. for _, c := range cases {
  156. Convey(c.title, t, func() {
  157. got := AddRange(c.arr, c.r)
  158. So(got, ShouldResemble, c.want)
  159. })
  160. }
  161. }
  162. func Test_MergeRanges(t *testing.T) {
  163. cases := []struct {
  164. title string
  165. arr1 []*Range
  166. arr2 []*Range
  167. want []*Range
  168. }{
  169. {
  170. "两个都是空数组",
  171. []*Range{},
  172. []*Range{},
  173. nil,
  174. },
  175. {
  176. "其中一个是空数组",
  177. []*Range{{100, 100}},
  178. []*Range{},
  179. []*Range{{100, 100}},
  180. },
  181. {
  182. "两个都是单个区间,没有重叠",
  183. []*Range{{100, 100}},
  184. []*Range{{300, 100}},
  185. []*Range{{100, 100}, {300, 100}},
  186. },
  187. {
  188. "两个都是单个区间,恰好连接",
  189. []*Range{{100, 100}},
  190. []*Range{{200, 100}},
  191. []*Range{{100, 200}},
  192. },
  193. {
  194. "两个都是单个区间,有重叠",
  195. []*Range{{100, 100}},
  196. []*Range{{150, 100}},
  197. []*Range{{100, 150}},
  198. },
  199. {
  200. "多区间恰好连接",
  201. []*Range{{100, 100}, {300, 100}, {500, 100}},
  202. []*Range{{200, 100}, {400, 100}},
  203. []*Range{{100, 500}},
  204. },
  205. {
  206. "多区间各种情况",
  207. []*Range{{100, 100}, {300, 100}, {500, 100}, {700, 100}},
  208. []*Range{{150, 100}, {260, 90}, {400, 100}, {550, 250}},
  209. []*Range{{100, 150}, {260, 540}},
  210. },
  211. }
  212. for _, c := range cases {
  213. Convey(c.title, t, func() {
  214. got := MergeRanges(c.arr1, c.arr2)
  215. So(got, ShouldResemble, c.want)
  216. })
  217. }
  218. }
  219. func Test_TruncateRange(t *testing.T) {
  220. cases := []struct {
  221. title string
  222. arr []*Range
  223. pos int64
  224. want []*Range
  225. }{
  226. {
  227. "空数组",
  228. []*Range{},
  229. 100,
  230. []*Range{},
  231. },
  232. {
  233. "截断的长度比现有长",
  234. []*Range{{100, 100}},
  235. 300,
  236. []*Range{{100, 100}},
  237. },
  238. {
  239. "截断的长度等于现有长",
  240. []*Range{{100, 100}},
  241. 200,
  242. []*Range{{100, 100}},
  243. },
  244. {
  245. "截断的长度小于现有长",
  246. []*Range{{100, 100}, {300, 100}},
  247. 150,
  248. []*Range{{100, 50}},
  249. },
  250. {
  251. "截断了所有",
  252. []*Range{{100, 100}, {300, 100}},
  253. 0,
  254. []*Range{},
  255. },
  256. {
  257. "截断的位置在空洞内",
  258. []*Range{{100, 100}, {300, 100}},
  259. 250,
  260. []*Range{{100, 100}},
  261. },
  262. }
  263. for _, c := range cases {
  264. Convey(c.title, t, func() {
  265. got := TruncateRange(c.arr, c.pos)
  266. So(got, ShouldResemble, c.want)
  267. })
  268. }
  269. }
  270. func Test_DifferentRange(t *testing.T) {
  271. cases := []struct {
  272. title string
  273. rng *Range
  274. arr []*Range
  275. want *Range
  276. }{
  277. {
  278. "空数组",
  279. &Range{100, 100},
  280. []*Range{},
  281. &Range{100, 100},
  282. },
  283. {
  284. "区间的右边被截断",
  285. &Range{50, 150},
  286. []*Range{{100, 100}, {300, 100}},
  287. &Range{50, 50},
  288. },
  289. {
  290. "区间的左边被截断",
  291. &Range{150, 150},
  292. []*Range{{100, 100}, {300, 100}},
  293. &Range{200, 100},
  294. },
  295. {
  296. "区间被彻底截断",
  297. &Range{100, 100},
  298. []*Range{{100, 100}, {300, 100}},
  299. &Range{200, 0},
  300. },
  301. {
  302. "区间被截断成多份1",
  303. &Range{0, 400},
  304. []*Range{{100, 100}, {300, 100}},
  305. &Range{0, 100},
  306. },
  307. {
  308. "区间被截断成多份2",
  309. &Range{100, 300},
  310. []*Range{{100, 100}, {300, 100}},
  311. &Range{200, 100},
  312. },
  313. }
  314. for _, c := range cases {
  315. Convey(c.title, t, func() {
  316. DifferentRange(c.rng, c.arr)
  317. So(c.rng, ShouldResemble, c.want)
  318. })
  319. }
  320. }

本项目旨在将云际存储公共基础设施化,使个人及企业可低门槛使用高效的云际存储服务(安装开箱即用云际存储客户端即可,无需关注其他组件的部署),同时支持用户灵活便捷定制云际存储的功能细节。