Files
herolib/lib/data/radixtree/factory_test.v
2025-03-24 06:44:39 +01:00

159 lines
3.6 KiB
V

module radixtree
import freeflowuniverse.herolib.ui.console
fn test_basic_operations() ! {
mut rt := new(path: '/tmp/radixtree_test', reset: true)!
// Test set and get
rt.set('test', 'value1'.bytes())!
value1 := rt.get('test')!
assert value1.bytestr() == 'value1'
// Test updating existing key
rt.set('test', 'value2'.bytes())!
value2 := rt.get('test')!
assert value2.bytestr() == 'value2'
// Test non-existent key
if _ := rt.get('nonexistent') {
assert false, 'Expected error for non-existent key'
}
// Test delete
rt.delete('test')!
mut ok := false
if _ := rt.get('test') {
ok = true
} else {
ok = false
}
assert !ok, 'Expected error for deleted key'
}
fn test_prefix_matching() ! {
mut rt := new(path: '/tmp/radixtree_test_prefix')!
// Set keys with common prefixes
rt.set('team', 'value1'.bytes())!
rt.set('test', 'value2'.bytes())!
rt.set('testing', 'value3'.bytes())!
// Verify each key has correct value
value1 := rt.get('team')!
assert value1.bytestr() == 'value1'
value2 := rt.get('test')!
assert value2.bytestr() == 'value2'
value3 := rt.get('testing')!
assert value3.bytestr() == 'value3'
// Delete middle key and verify others still work
rt.delete('test')!
if _ := rt.get('test') {
assert false, 'Expected error after deletion'
}
value1_after := rt.get('team')!
assert value1_after.bytestr() == 'value1'
value3_after := rt.get('testing')!
assert value3_after.bytestr() == 'value3'
}
fn test_edge_cases() ! {
mut rt := new(path: '/tmp/radixtree_test_edge')!
// Test empty key
rt.set('', 'empty'.bytes())!
empty_value := rt.get('')!
assert empty_value.bytestr() == 'empty'
// Test very long key
long_key := 'a'.repeat(1000)
rt.set(long_key, 'long'.bytes())!
long_value := rt.get(long_key)!
assert long_value.bytestr() == 'long'
// Test keys that require node splitting
rt.set('test', 'value1'.bytes())!
rt.set('testing', 'value2'.bytes())!
rt.set('te', 'value3'.bytes())!
value1 := rt.get('test')!
assert value1.bytestr() == 'value1'
value2 := rt.get('testing')!
assert value2.bytestr() == 'value2'
value3 := rt.get('te')!
assert value3.bytestr() == 'value3'
}
fn test_update_metadata() ! {
mut rt := new(path: '/tmp/radixtree_test_update')!
// Simulate hash.bytes + id_bytes + metadata_bytes
prefix := 'hashbytes123id456'
initial_metadata := 'metadata_initial'.bytes()
new_metadata := 'metadata_updated'.bytes()
// Set initial entry
rt.set(prefix, initial_metadata)!
// Verify initial value
value := rt.get(prefix)!
assert value.bytestr() == 'metadata_initial'
// Update metadata while keeping the same prefix
rt.update(prefix, new_metadata)!
// Verify updated value
updated_value := rt.get(prefix)!
assert updated_value.bytestr() == 'metadata_updated'
// Test updating non-existent prefix
if _ := rt.update('nonexistent', 'test'.bytes()) {
assert false, 'Expected error for non-existent prefix'
}
}
fn test_multiple_operations() ! {
mut rt := new(path: '/tmp/radixtree_test_multiple')!
// Set multiple keys
keys := ['abc', 'abcd', 'abcde', 'bcd', 'bcde']
for i, key in keys {
rt.set(key, 'value${i + 1}'.bytes())!
}
// Verify all keys
for i, key in keys {
value := rt.get(key)!
assert value.bytestr() == 'value${i + 1}'
}
// Delete some keys
rt.delete('abcd')!
rt.delete('bcde')!
// Verify remaining keys
remaining := ['abc', 'abcde', 'bcd']
expected := ['value1', 'value3', 'value4']
for i, key in remaining {
value := rt.get(key)!
assert value.bytestr() == expected[i]
}
// Verify deleted keys return error
deleted := ['abcd', 'bcde']
for key in deleted {
if _ := rt.get(key) {
assert false, 'Expected error for deleted key: ${key}'
}
}
}