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