github.com/hdt3213/godis@v1.2.9/datastruct/list/quicklist_test.go (about)

     1  package list
     2  
     3  import (
     4  	"github.com/hdt3213/godis/lib/utils"
     5  	"strconv"
     6  	"testing"
     7  )
     8  
     9  func TestQuickList_Add(t *testing.T) {
    10  	list := NewQuickList()
    11  	for i := 0; i < pageSize*10; i++ {
    12  		list.Add(i)
    13  	}
    14  	for i := 0; i < pageSize*10; i++ {
    15  		v := list.Get(i).(int)
    16  		if v != i {
    17  			t.Errorf("wrong value at: %d", i)
    18  		}
    19  	}
    20  	list.ForEach(func(i int, v interface{}) bool {
    21  		if v != i {
    22  			t.Errorf("wrong value at: %d", i)
    23  		}
    24  		return true
    25  	})
    26  }
    27  
    28  func BenchmarkQuickList_Add(b *testing.B) {
    29  	list := NewQuickList()
    30  	for i := 0; i < pageSize*10; i++ {
    31  		list.Add(i)
    32  	}
    33  }
    34  
    35  func BenchmarkQuickList_Range(b *testing.B) {
    36  	list := NewQuickList()
    37  	for i := 0; i < pageSize*10; i++ {
    38  		list.Add(i)
    39  	}
    40  	list.ForEach(func(i int, v interface{}) bool {
    41  		return true
    42  	})
    43  }
    44  
    45  func TestQuickList_Set(t *testing.T) {
    46  	list := NewQuickList()
    47  	for i := 0; i < pageSize*10; i++ {
    48  		list.Add(i)
    49  	}
    50  	for i := 0; i < pageSize*10; i++ {
    51  		list.Set(i, 2*i)
    52  	}
    53  	for i := 0; i < pageSize*10; i++ {
    54  		v := list.Get(i).(int)
    55  		if v != 2*i {
    56  			t.Errorf("wrong value at: %d", i)
    57  		}
    58  	}
    59  }
    60  
    61  func TestQuickList_Insert(t *testing.T) {
    62  	list := NewQuickList()
    63  	for i := 0; i < pageSize*10; i++ {
    64  		list.Insert(0, i)
    65  	}
    66  	for i := 0; i < pageSize*10; i++ {
    67  		v := list.Get(i).(int)
    68  		if v != pageSize*10-i-1 {
    69  			t.Errorf("wrong value at: %d", i)
    70  		}
    71  	}
    72  
    73  	// insert into second half page
    74  	list = NewQuickList()
    75  	for i := 0; i < pageSize; i++ {
    76  		list.Add(0)
    77  	}
    78  	for i := 0; i < pageSize; i++ {
    79  		list.Insert(pageSize-1, i+1)
    80  	}
    81  	for i := pageSize - 1; i < list.size; i++ {
    82  		v := list.Get(i).(int)
    83  		if v != 2*pageSize-1-i {
    84  			t.Errorf("wrong value at: %d", i)
    85  		}
    86  	}
    87  }
    88  
    89  func TestQuickList_RemoveLast(t *testing.T) {
    90  	list := NewQuickList()
    91  	size := pageSize * 10
    92  	for i := 0; i < size; i++ {
    93  		list.Add(i)
    94  	}
    95  	for i := 0; i < size; i++ {
    96  		v := list.RemoveLast()
    97  		if v != size-i-1 {
    98  			t.Errorf("wrong value at: %d", i)
    99  		}
   100  		if list.Len() != size-i-1 {
   101  			t.Errorf("wrong len: %d", list.Len())
   102  		}
   103  	}
   104  
   105  }
   106  
   107  func TestQuickListRemoveVal(t *testing.T) {
   108  	list := NewQuickList()
   109  	size := pageSize * 10
   110  	for i := 0; i < size; i++ {
   111  		list.Add(i)
   112  		list.Add(i)
   113  	}
   114  	for index := 0; index < list.Len(); index++ {
   115  		list.RemoveAllByVal(func(a interface{}) bool {
   116  			return utils.Equals(a, index)
   117  		})
   118  		list.ForEach(func(i int, v interface{}) bool {
   119  			intVal, _ := v.(int)
   120  			if intVal == index {
   121  				t.Error("remove test fail: found  " + strconv.Itoa(index) + " at index: " + strconv.Itoa(i))
   122  			}
   123  			return true
   124  		})
   125  	}
   126  
   127  	list = NewQuickList()
   128  	for i := 0; i < size; i++ {
   129  		list.Add(i)
   130  		list.Add(i)
   131  	}
   132  	for i := 0; i < size; i++ {
   133  		list.RemoveByVal(func(a interface{}) bool {
   134  			return utils.Equals(a, i)
   135  		}, 1)
   136  	}
   137  	list.ForEach(func(i int, v interface{}) bool {
   138  		intVal, _ := v.(int)
   139  		if intVal != i {
   140  			t.Error("test fail: expected " + strconv.Itoa(i) + ", actual: " + strconv.Itoa(intVal))
   141  		}
   142  		return true
   143  	})
   144  	for i := 0; i < size; i++ {
   145  		list.RemoveByVal(func(a interface{}) bool {
   146  			return utils.Equals(a, i)
   147  		}, 1)
   148  	}
   149  	if list.Len() != 0 {
   150  		t.Error("test fail: expected 0, actual: " + strconv.Itoa(list.Len()))
   151  	}
   152  
   153  	list = NewQuickList()
   154  	for i := 0; i < size; i++ {
   155  		list.Add(i)
   156  		list.Add(i)
   157  	}
   158  	for i := 0; i < size; i++ {
   159  		list.ReverseRemoveByVal(func(a interface{}) bool {
   160  			return utils.Equals(a, i)
   161  		}, 1)
   162  	}
   163  	list.ForEach(func(i int, v interface{}) bool {
   164  		intVal, _ := v.(int)
   165  		if intVal != i {
   166  			t.Error("test fail: expected " + strconv.Itoa(i) + ", actual: " + strconv.Itoa(intVal))
   167  		}
   168  		return true
   169  	})
   170  	for i := 0; i < size; i++ {
   171  		list.ReverseRemoveByVal(func(a interface{}) bool {
   172  			return utils.Equals(a, i)
   173  		}, 1)
   174  	}
   175  	if list.Len() != 0 {
   176  		t.Error("test fail: expected 0, actual: " + strconv.Itoa(list.Len()))
   177  	}
   178  }
   179  
   180  func TestQuickList_Contains(t *testing.T) {
   181  	list := NewQuickList()
   182  	list.Add(1)
   183  	list.Add(2)
   184  	list.Add(3)
   185  	if !list.Contains(func(a interface{}) bool {
   186  		return a == 1
   187  	}) {
   188  		t.Error("expect true actual false")
   189  	}
   190  	if list.Contains(func(a interface{}) bool {
   191  		return a == -1
   192  	}) {
   193  		t.Error("expect false actual true")
   194  	}
   195  }
   196  
   197  func TestQuickList_Range(t *testing.T) {
   198  	list := NewQuickList()
   199  	size := 10
   200  	for i := 0; i < size; i++ {
   201  		list.Add(i)
   202  	}
   203  	for start := 0; start < size; start++ {
   204  		for stop := start; stop < size; stop++ {
   205  			slice := list.Range(start, stop)
   206  			if len(slice) != stop-start {
   207  				t.Error("expected " + strconv.Itoa(stop-start) + ", get: " + strconv.Itoa(len(slice)) +
   208  					", range: [" + strconv.Itoa(start) + "," + strconv.Itoa(stop) + "]")
   209  			}
   210  			sliceIndex := 0
   211  			for i := start; i < stop; i++ {
   212  				val := slice[sliceIndex]
   213  				intVal, _ := val.(int)
   214  				if intVal != i {
   215  					t.Error("expected " + strconv.Itoa(i) + ", get: " + strconv.Itoa(intVal) +
   216  						", range: [" + strconv.Itoa(start) + "," + strconv.Itoa(stop) + "]")
   217  				}
   218  				sliceIndex++
   219  			}
   220  		}
   221  	}
   222  }
   223  
   224  func TestQuickList_Remove(t *testing.T) {
   225  	list := NewQuickList()
   226  	size := pageSize * 10
   227  	for i := 0; i < size; i++ {
   228  		list.Add(i)
   229  	}
   230  	for i := size - 1; i >= 0; i-- {
   231  		list.Remove(i)
   232  		if i != list.Len() {
   233  			t.Error("remove test fail: expected size " + strconv.Itoa(i) + ", actual: " + strconv.Itoa(list.Len()))
   234  		}
   235  		list.ForEach(func(i int, v interface{}) bool {
   236  			intVal, _ := v.(int)
   237  			if intVal != i {
   238  				t.Error("remove test fail: expected " + strconv.Itoa(i) + ", actual: " + strconv.Itoa(intVal))
   239  			}
   240  			return true
   241  		})
   242  	}
   243  }
   244  
   245  func TestQuickList_Prev(t *testing.T) {
   246  	list := NewQuickList()
   247  	size := pageSize * 10
   248  	for i := 0; i < size; i++ {
   249  		list.Add(i)
   250  	}
   251  	iter := list.find(size - 1)
   252  	i := size - 1
   253  	for !iter.atBegin() {
   254  		v := iter.get()
   255  		if v != i {
   256  			t.Errorf("wrong value at %d", i)
   257  		}
   258  		iter.prev()
   259  		i--
   260  	}
   261  }