use crate as toasty;
use crate::engine::lower::expr_or::is_variant_tautology_or;
use crate::engine::test_util::test_schema_with;
use crate::schema::Register;
use toasty_core::schema::app::VariantId;
use toasty_core::stmt::{Expr, ExprOr};
#[derive(Debug, PartialEq, toasty::Embed)]
enum TwoVariant {
#[column(variant = 1)]
A,
#[column(variant = 2)]
B,
}
#[derive(Debug, PartialEq, toasty::Embed)]
enum ThreeVariant {
#[column(variant = 1)]
X,
#[column(variant = 2)]
Y,
#[column(variant = 3)]
Z,
}
#[test]
fn all_two_variants_is_tautology() {
let schema = test_schema_with(&[TwoVariant::schema()]);
let model_id = TwoVariant::id();
let expr = ExprOr {
operands: vec![
Expr::is_variant(
Expr::arg(0),
VariantId {
model: model_id,
index: 0,
},
),
Expr::is_variant(
Expr::arg(0),
VariantId {
model: model_id,
index: 1,
},
),
],
};
assert!(is_variant_tautology_or(&schema, &expr));
}
#[test]
fn all_three_variants_is_tautology() {
let schema = test_schema_with(&[ThreeVariant::schema()]);
let model_id = ThreeVariant::id();
let expr = ExprOr {
operands: vec![
Expr::is_variant(
Expr::arg(0),
VariantId {
model: model_id,
index: 0,
},
),
Expr::is_variant(
Expr::arg(0),
VariantId {
model: model_id,
index: 1,
},
),
Expr::is_variant(
Expr::arg(0),
VariantId {
model: model_id,
index: 2,
},
),
],
};
assert!(is_variant_tautology_or(&schema, &expr));
}
#[test]
fn subset_of_variants_is_not_tautology() {
let schema = test_schema_with(&[ThreeVariant::schema()]);
let model_id = ThreeVariant::id();
let expr = ExprOr {
operands: vec![
Expr::is_variant(
Expr::arg(0),
VariantId {
model: model_id,
index: 0,
},
),
Expr::is_variant(
Expr::arg(0),
VariantId {
model: model_id,
index: 1,
},
),
],
};
assert!(!is_variant_tautology_or(&schema, &expr));
}
#[test]
fn single_variant_of_two_with_extra_operand_is_not_tautology() {
let schema = test_schema_with(&[TwoVariant::schema()]);
let model_id = TwoVariant::id();
let expr = ExprOr {
operands: vec![
Expr::is_variant(
Expr::arg(0),
VariantId {
model: model_id,
index: 0,
},
),
Expr::arg(1),
],
};
assert!(!is_variant_tautology_or(&schema, &expr));
}
#[test]
fn all_variants_with_extra_operands_is_tautology() {
let schema = test_schema_with(&[TwoVariant::schema()]);
let model_id = TwoVariant::id();
let expr = ExprOr {
operands: vec![
Expr::is_variant(
Expr::arg(0),
VariantId {
model: model_id,
index: 0,
},
),
Expr::arg(5),
Expr::is_variant(
Expr::arg(0),
VariantId {
model: model_id,
index: 1,
},
),
],
};
assert!(is_variant_tautology_or(&schema, &expr));
}
#[test]
fn different_inner_exprs_is_not_tautology() {
let schema = test_schema_with(&[TwoVariant::schema()]);
let model_id = TwoVariant::id();
let expr = ExprOr {
operands: vec![
Expr::is_variant(
Expr::arg(0),
VariantId {
model: model_id,
index: 0,
},
),
Expr::is_variant(
Expr::arg(1),
VariantId {
model: model_id,
index: 1,
},
),
],
};
assert!(!is_variant_tautology_or(&schema, &expr));
}
#[test]
fn duplicate_variants_is_not_tautology() {
let schema = test_schema_with(&[ThreeVariant::schema()]);
let model_id = ThreeVariant::id();
let expr = ExprOr {
operands: vec![
Expr::is_variant(
Expr::arg(0),
VariantId {
model: model_id,
index: 0,
},
),
Expr::is_variant(
Expr::arg(0),
VariantId {
model: model_id,
index: 0,
},
),
Expr::is_variant(
Expr::arg(0),
VariantId {
model: model_id,
index: 1,
},
),
],
};
assert!(!is_variant_tautology_or(&schema, &expr));
}
#[test]
fn reversed_order_is_tautology() {
let schema = test_schema_with(&[TwoVariant::schema()]);
let model_id = TwoVariant::id();
let expr = ExprOr {
operands: vec![
Expr::is_variant(
Expr::arg(0),
VariantId {
model: model_id,
index: 1,
},
),
Expr::is_variant(
Expr::arg(0),
VariantId {
model: model_id,
index: 0,
},
),
],
};
assert!(is_variant_tautology_or(&schema, &expr));
}
#[test]
fn no_is_variant_operands_is_not_tautology() {
let schema = test_schema_with(&[TwoVariant::schema()]);
let expr = ExprOr {
operands: vec![Expr::arg(0), Expr::arg(1)],
};
assert!(!is_variant_tautology_or(&schema, &expr));
}