github.com/mymmsc/gox@v1.3.33/util/arraystack/arraystack_test.go (about)

     1  // Copyright (c) 2015, Emir Pasic. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package arraystack
     6  
     7  import (
     8  	"fmt"
     9  	"testing"
    10  )
    11  
    12  func TestStackPush(t *testing.T) {
    13  	stack := New()
    14  	if actualValue := stack.Empty(); actualValue != true {
    15  		t.Errorf("Got %v expected %v", actualValue, true)
    16  	}
    17  	stack.Push(1)
    18  	stack.Push(2)
    19  	stack.Push(3)
    20  
    21  	if actualValue := stack.Values(); actualValue[0].(int) != 3 || actualValue[1].(int) != 2 || actualValue[2].(int) != 1 {
    22  		t.Errorf("Got %v expected %v", actualValue, "[3,2,1]")
    23  	}
    24  	if actualValue := stack.Empty(); actualValue != false {
    25  		t.Errorf("Got %v expected %v", actualValue, false)
    26  	}
    27  	if actualValue := stack.Size(); actualValue != 3 {
    28  		t.Errorf("Got %v expected %v", actualValue, 3)
    29  	}
    30  	if actualValue, ok := stack.Peek(); actualValue != 3 || !ok {
    31  		t.Errorf("Got %v expected %v", actualValue, 3)
    32  	}
    33  }
    34  
    35  func TestStackPeek(t *testing.T) {
    36  	stack := New()
    37  	if actualValue, ok := stack.Peek(); actualValue != nil || ok {
    38  		t.Errorf("Got %v expected %v", actualValue, nil)
    39  	}
    40  	stack.Push(1)
    41  	stack.Push(2)
    42  	stack.Push(3)
    43  	if actualValue, ok := stack.Peek(); actualValue != 3 || !ok {
    44  		t.Errorf("Got %v expected %v", actualValue, 3)
    45  	}
    46  }
    47  
    48  func TestStackPop(t *testing.T) {
    49  	stack := New()
    50  	stack.Push(1)
    51  	stack.Push(2)
    52  	stack.Push(3)
    53  	stack.Pop()
    54  	if actualValue, ok := stack.Peek(); actualValue != 2 || !ok {
    55  		t.Errorf("Got %v expected %v", actualValue, 2)
    56  	}
    57  	if actualValue, ok := stack.Pop(); actualValue != 2 || !ok {
    58  		t.Errorf("Got %v expected %v", actualValue, 2)
    59  	}
    60  	if actualValue, ok := stack.Pop(); actualValue != 1 || !ok {
    61  		t.Errorf("Got %v expected %v", actualValue, 1)
    62  	}
    63  	if actualValue, ok := stack.Pop(); actualValue != nil || ok {
    64  		t.Errorf("Got %v expected %v", actualValue, nil)
    65  	}
    66  	if actualValue := stack.Empty(); actualValue != true {
    67  		t.Errorf("Got %v expected %v", actualValue, true)
    68  	}
    69  	if actualValue := stack.Values(); len(actualValue) != 0 {
    70  		t.Errorf("Got %v expected %v", actualValue, "[]")
    71  	}
    72  }
    73  
    74  func TestStackIteratorOnEmpty(t *testing.T) {
    75  	stack := New()
    76  	it := stack.Iterator()
    77  	for it.Next() {
    78  		t.Errorf("Shouldn't iterate on empty stack")
    79  	}
    80  }
    81  
    82  func TestStackIteratorNext(t *testing.T) {
    83  	stack := New()
    84  	stack.Push("a")
    85  	stack.Push("b")
    86  	stack.Push("c")
    87  
    88  	it := stack.Iterator()
    89  	count := 0
    90  	for it.Next() {
    91  		count++
    92  		index := it.Index()
    93  		value := it.Value()
    94  		switch index {
    95  		case 0:
    96  			if actualValue, expectedValue := value, "c"; actualValue != expectedValue {
    97  				t.Errorf("Got %v expected %v", actualValue, expectedValue)
    98  			}
    99  		case 1:
   100  			if actualValue, expectedValue := value, "b"; actualValue != expectedValue {
   101  				t.Errorf("Got %v expected %v", actualValue, expectedValue)
   102  			}
   103  		case 2:
   104  			if actualValue, expectedValue := value, "a"; actualValue != expectedValue {
   105  				t.Errorf("Got %v expected %v", actualValue, expectedValue)
   106  			}
   107  		default:
   108  			t.Errorf("Too many")
   109  		}
   110  		if actualValue, expectedValue := index, count-1; actualValue != expectedValue {
   111  			t.Errorf("Got %v expected %v", actualValue, expectedValue)
   112  		}
   113  	}
   114  	if actualValue, expectedValue := count, 3; actualValue != expectedValue {
   115  		t.Errorf("Got %v expected %v", actualValue, expectedValue)
   116  	}
   117  }
   118  
   119  func TestStackIteratorPrev(t *testing.T) {
   120  	stack := New()
   121  	stack.Push("a")
   122  	stack.Push("b")
   123  	stack.Push("c")
   124  
   125  	it := stack.Iterator()
   126  	for it.Next() {
   127  	}
   128  	count := 0
   129  	for it.Prev() {
   130  		count++
   131  		index := it.Index()
   132  		value := it.Value()
   133  		switch index {
   134  		case 0:
   135  			if actualValue, expectedValue := value, "c"; actualValue != expectedValue {
   136  				t.Errorf("Got %v expected %v", actualValue, expectedValue)
   137  			}
   138  		case 1:
   139  			if actualValue, expectedValue := value, "b"; actualValue != expectedValue {
   140  				t.Errorf("Got %v expected %v", actualValue, expectedValue)
   141  			}
   142  		case 2:
   143  			if actualValue, expectedValue := value, "a"; actualValue != expectedValue {
   144  				t.Errorf("Got %v expected %v", actualValue, expectedValue)
   145  			}
   146  		default:
   147  			t.Errorf("Too many")
   148  		}
   149  		if actualValue, expectedValue := index, 3-count; actualValue != expectedValue {
   150  			t.Errorf("Got %v expected %v", actualValue, expectedValue)
   151  		}
   152  	}
   153  	if actualValue, expectedValue := count, 3; actualValue != expectedValue {
   154  		t.Errorf("Got %v expected %v", actualValue, expectedValue)
   155  	}
   156  }
   157  
   158  func TestStackIteratorBegin(t *testing.T) {
   159  	stack := New()
   160  	it := stack.Iterator()
   161  	it.Begin()
   162  	stack.Push("a")
   163  	stack.Push("b")
   164  	stack.Push("c")
   165  	for it.Next() {
   166  	}
   167  	it.Begin()
   168  	it.Next()
   169  	if index, value := it.Index(), it.Value(); index != 0 || value != "c" {
   170  		t.Errorf("Got %v,%v expected %v,%v", index, value, 0, "c")
   171  	}
   172  }
   173  
   174  func TestStackIteratorEnd(t *testing.T) {
   175  	stack := New()
   176  	it := stack.Iterator()
   177  
   178  	if index := it.Index(); index != -1 {
   179  		t.Errorf("Got %v expected %v", index, -1)
   180  	}
   181  
   182  	it.End()
   183  	if index := it.Index(); index != 0 {
   184  		t.Errorf("Got %v expected %v", index, 0)
   185  	}
   186  
   187  	stack.Push("a")
   188  	stack.Push("b")
   189  	stack.Push("c")
   190  	it.End()
   191  	if index := it.Index(); index != stack.Size() {
   192  		t.Errorf("Got %v expected %v", index, stack.Size())
   193  	}
   194  
   195  	it.Prev()
   196  	if index, value := it.Index(), it.Value(); index != stack.Size()-1 || value != "a" {
   197  		t.Errorf("Got %v,%v expected %v,%v", index, value, stack.Size()-1, "a")
   198  	}
   199  }
   200  
   201  func TestStackIteratorFirst(t *testing.T) {
   202  	stack := New()
   203  	it := stack.Iterator()
   204  	if actualValue, expectedValue := it.First(), false; actualValue != expectedValue {
   205  		t.Errorf("Got %v expected %v", actualValue, expectedValue)
   206  	}
   207  	stack.Push("a")
   208  	stack.Push("b")
   209  	stack.Push("c")
   210  	if actualValue, expectedValue := it.First(), true; actualValue != expectedValue {
   211  		t.Errorf("Got %v expected %v", actualValue, expectedValue)
   212  	}
   213  	if index, value := it.Index(), it.Value(); index != 0 || value != "c" {
   214  		t.Errorf("Got %v,%v expected %v,%v", index, value, 0, "c")
   215  	}
   216  }
   217  
   218  func TestStackIteratorLast(t *testing.T) {
   219  	stack := New()
   220  	it := stack.Iterator()
   221  	if actualValue, expectedValue := it.Last(), false; actualValue != expectedValue {
   222  		t.Errorf("Got %v expected %v", actualValue, expectedValue)
   223  	}
   224  	stack.Push("a")
   225  	stack.Push("b")
   226  	stack.Push("c")
   227  	if actualValue, expectedValue := it.Last(), true; actualValue != expectedValue {
   228  		t.Errorf("Got %v expected %v", actualValue, expectedValue)
   229  	}
   230  	if index, value := it.Index(), it.Value(); index != 2 || value != "a" {
   231  		t.Errorf("Got %v,%v expected %v,%v", index, value, 2, "a")
   232  	}
   233  }
   234  
   235  func TestStackSerialization(t *testing.T) {
   236  	stack := New()
   237  	stack.Push("a")
   238  	stack.Push("b")
   239  	stack.Push("c")
   240  
   241  	var err error
   242  	assert := func() {
   243  		if actualValue, expectedValue := fmt.Sprintf("%s%s%s", stack.Values()...), "cba"; actualValue != expectedValue {
   244  			t.Errorf("Got %v expected %v", actualValue, expectedValue)
   245  		}
   246  		if actualValue, expectedValue := stack.Size(), 3; actualValue != expectedValue {
   247  			t.Errorf("Got %v expected %v", actualValue, expectedValue)
   248  		}
   249  		if err != nil {
   250  			t.Errorf("Got error %v", err)
   251  		}
   252  	}
   253  
   254  	assert()
   255  
   256  	json, err := stack.ToJSON()
   257  	assert()
   258  
   259  	err = stack.FromJSON(json)
   260  	assert()
   261  }
   262  
   263  func benchmarkPush(b *testing.B, stack *Stack, size int) {
   264  	for i := 0; i < b.N; i++ {
   265  		for n := 0; n < size; n++ {
   266  			stack.Push(n)
   267  		}
   268  	}
   269  }
   270  
   271  func benchmarkPop(b *testing.B, stack *Stack, size int) {
   272  	for i := 0; i < b.N; i++ {
   273  		for n := 0; n < size; n++ {
   274  			stack.Pop()
   275  		}
   276  	}
   277  }
   278  
   279  func BenchmarkArrayStackPop100(b *testing.B) {
   280  	b.StopTimer()
   281  	size := 100
   282  	stack := New()
   283  	for n := 0; n < size; n++ {
   284  		stack.Push(n)
   285  	}
   286  	b.StartTimer()
   287  	benchmarkPop(b, stack, size)
   288  }
   289  
   290  func BenchmarkArrayStackPop1000(b *testing.B) {
   291  	b.StopTimer()
   292  	size := 1000
   293  	stack := New()
   294  	for n := 0; n < size; n++ {
   295  		stack.Push(n)
   296  	}
   297  	b.StartTimer()
   298  	benchmarkPop(b, stack, size)
   299  }
   300  
   301  func BenchmarkArrayStackPop10000(b *testing.B) {
   302  	b.StopTimer()
   303  	size := 10000
   304  	stack := New()
   305  	for n := 0; n < size; n++ {
   306  		stack.Push(n)
   307  	}
   308  	b.StartTimer()
   309  	benchmarkPop(b, stack, size)
   310  }
   311  
   312  func BenchmarkArrayStackPop100000(b *testing.B) {
   313  	b.StopTimer()
   314  	size := 100000
   315  	stack := New()
   316  	for n := 0; n < size; n++ {
   317  		stack.Push(n)
   318  	}
   319  	b.StartTimer()
   320  	benchmarkPop(b, stack, size)
   321  }
   322  
   323  func BenchmarkArrayStackPush100(b *testing.B) {
   324  	b.StopTimer()
   325  	size := 100
   326  	stack := New()
   327  	b.StartTimer()
   328  	benchmarkPush(b, stack, size)
   329  }
   330  
   331  func BenchmarkArrayStackPush1000(b *testing.B) {
   332  	b.StopTimer()
   333  	size := 1000
   334  	stack := New()
   335  	for n := 0; n < size; n++ {
   336  		stack.Push(n)
   337  	}
   338  	b.StartTimer()
   339  	benchmarkPush(b, stack, size)
   340  }
   341  
   342  func BenchmarkArrayStackPush10000(b *testing.B) {
   343  	b.StopTimer()
   344  	size := 10000
   345  	stack := New()
   346  	for n := 0; n < size; n++ {
   347  		stack.Push(n)
   348  	}
   349  	b.StartTimer()
   350  	benchmarkPush(b, stack, size)
   351  }
   352  
   353  func BenchmarkArrayStackPush100000(b *testing.B) {
   354  	b.StopTimer()
   355  	size := 100000
   356  	stack := New()
   357  	for n := 0; n < size; n++ {
   358  		stack.Push(n)
   359  	}
   360  	b.StartTimer()
   361  	benchmarkPush(b, stack, size)
   362  }