use tegdb::{Database, Result};
fn main() -> Result<()> {
println!("=== TegDB Comprehensive Storage Backend Test ===\n");
test_file_log_backend()?;
test_unsupported_protocols()?;
test_edge_cases()?;
test_large_data()?;
println!("\n🎉 All comprehensive tests passed!");
Ok(())
}
fn test_file_log_backend() -> Result<()> {
println!("1. Testing File Backend...");
{
let mut db = Database::open("file:///tmp/test_file_crud.teg")?;
db.execute("CREATE TABLE test (id INTEGER PRIMARY KEY, name TEXT(32), value REAL)")?;
db.execute("INSERT INTO test (id, name, value) VALUES (1, 'test1', 10.5)")?;
db.execute("INSERT INTO test (id, name, value) VALUES (2, 'test2', 20.5)")?;
let results = db.query("SELECT * FROM test")?;
let rows: Vec<_> = results.into_iter().collect::<Result<Vec<_>>>()?;
assert_eq!(rows.len(), 2);
db.execute("UPDATE test SET value = 15.5 WHERE id = 1")?;
db.execute("DELETE FROM test WHERE id = 2")?;
let results = db.query("SELECT * FROM test")?;
let rows: Vec<_> = results.into_iter().collect::<Result<Vec<_>>>()?;
assert_eq!(rows.len(), 1); println!(" ✓ CRUD operations completed");
}
{
let mut db = Database::open("file:///tmp/test_file_transactions.teg")?;
db.execute("CREATE TABLE accounts (id INTEGER PRIMARY KEY, balance REAL)")?;
db.execute("INSERT INTO accounts (id, balance) VALUES (1, 100.0)")?;
db.execute("INSERT INTO accounts (id, balance) VALUES (2, 50.0)")?;
{
let mut tx = db.begin_transaction()?;
tx.execute("UPDATE accounts SET balance = balance - 25.0 WHERE id = 1")?;
tx.execute("UPDATE accounts SET balance = balance + 25.0 WHERE id = 2")?;
tx.commit()?;
}
let results = db.query("SELECT balance FROM accounts WHERE id = 2")?;
let _rows: Vec<_> = results.into_iter().collect::<Result<Vec<_>>>()?;
println!(" ✓ Transaction commit works");
{
let mut tx = db.begin_transaction()?;
tx.execute("UPDATE accounts SET balance = 0 WHERE id = 1")?;
tx.rollback()?;
}
let results = db.query("SELECT balance FROM accounts WHERE id = 1")?;
let _rows: Vec<_> = results.into_iter().collect::<Result<Vec<_>>>()?;
println!(" ✓ Transaction rollback works");
}
{
let mut db = Database::open("file:///tmp/test_file_multiple.teg")?;
db.execute("CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT(32))")?;
db.execute("CREATE TABLE orders (id INTEGER PRIMARY KEY, user_id INTEGER, amount REAL)")?;
db.execute("INSERT INTO users (id, name) VALUES (1, 'Alice')")?;
db.execute("INSERT INTO users (id, name) VALUES (2, 'Bob')")?;
db.execute("INSERT INTO orders (id, user_id, amount) VALUES (1, 1, 99.99)")?;
db.execute("INSERT INTO orders (id, user_id, amount) VALUES (2, 1, 149.99)")?;
db.execute("INSERT INTO orders (id, user_id, amount) VALUES (3, 2, 79.99)")?;
let results = db.query("SELECT name FROM users")?;
let _rows: Vec<_> = results.into_iter().collect::<Result<Vec<_>>>()?;
println!(" ✓ Multiple tables work");
}
println!(" ✅ File backend tests completed");
Ok(())
}
fn test_unsupported_protocols() -> Result<()> {
println!("\n2. Verifying unsupported protocol handling...");
for identifier in ["browser://test_app_data", "localstorage://user_preferences"] {
println!(" Attempting to open {identifier}");
match Database::open(identifier) {
Ok(_) => println!(" ⚠️ Unexpected success - protocol should be rejected"),
Err(e) => println!(" ✓ Received expected error: {e}"),
}
}
println!(" ✅ Unsupported protocols are rejected");
Ok(())
}
fn test_edge_cases() -> Result<()> {
println!("\n3. Testing Edge Cases...");
{
let mut db = Database::open("file:///tmp/test_edge_empty.teg")?;
db.execute("CREATE TABLE test (id INTEGER PRIMARY KEY, data TEXT(32))")?;
db.execute("INSERT INTO test (id, data) VALUES (1, ' ')")?;
let results = db.query("SELECT data FROM test WHERE id = 1")?;
let _rows: Vec<_> = results.into_iter().collect::<Result<Vec<_>>>()?;
println!(" ✓ Empty values handled");
}
{
let mut db = Database::open("file:///tmp/test_edge_special.teg")?;
db.execute("CREATE TABLE test (id INTEGER PRIMARY KEY, data TEXT(32))")?;
db.execute("INSERT INTO test (id, data) VALUES (1, 'Hello World')")?;
let results = db.query("SELECT data FROM test WHERE id = 1")?;
let _rows: Vec<_> = results.into_iter().collect::<Result<Vec<_>>>()?;
println!(" ✓ Special characters handled");
}
{
let mut db = Database::open("file:///tmp/test_edge_numbers.teg")?;
db.execute("CREATE TABLE test (id INTEGER PRIMARY KEY, big_num INTEGER, big_real REAL)")?;
db.execute("INSERT INTO test (id, big_num, big_real) VALUES (1, 999999, 123.456)")?;
let results = db.query("SELECT big_num, big_real FROM test WHERE id = 1")?;
let _rows: Vec<_> = results.into_iter().collect::<Result<Vec<_>>>()?;
println!(" ✓ Large numbers handled");
}
println!(" ✅ Edge cases handled properly");
Ok(())
}
fn test_large_data() -> Result<()> {
println!("\n4. Testing Large Data Handling...");
{
let mut db = Database::open("file:///tmp/test_large_data.teg")?;
db.execute("CREATE TABLE large_test (id INTEGER PRIMARY KEY, data TEXT(32))")?;
for i in 1..=50 {
let large_text = "A".repeat(100); db.execute(&format!(
"INSERT INTO large_test (id, data) VALUES ({i}, '{large_text}')"
))?;
}
let results = db.query("SELECT * FROM large_test")?;
let rows: Vec<_> = results.into_iter().collect::<Result<Vec<_>>>()?;
assert_eq!(rows.len(), 50);
println!(" ✓ Large dataset (50 rows × 100 chars) handled");
let results = db.query("SELECT * FROM large_test WHERE id > 25")?;
let rows: Vec<_> = results.into_iter().collect::<Result<Vec<_>>>()?;
assert_eq!(rows.len(), 25);
println!(" ✓ Large dataset queries work");
}
println!(" ✅ Large data handling verified");
Ok(())
}