use geoit::algebra::mv::Mv;
use geoit::algebra::signature::Signature;
use geoit::governance::{govern, Construction, Expr, GeomClass, Governance, Phase};
use geoit::scalar::{Rat, Scalar};
fn vga3_governance() -> Governance {
Governance {
sig: Signature::new(0, 0, 3).unwrap(),
derived_gens: vec![],
geom_classes: vec![GeomClass::grades_only(&[1])],
constructions: vec![Construction {
class_index: 0,
arity: 3,
body: Expr::Add(
Expr::add(
Expr::mul(Expr::param(0), Expr::gen(0)),
Expr::mul(Expr::param(1), Expr::gen(1)),
),
Expr::mul(Expr::param(2), Expr::gen(2)),
),
}],
probe: None,
transform_rules: vec![],
}
}
#[test]
fn vga_circuit_closes() {
let gov = vga3_governance();
let params = vec![Scalar::from(3i64), Scalar::from(4i64), Scalar::from(5i64)];
let mv = gov.construct(0, ¶ms).unwrap();
let geoit = govern(&mv, &gov, 0).unwrap();
assert_eq!(geoit.read_all().unwrap(), params);
}
#[test]
fn vga_rational_coefficients() {
let gov = vga3_governance();
let params = vec![
Scalar::Rat(Rat::new(1, 2)),
Scalar::Rat(Rat::new(1, 3)),
Scalar::Rat(Rat::new(1, 7)),
];
let mv = gov.construct(0, ¶ms).unwrap();
let geoit = govern(&mv, &gov, 0).unwrap();
assert_eq!(geoit.read_all().unwrap(), params);
}
#[test]
fn vga_phase_values() {
let gov = vga3_governance();
let mv = gov
.construct(
0,
&[Scalar::from(3i64), Scalar::from(4i64), Scalar::from(5i64)],
)
.unwrap();
assert_eq!(govern(&mv, &gov, 0).unwrap().phase(), Phase::Commitment);
let zero = gov
.construct(
0,
&[Scalar::from(0i64), Scalar::from(0i64), Scalar::from(0i64)],
)
.unwrap();
assert_eq!(govern(&zero, &gov, 0).unwrap().phase(), Phase::Evaluation);
}
#[test]
fn vga_bivector_rejected() {
let gov = vga3_governance();
let bv = Mv::from_rat_terms(&[(0b011, Rat::from(1))]);
assert!(govern(&bv, &gov, 0).is_err());
}
#[test]
fn vga_scalar_rejected() {
let gov = vga3_governance();
let s = Mv::from_rat_terms(&[(0b000, Rat::from(5))]);
assert!(govern(&s, &gov, 0).is_err());
}
#[test]
fn vga_mixed_grade_rejected() {
let gov = vga3_governance();
let mixed = Mv::from_rat_terms(&[(0b001, Rat::from(1)), (0b011, Rat::from(2))]);
assert!(govern(&mixed, &gov, 0).is_err());
}
#[test]
fn vga_circuit_multiple_vectors() {
let gov = vga3_governance();
let cases: Vec<Vec<i64>> = vec![
vec![1, 0, 0],
vec![0, 1, 0],
vec![0, 0, 1],
vec![-1, -2, -3],
];
for case in &cases {
let params: Vec<Scalar> = case.iter().map(|&n| Scalar::from(n)).collect();
let mv = gov.construct(0, ¶ms).unwrap();
let geoit = govern(&mv, &gov, 0).unwrap();
assert_eq!(geoit.read_all().unwrap(), params);
}
}