github.com/linapex/ethereum-dpos-chinese@v0.0.0-20190316121959-b78b3a4a1ece/swarm/network/priorityqueue/priorityqueue_test.go (about) 1 2 //<developer> 3 // <name>linapex 曹一峰</name> 4 // <email>linapex@163.com</email> 5 // <wx>superexc</wx> 6 // <qqgroup>128148617</qqgroup> 7 // <url>https://jsq.ink</url> 8 // <role>pku engineer</role> 9 // <date>2019-03-16 12:09:47</date> 10 //</624342672772960256> 11 12 package priorityqueue 13 14 import ( 15 "context" 16 "sync" 17 "testing" 18 ) 19 20 func TestPriorityQueue(t *testing.T) { 21 var results []string 22 wg := sync.WaitGroup{} 23 pq := New(3, 2) 24 wg.Add(1) 25 go pq.Run(context.Background(), func(v interface{}) { 26 results = append(results, v.(string)) 27 wg.Done() 28 }) 29 pq.Push(context.Background(), "2.0", 2) 30 wg.Wait() 31 if results[0] != "2.0" { 32 t.Errorf("expected first result %q, got %q", "2.0", results[0]) 33 } 34 35 Loop: 36 for i, tc := range []struct { 37 priorities []int 38 values []string 39 results []string 40 errors []error 41 }{ 42 { 43 priorities: []int{0}, 44 values: []string{""}, 45 results: []string{""}, 46 }, 47 { 48 priorities: []int{0, 1}, 49 values: []string{"0.0", "1.0"}, 50 results: []string{"1.0", "0.0"}, 51 }, 52 { 53 priorities: []int{1, 0}, 54 values: []string{"1.0", "0.0"}, 55 results: []string{"1.0", "0.0"}, 56 }, 57 { 58 priorities: []int{0, 1, 1}, 59 values: []string{"0.0", "1.0", "1.1"}, 60 results: []string{"1.0", "1.1", "0.0"}, 61 }, 62 { 63 priorities: []int{0, 0, 0}, 64 values: []string{"0.0", "0.0", "0.1"}, 65 errors: []error{nil, nil, errContention}, 66 }, 67 } { 68 var results []string 69 wg := sync.WaitGroup{} 70 pq := New(3, 2) 71 wg.Add(len(tc.values)) 72 for j, value := range tc.values { 73 err := pq.Push(nil, value, tc.priorities[j]) 74 if tc.errors != nil && err != tc.errors[j] { 75 t.Errorf("expected push error %v, got %v", tc.errors[j], err) 76 continue Loop 77 } 78 if err != nil { 79 continue Loop 80 } 81 } 82 go pq.Run(context.Background(), func(v interface{}) { 83 results = append(results, v.(string)) 84 wg.Done() 85 }) 86 wg.Wait() 87 for k, result := range tc.results { 88 if results[k] != result { 89 t.Errorf("test case %v: expected %v element %q, got %q", i, k, result, results[k]) 90 } 91 } 92 } 93 } 94