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  }