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

225 lines
5.4 KiB
V

module tst
import os
// Define a struct for test cases
struct PrefixTestCase {
prefix string
expected_count int
}
// Test more complex prefix search scenarios
fn test_complex_prefix_search() {
mut tree := new(path: 'testdata/test_complex_prefix.db', reset: true) or {
assert false, 'Failed to create TST: ${err}'
return
}
// Insert a larger set of keys with various prefixes
keys := [
'a',
'ab',
'abc',
'abcd',
'abcde',
'b',
'bc',
'bcd',
'bcde',
'c',
'cd',
'cde',
'x',
'xy',
'xyz',
'test',
'testing',
'tested',
'tests',
'team',
'teammate',
'teams',
'tech',
'technology',
'technical',
]
// Insert all keys
for i, key in keys {
value := 'value-${i}'.bytes()
tree.set(key, value) or {
assert false, 'Failed to set key "${key}": ${err}'
return
}
}
// Test various prefix searches
test_cases := [
// prefix, expected_count
PrefixTestCase{'a', 5},
PrefixTestCase{'ab', 4},
PrefixTestCase{'abc', 3},
PrefixTestCase{'abcd', 2},
PrefixTestCase{'abcde', 1},
PrefixTestCase{'b', 4},
PrefixTestCase{'bc', 3},
PrefixTestCase{'t', 10},
PrefixTestCase{'te', 7},
PrefixTestCase{'tes', 4},
PrefixTestCase{'test', 4},
PrefixTestCase{'team', 3},
PrefixTestCase{'tech', 3},
PrefixTestCase{'x', 3},
PrefixTestCase{'xy', 2},
PrefixTestCase{'xyz', 1},
PrefixTestCase{'z', 0}, // No matches
PrefixTestCase{'', keys.len}, // All keys
]
for test_case in test_cases {
prefix := test_case.prefix
expected_count := test_case.expected_count
result := tree.list(prefix) or {
if expected_count > 0 {
assert false, 'Failed to list keys with prefix "${prefix}": ${err}'
}
[]string{}
}
assert result.len == expected_count, 'For prefix "${prefix}": expected ${expected_count} keys, got ${result.len}'
// Verify each result starts with the prefix
for key in result {
assert key.starts_with(prefix), 'Key "${key}" does not start with prefix "${prefix}"'
}
}
}
// Test prefix search with longer strings and special characters
fn test_special_prefix_search() {
mut tree := new(path: 'testdata/test_special_prefix.db', reset: true) or {
assert false, 'Failed to create TST: ${err}'
return
}
// Insert keys with special characters and longer strings
special_keys := [
'user:1:profile',
'user:1:settings',
'user:1:posts',
'user:2:profile',
'user:2:settings',
'config:app:name',
'config:app:version',
'config:app:debug',
'config:db:host',
'config:db:port',
'data:2023:01:01',
'data:2023:01:02',
'data:2023:02:01',
'very:long:key:with:multiple:segments:and:special:characters:!@#$%^&*()',
'another:very:long:key:with:different:segments',
]
// Insert all keys
for i, key in special_keys {
value := 'special-value-${i}'.bytes()
tree.set(key, value) or {
assert false, 'Failed to set key "${key}": ${err}'
return
}
}
// Test various prefix searches
special_test_cases := [
// prefix, expected_count
PrefixTestCase{'user:', 5},
PrefixTestCase{'user:1:', 3},
PrefixTestCase{'user:2:', 2},
PrefixTestCase{'config:', 5},
PrefixTestCase{'config:app:', 3},
PrefixTestCase{'config:db:', 2},
PrefixTestCase{'data:2023:', 3},
PrefixTestCase{'data:2023:01:', 2},
PrefixTestCase{'very:', 1},
PrefixTestCase{'another:', 1},
PrefixTestCase{'nonexistent:', 0},
]
for test_case in special_test_cases {
prefix := test_case.prefix
expected_count := test_case.expected_count
result := tree.list(prefix) or {
if expected_count > 0 {
assert false, 'Failed to list keys with prefix "${prefix}": ${err}'
}
[]string{}
}
assert result.len == expected_count, 'For prefix "${prefix}": expected ${expected_count} keys, got ${result.len}'
// Verify each result starts with the prefix
for key in result {
assert key.starts_with(prefix), 'Key "${key}" does not start with prefix "${prefix}"'
}
}
}
// Test prefix search performance with a larger dataset
fn test_prefix_search_performance() {
mut tree := new(path: 'testdata/test_performance.db', reset: true) or {
assert false, 'Failed to create TST: ${err}'
return
}
// Generate a larger dataset (1000 keys)
prefixes := ['user', 'config', 'data', 'app', 'service', 'api', 'test', 'dev', 'prod', 'staging']
mut large_keys := []string{}
for prefix in prefixes {
for i in 0 .. 100 {
large_keys << '${prefix}:${i}:name'
}
}
// Insert all keys
for i, key in large_keys {
value := 'performance-value-${i}'.bytes()
tree.set(key, value) or {
assert false, 'Failed to set key "${key}": ${err}'
return
}
}
// Test prefix search performance
for prefix in prefixes {
result := tree.list(prefix + ':') or {
assert false, 'Failed to list keys with prefix "${prefix}:": ${err}'
return
}
assert result.len == 100, 'For prefix "${prefix}:": expected 100 keys, got ${result.len}'
// Verify each result starts with the prefix
for key in result {
assert key.starts_with(prefix + ':'), 'Key "${key}" does not start with prefix "${prefix}:"'
}
}
// Test more specific prefixes
for prefix in prefixes {
for i in 0 .. 10 {
specific_prefix := '${prefix}:${i}'
result := tree.list(specific_prefix) or {
assert false, 'Failed to list keys with prefix "${specific_prefix}": ${err}'
return
}
assert result.len == 1, 'For prefix "${specific_prefix}": expected 1 key, got ${result.len}'
assert result[0] == '${specific_prefix}:name', 'Expected "${specific_prefix}:name", got "${result[0]}"'
}
}
}