#[cfg(test)]
mod tests {
use super::*;
use std::collections::HashMap;
fn create_test_table() -> Table {
let mut schema = HashMap::new();
let mut order = vec![];
let columns = vec![
("id", ColumnType::Integer, Constraint::PrimaryKey),
("name", ColumnType::Text, Constraint::None),
("age", ColumnType::Integer, Constraint::None),
];
for(i, (name, col_type, constraint)) in columns.into_iter().enumerate(){
schema.insert(
name.to_string(),
ColumnSchema {
order: i,
column_type: col_type,
constraint,
},
);
order.push(name.to_string());
}
Table {
name: "users".to_string(),
columns: Columns { schema, order },
rows: vec![],
}
}
#[test]
fn test_insert_and_find() {
let mut table = create_test_table();
let result = table.insert_row(vec![
Value::Integer(1),
Value::Text("Alice".to_string()),
Value::Integer(30),
]);
assert!(result.is_ok());
let results = table.find_rows_by_column_value("id", &Value::Integer(1));
assert_eq!(results.len(), 1);
assert_eq!(results[0][1], Value::Text("Alice".to_string()));
}
#[test]
fn test_update_by_condition() {
let mut table = create_test_table();
table.insert_row(vec![
Value::Integer(2),
Value::Text("Bob".to_string()),
Value::Integer(25),
]).unwrap();
let condition = Condition::Equals("id".to_string(), Value::Integer(2));
let updated = table.update_by_condition("name", Value::Text("Carol".to_string()), Some(condition)).unwrap();
assert_eq!(updated, 1);
let updated_rows = table.find_rows_by_column_value("id", &Value::Integer(2));
assert_eq!(updated_rows[0][1], Value::Text("Carol".to_string()));
}
#[test]
fn test_delete_by_condition() {
let mut table = create_test_table();
table.insert_row(vec![
Value::Integer(3),
Value::Text("David".to_string()),
Value::Integer(40),
]).unwrap();
let condition = Condition::Equals("id".to_string(), Value::Integer(3));
let deleted = table.delete_by_condition(Some(condition)).unwrap();
assert_eq!(deleted, 1);
let rows = table.find_rows_by_column_value("id", &Value::Integer(3));
assert_eq!(rows.len(), 0);
}
#[test]
fn test_unique_violation() {
let mut table = create_test_table();
table.insert_row(vec![
Value::Integer(4),
Value::Text("Eve".to_string()),
Value::Integer(50),
]).unwrap();
let result = table.insert_row(vec![
Value::Integer(4),
Value::Text("Eve2".to_string()),
Value::Integer(60),
]);
assert!(result.is_err());
assert!(result.unwrap_err().contains("Duplicate primary key"));
}
}
Finished `test` profile [unoptimized + debuginfo] target(s) in 4.35s
Running unittests src/main.rs (target/debug/deps/rds-a17132f561100387)
running 4 tests
test tests::test_insert_and_find … ok
test tests::test_delete_by_condition … ok
test tests::test_unique_violation … ok
test tests::test_update_by_condition … ok
test result: ok. 4 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
プロジェクトを lib.rs + main.rs に分けたい。