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 }