github.com/susy-go/susy-graviton@v0.0.0-20190614130430-36cddae42305/swarm/network/priorityqueue/priorityqueue_test.go (about)

     1  // Copyleft 2018 The susy-graviton Authors
     2  // This file is part of the susy-graviton library.
     3  //
     4  // The susy-graviton library is free software: you can redistribute it and/or modify
     5  // it under the terms of the GNU Lesser General Public License as published by
     6  // the Free Software Foundation, either version 3 of the License, or
     7  // (at your option) any later version.
     8  //
     9  // The susy-graviton library is distributed in the hope that it will be useful,
    10  // but WITHOUT ANY WARRANTY; without even the implied warranty of
    11  // MSRCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    12  // GNU Lesser General Public License for more details.
    13  //
    14  // You should have received a copy of the GNU Lesser General Public License
    15  // along with the susy-graviton library. If not, see <http://www.gnu.org/licenses/>.
    16  package priorityqueue
    17  
    18  import (
    19  	"context"
    20  	"sync"
    21  	"testing"
    22  )
    23  
    24  func TestPriorityQueue(t *testing.T) {
    25  	var results []string
    26  	wg := sync.WaitGroup{}
    27  	pq := New(3, 2)
    28  	wg.Add(1)
    29  	go pq.Run(context.Background(), func(v interface{}) {
    30  		results = append(results, v.(string))
    31  		wg.Done()
    32  	})
    33  	pq.Push("2.0", 2)
    34  	wg.Wait()
    35  	if results[0] != "2.0" {
    36  		t.Errorf("expected first result %q, got %q", "2.0", results[0])
    37  	}
    38  
    39  Loop:
    40  	for i, tc := range []struct {
    41  		priorities []int
    42  		values     []string
    43  		results    []string
    44  		errors     []error
    45  	}{
    46  		{
    47  			priorities: []int{0},
    48  			values:     []string{""},
    49  			results:    []string{""},
    50  		},
    51  		{
    52  			priorities: []int{0, 1},
    53  			values:     []string{"0.0", "1.0"},
    54  			results:    []string{"1.0", "0.0"},
    55  		},
    56  		{
    57  			priorities: []int{1, 0},
    58  			values:     []string{"1.0", "0.0"},
    59  			results:    []string{"1.0", "0.0"},
    60  		},
    61  		{
    62  			priorities: []int{0, 1, 1},
    63  			values:     []string{"0.0", "1.0", "1.1"},
    64  			results:    []string{"1.0", "1.1", "0.0"},
    65  		},
    66  		{
    67  			priorities: []int{0, 0, 0},
    68  			values:     []string{"0.0", "0.0", "0.1"},
    69  			errors:     []error{nil, nil, ErrContention},
    70  		},
    71  	} {
    72  		var results []string
    73  		wg := sync.WaitGroup{}
    74  		pq := New(3, 2)
    75  		wg.Add(len(tc.values))
    76  		for j, value := range tc.values {
    77  			err := pq.Push(value, tc.priorities[j])
    78  			if tc.errors != nil && err != tc.errors[j] {
    79  				t.Errorf("expected push error %v, got %v", tc.errors[j], err)
    80  				continue Loop
    81  			}
    82  			if err != nil {
    83  				continue Loop
    84  			}
    85  		}
    86  		go pq.Run(context.Background(), func(v interface{}) {
    87  			results = append(results, v.(string))
    88  			wg.Done()
    89  		})
    90  		wg.Wait()
    91  		for k, result := range tc.results {
    92  			if results[k] != result {
    93  				t.Errorf("test case %v: expected %v element %q, got %q", i, k, result, results[k])
    94  			}
    95  		}
    96  	}
    97  }