|
|
@@ -1 +1,580 @@
|
|
|
package xlsx
|
|
|
+
|
|
|
+import (
|
|
|
+ "testing"
|
|
|
+
|
|
|
+ qt "github.com/frankban/quicktest"
|
|
|
+ . "gopkg.in/check.v1"
|
|
|
+)
|
|
|
+
|
|
|
+var notNil = qt.Not(qt.IsNil)
|
|
|
+
|
|
|
+func TestNewColForRange(t *testing.T) {
|
|
|
+ c := qt.New(t)
|
|
|
+ col := NewColForRange(30, 45)
|
|
|
+ c.Assert(col, notNil)
|
|
|
+ c.Assert(col.Min, qt.Equals, 30)
|
|
|
+ c.Assert(col.Max, qt.Equals, 45)
|
|
|
+
|
|
|
+ // Auto fix the min/max
|
|
|
+ col = NewColForRange(45, 30)
|
|
|
+ c.Assert(col, notNil)
|
|
|
+ c.Assert(col.Min, qt.Equals, 30)
|
|
|
+ c.Assert(col.Max, qt.Equals, 45)
|
|
|
+}
|
|
|
+
|
|
|
+func TestCol(t *testing.T) {
|
|
|
+ c := qt.New(t)
|
|
|
+ c.Run("SetType", func(c *qt.C) {
|
|
|
+ expectations := map[CellType]string{
|
|
|
+ CellTypeString: builtInNumFmt[builtInNumFmtIndex_STRING],
|
|
|
+ CellTypeNumeric: builtInNumFmt[builtInNumFmtIndex_INT],
|
|
|
+ CellTypeBool: builtInNumFmt[builtInNumFmtIndex_GENERAL],
|
|
|
+ CellTypeInline: builtInNumFmt[builtInNumFmtIndex_STRING],
|
|
|
+ CellTypeError: builtInNumFmt[builtInNumFmtIndex_GENERAL],
|
|
|
+ CellTypeDate: builtInNumFmt[builtInNumFmtIndex_GENERAL],
|
|
|
+ CellTypeStringFormula: builtInNumFmt[builtInNumFmtIndex_STRING],
|
|
|
+ }
|
|
|
+
|
|
|
+ assertSetType := func(cellType CellType, expectation string) {
|
|
|
+ col := &Col{}
|
|
|
+ col.SetType(cellType)
|
|
|
+ c.Assert(col.numFmt, qt.Equals, expectation)
|
|
|
+ }
|
|
|
+ for k, v := range expectations {
|
|
|
+ assertSetType(k, v)
|
|
|
+ }
|
|
|
+ })
|
|
|
+ c.Run("SetWidth", func(c *qt.C) {
|
|
|
+ col := &Col{}
|
|
|
+ col.SetWidth(20.2)
|
|
|
+ c.Assert(col.Width, qt.Equals, 20.2)
|
|
|
+ c.Assert(col.CustomWidth, qt.Equals, true)
|
|
|
+ })
|
|
|
+
|
|
|
+ c.Run("copyToRange", func(c *qt.C) {
|
|
|
+ nf := &parsedNumberFormat{}
|
|
|
+ s := &Style{}
|
|
|
+ c1 := &Col{
|
|
|
+ Min: 1,
|
|
|
+ Max: 11,
|
|
|
+ Hidden: true,
|
|
|
+ Width: 300.4,
|
|
|
+ Collapsed: true,
|
|
|
+ OutlineLevel: 2,
|
|
|
+ numFmt: "-0.00",
|
|
|
+ parsedNumFmt: nf,
|
|
|
+ style: s,
|
|
|
+ }
|
|
|
+
|
|
|
+ c2 := c1.copyToRange(4, 10)
|
|
|
+ c.Assert(c2.Min, qt.Equals, 4)
|
|
|
+ c.Assert(c2.Max, qt.Equals, 10)
|
|
|
+ c.Assert(c2.Hidden, qt.Equals, c1.Hidden)
|
|
|
+ c.Assert(c2.Width, qt.Equals, c1.Width)
|
|
|
+ c.Assert(c2.Collapsed, qt.Equals, c1.Collapsed)
|
|
|
+ c.Assert(c2.OutlineLevel, qt.Equals, c1.OutlineLevel)
|
|
|
+ c.Assert(c2.numFmt, qt.Equals, c1.numFmt)
|
|
|
+ c.Assert(c2.parsedNumFmt, qt.Equals, c1.parsedNumFmt)
|
|
|
+ c.Assert(c2.style, qt.Equals, c1.style)
|
|
|
+ })
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+type ColStoreSuite struct{}
|
|
|
+
|
|
|
+var _ = Suite(&ColStoreSuite{})
|
|
|
+
|
|
|
+func (css *ColStoreSuite) TestAddRootNode(c *C) {
|
|
|
+ col := &Col{Min: 1, Max: 1}
|
|
|
+ cs := ColStore{}
|
|
|
+ cs.Add(col)
|
|
|
+ c.Assert(cs.Len, Equals, 1)
|
|
|
+ c.Assert(cs.Root.Col, Equals, col)
|
|
|
+}
|
|
|
+
|
|
|
+func TestMakeWay(t *testing.T) {
|
|
|
+ c := qt.New(t)
|
|
|
+ assertWayMade := func(cols []*Col, chainFunc func(*ColStore)) {
|
|
|
+
|
|
|
+ cs := &ColStore{}
|
|
|
+ for _, col := range cols {
|
|
|
+ _ = cs.Add(col)
|
|
|
+ }
|
|
|
+ chainFunc(cs)
|
|
|
+ }
|
|
|
+
|
|
|
+ // Col1: |--|
|
|
|
+ // Col2: |--|
|
|
|
+ assertWayMade([]*Col{{Min: 1, Max: 2}, {Min: 3, Max: 4}},
|
|
|
+ func(cs *ColStore) {
|
|
|
+ c.Assert(cs.Len, qt.Equals, 2)
|
|
|
+ root := cs.Root
|
|
|
+ c.Assert(root.Col.Min, qt.Equals, 1)
|
|
|
+ c.Assert(root.Col.Max, qt.Equals, 2)
|
|
|
+ c.Assert(root.Prev, qt.IsNil)
|
|
|
+ c.Assert(root.Next, notNil)
|
|
|
+ node2 := root.Next
|
|
|
+ c.Assert(node2.Prev, qt.Equals, root)
|
|
|
+ c.Assert(node2.Next, qt.IsNil)
|
|
|
+ c.Assert(node2.Col.Min, qt.Equals, 3)
|
|
|
+ c.Assert(node2.Col.Max, qt.Equals, 4)
|
|
|
+ })
|
|
|
+
|
|
|
+ // Col1: |--|
|
|
|
+ // Col2: |--|
|
|
|
+ assertWayMade([]*Col{{Min: 3, Max: 4}, {Min: 1, Max: 2}},
|
|
|
+ func(cs *ColStore) {
|
|
|
+ root := cs.Root
|
|
|
+ c.Assert(cs.Len, qt.Equals, 2)
|
|
|
+ c.Assert(root.Col.Min, qt.Equals, 3)
|
|
|
+ c.Assert(root.Col.Max, qt.Equals, 4)
|
|
|
+ c.Assert(root.Prev, notNil)
|
|
|
+ c.Assert(root.Next, qt.IsNil)
|
|
|
+ node2 := root.Prev
|
|
|
+ c.Assert(node2.Next, qt.Equals, root)
|
|
|
+ c.Assert(node2.Prev, qt.IsNil)
|
|
|
+ c.Assert(node2.Col.Min, qt.Equals, 1)
|
|
|
+ c.Assert(node2.Col.Max, qt.Equals, 2)
|
|
|
+ })
|
|
|
+
|
|
|
+ // Col1: |--x|
|
|
|
+ // Col2: |--|
|
|
|
+ assertWayMade([]*Col{{Min: 1, Max: 3}, {Min: 3, Max: 4}},
|
|
|
+ func(cs *ColStore) {
|
|
|
+ root := cs.Root
|
|
|
+ c.Assert(cs.Len, qt.Equals, 2)
|
|
|
+ c.Assert(root.Col.Min, qt.Equals, 1)
|
|
|
+ c.Assert(root.Col.Max, qt.Equals, 2)
|
|
|
+ c.Assert(root.Prev, qt.IsNil)
|
|
|
+ c.Assert(root.Next, notNil)
|
|
|
+ node2 := root.Next
|
|
|
+ c.Assert(node2.Prev, qt.Equals, root)
|
|
|
+ c.Assert(node2.Next, qt.IsNil)
|
|
|
+ c.Assert(node2.Col.Min, qt.Equals, 3)
|
|
|
+ c.Assert(node2.Col.Max, qt.Equals, 4)
|
|
|
+ })
|
|
|
+
|
|
|
+ // Col1: |x-|
|
|
|
+ // Col2: |--|
|
|
|
+ assertWayMade([]*Col{{Min: 2, Max: 3}, {Min: 1, Max: 2}},
|
|
|
+ func(cs *ColStore) {
|
|
|
+ root := cs.Root
|
|
|
+ c.Assert(cs.Len, qt.Equals, 2)
|
|
|
+ c.Assert(root.Col.Min, qt.Equals, 3)
|
|
|
+ c.Assert(root.Col.Max, qt.Equals, 3)
|
|
|
+ c.Assert(root.Prev, notNil)
|
|
|
+ c.Assert(root.Next, qt.IsNil)
|
|
|
+ node2 := root.Prev
|
|
|
+ c.Assert(node2.Next, qt.Equals, root)
|
|
|
+ c.Assert(node2.Prev, qt.IsNil)
|
|
|
+ c.Assert(node2.Col.Min, qt.Equals, 1)
|
|
|
+ c.Assert(node2.Col.Max, qt.Equals, 2)
|
|
|
+ })
|
|
|
+
|
|
|
+ // Col1: |---xx---|
|
|
|
+ // Col2: |--|
|
|
|
+ assertWayMade([]*Col{{Min: 1, Max: 8}, {Min: 4, Max: 5}},
|
|
|
+ func(cs *ColStore) {
|
|
|
+ root := cs.Root
|
|
|
+ c.Assert(cs.Len, qt.Equals, 3)
|
|
|
+ c.Assert(root.Prev, qt.IsNil)
|
|
|
+ c.Assert(root.Next, notNil)
|
|
|
+ c.Assert(root.Col.Min, qt.Equals, 1)
|
|
|
+ c.Assert(root.Col.Max, qt.Equals, 3)
|
|
|
+ node2 := root.Next
|
|
|
+ c.Assert(node2.Prev, qt.Equals, root)
|
|
|
+ c.Assert(node2.Col.Min, qt.Equals, 4)
|
|
|
+ c.Assert(node2.Col.Max, qt.Equals, 5)
|
|
|
+ c.Assert(node2.Next, notNil)
|
|
|
+ node3 := node2.Next
|
|
|
+ c.Assert(node3.Prev, qt.Equals, node2)
|
|
|
+ c.Assert(node3.Next, qt.IsNil)
|
|
|
+ c.Assert(node3.Col.Min, qt.Equals, 6)
|
|
|
+ c.Assert(node3.Col.Max, qt.Equals, 8)
|
|
|
+ })
|
|
|
+
|
|
|
+ // Col1: |xx|
|
|
|
+ // Col2: |--|
|
|
|
+ assertWayMade([]*Col{{Min: 1, Max: 2, Width: 40.1}, {Min: 1, Max: 2, Width: 10.0}},
|
|
|
+ func(cs *ColStore) {
|
|
|
+ root := cs.Root
|
|
|
+ c.Assert(cs.Len, qt.Equals, 1)
|
|
|
+ c.Assert(root, notNil)
|
|
|
+ c.Assert(root.Prev, qt.IsNil)
|
|
|
+ c.Assert(root.Next, qt.IsNil)
|
|
|
+ c.Assert(root.Col.Min, qt.Equals, 1)
|
|
|
+ c.Assert(root.Col.Max, qt.Equals, 2)
|
|
|
+ // This is how we establish we have the new node, and not the old one
|
|
|
+ c.Assert(root.Col.Width, qt.Equals, 10.0)
|
|
|
+ })
|
|
|
+
|
|
|
+ // Col1: |xx|
|
|
|
+ // Col2: |----|
|
|
|
+ assertWayMade([]*Col{{Min: 2, Max: 3, Width: 40.1}, {Min: 1, Max: 4, Width: 10.0}},
|
|
|
+ func(cs *ColStore) {
|
|
|
+ root := cs.Root
|
|
|
+ c.Assert(cs.Len, qt.Equals, 1)
|
|
|
+ c.Assert(root.Prev, qt.IsNil)
|
|
|
+ c.Assert(root.Next, qt.IsNil)
|
|
|
+ c.Assert(root.Col.Min, qt.Equals, 1)
|
|
|
+ c.Assert(root.Col.Max, qt.Equals, 4)
|
|
|
+ // This is how we establish we have the new node, and not the old one
|
|
|
+ c.Assert(root.Col.Width, qt.Equals, 10.0)
|
|
|
+ })
|
|
|
+
|
|
|
+ // Col1: |--|
|
|
|
+ // Col2: |--|
|
|
|
+ // Col3: |--|
|
|
|
+ assertWayMade([]*Col{{Min: 1, Max: 2}, {Min: 3, Max: 4}, {Min: 5, Max: 6}},
|
|
|
+ func(cs *ColStore) {
|
|
|
+ root := cs.Root
|
|
|
+ c.Assert(cs.Len, qt.Equals, 3)
|
|
|
+ c.Assert(root.Prev, qt.IsNil)
|
|
|
+ c.Assert(root.Next, notNil)
|
|
|
+ c.Assert(root.Col.Min, qt.Equals, 1)
|
|
|
+ c.Assert(root.Col.Max, qt.Equals, 2)
|
|
|
+ node2 := root.Next
|
|
|
+ c.Assert(node2.Prev, qt.Equals, root)
|
|
|
+ c.Assert(node2.Col.Min, qt.Equals, 3)
|
|
|
+ c.Assert(node2.Col.Max, qt.Equals, 4)
|
|
|
+ c.Assert(node2.Next, notNil)
|
|
|
+ node3 := node2.Next
|
|
|
+ c.Assert(node3.Prev, qt.Equals, node2)
|
|
|
+ c.Assert(node3.Next, qt.IsNil)
|
|
|
+ c.Assert(node3.Col.Min, qt.Equals, 5)
|
|
|
+ c.Assert(node3.Col.Max, qt.Equals, 6)
|
|
|
+ })
|
|
|
+
|
|
|
+ // Col1: |--|
|
|
|
+ // Col2: |--|
|
|
|
+ // Col3: |--|
|
|
|
+ assertWayMade([]*Col{{Min: 5, Max: 6}, {Min: 3, Max: 4}, {Min: 1, Max: 2}},
|
|
|
+ func(cs *ColStore) {
|
|
|
+ root := cs.Root
|
|
|
+ c.Assert(cs.Len, qt.Equals, 3)
|
|
|
+ c.Assert(root.Prev, notNil)
|
|
|
+ c.Assert(root.Next, qt.IsNil)
|
|
|
+ c.Assert(root.Col.Min, qt.Equals, 5)
|
|
|
+ c.Assert(root.Col.Max, qt.Equals, 6)
|
|
|
+ node2 := root.Prev
|
|
|
+ c.Assert(node2.Next, qt.Equals, root)
|
|
|
+ c.Assert(node2.Col.Min, qt.Equals, 3)
|
|
|
+ c.Assert(node2.Col.Max, qt.Equals, 4)
|
|
|
+ c.Assert(node2.Prev, notNil)
|
|
|
+ node3 := node2.Prev
|
|
|
+ c.Assert(node3.Next, qt.Equals, node2)
|
|
|
+ c.Assert(node3.Prev, qt.IsNil)
|
|
|
+ c.Assert(node3.Col.Min, qt.Equals, 1)
|
|
|
+ c.Assert(node3.Col.Max, qt.Equals, 2)
|
|
|
+ })
|
|
|
+
|
|
|
+ // Col1: |--|
|
|
|
+ // Col2: |--|
|
|
|
+ // Col3: |--|
|
|
|
+ assertWayMade([]*Col{{Min: 1, Max: 2}, {Min: 10, Max: 11}, {Min: 5, Max: 6}},
|
|
|
+ func(cs *ColStore) {
|
|
|
+ root := cs.Root
|
|
|
+ c.Assert(cs.Len, qt.Equals, 3)
|
|
|
+ c.Assert(root.Prev, qt.IsNil)
|
|
|
+ c.Assert(root.Next, notNil)
|
|
|
+ c.Assert(root.Col.Min, qt.Equals, 1)
|
|
|
+ c.Assert(root.Col.Max, qt.Equals, 2)
|
|
|
+ node2 := root.Next
|
|
|
+ c.Assert(node2.Prev, qt.Equals, root)
|
|
|
+ c.Assert(node2.Col.Min, qt.Equals, 5)
|
|
|
+ c.Assert(node2.Col.Max, qt.Equals, 6)
|
|
|
+ c.Assert(node2.Next, notNil)
|
|
|
+ node3 := node2.Next
|
|
|
+ c.Assert(node3.Prev, qt.Equals, node2)
|
|
|
+ c.Assert(node3.Next, qt.IsNil)
|
|
|
+ c.Assert(node3.Col.Min, qt.Equals, 10)
|
|
|
+ c.Assert(node3.Col.Max, qt.Equals, 11)
|
|
|
+ })
|
|
|
+
|
|
|
+ // Col1: |-x|
|
|
|
+ // Col2: |x-|
|
|
|
+ // Col3: |-------|
|
|
|
+ assertWayMade([]*Col{
|
|
|
+ {Min: 1, Max: 2}, {Min: 8, Max: 9}, {Min: 2, Max: 8}},
|
|
|
+ func(cs *ColStore) {
|
|
|
+ root := cs.Root
|
|
|
+ c.Assert(cs.Len, qt.Equals, 3)
|
|
|
+ c.Assert(root.Prev, qt.IsNil)
|
|
|
+ c.Assert(root.Next, notNil)
|
|
|
+ c.Assert(root.Col.Min, qt.Equals, 1)
|
|
|
+ c.Assert(root.Col.Max, qt.Equals, 1)
|
|
|
+ node2 := root.Next
|
|
|
+ c.Assert(node2.Prev, qt.Equals, root)
|
|
|
+ c.Assert(node2.Next, notNil)
|
|
|
+ c.Assert(node2.Col.Min, qt.Equals, 2)
|
|
|
+ c.Assert(node2.Col.Max, qt.Equals, 8)
|
|
|
+ node3 := node2.Next
|
|
|
+ c.Assert(node3.Prev, qt.Equals, node2)
|
|
|
+ c.Assert(node3.Next, qt.IsNil)
|
|
|
+ c.Assert(node3.Col.Min, qt.Equals, 9)
|
|
|
+ c.Assert(node3.Col.Max, qt.Equals, 9)
|
|
|
+ })
|
|
|
+
|
|
|
+ // Col1: |-x|
|
|
|
+ // Col2: |--|
|
|
|
+ // Col3: |-----|
|
|
|
+ assertWayMade([]*Col{
|
|
|
+ {Min: 1, Max: 2}, {Min: 8, Max: 9}, {Min: 2, Max: 7}},
|
|
|
+ func(cs *ColStore) {
|
|
|
+ root := cs.Root
|
|
|
+ c.Assert(cs.Len, qt.Equals, 3)
|
|
|
+ c.Assert(root.Prev, qt.IsNil)
|
|
|
+ c.Assert(root.Next, notNil)
|
|
|
+ c.Assert(root.Col.Min, qt.Equals, 1)
|
|
|
+ c.Assert(root.Col.Max, qt.Equals, 1)
|
|
|
+ node2 := root.Next
|
|
|
+ c.Assert(node2.Prev, qt.Equals, root)
|
|
|
+ c.Assert(node2.Next, notNil)
|
|
|
+ c.Assert(node2.Col.Min, qt.Equals, 2)
|
|
|
+ c.Assert(node2.Col.Max, qt.Equals, 7)
|
|
|
+ node3 := node2.Next
|
|
|
+ c.Assert(node3.Prev, qt.Equals, node2)
|
|
|
+ c.Assert(node3.Next, qt.IsNil)
|
|
|
+ c.Assert(node3.Col.Min, qt.Equals, 8)
|
|
|
+ c.Assert(node3.Col.Max, qt.Equals, 9)
|
|
|
+ })
|
|
|
+
|
|
|
+ // Col1: |--|
|
|
|
+ // Col2: |x-|
|
|
|
+ // Col3: |-----|
|
|
|
+ assertWayMade([]*Col{
|
|
|
+ {Min: 1, Max: 2}, {Min: 8, Max: 9}, {Min: 3, Max: 8}},
|
|
|
+ func(cs *ColStore) {
|
|
|
+ root := cs.Root
|
|
|
+ c.Assert(cs.Len, qt.Equals, 3)
|
|
|
+ c.Assert(root.Prev, qt.IsNil)
|
|
|
+ c.Assert(root.Next, notNil)
|
|
|
+ c.Assert(root.Col.Min, qt.Equals, 1)
|
|
|
+ c.Assert(root.Col.Max, qt.Equals, 2)
|
|
|
+ node2 := root.Next
|
|
|
+ c.Assert(node2.Prev, qt.Equals, root)
|
|
|
+ c.Assert(node2.Next, notNil)
|
|
|
+ c.Assert(node2.Col.Min, qt.Equals, 3)
|
|
|
+ c.Assert(node2.Col.Max, qt.Equals, 8)
|
|
|
+ node3 := node2.Next
|
|
|
+ c.Assert(node3.Prev, qt.Equals, node2)
|
|
|
+ c.Assert(node3.Next, qt.IsNil)
|
|
|
+ c.Assert(node3.Col.Min, qt.Equals, 9)
|
|
|
+ c.Assert(node3.Col.Max, qt.Equals, 9)
|
|
|
+ })
|
|
|
+
|
|
|
+ // Col1: |--|
|
|
|
+ // Col2: |xx|
|
|
|
+ // Col3: |--|
|
|
|
+ // Col4: |--|
|
|
|
+ assertWayMade(
|
|
|
+ []*Col{
|
|
|
+ {Min: 1, Max: 2},
|
|
|
+ {Min: 3, Max: 4, Width: 1.0},
|
|
|
+ {Min: 5, Max: 6},
|
|
|
+ {Min: 3, Max: 4, Width: 2.0},
|
|
|
+ },
|
|
|
+ func(cs *ColStore) {
|
|
|
+ root := cs.Root
|
|
|
+ c.Assert(cs.Len, qt.Equals, 3)
|
|
|
+ c.Assert(root.Prev, qt.IsNil)
|
|
|
+ c.Assert(root.Next, notNil)
|
|
|
+ c.Assert(root.Col.Min, qt.Equals, 1)
|
|
|
+ c.Assert(root.Col.Max, qt.Equals, 2)
|
|
|
+ node2 := root.Next
|
|
|
+ c.Assert(node2.Prev, qt.Equals, root)
|
|
|
+ c.Assert(node2.Next, notNil)
|
|
|
+ c.Assert(node2.Col.Min, qt.Equals, 3)
|
|
|
+ c.Assert(node2.Col.Max, qt.Equals, 4)
|
|
|
+ c.Assert(node2.Col.Width, qt.Equals, 2.0) // We have the later version
|
|
|
+ node3 := node2.Next
|
|
|
+ c.Assert(node3.Prev, qt.Equals, node2)
|
|
|
+ c.Assert(node3.Next, qt.IsNil)
|
|
|
+ c.Assert(node3.Col.Min, qt.Equals, 5)
|
|
|
+ c.Assert(node3.Col.Max, qt.Equals, 6)
|
|
|
+ })
|
|
|
+
|
|
|
+ // Col1: |-x|
|
|
|
+ // Col2: |xx|
|
|
|
+ // Col3: |x-|
|
|
|
+ // Col4: |----|
|
|
|
+ assertWayMade(
|
|
|
+ []*Col{
|
|
|
+ {Min: 1, Max: 2, Width: 1.0},
|
|
|
+ {Min: 3, Max: 4, Width: 2.0},
|
|
|
+ {Min: 5, Max: 6, Width: 3.0},
|
|
|
+ {Min: 2, Max: 5, Width: 4.0},
|
|
|
+ },
|
|
|
+ func(cs *ColStore) {
|
|
|
+ root := cs.Root
|
|
|
+ c.Assert(cs.Len, qt.Equals, 3)
|
|
|
+ c.Assert(root.Prev, qt.IsNil)
|
|
|
+ c.Assert(root.Next, notNil)
|
|
|
+ c.Assert(root.Col.Min, qt.Equals, 1)
|
|
|
+ c.Assert(root.Col.Max, qt.Equals, 1)
|
|
|
+ c.Assert(root.Col.Width, qt.Equals, 1.0)
|
|
|
+ node2 := root.Next
|
|
|
+ c.Assert(node2.Prev, qt.Equals, root)
|
|
|
+ c.Assert(node2.Next, notNil)
|
|
|
+ c.Assert(node2.Col.Min, qt.Equals, 2)
|
|
|
+ c.Assert(node2.Col.Max, qt.Equals, 5)
|
|
|
+ c.Assert(node2.Col.Width, qt.Equals, 4.0)
|
|
|
+ node3 := node2.Next
|
|
|
+ c.Assert(node3.Prev, qt.Equals, node2)
|
|
|
+ c.Assert(node3.Next, qt.IsNil)
|
|
|
+ c.Assert(node3.Col.Min, qt.Equals, 6)
|
|
|
+ c.Assert(node3.Col.Max, qt.Equals, 6)
|
|
|
+ c.Assert(node3.Col.Width, qt.Equals, 3.0)
|
|
|
+ })
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+func (css *ColStoreSuite) TestFindNodeForCol(c *C) {
|
|
|
+
|
|
|
+ assertNodeFound := func(cs *ColStore, num int, col *Col) {
|
|
|
+ node := cs.findNodeForColNum(num)
|
|
|
+ if col == nil {
|
|
|
+ c.Assert(node, IsNil)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ c.Assert(node, NotNil)
|
|
|
+ c.Assert(node.Col, Equals, col)
|
|
|
+ }
|
|
|
+
|
|
|
+ cs := &ColStore{}
|
|
|
+ col0 := &Col{Min: 1, Max: 1}
|
|
|
+ cs.Add(col0)
|
|
|
+ col1 := &Col{Min: 2, Max: 2}
|
|
|
+ cs.Add(col1)
|
|
|
+ col2 := &Col{Min: 3, Max: 3}
|
|
|
+ cs.Add(col2)
|
|
|
+ col3 := &Col{Min: 4, Max: 4}
|
|
|
+ cs.Add(col3)
|
|
|
+ col4 := &Col{Min: 5, Max: 5}
|
|
|
+ cs.Add(col4)
|
|
|
+ col5 := &Col{Min: 100, Max: 125}
|
|
|
+ cs.Add(col5)
|
|
|
+
|
|
|
+ assertNodeFound(cs, 0, nil)
|
|
|
+ assertNodeFound(cs, 1, col0)
|
|
|
+ assertNodeFound(cs, 2, col1)
|
|
|
+ assertNodeFound(cs, 3, col2)
|
|
|
+ assertNodeFound(cs, 4, col3)
|
|
|
+ assertNodeFound(cs, 5, col4)
|
|
|
+ assertNodeFound(cs, 6, nil)
|
|
|
+ assertNodeFound(cs, 99, nil)
|
|
|
+ assertNodeFound(cs, 100, col5)
|
|
|
+ assertNodeFound(cs, 110, col5)
|
|
|
+ assertNodeFound(cs, 125, col5)
|
|
|
+ assertNodeFound(cs, 126, nil)
|
|
|
+}
|
|
|
+
|
|
|
+func (css *ColStoreSuite) TestRemoveNode(c *C) {
|
|
|
+
|
|
|
+ assertChain := func(cs *ColStore, chain []*Col) {
|
|
|
+ node := cs.Root
|
|
|
+ for _, col := range chain {
|
|
|
+ c.Assert(node, NotNil)
|
|
|
+ c.Assert(node.Col.Min, Equals, col.Min)
|
|
|
+ c.Assert(node.Col.Max, Equals, col.Max)
|
|
|
+ node = node.Next
|
|
|
+ }
|
|
|
+ c.Assert(node, IsNil)
|
|
|
+ }
|
|
|
+
|
|
|
+ cs := &ColStore{}
|
|
|
+ col0 := &Col{Min: 1, Max: 1}
|
|
|
+ cs.Add(col0)
|
|
|
+ col1 := &Col{Min: 2, Max: 2}
|
|
|
+ cs.Add(col1)
|
|
|
+ col2 := &Col{Min: 3, Max: 3}
|
|
|
+ cs.Add(col2)
|
|
|
+ col3 := &Col{Min: 4, Max: 4}
|
|
|
+ cs.Add(col3)
|
|
|
+ col4 := &Col{Min: 5, Max: 5}
|
|
|
+ cs.Add(col4)
|
|
|
+ c.Assert(cs.Len, Equals, 5)
|
|
|
+
|
|
|
+ cs.removeNode(cs.findNodeForColNum(5))
|
|
|
+ c.Assert(cs.Len, Equals, 4)
|
|
|
+ assertChain(cs, []*Col{col0, col1, col2, col3})
|
|
|
+
|
|
|
+ cs.removeNode(cs.findNodeForColNum(1))
|
|
|
+ c.Assert(cs.Len, Equals, 3)
|
|
|
+ assertChain(cs, []*Col{col1, col2, col3})
|
|
|
+}
|
|
|
+
|
|
|
+func (css *ColStoreSuite) TestForEach(c *C) {
|
|
|
+ cs := &ColStore{}
|
|
|
+ col0 := &Col{Min: 1, Max: 1, Hidden: true}
|
|
|
+ cs.Add(col0)
|
|
|
+ col1 := &Col{Min: 2, Max: 2}
|
|
|
+ cs.Add(col1)
|
|
|
+ col2 := &Col{Min: 3, Max: 3}
|
|
|
+ cs.Add(col2)
|
|
|
+ col3 := &Col{Min: 4, Max: 4}
|
|
|
+ cs.Add(col3)
|
|
|
+ col4 := &Col{Min: 5, Max: 5}
|
|
|
+ cs.Add(col4)
|
|
|
+ cs.ForEach(func(index int, col *Col) {
|
|
|
+ col.Phonetic = true
|
|
|
+ })
|
|
|
+
|
|
|
+ c.Assert(col0.Phonetic, Equals, true)
|
|
|
+ c.Assert(col1.Phonetic, Equals, true)
|
|
|
+ c.Assert(col2.Phonetic, Equals, true)
|
|
|
+ c.Assert(col3.Phonetic, Equals, true)
|
|
|
+ c.Assert(col4.Phonetic, Equals, true)
|
|
|
+}
|
|
|
+
|
|
|
+func (css *ColStoreSuite) TestGetOrMakeColsForRange(c *C) {
|
|
|
+ assertCols := func(min, max int, initalCols, expectedCols []*Col) {
|
|
|
+ cs := &ColStore{}
|
|
|
+ for _, col := range initalCols {
|
|
|
+ cs.Add(col)
|
|
|
+ }
|
|
|
+ result := cs.getOrMakeColsForRange(cs.Root, min, max)
|
|
|
+ c.Assert(result, HasLen, len(expectedCols))
|
|
|
+ for i := 0; i < len(expectedCols); i++ {
|
|
|
+ got := result[i]
|
|
|
+ expected := expectedCols[i]
|
|
|
+ c.Assert(got.Min, Equals, expected.Min)
|
|
|
+ c.Assert(got.Max, Equals, expected.Max)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // make everything
|
|
|
+ assertCols(1, 11, nil, []*Col{{Min: 1, Max: 11}})
|
|
|
+
|
|
|
+ // get everything, one col
|
|
|
+ assertCols(1, 11, []*Col{{Min: 1, Max: 11}}, []*Col{{Min: 1, Max: 11}})
|
|
|
+
|
|
|
+ // get everything, many cols
|
|
|
+ assertCols(1, 11,
|
|
|
+ []*Col{
|
|
|
+ {Min: 1, Max: 4},
|
|
|
+ {Min: 5, Max: 8},
|
|
|
+ {Min: 9, Max: 11},
|
|
|
+ },
|
|
|
+ []*Col{
|
|
|
+ {Min: 1, Max: 4},
|
|
|
+ {Min: 5, Max: 8},
|
|
|
+ {Min: 9, Max: 11},
|
|
|
+ },
|
|
|
+ )
|
|
|
+
|
|
|
+ // make missing col
|
|
|
+ assertCols(1, 11,
|
|
|
+ []*Col{
|
|
|
+ {Min: 1, Max: 4},
|
|
|
+ {Min: 9, Max: 11},
|
|
|
+ },
|
|
|
+ []*Col{
|
|
|
+ {Min: 1, Max: 4},
|
|
|
+ {Min: 5, Max: 8},
|
|
|
+ {Min: 9, Max: 11},
|
|
|
+ },
|
|
|
+ )
|
|
|
+
|
|
|
+}
|