Kaynağa Gözat

Initial test case for sequential cols

Geoffrey J. Teale 6 yıl önce
ebeveyn
işleme
d6bcf72c39
2 değiştirilmiş dosya ile 70 ekleme ve 0 silme
  1. 42 0
      col.go
  2. 28 0
      col_test.go

+ 42 - 0
col.go

@@ -119,3 +119,45 @@ func (c *Col) GetStreamStyle() StreamStyle {
 	// returning 0 which maps to formatCode "general"
 	return StreamStyle{builtInNumFmtInv[c.numFmt], c.style}
 }
+
+type colStoreNode struct {
+	Col  *Col
+	Prev *colStoreNode
+	Next *colStoreNode
+}
+
+func (csn *colStoreNode) placeNode(node *colStoreNode) error {
+	switch {
+	case csn.Col.Max < node.Col.Min:
+		if csn.Next == nil {
+			csn.Next = node
+			return nil
+		}
+	}
+
+	if node.Col.Min <= csn.Col.Min {
+		if csn.Prev == nil {
+			csn.Prev = node
+		} else {
+			err := csn.Prev.placeNode(node)
+			if err != nil {
+				return err
+			}
+		}
+	}
+	return nil
+}
+
+type ColStore struct {
+	Root *colStoreNode
+}
+
+//
+func (cs *ColStore) Add(col *Col) error {
+	newNode := &colStoreNode{Col: col}
+	if cs.Root == nil {
+		cs.Root = newNode
+		return nil
+	}
+	return cs.Root.placeNode(newNode)
+}

+ 28 - 0
col_test.go

@@ -1 +1,29 @@
 package xlsx
+
+import (
+	. "gopkg.in/check.v1"
+)
+
+type ColStoreSuite struct{}
+
+var _ = Suite(&ColStoreSuite{})
+
+func (css *ColStoreSuite) TestAddOneNode(c *C) {
+	col := &Col{Min: 0, Max: 1}
+	cs := ColStore{}
+	err := cs.Add(col)
+	c.Assert(err, IsNil)
+	c.Assert(cs.Root.Col, Equals, col)
+}
+
+func (css *ColStoreSuite) TestAddTwoNonOverlappingSequentialNodes(c *C) {
+	col1 := &Col{Min: 0, Max: 1}
+	col2 := &Col{Min: 2, Max: 4}
+	cs := ColStore{}
+	err := cs.Add(col1)
+	c.Assert(err, IsNil)
+	err = cs.Add(col2)
+	c.Assert(err, IsNil)
+	c.Assert(cs.Root.Col, Equals, col1)
+	c.Assert(cs.Root.Next.Col, Equals, col2)
+}