xx/mem/mem_test.go

78 lines
2 KiB
Go

package mem_test
import (
"testing"
"unsafe"
"git.brut.systems/judah/xx/mem"
"git.brut.systems/judah/xx/testx"
)
func TestBitCast(t *testing.T) {
a := uint32(0xFFFF_FFFF)
b := mem.BitCast[float32](&a)
c := mem.BitCast[uint32](&b)
if a != c {
t.Fail()
}
v := uint8(0xFF)
d := mem.BitCast[int8](&v)
if d != -1 {
t.Fail()
}
e := mem.BitCast[uint8](&d)
if e != 255 {
t.Fail()
}
}
func TestAllocationPrimitives(t *testing.T) {
t.Run("reserve, unreserve", func(t *testing.T) {
data, err := mem.Reserve(1 * mem.Gigabyte)
testx.Expect(t, err == nil, "mem.Reserve returned an error - %s", err)
testx.Expect(t, len(data) == 1*mem.Gigabyte, "len was %d", len(data))
testx.Expect(t, cap(data) == 1*mem.Gigabyte, "len was %d", cap(data))
err = mem.Release(data)
testx.Expect(t, err == nil, "mem.Unreserve returned an error - %s", err)
})
t.Run("commit", func(t *testing.T) {
data, err := mem.Reserve(1 * mem.Gigabyte)
testx.Expect(t, err == nil, "mem.Reserve returned an error - %s", err)
err = mem.Commit(data, mem.AccessRead|mem.AccessWrite)
testx.Expect(t, err == nil, "mem.Commit returned an error - %s", err)
for i := range data {
data[i] = byte(i * i)
}
})
t.Run("decommit", func(t *testing.T) {
data, err := mem.Reserve(1 * mem.Gigabyte)
testx.Expect(t, err == nil, "mem.Reserve returned an error - %s", err)
err = mem.Commit(data, mem.AccessRead|mem.AccessWrite)
testx.Expect(t, err == nil, "mem.Commit returned an error - %s", err)
before := uintptr(unsafe.Pointer(&data[0]))
err = mem.Decommit(data)
testx.Expect(t, err == nil, "mem.Decommit returned an error - %s", err)
// accessing data before recommitting it will fail
err = mem.Commit(data, mem.AccessRead|mem.AccessWrite)
testx.Expect(t, err == nil, "mem.Commit returned an error - %s", err)
after := uintptr(unsafe.Pointer(&data[0]))
testx.Expect(t, before == after, "base pointers did not match between after recommit %d != %d", before, after)
for i := range data {
data[i] = byte(i * i)
}
})
}