You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
248 lines
4.7 KiB
248 lines
4.7 KiB
package store |
|
|
|
import ( |
|
"bytes" |
|
"testing" |
|
|
|
ntypes "git.mleku.dev/mleku/nostr/types" |
|
) |
|
|
|
func TestIdPkTsFixedMethods(t *testing.T) { |
|
// Create an IdPkTs with sample data |
|
id := make([]byte, 32) |
|
pub := make([]byte, 32) |
|
for i := 0; i < 32; i++ { |
|
id[i] = byte(i) |
|
pub[i] = byte(i + 32) |
|
} |
|
|
|
ipk := &IdPkTs{ |
|
Id: id, |
|
Pub: pub, |
|
Ts: 1234567890, |
|
Ser: 42, |
|
} |
|
|
|
// Test IDFixed returns correct data |
|
idFixed := ipk.IDFixed() |
|
if !bytes.Equal(idFixed[:], id) { |
|
t.Errorf("IDFixed: got %x, want %x", idFixed[:], id) |
|
} |
|
|
|
// Test IDFixed returns a copy |
|
idFixed[0] = 0xFF |
|
if ipk.Id[0] == 0xFF { |
|
t.Error("IDFixed should return a copy, not a reference") |
|
} |
|
|
|
// Test PubFixed returns correct data |
|
pubFixed := ipk.PubFixed() |
|
if !bytes.Equal(pubFixed[:], pub) { |
|
t.Errorf("PubFixed: got %x, want %x", pubFixed[:], pub) |
|
} |
|
|
|
// Test hex methods |
|
idHex := ipk.IDHex() |
|
expectedIDHex := "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" |
|
if idHex != expectedIDHex { |
|
t.Errorf("IDHex: got %s, want %s", idHex, expectedIDHex) |
|
} |
|
} |
|
|
|
func TestEventRef(t *testing.T) { |
|
id := make([]byte, 32) |
|
pub := make([]byte, 32) |
|
for i := 0; i < 32; i++ { |
|
id[i] = byte(i) |
|
pub[i] = byte(i + 100) |
|
} |
|
|
|
// Create EventRef |
|
ref := NewEventRef(id, pub, 1234567890, 42) |
|
|
|
// Test accessors - need to get addressable values for slicing |
|
refID := ref.ID() |
|
refPub := ref.Pub() |
|
if !bytes.Equal(refID[:], id) { |
|
t.Error("ID() mismatch") |
|
} |
|
if !bytes.Equal(refPub[:], pub) { |
|
t.Error("Pub() mismatch") |
|
} |
|
if ref.Ts() != 1234567890 { |
|
t.Error("Ts() mismatch") |
|
} |
|
if ref.Ser() != 42 { |
|
t.Error("Ser() mismatch") |
|
} |
|
|
|
// Test copy-on-assignment |
|
ref2 := ref |
|
testID := ref.ID() |
|
testID[0] = 0xFF |
|
ref2ID := ref2.ID() |
|
if ref2ID[0] == 0xFF { |
|
t.Error("EventRef should copy on assignment") |
|
} |
|
|
|
// Test hex methods |
|
if len(ref.IDHex()) != 64 { |
|
t.Errorf("IDHex length: got %d, want 64", len(ref.IDHex())) |
|
} |
|
} |
|
|
|
func TestEventRefToIdPkTs(t *testing.T) { |
|
id := make([]byte, 32) |
|
pub := make([]byte, 32) |
|
for i := 0; i < 32; i++ { |
|
id[i] = byte(i) |
|
pub[i] = byte(i + 100) |
|
} |
|
|
|
ref := NewEventRef(id, pub, 1234567890, 42) |
|
ipk := ref.ToIdPkTs() |
|
|
|
// Verify conversion |
|
if !bytes.Equal(ipk.Id, id) { |
|
t.Error("ToIdPkTs: Id mismatch") |
|
} |
|
if !bytes.Equal(ipk.Pub, pub) { |
|
t.Error("ToIdPkTs: Pub mismatch") |
|
} |
|
if ipk.Ts != 1234567890 { |
|
t.Error("ToIdPkTs: Ts mismatch") |
|
} |
|
if ipk.Ser != 42 { |
|
t.Error("ToIdPkTs: Ser mismatch") |
|
} |
|
|
|
// Verify independence (modifications don't affect original) |
|
ipk.Id[0] = 0xFF |
|
if ref.ID()[0] == 0xFF { |
|
t.Error("ToIdPkTs should create independent copy") |
|
} |
|
} |
|
|
|
func TestIdPkTsToEventRef(t *testing.T) { |
|
id := make([]byte, 32) |
|
pub := make([]byte, 32) |
|
for i := 0; i < 32; i++ { |
|
id[i] = byte(i) |
|
pub[i] = byte(i + 100) |
|
} |
|
|
|
ipk := &IdPkTs{ |
|
Id: id, |
|
Pub: pub, |
|
Ts: 1234567890, |
|
Ser: 42, |
|
} |
|
|
|
ref := ipk.ToEventRef() |
|
|
|
// Verify conversion - need addressable values for slicing |
|
refID := ref.ID() |
|
refPub := ref.Pub() |
|
if !bytes.Equal(refID[:], id) { |
|
t.Error("ToEventRef: ID mismatch") |
|
} |
|
if !bytes.Equal(refPub[:], pub) { |
|
t.Error("ToEventRef: Pub mismatch") |
|
} |
|
if ref.Ts() != 1234567890 { |
|
t.Error("ToEventRef: Ts mismatch") |
|
} |
|
if ref.Ser() != 42 { |
|
t.Error("ToEventRef: Ser mismatch") |
|
} |
|
} |
|
|
|
func BenchmarkEventRefCopy(b *testing.B) { |
|
id := make([]byte, 32) |
|
pub := make([]byte, 32) |
|
for i := 0; i < 32; i++ { |
|
id[i] = byte(i) |
|
pub[i] = byte(i + 100) |
|
} |
|
|
|
ref := NewEventRef(id, pub, 1234567890, 42) |
|
|
|
b.ResetTimer() |
|
for i := 0; i < b.N; i++ { |
|
ref2 := ref // Copy (should stay on stack) |
|
_ = ref2 |
|
} |
|
} |
|
|
|
func BenchmarkIdPkTsToEventRef(b *testing.B) { |
|
id := make([]byte, 32) |
|
pub := make([]byte, 32) |
|
for i := 0; i < 32; i++ { |
|
id[i] = byte(i) |
|
pub[i] = byte(i + 100) |
|
} |
|
|
|
ipk := &IdPkTs{ |
|
Id: id, |
|
Pub: pub, |
|
Ts: 1234567890, |
|
Ser: 42, |
|
} |
|
|
|
b.ResetTimer() |
|
for i := 0; i < b.N; i++ { |
|
ref := ipk.ToEventRef() |
|
_ = ref |
|
} |
|
} |
|
|
|
func BenchmarkEventRefAccess(b *testing.B) { |
|
id := make([]byte, 32) |
|
pub := make([]byte, 32) |
|
for i := 0; i < 32; i++ { |
|
id[i] = byte(i) |
|
pub[i] = byte(i + 100) |
|
} |
|
|
|
ref := NewEventRef(id, pub, 1234567890, 42) |
|
|
|
b.ResetTimer() |
|
for i := 0; i < b.N; i++ { |
|
idCopy := ref.ID() |
|
pubCopy := ref.Pub() |
|
_ = idCopy |
|
_ = pubCopy |
|
} |
|
} |
|
|
|
func BenchmarkIdPkTsFixedAccess(b *testing.B) { |
|
id := make([]byte, 32) |
|
pub := make([]byte, 32) |
|
for i := 0; i < 32; i++ { |
|
id[i] = byte(i) |
|
pub[i] = byte(i + 100) |
|
} |
|
|
|
ipk := &IdPkTs{ |
|
Id: id, |
|
Pub: pub, |
|
Ts: 1234567890, |
|
Ser: 42, |
|
} |
|
|
|
b.ResetTimer() |
|
for i := 0; i < b.N; i++ { |
|
idCopy := ipk.IDFixed() |
|
pubCopy := ipk.PubFixed() |
|
_ = idCopy |
|
_ = pubCopy |
|
} |
|
} |
|
|
|
// Ensure EventRef implements expected interface at compile time |
|
var _ interface { |
|
ID() ntypes.EventID |
|
Pub() ntypes.Pubkey |
|
Ts() int64 |
|
Ser() uint64 |
|
} = EventRef{}
|
|
|