Files
herolib/lib/data/tst/tst_test.v
2025-05-04 08:19:47 +03:00

236 lines
5.9 KiB
V

module tst
import os
fn testsuite_begin() {
// Clean up any test files from previous runs
if os.exists('testdata') {
os.rmdir_all('testdata') or {}
}
os.mkdir('testdata') or {}
}
fn testsuite_end() {
// Clean up test files
if os.exists('testdata') {
os.rmdir_all('testdata') or {}
}
}
// Test basic set and get operations
fn test_set_get() {
mut tree := new(path: 'testdata/test_set_get.db', reset: true) or {
assert false, 'Failed to create TST: ${err}'
return
}
// Test setting and getting values
tree.set('hello', 'world'.bytes()) or {
assert false, 'Failed to set key: ${err}'
return
}
tree.set('help', 'me'.bytes()) or {
assert false, 'Failed to set key: ${err}'
return
}
tree.set('test', 'value'.bytes()) or {
assert false, 'Failed to set key: ${err}'
return
}
// Test getting values
value1 := tree.get('hello') or {
assert false, 'Failed to get key: ${err}'
return
}
assert value1.bytestr() == 'world', 'Expected "world", got "${value1.bytestr()}"'
value2 := tree.get('help') or {
assert false, 'Failed to get key: ${err}'
return
}
assert value2.bytestr() == 'me', 'Expected "me", got "${value2.bytestr()}"'
value3 := tree.get('test') or {
assert false, 'Failed to get key: ${err}'
return
}
assert value3.bytestr() == 'value', 'Expected "value", got "${value3.bytestr()}"'
// Test getting a non-existent key
tree.get('nonexistent') or {
assert err.str() == 'Key not found', 'Expected "Key not found", got "${err}"'
return
}
assert false, 'Expected error for non-existent key'
}
// Test deletion
fn test_delete() {
mut tree := new(path: 'testdata/test_delete.db', reset: true) or {
assert false, 'Failed to create TST: ${err}'
return
}
// Set some keys
tree.set('hello', 'world'.bytes()) or {
assert false, 'Failed to set key: ${err}'
return
}
tree.set('help', 'me'.bytes()) or {
assert false, 'Failed to set key: ${err}'
return
}
tree.set('test', 'value'.bytes()) or {
assert false, 'Failed to set key: ${err}'
return
}
// Delete a key
tree.delete('hello') or {
assert false, 'Failed to delete key: ${err}'
return
}
// Verify the key was deleted
tree.get('hello') or {
assert err.str() == 'Key not found', 'Expected "Key not found", got "${err}"'
return
}
assert false, 'Expected error for deleted key'
}
// Test prefix search
fn test_list_prefix() {
mut tree := new(path: 'testdata/test_list_prefix.db', reset: true) or {
assert false, 'Failed to create TST: ${err}'
return
}
// Set some keys with common prefixes
tree.set('hello', 'world'.bytes()) or {
assert false, 'Failed to set key: ${err}'
return
}
tree.set('help', 'me'.bytes()) or {
assert false, 'Failed to set key: ${err}'
return
}
tree.set('test', 'value'.bytes()) or {
assert false, 'Failed to set key: ${err}'
return
}
tree.set('testing', 'another'.bytes()) or {
assert false, 'Failed to set key: ${err}'
return
}
tree.set('tested', 'past'.bytes()) or {
assert false, 'Failed to set key: ${err}'
return
}
// Test listing keys with prefix 'hel'
hel_keys := tree.list('hel') or {
assert false, 'Failed to list keys with prefix: ${err}'
return
}
assert hel_keys.len == 2, 'Expected 2 keys with prefix "hel", got ${hel_keys.len}'
assert 'hello' in hel_keys, 'Expected "hello" in keys with prefix "hel"'
assert 'help' in hel_keys, 'Expected "help" in keys with prefix "hel"'
// Test listing keys with prefix 'test'
test_keys := tree.list('test') or {
assert false, 'Failed to list keys with prefix: ${err}'
return
}
assert test_keys.len == 2, 'Expected 2 keys with prefix "test", got ${test_keys.len}'
assert 'test' in test_keys, 'Expected "test" in keys with prefix "test"'
assert 'testing' in test_keys, 'Expected "testing" in keys with prefix "test"'
// Test listing all keys
all_keys := tree.list('') or {
assert false, 'Failed to list all keys: ${err}'
return
}
assert all_keys.len == 5, 'Expected 5 keys in total, got ${all_keys.len}'
}
// Test getall function
fn test_getall() {
mut tree := new(path: 'testdata/test_getall.db', reset: true) or {
assert false, 'Failed to create TST: ${err}'
return
}
// Set some keys with common prefixes
tree.set('hello', 'world'.bytes()) or {
assert false, 'Failed to set key: ${err}'
return
}
tree.set('help', 'me'.bytes()) or {
assert false, 'Failed to set key: ${err}'
return
}
tree.set('test', 'value'.bytes()) or {
assert false, 'Failed to set key: ${err}'
return
}
// Test getting all values with prefix 'hel'
hel_values := tree.getall('hel') or {
assert false, 'Failed to get values with prefix: ${err}'
return
}
assert hel_values.len == 2, 'Expected 2 values with prefix "hel", got ${hel_values.len}'
// Convert byte arrays to strings for easier comparison
mut hel_strings := []string{}
for val in hel_values {
hel_strings << val.bytestr()
}
assert 'world' in hel_strings, 'Expected "world" in values with prefix "hel"'
assert 'me' in hel_strings, 'Expected "me" in values with prefix "hel"'
}
// Test persistence
fn test_persistence() {
// Create a new TST and add some data
{
mut tree := new(path: 'testdata/test_persistence.db', reset: true) or {
assert false, 'Failed to create TST: ${err}'
return
}
tree.set('hello', 'world'.bytes()) or {
assert false, 'Failed to set key: ${err}'
return
}
tree.set('test', 'value'.bytes()) or {
assert false, 'Failed to set key: ${err}'
return
}
}
// Create a new TST with the same path but don't reset
{
mut tree := new(path: 'testdata/test_persistence.db', reset: false) or {
assert false, 'Failed to create TST: ${err}'
return
}
// Verify the data persisted
value1 := tree.get('hello') or {
assert false, 'Failed to get key: ${err}'
return
}
assert value1.bytestr() == 'world', 'Expected "world", got "${value1.bytestr()}"'
value2 := tree.get('test') or {
assert false, 'Failed to get key: ${err}'
return
}
assert value2.bytestr() == 'value', 'Expected "value", got "${value2.bytestr()}"'
}
}