col_test.go 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589
  1. package xlsx
  2. import (
  3. "testing"
  4. qt "github.com/frankban/quicktest"
  5. . "gopkg.in/check.v1"
  6. )
  7. var notNil = qt.Not(qt.IsNil)
  8. func TestNewColForRange(t *testing.T) {
  9. c := qt.New(t)
  10. col := NewColForRange(30, 45)
  11. c.Assert(col, notNil)
  12. c.Assert(col.Min, qt.Equals, 30)
  13. c.Assert(col.Max, qt.Equals, 45)
  14. // Auto fix the min/max
  15. col = NewColForRange(45, 30)
  16. c.Assert(col, notNil)
  17. c.Assert(col.Min, qt.Equals, 30)
  18. c.Assert(col.Max, qt.Equals, 45)
  19. }
  20. func TestCol(t *testing.T) {
  21. c := qt.New(t)
  22. c.Run("SetType", func(c *qt.C) {
  23. expectations := map[CellType]string{
  24. CellTypeString: builtInNumFmt[builtInNumFmtIndex_STRING],
  25. CellTypeNumeric: builtInNumFmt[builtInNumFmtIndex_INT],
  26. CellTypeBool: builtInNumFmt[builtInNumFmtIndex_GENERAL],
  27. CellTypeInline: builtInNumFmt[builtInNumFmtIndex_STRING],
  28. CellTypeError: builtInNumFmt[builtInNumFmtIndex_GENERAL],
  29. CellTypeDate: builtInNumFmt[builtInNumFmtIndex_GENERAL],
  30. CellTypeStringFormula: builtInNumFmt[builtInNumFmtIndex_STRING],
  31. }
  32. assertSetType := func(cellType CellType, expectation string) {
  33. col := &Col{}
  34. col.SetType(cellType)
  35. c.Assert(col.numFmt, qt.Equals, expectation)
  36. }
  37. for k, v := range expectations {
  38. assertSetType(k, v)
  39. }
  40. })
  41. c.Run("SetWidth", func(c *qt.C) {
  42. col := &Col{}
  43. col.SetWidth(20.2)
  44. c.Assert(col.Width, qt.Equals, 20.2)
  45. c.Assert(col.CustomWidth, qt.Equals, true)
  46. })
  47. c.Run("copyToRange", func(c *qt.C) {
  48. nf := &parsedNumberFormat{}
  49. s := &Style{}
  50. cdv1 := &xlsxCellDataValidation{}
  51. cdv2 := &xlsxCellDataValidation{}
  52. ct := CellTypeBool.Ptr()
  53. c1 := &Col{
  54. Min: 1,
  55. Max: 11,
  56. Hidden: true,
  57. Width: 300.4,
  58. Collapsed: true,
  59. OutlineLevel: 2,
  60. numFmt: "-0.00",
  61. parsedNumFmt: nf,
  62. style: s,
  63. DataValidation: []*xlsxCellDataValidation{cdv1, cdv2},
  64. defaultCellType: ct,
  65. }
  66. c2 := c1.copyToRange(4, 10)
  67. c.Assert(c2.Min, qt.Equals, 4)
  68. c.Assert(c2.Max, qt.Equals, 10)
  69. c.Assert(c2.Hidden, qt.Equals, c1.Hidden)
  70. c.Assert(c2.Width, qt.Equals, c1.Width)
  71. c.Assert(c2.Collapsed, qt.Equals, c1.Collapsed)
  72. c.Assert(c2.OutlineLevel, qt.Equals, c1.OutlineLevel)
  73. c.Assert(c2.numFmt, qt.Equals, c1.numFmt)
  74. c.Assert(c2.parsedNumFmt, qt.Equals, c1.parsedNumFmt)
  75. c.Assert(c2.style, qt.Equals, c1.style)
  76. c.Assert(c2.DataValidation, qt.HasLen, 2)
  77. c.Assert(c2.DataValidation[0], qt.Equals, c1.DataValidation[0])
  78. c.Assert(c2.DataValidation[1], qt.Equals, c1.DataValidation[1])
  79. c.Assert(c2.defaultCellType, qt.Equals, c1.defaultCellType)
  80. })
  81. }
  82. type ColStoreSuite struct{}
  83. var _ = Suite(&ColStoreSuite{})
  84. func (css *ColStoreSuite) TestAddRootNode(c *C) {
  85. col := &Col{Min: 1, Max: 1}
  86. cs := ColStore{}
  87. cs.Add(col)
  88. c.Assert(cs.Len, Equals, 1)
  89. c.Assert(cs.Root.Col, Equals, col)
  90. }
  91. func TestMakeWay(t *testing.T) {
  92. c := qt.New(t)
  93. assertWayMade := func(cols []*Col, chainFunc func(*ColStore)) {
  94. cs := &ColStore{}
  95. for _, col := range cols {
  96. _ = cs.Add(col)
  97. }
  98. chainFunc(cs)
  99. }
  100. // Col1: |--|
  101. // Col2: |--|
  102. assertWayMade([]*Col{&Col{Min: 1, Max: 2}, &Col{Min: 3, Max: 4}},
  103. func(cs *ColStore) {
  104. c.Assert(cs.Len, qt.Equals, 2)
  105. root := cs.Root
  106. c.Assert(root.Col.Min, qt.Equals, 1)
  107. c.Assert(root.Col.Max, qt.Equals, 2)
  108. c.Assert(root.Prev, qt.IsNil)
  109. c.Assert(root.Next, notNil)
  110. node2 := root.Next
  111. c.Assert(node2.Prev, qt.Equals, root)
  112. c.Assert(node2.Next, qt.IsNil)
  113. c.Assert(node2.Col.Min, qt.Equals, 3)
  114. c.Assert(node2.Col.Max, qt.Equals, 4)
  115. })
  116. // Col1: |--|
  117. // Col2: |--|
  118. assertWayMade([]*Col{&Col{Min: 3, Max: 4}, &Col{Min: 1, Max: 2}},
  119. func(cs *ColStore) {
  120. root := cs.Root
  121. c.Assert(cs.Len, qt.Equals, 2)
  122. c.Assert(root.Col.Min, qt.Equals, 3)
  123. c.Assert(root.Col.Max, qt.Equals, 4)
  124. c.Assert(root.Prev, notNil)
  125. c.Assert(root.Next, qt.IsNil)
  126. node2 := root.Prev
  127. c.Assert(node2.Next, qt.Equals, root)
  128. c.Assert(node2.Prev, qt.IsNil)
  129. c.Assert(node2.Col.Min, qt.Equals, 1)
  130. c.Assert(node2.Col.Max, qt.Equals, 2)
  131. })
  132. // Col1: |--x|
  133. // Col2: |--|
  134. assertWayMade([]*Col{&Col{Min: 1, Max: 3}, &Col{Min: 3, Max: 4}},
  135. func(cs *ColStore) {
  136. root := cs.Root
  137. c.Assert(cs.Len, qt.Equals, 2)
  138. c.Assert(root.Col.Min, qt.Equals, 1)
  139. c.Assert(root.Col.Max, qt.Equals, 2)
  140. c.Assert(root.Prev, qt.IsNil)
  141. c.Assert(root.Next, notNil)
  142. node2 := root.Next
  143. c.Assert(node2.Prev, qt.Equals, root)
  144. c.Assert(node2.Next, qt.IsNil)
  145. c.Assert(node2.Col.Min, qt.Equals, 3)
  146. c.Assert(node2.Col.Max, qt.Equals, 4)
  147. })
  148. // Col1: |x-|
  149. // Col2: |--|
  150. assertWayMade([]*Col{&Col{Min: 2, Max: 3}, &Col{Min: 1, Max: 2}},
  151. func(cs *ColStore) {
  152. root := cs.Root
  153. c.Assert(cs.Len, qt.Equals, 2)
  154. c.Assert(root.Col.Min, qt.Equals, 3)
  155. c.Assert(root.Col.Max, qt.Equals, 3)
  156. c.Assert(root.Prev, notNil)
  157. c.Assert(root.Next, qt.IsNil)
  158. node2 := root.Prev
  159. c.Assert(node2.Next, qt.Equals, root)
  160. c.Assert(node2.Prev, qt.IsNil)
  161. c.Assert(node2.Col.Min, qt.Equals, 1)
  162. c.Assert(node2.Col.Max, qt.Equals, 2)
  163. })
  164. // Col1: |---xx---|
  165. // Col2: |--|
  166. assertWayMade([]*Col{&Col{Min: 1, Max: 8}, &Col{Min: 4, Max: 5}},
  167. func(cs *ColStore) {
  168. root := cs.Root
  169. c.Assert(cs.Len, qt.Equals, 3)
  170. c.Assert(root.Prev, qt.IsNil)
  171. c.Assert(root.Next, notNil)
  172. c.Assert(root.Col.Min, qt.Equals, 1)
  173. c.Assert(root.Col.Max, qt.Equals, 3)
  174. node2 := root.Next
  175. c.Assert(node2.Prev, qt.Equals, root)
  176. c.Assert(node2.Col.Min, qt.Equals, 4)
  177. c.Assert(node2.Col.Max, qt.Equals, 5)
  178. c.Assert(node2.Next, notNil)
  179. node3 := node2.Next
  180. c.Assert(node3.Prev, qt.Equals, node2)
  181. c.Assert(node3.Next, qt.IsNil)
  182. c.Assert(node3.Col.Min, qt.Equals, 6)
  183. c.Assert(node3.Col.Max, qt.Equals, 8)
  184. })
  185. // Col1: |xx|
  186. // Col2: |--|
  187. assertWayMade([]*Col{&Col{Min: 1, Max: 2, Width: 40.1}, &Col{Min: 1, Max: 2, Width: 10.0}},
  188. func(cs *ColStore) {
  189. root := cs.Root
  190. c.Assert(cs.Len, qt.Equals, 1)
  191. c.Assert(root, notNil)
  192. c.Assert(root.Prev, qt.IsNil)
  193. c.Assert(root.Next, qt.IsNil)
  194. c.Assert(root.Col.Min, qt.Equals, 1)
  195. c.Assert(root.Col.Max, qt.Equals, 2)
  196. // This is how we establish we have the new node, and not the old one
  197. c.Assert(root.Col.Width, qt.Equals, 10.0)
  198. })
  199. // Col1: |xx|
  200. // Col2: |----|
  201. assertWayMade([]*Col{&Col{Min: 2, Max: 3, Width: 40.1}, &Col{Min: 1, Max: 4, Width: 10.0}},
  202. func(cs *ColStore) {
  203. root := cs.Root
  204. c.Assert(cs.Len, qt.Equals, 1)
  205. c.Assert(root.Prev, qt.IsNil)
  206. c.Assert(root.Next, qt.IsNil)
  207. c.Assert(root.Col.Min, qt.Equals, 1)
  208. c.Assert(root.Col.Max, qt.Equals, 4)
  209. // This is how we establish we have the new node, and not the old one
  210. c.Assert(root.Col.Width, qt.Equals, 10.0)
  211. })
  212. // Col1: |--|
  213. // Col2: |--|
  214. // Col3: |--|
  215. assertWayMade([]*Col{&Col{Min: 1, Max: 2}, &Col{Min: 3, Max: 4}, &Col{Min: 5, Max: 6}},
  216. func(cs *ColStore) {
  217. root := cs.Root
  218. c.Assert(cs.Len, qt.Equals, 3)
  219. c.Assert(root.Prev, qt.IsNil)
  220. c.Assert(root.Next, notNil)
  221. c.Assert(root.Col.Min, qt.Equals, 1)
  222. c.Assert(root.Col.Max, qt.Equals, 2)
  223. node2 := root.Next
  224. c.Assert(node2.Prev, qt.Equals, root)
  225. c.Assert(node2.Col.Min, qt.Equals, 3)
  226. c.Assert(node2.Col.Max, qt.Equals, 4)
  227. c.Assert(node2.Next, notNil)
  228. node3 := node2.Next
  229. c.Assert(node3.Prev, qt.Equals, node2)
  230. c.Assert(node3.Next, qt.IsNil)
  231. c.Assert(node3.Col.Min, qt.Equals, 5)
  232. c.Assert(node3.Col.Max, qt.Equals, 6)
  233. })
  234. // Col1: |--|
  235. // Col2: |--|
  236. // Col3: |--|
  237. assertWayMade([]*Col{&Col{Min: 5, Max: 6}, &Col{Min: 3, Max: 4}, &Col{Min: 1, Max: 2}},
  238. func(cs *ColStore) {
  239. root := cs.Root
  240. c.Assert(cs.Len, qt.Equals, 3)
  241. c.Assert(root.Prev, notNil)
  242. c.Assert(root.Next, qt.IsNil)
  243. c.Assert(root.Col.Min, qt.Equals, 5)
  244. c.Assert(root.Col.Max, qt.Equals, 6)
  245. node2 := root.Prev
  246. c.Assert(node2.Next, qt.Equals, root)
  247. c.Assert(node2.Col.Min, qt.Equals, 3)
  248. c.Assert(node2.Col.Max, qt.Equals, 4)
  249. c.Assert(node2.Prev, notNil)
  250. node3 := node2.Prev
  251. c.Assert(node3.Next, qt.Equals, node2)
  252. c.Assert(node3.Prev, qt.IsNil)
  253. c.Assert(node3.Col.Min, qt.Equals, 1)
  254. c.Assert(node3.Col.Max, qt.Equals, 2)
  255. })
  256. // Col1: |--|
  257. // Col2: |--|
  258. // Col3: |--|
  259. assertWayMade([]*Col{&Col{Min: 1, Max: 2}, &Col{Min: 10, Max: 11}, &Col{Min: 5, Max: 6}},
  260. func(cs *ColStore) {
  261. root := cs.Root
  262. c.Assert(cs.Len, qt.Equals, 3)
  263. c.Assert(root.Prev, qt.IsNil)
  264. c.Assert(root.Next, notNil)
  265. c.Assert(root.Col.Min, qt.Equals, 1)
  266. c.Assert(root.Col.Max, qt.Equals, 2)
  267. node2 := root.Next
  268. c.Assert(node2.Prev, qt.Equals, root)
  269. c.Assert(node2.Col.Min, qt.Equals, 5)
  270. c.Assert(node2.Col.Max, qt.Equals, 6)
  271. c.Assert(node2.Next, notNil)
  272. node3 := node2.Next
  273. c.Assert(node3.Prev, qt.Equals, node2)
  274. c.Assert(node3.Next, qt.IsNil)
  275. c.Assert(node3.Col.Min, qt.Equals, 10)
  276. c.Assert(node3.Col.Max, qt.Equals, 11)
  277. })
  278. // Col1: |-x|
  279. // Col2: |x-|
  280. // Col3: |-------|
  281. assertWayMade([]*Col{
  282. &Col{Min: 1, Max: 2}, &Col{Min: 8, Max: 9}, &Col{Min: 2, Max: 8}},
  283. func(cs *ColStore) {
  284. root := cs.Root
  285. c.Assert(cs.Len, qt.Equals, 3)
  286. c.Assert(root.Prev, qt.IsNil)
  287. c.Assert(root.Next, notNil)
  288. c.Assert(root.Col.Min, qt.Equals, 1)
  289. c.Assert(root.Col.Max, qt.Equals, 1)
  290. node2 := root.Next
  291. c.Assert(node2.Prev, qt.Equals, root)
  292. c.Assert(node2.Next, notNil)
  293. c.Assert(node2.Col.Min, qt.Equals, 2)
  294. c.Assert(node2.Col.Max, qt.Equals, 8)
  295. node3 := node2.Next
  296. c.Assert(node3.Prev, qt.Equals, node2)
  297. c.Assert(node3.Next, qt.IsNil)
  298. c.Assert(node3.Col.Min, qt.Equals, 9)
  299. c.Assert(node3.Col.Max, qt.Equals, 9)
  300. })
  301. // Col1: |-x|
  302. // Col2: |--|
  303. // Col3: |-----|
  304. assertWayMade([]*Col{
  305. &Col{Min: 1, Max: 2}, &Col{Min: 8, Max: 9}, &Col{Min: 2, Max: 7}},
  306. func(cs *ColStore) {
  307. root := cs.Root
  308. c.Assert(cs.Len, qt.Equals, 3)
  309. c.Assert(root.Prev, qt.IsNil)
  310. c.Assert(root.Next, notNil)
  311. c.Assert(root.Col.Min, qt.Equals, 1)
  312. c.Assert(root.Col.Max, qt.Equals, 1)
  313. node2 := root.Next
  314. c.Assert(node2.Prev, qt.Equals, root)
  315. c.Assert(node2.Next, notNil)
  316. c.Assert(node2.Col.Min, qt.Equals, 2)
  317. c.Assert(node2.Col.Max, qt.Equals, 7)
  318. node3 := node2.Next
  319. c.Assert(node3.Prev, qt.Equals, node2)
  320. c.Assert(node3.Next, qt.IsNil)
  321. c.Assert(node3.Col.Min, qt.Equals, 8)
  322. c.Assert(node3.Col.Max, qt.Equals, 9)
  323. })
  324. // Col1: |--|
  325. // Col2: |x-|
  326. // Col3: |-----|
  327. assertWayMade([]*Col{
  328. &Col{Min: 1, Max: 2}, &Col{Min: 8, Max: 9}, &Col{Min: 3, Max: 8}},
  329. func(cs *ColStore) {
  330. root := cs.Root
  331. c.Assert(cs.Len, qt.Equals, 3)
  332. c.Assert(root.Prev, qt.IsNil)
  333. c.Assert(root.Next, notNil)
  334. c.Assert(root.Col.Min, qt.Equals, 1)
  335. c.Assert(root.Col.Max, qt.Equals, 2)
  336. node2 := root.Next
  337. c.Assert(node2.Prev, qt.Equals, root)
  338. c.Assert(node2.Next, notNil)
  339. c.Assert(node2.Col.Min, qt.Equals, 3)
  340. c.Assert(node2.Col.Max, qt.Equals, 8)
  341. node3 := node2.Next
  342. c.Assert(node3.Prev, qt.Equals, node2)
  343. c.Assert(node3.Next, qt.IsNil)
  344. c.Assert(node3.Col.Min, qt.Equals, 9)
  345. c.Assert(node3.Col.Max, qt.Equals, 9)
  346. })
  347. // Col1: |--|
  348. // Col2: |xx|
  349. // Col3: |--|
  350. // Col4: |--|
  351. assertWayMade(
  352. []*Col{
  353. &Col{Min: 1, Max: 2},
  354. &Col{Min: 3, Max: 4, Width: 1.0},
  355. &Col{Min: 5, Max: 6},
  356. &Col{Min: 3, Max: 4, Width: 2.0},
  357. },
  358. func(cs *ColStore) {
  359. root := cs.Root
  360. c.Assert(cs.Len, qt.Equals, 3)
  361. c.Assert(root.Prev, qt.IsNil)
  362. c.Assert(root.Next, notNil)
  363. c.Assert(root.Col.Min, qt.Equals, 1)
  364. c.Assert(root.Col.Max, qt.Equals, 2)
  365. node2 := root.Next
  366. c.Assert(node2.Prev, qt.Equals, root)
  367. c.Assert(node2.Next, notNil)
  368. c.Assert(node2.Col.Min, qt.Equals, 3)
  369. c.Assert(node2.Col.Max, qt.Equals, 4)
  370. c.Assert(node2.Col.Width, qt.Equals, 2.0) // We have the later version
  371. node3 := node2.Next
  372. c.Assert(node3.Prev, qt.Equals, node2)
  373. c.Assert(node3.Next, qt.IsNil)
  374. c.Assert(node3.Col.Min, qt.Equals, 5)
  375. c.Assert(node3.Col.Max, qt.Equals, 6)
  376. })
  377. // Col1: |-x|
  378. // Col2: |xx|
  379. // Col3: |x-|
  380. // Col4: |----|
  381. assertWayMade(
  382. []*Col{
  383. &Col{Min: 1, Max: 2, Width: 1.0},
  384. &Col{Min: 3, Max: 4, Width: 2.0},
  385. &Col{Min: 5, Max: 6, Width: 3.0},
  386. &Col{Min: 2, Max: 5, Width: 4.0},
  387. },
  388. func(cs *ColStore) {
  389. root := cs.Root
  390. c.Assert(cs.Len, qt.Equals, 3)
  391. c.Assert(root.Prev, qt.IsNil)
  392. c.Assert(root.Next, notNil)
  393. c.Assert(root.Col.Min, qt.Equals, 1)
  394. c.Assert(root.Col.Max, qt.Equals, 1)
  395. c.Assert(root.Col.Width, qt.Equals, 1.0)
  396. node2 := root.Next
  397. c.Assert(node2.Prev, qt.Equals, root)
  398. c.Assert(node2.Next, notNil)
  399. c.Assert(node2.Col.Min, qt.Equals, 2)
  400. c.Assert(node2.Col.Max, qt.Equals, 5)
  401. c.Assert(node2.Col.Width, qt.Equals, 4.0)
  402. node3 := node2.Next
  403. c.Assert(node3.Prev, qt.Equals, node2)
  404. c.Assert(node3.Next, qt.IsNil)
  405. c.Assert(node3.Col.Min, qt.Equals, 6)
  406. c.Assert(node3.Col.Max, qt.Equals, 6)
  407. c.Assert(node3.Col.Width, qt.Equals, 3.0)
  408. })
  409. }
  410. func (css *ColStoreSuite) TestFindNodeForCol(c *C) {
  411. assertNodeFound := func(cs *ColStore, num int, col *Col) {
  412. node := cs.findNodeForColNum(num)
  413. if col == nil {
  414. c.Assert(node, IsNil)
  415. return
  416. }
  417. c.Assert(node, NotNil)
  418. c.Assert(node.Col, Equals, col)
  419. }
  420. cs := &ColStore{}
  421. col0 := &Col{Min: 1, Max: 1}
  422. cs.Add(col0)
  423. col1 := &Col{Min: 2, Max: 2}
  424. cs.Add(col1)
  425. col2 := &Col{Min: 3, Max: 3}
  426. cs.Add(col2)
  427. col3 := &Col{Min: 4, Max: 4}
  428. cs.Add(col3)
  429. col4 := &Col{Min: 5, Max: 5}
  430. cs.Add(col4)
  431. col5 := &Col{Min: 100, Max: 125}
  432. cs.Add(col5)
  433. assertNodeFound(cs, 0, nil)
  434. assertNodeFound(cs, 1, col0)
  435. assertNodeFound(cs, 2, col1)
  436. assertNodeFound(cs, 3, col2)
  437. assertNodeFound(cs, 4, col3)
  438. assertNodeFound(cs, 5, col4)
  439. assertNodeFound(cs, 6, nil)
  440. assertNodeFound(cs, 99, nil)
  441. assertNodeFound(cs, 100, col5)
  442. assertNodeFound(cs, 110, col5)
  443. assertNodeFound(cs, 125, col5)
  444. assertNodeFound(cs, 126, nil)
  445. }
  446. func (css *ColStoreSuite) TestRemoveNode(c *C) {
  447. assertChain := func(cs *ColStore, chain []*Col) {
  448. node := cs.Root
  449. for _, col := range chain {
  450. c.Assert(node, NotNil)
  451. c.Assert(node.Col.Min, Equals, col.Min)
  452. c.Assert(node.Col.Max, Equals, col.Max)
  453. node = node.Next
  454. }
  455. c.Assert(node, IsNil)
  456. }
  457. cs := &ColStore{}
  458. col0 := &Col{Min: 1, Max: 1}
  459. cs.Add(col0)
  460. col1 := &Col{Min: 2, Max: 2}
  461. cs.Add(col1)
  462. col2 := &Col{Min: 3, Max: 3}
  463. cs.Add(col2)
  464. col3 := &Col{Min: 4, Max: 4}
  465. cs.Add(col3)
  466. col4 := &Col{Min: 5, Max: 5}
  467. cs.Add(col4)
  468. c.Assert(cs.Len, Equals, 5)
  469. cs.removeNode(cs.findNodeForColNum(5))
  470. c.Assert(cs.Len, Equals, 4)
  471. assertChain(cs, []*Col{col0, col1, col2, col3})
  472. cs.removeNode(cs.findNodeForColNum(1))
  473. c.Assert(cs.Len, Equals, 3)
  474. assertChain(cs, []*Col{col1, col2, col3})
  475. }
  476. func (css *ColStoreSuite) TestForEach(c *C) {
  477. cs := &ColStore{}
  478. col0 := &Col{Min: 1, Max: 1, Hidden: true}
  479. cs.Add(col0)
  480. col1 := &Col{Min: 2, Max: 2}
  481. cs.Add(col1)
  482. col2 := &Col{Min: 3, Max: 3}
  483. cs.Add(col2)
  484. col3 := &Col{Min: 4, Max: 4}
  485. cs.Add(col3)
  486. col4 := &Col{Min: 5, Max: 5}
  487. cs.Add(col4)
  488. cs.ForEach(func(index int, col *Col) {
  489. col.Phonetic = true
  490. })
  491. c.Assert(col0.Phonetic, Equals, true)
  492. c.Assert(col1.Phonetic, Equals, true)
  493. c.Assert(col2.Phonetic, Equals, true)
  494. c.Assert(col3.Phonetic, Equals, true)
  495. c.Assert(col4.Phonetic, Equals, true)
  496. }
  497. func (css *ColStoreSuite) TestGetOrMakeColsForRange(c *C) {
  498. assertCols := func(min, max int, initalCols, expectedCols []*Col) {
  499. cs := &ColStore{}
  500. for _, col := range initalCols {
  501. cs.Add(col)
  502. }
  503. result := cs.getOrMakeColsForRange(cs.Root, min, max)
  504. c.Assert(result, HasLen, len(expectedCols))
  505. for i := 0; i < len(expectedCols); i++ {
  506. got := result[i]
  507. expected := expectedCols[i]
  508. c.Assert(got.Min, Equals, expected.Min)
  509. c.Assert(got.Max, Equals, expected.Max)
  510. }
  511. }
  512. // make everything
  513. assertCols(1, 11, nil, []*Col{&Col{Min: 1, Max: 11}})
  514. // get everything, one col
  515. assertCols(1, 11, []*Col{&Col{Min: 1, Max: 11}}, []*Col{&Col{Min: 1, Max: 11}})
  516. // get everything, many cols
  517. assertCols(1, 11,
  518. []*Col{
  519. &Col{Min: 1, Max: 4},
  520. &Col{Min: 5, Max: 8},
  521. &Col{Min: 9, Max: 11},
  522. },
  523. []*Col{
  524. &Col{Min: 1, Max: 4},
  525. &Col{Min: 5, Max: 8},
  526. &Col{Min: 9, Max: 11},
  527. },
  528. )
  529. // make missing col
  530. assertCols(1, 11,
  531. []*Col{
  532. &Col{Min: 1, Max: 4},
  533. &Col{Min: 9, Max: 11},
  534. },
  535. []*Col{
  536. &Col{Min: 1, Max: 4},
  537. &Col{Min: 5, Max: 8},
  538. &Col{Min: 9, Max: 11},
  539. },
  540. )
  541. }