mirror of
https://github.com/aljazceru/turso.git
synced 2025-12-31 15:04:19 +01:00
79 lines
2.3 KiB
Rust
79 lines
2.3 KiB
Rust
use std::rc::Rc;
|
|
|
|
use limbo_core::Connection;
|
|
use rand::Rng;
|
|
|
|
use crate::{
|
|
compare_equal_rows,
|
|
generation::ArbitraryFrom,
|
|
get_all_rows,
|
|
model::{
|
|
query::{Insert, Predicate, Query, Select},
|
|
table::Value,
|
|
},
|
|
SimulatorEnv,
|
|
};
|
|
|
|
pub fn property_insert_select(env: &mut SimulatorEnv, conn: &mut Rc<Connection>) {
|
|
// Get a random table
|
|
let table = env.rng.gen_range(0..env.tables.len());
|
|
|
|
// Pick a random column
|
|
let column_index = env.rng.gen_range(0..env.tables[table].columns.len());
|
|
let column = &env.tables[table].columns[column_index].clone();
|
|
|
|
let mut rng = env.rng.clone();
|
|
|
|
// Generate a random value of the column type
|
|
let value = Value::arbitrary_from(&mut rng, &column.column_type);
|
|
|
|
// Create a whole new row
|
|
let mut row = Vec::new();
|
|
for (i, column) in env.tables[table].columns.iter().enumerate() {
|
|
if i == column_index {
|
|
row.push(value.clone());
|
|
} else {
|
|
let value = Value::arbitrary_from(&mut rng, &column.column_type);
|
|
row.push(value);
|
|
}
|
|
}
|
|
|
|
// Insert the row
|
|
let query = Query::Insert(Insert {
|
|
table: env.tables[table].name.clone(),
|
|
values: row.clone(),
|
|
});
|
|
let _ = get_all_rows(env, conn, query.to_string().as_str()).unwrap();
|
|
// Shadow operation on the table
|
|
env.tables[table].rows.push(row.clone());
|
|
|
|
// Create a query that selects the row
|
|
let query = Query::Select(Select {
|
|
table: env.tables[table].name.clone(),
|
|
predicate: Predicate::Eq(column.name.clone(), value),
|
|
});
|
|
|
|
// Get all rows
|
|
let rows = get_all_rows(env, conn, query.to_string().as_str()).unwrap();
|
|
|
|
// Check that the row is there
|
|
assert!(rows.iter().any(|r| r == &row));
|
|
}
|
|
|
|
pub fn property_select_all(env: &mut SimulatorEnv, conn: &mut Rc<Connection>) {
|
|
// Get a random table
|
|
let table = env.rng.gen_range(0..env.tables.len());
|
|
|
|
// Create a query that selects all rows
|
|
let query = Query::Select(Select {
|
|
table: env.tables[table].name.clone(),
|
|
predicate: Predicate::And(Vec::new()),
|
|
});
|
|
|
|
// Get all rows
|
|
let rows = get_all_rows(env, conn, query.to_string().as_str()).unwrap();
|
|
|
|
// Make sure the rows are the same
|
|
compare_equal_rows(&rows, &env.tables[table].rows);
|
|
}
|