github.com/ethxdao/go-ethereum@v0.0.0-20221218102228-5ae34a9cc189/common/prque/sstack_test.go (about)

     1  // CookieJar - A contestant's algorithm toolbox
     2  // Copyright (c) 2013 Peter Szilagyi. All rights reserved.
     3  //
     4  // CookieJar is dual licensed: use of this source code is governed by a BSD
     5  // license that can be found in the LICENSE file. Alternatively, the CookieJar
     6  // toolbox may be used in accordance with the terms and conditions contained
     7  // in a signed written agreement between you and the author(s).
     8  
     9  package prque
    10  
    11  import (
    12  	"math/rand"
    13  	"sort"
    14  	"testing"
    15  )
    16  
    17  func TestSstack(t *testing.T) {
    18  	// Create some initial data
    19  	size := 16 * blockSize
    20  	data := make([]*item, size)
    21  	for i := 0; i < size; i++ {
    22  		data[i] = &item{rand.Int(), rand.Int63()}
    23  	}
    24  	stack := newSstack(nil, false)
    25  	for rep := 0; rep < 2; rep++ {
    26  		// Push all the data into the stack, pop out every second
    27  		secs := []*item{}
    28  		for i := 0; i < size; i++ {
    29  			stack.Push(data[i])
    30  			if i%2 == 0 {
    31  				secs = append(secs, stack.Pop().(*item))
    32  			}
    33  		}
    34  		rest := []*item{}
    35  		for stack.Len() > 0 {
    36  			rest = append(rest, stack.Pop().(*item))
    37  		}
    38  		// Make sure the contents of the resulting slices are ok
    39  		for i := 0; i < size; i++ {
    40  			if i%2 == 0 && data[i] != secs[i/2] {
    41  				t.Errorf("push/pop mismatch: have %v, want %v.", secs[i/2], data[i])
    42  			}
    43  			if i%2 == 1 && data[i] != rest[len(rest)-i/2-1] {
    44  				t.Errorf("push/pop mismatch: have %v, want %v.", rest[len(rest)-i/2-1], data[i])
    45  			}
    46  		}
    47  	}
    48  }
    49  
    50  func TestSstackSort(t *testing.T) {
    51  	// Create some initial data
    52  	size := 16 * blockSize
    53  	data := make([]*item, size)
    54  	for i := 0; i < size; i++ {
    55  		data[i] = &item{rand.Int(), int64(i)}
    56  	}
    57  	// Push all the data into the stack
    58  	stack := newSstack(nil, false)
    59  	for _, val := range data {
    60  		stack.Push(val)
    61  	}
    62  	// Sort and pop the stack contents (should reverse the order)
    63  	sort.Sort(stack)
    64  	for _, val := range data {
    65  		out := stack.Pop()
    66  		if out != val {
    67  			t.Errorf("push/pop mismatch after sort: have %v, want %v.", out, val)
    68  		}
    69  	}
    70  }
    71  
    72  func TestSstackReset(t *testing.T) {
    73  	// Create some initial data
    74  	size := 16 * blockSize
    75  	data := make([]*item, size)
    76  	for i := 0; i < size; i++ {
    77  		data[i] = &item{rand.Int(), rand.Int63()}
    78  	}
    79  	stack := newSstack(nil, false)
    80  	for rep := 0; rep < 2; rep++ {
    81  		// Push all the data into the stack, pop out every second
    82  		secs := []*item{}
    83  		for i := 0; i < size; i++ {
    84  			stack.Push(data[i])
    85  			if i%2 == 0 {
    86  				secs = append(secs, stack.Pop().(*item))
    87  			}
    88  		}
    89  		// Reset and verify both pulled and stack contents
    90  		stack.Reset()
    91  		if stack.Len() != 0 {
    92  			t.Errorf("stack not empty after reset: %v", stack)
    93  		}
    94  		for i := 0; i < size; i++ {
    95  			if i%2 == 0 && data[i] != secs[i/2] {
    96  				t.Errorf("push/pop mismatch: have %v, want %v.", secs[i/2], data[i])
    97  			}
    98  		}
    99  	}
   100  }