go.charczuk.com@v0.0.0-20240327042549-bc490516bd1a/sdk/collections/set_test.go (about)

     1  /*
     2  
     3  Copyright (c) 2023 - Present. Will Charczuk. All rights reserved.
     4  Use of this source code is governed by a MIT license that can be found in the LICENSE file at the root of the repository.
     5  
     6  */
     7  
     8  package collections
     9  
    10  import (
    11  	"sort"
    12  	"testing"
    13  
    14  	. "go.charczuk.com/sdk/assert"
    15  )
    16  
    17  func Test_Set(t *testing.T) {
    18  	s := make(Set[int])
    19  
    20  	s.Add(10)
    21  	s.Add(11)
    22  	ItsEqual(t, true, s.Has(10))
    23  	ItsEqual(t, true, s.Has(11))
    24  	ItsEqual(t, false, s.Has(12))
    25  
    26  	s.Delete(10)
    27  	ItsEqual(t, false, s.Has(10))
    28  	ItsEqual(t, true, s.Has(11))
    29  	ItsEqual(t, false, s.Has(12))
    30  }
    31  
    32  func Test_NewSet(t *testing.T) {
    33  	s := NewSet([]rune("foobar"))
    34  	ItsEqual(t, true, s.Has('f'))
    35  	ItsEqual(t, true, s.Has('o'))
    36  	ItsEqual(t, true, s.Has('b'))
    37  	ItsEqual(t, true, s.Has('a'))
    38  	ItsEqual(t, true, s.Has('r'))
    39  	ItsEqual(t, false, s.Has('z'))
    40  }
    41  
    42  func Test_Set_PopRandom(t *testing.T) {
    43  	s0 := make(Set[int])
    44  	s1 := make(Set[int])
    45  
    46  	s0.Add(10)
    47  	s0.Add(11)
    48  	s0.Add(12)
    49  	s0.Add(13)
    50  	s0.Add(14)
    51  
    52  	for x := 0; x < 5; x++ {
    53  		v, ok := s0.PopRandom()
    54  		ItsEqual(t, true, ok)
    55  		s1.Add(v)
    56  	}
    57  
    58  	_, ok := s0.PopRandom()
    59  	ItsEqual(t, false, ok)
    60  
    61  	ItsEqual(t, 0, len(s0))
    62  	ItsEqual(t, 5, len(s1))
    63  	ItsEqual(t, true, s1.Has(10))
    64  	ItsEqual(t, true, s1.Has(11))
    65  	ItsEqual(t, true, s1.Has(12))
    66  	ItsEqual(t, true, s1.Has(13))
    67  	ItsEqual(t, true, s1.Has(14))
    68  }
    69  
    70  func Test_Set_Intersect(t *testing.T) {
    71  	s0 := make(Set[int])
    72  
    73  	s0.Add(10)
    74  	s0.Add(11)
    75  	s0.Add(12)
    76  
    77  	s1 := make(Set[int])
    78  
    79  	s1.Add(11)
    80  	s1.Add(12)
    81  	s1.Add(13)
    82  
    83  	union := s0.Intersect(s1)
    84  	ItsEqual(t, 2, len(union))
    85  	ItsEqual(t, false, union.Has(10))
    86  	ItsEqual(t, true, union.Has(11))
    87  	ItsEqual(t, true, union.Has(12))
    88  	ItsEqual(t, false, union.Has(13))
    89  }
    90  
    91  func Test_Set_Disjoint(t *testing.T) {
    92  	s0 := make(Set[int])
    93  
    94  	s0.Add(10)
    95  	s0.Add(11)
    96  	s0.Add(12)
    97  
    98  	s1 := make(Set[int])
    99  
   100  	s1.Add(11)
   101  	s1.Add(12)
   102  	s1.Add(13)
   103  
   104  	union := s0.Disjoint(s1)
   105  	ItsEqual(t, 2, len(union))
   106  	ItsEqual(t, true, union.Has(10))
   107  	ItsEqual(t, false, union.Has(11))
   108  	ItsEqual(t, false, union.Has(12))
   109  	ItsEqual(t, true, union.Has(13))
   110  }
   111  
   112  func Test_Set_Union(t *testing.T) {
   113  	s0 := make(Set[int])
   114  
   115  	s0.Add(10)
   116  	s0.Add(11)
   117  	s0.Add(12)
   118  
   119  	s1 := make(Set[int])
   120  
   121  	s1.Add(11)
   122  	s1.Add(12)
   123  	s1.Add(13)
   124  
   125  	union := s0.Union(s1)
   126  	ItsEqual(t, 4, len(union))
   127  	ItsEqual(t, true, union.Has(10))
   128  	ItsEqual(t, true, union.Has(11))
   129  	ItsEqual(t, true, union.Has(12))
   130  	ItsEqual(t, true, union.Has(13))
   131  }
   132  
   133  func Test_Set_Diff(t *testing.T) {
   134  	s0 := make(Set[int])
   135  
   136  	s0.Add(10)
   137  	s0.Add(11)
   138  	s0.Add(12)
   139  
   140  	s1 := make(Set[int])
   141  
   142  	s1.Add(11)
   143  	s1.Add(12)
   144  	s1.Add(13)
   145  
   146  	added := s0.DiffAdded(s1)
   147  	ItsEqual(t, 1, len(added))
   148  	ItsEqual(t, true, added.Has(13))
   149  
   150  	removed := s0.DiffRemoved(s1)
   151  	ItsEqual(t, 1, len(removed))
   152  	ItsEqual(t, true, removed.Has(10))
   153  }
   154  
   155  func Test_Set_Equals(t *testing.T) {
   156  	s0 := make(Set[int])
   157  
   158  	s0.Add(10)
   159  	s0.Add(11)
   160  	s0.Add(12)
   161  
   162  	s1 := make(Set[int])
   163  
   164  	s1.Add(10)
   165  	s1.Add(11)
   166  	s1.Add(12)
   167  
   168  	ItsTrue(t, s0.Equals(s1))
   169  	ItsTrue(t, s1.Equals(s0))
   170  }
   171  
   172  func Test_Set_Equals_failing_differentSize(t *testing.T) {
   173  	s0 := make(Set[int])
   174  
   175  	s0.Add(10)
   176  	s0.Add(11)
   177  
   178  	s1 := make(Set[int])
   179  
   180  	s1.Add(10)
   181  	s1.Add(11)
   182  	s1.Add(12)
   183  
   184  	ItsFalse(t, s0.Equals(s1))
   185  	ItsFalse(t, s1.Equals(s0))
   186  }
   187  
   188  func Test_Set_Equals_failing_sameSize(t *testing.T) {
   189  	s0 := make(Set[int])
   190  
   191  	s0.Add(10)
   192  	s0.Add(11)
   193  	s0.Add(13)
   194  
   195  	s1 := make(Set[int])
   196  
   197  	s1.Add(10)
   198  	s1.Add(11)
   199  	s1.Add(12)
   200  
   201  	ItsFalse(t, s0.Equals(s1))
   202  	ItsFalse(t, s1.Equals(s0))
   203  }
   204  
   205  func Test_Set_Copy(t *testing.T) {
   206  	s0 := make(Set[int])
   207  
   208  	s0.Add(10)
   209  	s0.Add(11)
   210  	s0.Add(12)
   211  
   212  	s1 := s0.Copy()
   213  	s0values := s0.Values()
   214  	sort.Ints(s0values)
   215  	s1values := s1.Values()
   216  	sort.Ints(s1values)
   217  
   218  	ItsEqual(t, s0values, s1values)
   219  }
   220  
   221  func Test_Set_CopyAdd(t *testing.T) {
   222  	s0 := make(Set[int])
   223  
   224  	s0.Add(10)
   225  	s0.Add(11)
   226  	s0.Add(12)
   227  
   228  	s1 := s0.CopyAdd(13)
   229  
   230  	ItsNotEqual(t, s0.Values(), s1.Values())
   231  	ItsLen(t, s1, 4)
   232  	ItsTrue(t, s1.Has(10))
   233  	ItsTrue(t, s1.Has(11))
   234  	ItsTrue(t, s1.Has(12))
   235  	ItsTrue(t, s1.Has(13))
   236  }
   237  
   238  func Test_Set_CopyRemove(t *testing.T) {
   239  	s0 := make(Set[int])
   240  
   241  	s0.Add(10)
   242  	s0.Add(11)
   243  	s0.Add(12)
   244  	s0.Add(13)
   245  
   246  	s1 := s0.CopyRemove(10)
   247  
   248  	ItsNotEqual(t, s0.Values(), s1.Values())
   249  	ItsLen(t, s1, 3)
   250  	ItsFalse(t, s1.Has(10))
   251  	ItsTrue(t, s1.Has(11))
   252  	ItsTrue(t, s1.Has(12))
   253  	ItsTrue(t, s1.Has(13))
   254  }