use vibesql_catalog::{ColumnSchema, TableSchema};
use vibesql_storage::{Database, Row};
use vibesql_types::{DataType, SqlValue};
fn create_test_table(db: &mut Database) {
let schema = TableSchema::new(
"test".to_string(),
vec![
ColumnSchema::new("id".to_string(), DataType::Integer, false),
ColumnSchema::new("value".to_string(), DataType::Integer, true),
],
);
db.create_table(schema).expect("Failed to create test table");
}
#[test]
fn test_last_changes_count_initial_value() {
let db = Database::new();
assert_eq!(db.last_changes_count(), 0);
}
#[test]
fn test_set_and_get_last_changes_count() {
let mut db = Database::new();
db.set_last_changes_count(5);
assert_eq!(db.last_changes_count(), 5);
db.set_last_changes_count(10);
assert_eq!(db.last_changes_count(), 10);
db.set_last_changes_count(0);
assert_eq!(db.last_changes_count(), 0);
}
#[test]
fn test_last_changes_count_after_insert_single_row() {
let mut db = Database::new();
create_test_table(&mut db);
let row = Row::new(vec![SqlValue::Integer(1), SqlValue::Integer(100)]);
db.insert_row("test", row).expect("Failed to insert");
db.set_last_changes_count(1);
assert_eq!(db.last_changes_count(), 1);
}
#[test]
fn test_last_changes_count_after_multiple_inserts() {
let mut db = Database::new();
create_test_table(&mut db);
for i in 1..=3 {
let row = Row::new(vec![SqlValue::Integer(i), SqlValue::Integer(i * 100)]);
db.insert_row("test", row).expect("Failed to insert");
}
db.set_last_changes_count(3);
assert_eq!(db.last_changes_count(), 3);
}
#[test]
fn test_last_changes_count_persists_across_reads() {
let mut db = Database::new();
create_test_table(&mut db);
db.set_last_changes_count(5);
let table = db.get_table("test").expect("Table should exist");
let _rows = table.scan();
assert_eq!(db.last_changes_count(), 5);
}
#[test]
fn test_last_changes_count_zero_operations() {
let mut db = Database::new();
create_test_table(&mut db);
for i in 1..=3 {
let row = Row::new(vec![SqlValue::Integer(i), SqlValue::Integer(100)]);
db.insert_row("test", row).expect("Failed to insert");
}
db.set_last_changes_count(0);
assert_eq!(db.last_changes_count(), 0);
}
#[test]
fn test_last_changes_count_sequential_operations() {
let mut db = Database::new();
create_test_table(&mut db);
db.set_last_changes_count(3);
assert_eq!(db.last_changes_count(), 3);
db.set_last_changes_count(1);
assert_eq!(db.last_changes_count(), 1);
db.set_last_changes_count(2);
assert_eq!(db.last_changes_count(), 2);
}
#[test]
fn test_total_changes_count_initial_value() {
let db = Database::new();
assert_eq!(db.total_changes_count(), 0);
}
#[test]
fn test_increment_total_changes_count() {
let mut db = Database::new();
db.increment_total_changes_count(5);
assert_eq!(db.total_changes_count(), 5);
db.increment_total_changes_count(3);
assert_eq!(db.total_changes_count(), 8);
db.increment_total_changes_count(2);
assert_eq!(db.total_changes_count(), 10);
}
#[test]
fn test_total_changes_accumulates_across_operations() {
let mut db = Database::new();
create_test_table(&mut db);
db.set_last_changes_count(3);
db.increment_total_changes_count(3);
assert_eq!(db.last_changes_count(), 3);
assert_eq!(db.total_changes_count(), 3);
db.set_last_changes_count(2);
db.increment_total_changes_count(2);
assert_eq!(db.last_changes_count(), 2);
assert_eq!(db.total_changes_count(), 5);
db.set_last_changes_count(1);
db.increment_total_changes_count(1);
assert_eq!(db.last_changes_count(), 1);
assert_eq!(db.total_changes_count(), 6); }
#[test]
fn test_changes_resets_but_total_changes_accumulates() {
let mut db = Database::new();
create_test_table(&mut db);
db.set_last_changes_count(5);
db.increment_total_changes_count(5);
assert_eq!(db.last_changes_count(), 5);
assert_eq!(db.total_changes_count(), 5);
db.set_last_changes_count(3);
db.increment_total_changes_count(3);
assert_eq!(db.last_changes_count(), 3); assert_eq!(db.total_changes_count(), 8);
db.set_last_changes_count(2);
db.increment_total_changes_count(2);
assert_eq!(db.last_changes_count(), 2); assert_eq!(db.total_changes_count(), 10); }
#[test]
fn test_total_changes_zero_increment() {
let mut db = Database::new();
create_test_table(&mut db);
db.set_last_changes_count(5);
db.increment_total_changes_count(5);
assert_eq!(db.total_changes_count(), 5);
db.set_last_changes_count(0);
db.increment_total_changes_count(0);
assert_eq!(db.last_changes_count(), 0);
assert_eq!(db.total_changes_count(), 5); }
#[test]
fn test_total_changes_persists_across_reads() {
let mut db = Database::new();
create_test_table(&mut db);
db.set_last_changes_count(5);
db.increment_total_changes_count(5);
let table = db.get_table("test").expect("Table should exist");
let _rows = table.scan();
assert_eq!(db.last_changes_count(), 5);
assert_eq!(db.total_changes_count(), 5);
}
#[test]
fn test_cloned_database_resets_total_changes() {
let mut db = Database::new();
create_test_table(&mut db);
db.set_last_changes_count(10);
db.increment_total_changes_count(10);
assert_eq!(db.total_changes_count(), 10);
let cloned = db.clone();
assert_eq!(cloned.last_changes_count(), 0);
assert_eq!(cloned.total_changes_count(), 0);
}