Documentation
use crate::util::*;
testcase!(test);
fn test(mut glue: multisql::Glue) {
	execute!(
		glue,
		"
			CREATE TABLE TestA (
				id INTEGER UNIQUE,
				num INT
			)
		"
	);

	execute!(
		glue,
		"
			CREATE TABLE TestB (
				id INTEGER UNIQUE,
				num INT UNIQUE
			)
		"
	);
	execute!(
		glue,
		"
			CREATE TABLE TestC (
				id INTEGER NULL UNIQUE,
				num INT
			)
		"
	);

	execute!(glue, "INSERT INTO TestA VALUES (1, 1)");
	execute!(glue, "INSERT INTO TestA VALUES (2, 1), (3, 1)");

	execute!(glue, "INSERT INTO TestB VALUES (1, 1)");
	execute!(glue, "INSERT INTO TestB VALUES (2, 2), (3, 3)");

	execute!(glue, "INSERT INTO TestC VALUES (NULL, 1)");
	execute!(glue, "INSERT INTO TestC VALUES (2, 2), (NULL, 3)");
	execute!(glue, "UPDATE TestC SET id = 1 WHERE num = 1");
	execute!(glue, "UPDATE TestC SET id = NULL WHERE num = 1");

	{
		let error_cases: Vec<(multisql::Error, _)> = vec![
			(
				multisql::ValidateError::DuplicateEntryOnUniqueField.into(),
				"INSERT INTO TestA VALUES (2, 2)",
			),
			(
				multisql::ValidateError::DuplicateEntryOnUniqueField.into(),
				"INSERT INTO TestA VALUES (4, 4), (4, 5)",
			),
			(
				multisql::ValidateError::DuplicateEntryOnUniqueField.into(),
				"UPDATE TestA SET id = 2 WHERE id = 1",
			),
			(
				multisql::ValidateError::DuplicateEntryOnUniqueField.into(),
				"INSERT INTO TestB VALUES (1, 3)",
			),
			(
				multisql::ValidateError::DuplicateEntryOnUniqueField.into(),
				"INSERT INTO TestB VALUES (4, 2)",
			),
			(
				multisql::ValidateError::DuplicateEntryOnUniqueField.into(),
				"INSERT INTO TestB VALUES (5, 5), (6, 5)",
			),
			(
				multisql::ValidateError::DuplicateEntryOnUniqueField.into(),
				"UPDATE TestB SET num = 2 WHERE id = 1",
			),
			(
				multisql::ValidateError::DuplicateEntryOnUniqueField.into(),
				"INSERT INTO TestC VALUES (2, 4)",
			),
			(
				multisql::ValidateError::DuplicateEntryOnUniqueField.into(),
				"INSERT INTO TestC VALUES (NULL, 5), (3, 5), (3, 6)",
			),
			(
				multisql::ValidateError::DuplicateEntryOnUniqueField.into(),
				"UPDATE TestC SET id = 1",
			),
		];

		for (_error, sql) in error_cases.into_iter() {
			assert_error!(glue, sql, _error);
		}
	}
}