github.com/MetalBlockchain/metalgo@v1.11.9/utils/linked/list_test.go (about) 1 // Copyright (C) 2019-2024, Ava Labs, Inc. All rights reserved. 2 // See the file LICENSE for licensing terms. 3 4 package linked 5 6 import ( 7 "testing" 8 9 "github.com/stretchr/testify/require" 10 ) 11 12 func flattenForwards[T any](l *List[T]) []T { 13 var s []T 14 for e := l.Front(); e != nil; e = e.Next() { 15 s = append(s, e.Value) 16 } 17 return s 18 } 19 20 func flattenBackwards[T any](l *List[T]) []T { 21 var s []T 22 for e := l.Back(); e != nil; e = e.Prev() { 23 s = append(s, e.Value) 24 } 25 return s 26 } 27 28 func TestList_Empty(t *testing.T) { 29 require := require.New(t) 30 31 l := NewList[int]() 32 33 require.Empty(flattenForwards(l)) 34 require.Empty(flattenBackwards(l)) 35 require.Zero(l.Len()) 36 } 37 38 func TestList_PushBack(t *testing.T) { 39 require := require.New(t) 40 41 l := NewList[int]() 42 43 for i := 0; i < 5; i++ { 44 l.PushBack(&ListElement[int]{ 45 Value: i, 46 }) 47 } 48 49 require.Equal([]int{0, 1, 2, 3, 4}, flattenForwards(l)) 50 require.Equal([]int{4, 3, 2, 1, 0}, flattenBackwards(l)) 51 require.Equal(5, l.Len()) 52 } 53 54 func TestList_PushBack_Duplicate(t *testing.T) { 55 require := require.New(t) 56 57 l := NewList[int]() 58 59 e := &ListElement[int]{ 60 Value: 0, 61 } 62 l.PushBack(e) 63 l.PushBack(e) 64 65 require.Equal([]int{0}, flattenForwards(l)) 66 require.Equal([]int{0}, flattenBackwards(l)) 67 require.Equal(1, l.Len()) 68 } 69 70 func TestList_PushFront(t *testing.T) { 71 require := require.New(t) 72 73 l := NewList[int]() 74 75 for i := 0; i < 5; i++ { 76 l.PushFront(&ListElement[int]{ 77 Value: i, 78 }) 79 } 80 81 require.Equal([]int{4, 3, 2, 1, 0}, flattenForwards(l)) 82 require.Equal([]int{0, 1, 2, 3, 4}, flattenBackwards(l)) 83 require.Equal(5, l.Len()) 84 } 85 86 func TestList_PushFront_Duplicate(t *testing.T) { 87 require := require.New(t) 88 89 l := NewList[int]() 90 91 e := &ListElement[int]{ 92 Value: 0, 93 } 94 l.PushFront(e) 95 l.PushFront(e) 96 97 require.Equal([]int{0}, flattenForwards(l)) 98 require.Equal([]int{0}, flattenBackwards(l)) 99 require.Equal(1, l.Len()) 100 } 101 102 func TestList_Remove(t *testing.T) { 103 require := require.New(t) 104 105 l := NewList[int]() 106 107 e0 := &ListElement[int]{ 108 Value: 0, 109 } 110 e1 := &ListElement[int]{ 111 Value: 1, 112 } 113 e2 := &ListElement[int]{ 114 Value: 2, 115 } 116 l.PushBack(e0) 117 l.PushBack(e1) 118 l.PushBack(e2) 119 120 l.Remove(e1) 121 122 require.Equal([]int{0, 2}, flattenForwards(l)) 123 require.Equal([]int{2, 0}, flattenBackwards(l)) 124 require.Equal(2, l.Len()) 125 require.Nil(e1.next) 126 require.Nil(e1.prev) 127 require.Nil(e1.list) 128 } 129 130 func TestList_MoveToFront(t *testing.T) { 131 require := require.New(t) 132 133 l := NewList[int]() 134 135 e0 := &ListElement[int]{ 136 Value: 0, 137 } 138 e1 := &ListElement[int]{ 139 Value: 1, 140 } 141 l.PushFront(e0) 142 l.PushFront(e1) 143 l.MoveToFront(e0) 144 145 require.Equal([]int{0, 1}, flattenForwards(l)) 146 require.Equal([]int{1, 0}, flattenBackwards(l)) 147 require.Equal(2, l.Len()) 148 } 149 150 func TestList_MoveToBack(t *testing.T) { 151 require := require.New(t) 152 153 l := NewList[int]() 154 155 e0 := &ListElement[int]{ 156 Value: 0, 157 } 158 e1 := &ListElement[int]{ 159 Value: 1, 160 } 161 l.PushFront(e0) 162 l.PushFront(e1) 163 l.MoveToBack(e1) 164 165 require.Equal([]int{0, 1}, flattenForwards(l)) 166 require.Equal([]int{1, 0}, flattenBackwards(l)) 167 require.Equal(2, l.Len()) 168 }