github.com/edxfund/validator@v1.8.16-0.20181020093046-c1def72855da/core/qztree_test.go (about)

     1  package core
     2  
     3  import (
     4  	"fmt"
     5  	"testing"
     6  )
     7  
     8  type TestNode struct {
     9  	hash 		uint64
    10  	blockNumber uint64
    11  	parentHash 	uint64
    12  	td		   	uint64
    13  }
    14  
    15  
    16  func (ts *TestNode) Hash() uint64{ return ts. hash }
    17  func (ts *TestNode) BlockNumber() uint64{ return ts. blockNumber }
    18  func (ts *TestNode) ParentHash() uint64{ return ts. parentHash }
    19  func (ts *TestNode) Td() uint64{ return ts. td }
    20  
    21  const (
    22  	NODE1  = iota
    23  	NODE11
    24  	NODE12
    25  	NODE111
    26  	NODE112
    27  	NODE121
    28  	NODE122
    29  	NODE123
    30  	NODE1111
    31  	NODE1112
    32  	NODE11121
    33  	NODE1121
    34  	NODE1122
    35  	NODE1123
    36  	NODE11221
    37  	NODE11222
    38  )
    39  var nodes = []TestNode{
    40  	TestNode{1234, 1, 0, 10},
    41  	/*node11*/ TestNode{12345, 2, 1234, 20},
    42  	/*node12*/ TestNode{12346, 2, 1234, 21},
    43  	/*&node111*/ TestNode{123455, 3, 12345, 30},
    44  	/*&node112*/ TestNode{123456, 3, 12345, 31},
    45  	/*node121 =*/ TestNode{22345, 3, 12346, 32},
    46  	/*node122 = */ TestNode{22346, 3, 12346, 33},
    47  	/*node123 = */ TestNode{22347, 3, 12346, 33},
    48  	/*node1111 = */ TestNode{11111234, 4, 123455, 45},
    49  	/*node1112 = */ TestNode{11111235, 4, 123455, 47},
    50  	/*node11121 = */ TestNode{111112356, 5, 11111235, 55},
    51  	/*&node1121*/ TestNode{1234561, 4, 123456, 41},
    52  	/*&node1122*/ TestNode{1234562, 4, 123456, 44},
    53  	/*&node1123*/ TestNode{1234563, 4, 123456, 43},
    54  	/*&node11221*/ TestNode{12345621, 5, 1234562, 53},
    55  	/*&node11222*/ TestNode{12345622, 5, 1234562, 51},
    56  }
    57  
    58  
    59  func Test_Base_1(t *testing.T) {
    60  	ts := NewQZTree(&nodes[NODE1])
    61  	if ts.Node().Hash() == nodes[NODE1].Hash() {
    62  		t.Log("create ok")
    63  	}
    64  
    65  	res := ts.AddNode(&nodes[NODE111])
    66  	if !res {
    67  		t.Log( "Add invalid node")
    68  	} else {
    69  		t.Error( "Add invalid node failed")
    70  	}
    71  	for i:= NODE11; i<= NODE11121;i++{
    72  		ts.AddNode(&nodes[i])
    73  	}
    74  
    75  	nodefailed := false;
    76  	for i := 0; i <= NODE11121; i++ {
    77  		if ts.FindNode(&nodes[i], func(n1, n2 Node) bool {
    78  			return n1.Hash() == n2.Hash()
    79  		}) == nil  {
    80  			nodefailed = true
    81  			break
    82  		}
    83  	}
    84  
    85  	if nodefailed {
    86  		t.Error (" add node failed")
    87  	} else {
    88  		t.Log( " all nodes add ok")
    89  	}
    90  }
    91  func Test_noduplication (t *testing.T) {
    92  	ts := NewQZTree(&nodes[NODE1])
    93  	for i:= NODE1; i<= NODE11;i++{
    94  		ts.AddNode(&nodes[i])
    95  	}
    96  	for i:= NODE11; i<= NODE11121;i++{
    97  		ts.AddNode(&nodes[i])
    98  	}
    99  
   100  	counts := map[uint64]uint64{}
   101  	ts.Iterator(true, func(node Node) bool {
   102  		fmt.Println(node.(*TestNode))
   103  		hash := node.(*TestNode).Hash()
   104  		val,ok := counts[hash]
   105  		if(!ok) {
   106  			counts[hash] = 1
   107  		}else {
   108  			counts[hash] = val +1
   109  		}
   110  
   111  		return false
   112  	})
   113  
   114  	//check for all hash counts
   115  	duplicated := false
   116  	for _,val := range counts {
   117  		if val != 1 {
   118  			duplicated = true
   119  		}
   120  	}
   121  	if duplicated {
   122  		t.Error(" found duplicated!")
   123  	}else {
   124  		t.Log( " duplicated auto removed")
   125  	}
   126  }
   127  func Test_MaxTd_1(t *testing.T) {
   128  
   129  	ts := NewQZTree(&nodes[NODE1])
   130  
   131  	for i:= 0; i<= NODE11121;i++{
   132  		ts.AddNode(&nodes[i])
   133  	}
   134  
   135  	node := ts.GetMaxTdPath(nil)
   136  	if node != nil && node.self.Hash() == 111112356 {
   137  		t.Log( " Find Max TD PATH OK")
   138  	}else {
   139  		t.Error(" Max TD Path failed!")
   140  	}
   141  }
   142  
   143  func Test_MaxTd_2(t *testing.T) {
   144  
   145  	ts := NewQZTree(&nodes[NODE1])
   146  
   147  	for i:= 0; i<= NODE11222;i++{
   148  
   149  		ts.AddNode(&nodes[i])
   150  	}
   151  
   152  	node := ts.GetMaxTdPath(&nodes[NODE112])
   153  	if node != nil && node.self.Hash() == nodes[NODE11221].Hash()  {
   154  		t.Log( " Find Special Max TD PATH OK")
   155  	}else {
   156  		t.Error(" Max Special TD Path failed!")
   157  	}
   158  }
   159  
   160  func Test_SeperateNode_1(t *testing.T) {
   161  
   162  	ts := NewQZTree(&nodes[NODE1])
   163  
   164  	for i:= 0; i<= NODE11222;i++{
   165  		if i != NODE112 {
   166  			ts.AddNode(&nodes[i])
   167  		}
   168  
   169  	}
   170  
   171  	if ts.FindNode(&nodes[NODE1121], func(n1, n2 Node) bool {
   172  		return n1.Hash() == n2.Hash()
   173  	}) == nil  {
   174  		t.Log( " seperated node test ok")
   175  	}else {
   176  		t.Error(" seperated node test  failed!")
   177  	}
   178  }
   179  
   180  
   181  func Test_MergeNode_1(t *testing.T) {
   182  
   183  	ts := NewQZTree(&nodes[NODE1])
   184  
   185  	for i:= 0; i<= NODE11222;i++{
   186  		if i != NODE112 {
   187  			ts.AddNode(&nodes[i])
   188  		}
   189  
   190  	}
   191  	ts2 := NewQZTree(&nodes[NODE112])
   192  	for i:= 0; i<= NODE11222;i++{
   193  
   194  		ts2.AddNode(&nodes[i])
   195  
   196  	}
   197  
   198  	ts.Iterator(true, func(node Node) bool {
   199  		fmt.Println(node.(*TestNode))
   200  		return false
   201  	})
   202  
   203  	fmt.Println("---------")
   204  	ts2.Iterator(false, func(node Node) bool {
   205  		fmt.Println(node.(*TestNode))
   206  		return false
   207  	})
   208  
   209  	ts.MergeTree(ts2)
   210  
   211  	ts.Iterator(true, func(node Node) bool {
   212  		fmt.Println(node.(*TestNode))
   213  		return false
   214  	})
   215  
   216  	fmt.Println("---------")
   217  	if ts.FindNode(&nodes[NODE1121], func(n1, n2 Node) bool {
   218  		return n1.Hash() == n2.Hash()
   219  	}) != nil  {
   220  		t.Log( " seperated node test ok")
   221  	}else {
   222  		t.Error(" seperated node test  failed!")
   223  	}
   224  }
   225  
   226  
   227  func Test_ClearAll_1(t *testing.T) {
   228  
   229  	ts := NewQZTree(&nodes[NODE1])
   230  
   231  	for i:= 0; i<= NODE11222;i++{
   232  		ts.AddNode(&nodes[i])
   233  	}
   234  
   235  	ts.Remove(nil,false)
   236  
   237  	if ts.children.Len() == 0  {
   238  		t.Log( " Clear All nodes ok")
   239  	}else {
   240  		t.Error(" Clear all Node failed!")
   241  	}
   242  }
   243  
   244  func Test_ClearByNode_1(t *testing.T) {
   245  
   246  	ts := NewQZTree(&nodes[NODE1])
   247  
   248  	for i:= 0; i<= NODE11222;i++{
   249  		ts.AddNode(&nodes[i])
   250  	}
   251  
   252  	ts.Remove( &nodes[NODE11222],false)
   253  	remain := ts.FindNode(&nodes[NODE11222], func(n1, n2 Node) bool {
   254  		return n1.Hash() == n2.Hash()
   255  	})
   256  	if remain != nil && (remain.children.Len() == 0)  {
   257  		t.Log( " Clear Special nodes ok")
   258  	}else {
   259  		t.Error(" Clear Special Node failed!")
   260  	}
   261  }
   262  
   263  
   264  func Test_ClearByNode_2(t *testing.T) {
   265  
   266  	ts := NewQZTree(&nodes[NODE1])
   267  
   268  	for i:= 0; i<= NODE11222;i++{
   269  		ts.AddNode(&nodes[i])
   270  	}
   271  
   272  	ts.Remove( &nodes[NODE11222],true)
   273  	remain := ts.FindNode(&nodes[NODE11222], func(n1, n2 Node) bool {
   274  		return n1.Hash() == n2.Hash()
   275  	})
   276  	if remain == nil  {
   277  		t.Log( " Clear Special nodes ok")
   278  	}else {
   279  		t.Error(" Clear Special Node failed!")
   280  	}
   281  }