github.com/mitranim/gg@v0.1.17/mem_test.go (about)

     1  package gg_test
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/mitranim/gg"
     7  	"github.com/mitranim/gg/gtest"
     8  )
     9  
    10  type IniterStrs []string
    11  
    12  func (self *IniterStrs) Init() {
    13  	if *self != nil {
    14  		panic(`redundant init`)
    15  	}
    16  	*self = []string{`one`, `two`, `three`}
    17  }
    18  
    19  func TestMem(t *testing.T) {
    20  	defer gtest.Catch(t)
    21  
    22  	{
    23  		// Note: `IniterStr` panics if init is called on a non-zero value.
    24  		// This is part of our contract.
    25  		var mem gg.Mem[gg.DurSecond, IniterStr, *IniterStr]
    26  
    27  		test := func() {
    28  			testMemZero[IniterStr](&mem)
    29  			gtest.Eq(mem.Get(), `inited`)
    30  			gtest.Eq(mem.Get(), `inited`)
    31  			gtest.Eq(mem.Peek(), `inited`)
    32  			gtest.Eq(mem.Peek(), `inited`)
    33  			testMemNotZero[IniterStr](&mem)
    34  		}
    35  
    36  		test()
    37  		mem.Clear()
    38  		test()
    39  	}
    40  
    41  	{
    42  		// Note: `IniterStrs` panics if init is called on a non-zero value.
    43  		// This is part of our contract.
    44  		var mem gg.Mem[gg.DurSecond, IniterStrs, *IniterStrs]
    45  
    46  		test := func() {
    47  			testMemZero[IniterStrs](&mem)
    48  
    49  			prev := mem.Get()
    50  			gtest.Equal(prev, []string{`one`, `two`, `three`})
    51  			gtest.SliceIs(mem.Get(), prev)
    52  			gtest.SliceIs(mem.Get(), prev)
    53  			gtest.NotZero(mem.Timed().Inst)
    54  			gtest.NotZero(mem.Timed().Inst)
    55  
    56  			testMemNotZero[IniterStrs](&mem)
    57  		}
    58  
    59  		test()
    60  		prev := mem.Get()
    61  		mem.Clear()
    62  		test()
    63  		next := mem.Get()
    64  		gtest.NotSliceIs(next, prev)
    65  	}
    66  }
    67  
    68  type Peeker[Tar any] interface {
    69  	gg.Peeker[Tar]
    70  	PeekTimed() gg.Timed[Tar]
    71  }
    72  
    73  func testMemZero[Tar any, Mem Peeker[Tar]](mem Mem) {
    74  	gtest.Zero(mem.Peek())
    75  	gtest.Zero(mem.Peek())
    76  	gtest.Zero(mem.PeekTimed())
    77  	gtest.Zero(mem.PeekTimed())
    78  }
    79  
    80  func testMemNotZero[Tar any, Mem Peeker[Tar]](mem Mem) {
    81  	gtest.NotZero(mem.Peek())
    82  	gtest.NotZero(mem.Peek())
    83  	gtest.NotZero(mem.PeekTimed())
    84  	gtest.NotZero(mem.PeekTimed())
    85  	gtest.NotZero(mem.PeekTimed().Inst)
    86  	gtest.NotZero(mem.PeekTimed().Inst)
    87  }