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 }