| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| pub mod lexer; |
| pub mod parser; |
| pub mod ast; |
| pub mod evaluator; |
| pub mod xslt_processor; |
|
|
| pub use ast::{ConstraintProgram, Constraint, Requirement, OtherwiseAction}; |
| pub use evaluator::Evaluator; |
| pub use lexer::Lexer; |
| pub use parser::Parser; |
| pub use xslt_processor::{ |
| FormalizationMachine, InvariantRegistry, Invariant, ConstraintKind, Polarity, |
| ProverArtifact, ProverStatus, CorrespondenceObligation, CorrespondenceStatus, |
| AgdaIterationObligation, ExecutionSchedule, FormalizationSummary, |
| }; |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| pub fn compile(source: &str) -> hyperkitty_core::Result<ConstraintProgram> { |
| let mut lexer = Lexer::new(source); |
| let tokens = lexer.tokenize()?; |
| let mut parser = Parser::new(tokens); |
| parser.parse() |
| } |
|
|
| #[cfg(test)] |
| mod tests { |
| use super::*; |
| use std::collections::HashMap; |
|
|
| #[test] |
| fn test_compile_simple_program() -> hyperkitty_core::Result<()> { |
| let source = r#"validity(V1) msg { require check(); otherwise reject; }"#; |
| let program = compile(source)?; |
| assert_eq!(program.constraints.len(), 1); |
| Ok(()) |
| } |
|
|
| #[test] |
| fn test_full_pipeline() -> hyperkitty_core::Result<()> { |
| let source = r#" |
| validity(V1) "check1" { |
| require always_true(); |
| otherwise reject; |
| } |
| validity(V2) "check2" { |
| require always_true(); |
| otherwise accept; |
| } |
| "#; |
|
|
| let program = compile(source)?; |
| let evaluator = Evaluator::new(program); |
| let bindings = HashMap::new(); |
|
|
| assert!(evaluator.evaluate(&bindings)?); |
| Ok(()) |
| } |
|
|
| #[test] |
| fn test_multiple_requirements() -> hyperkitty_core::Result<()> { |
| let source = r#" |
| validity(V) msg { |
| require always_true(); |
| require always_true(); |
| otherwise reject; |
| } |
| "#; |
|
|
| let program = compile(source)?; |
| assert_eq!(program.constraints[0].requires.len(), 2); |
| Ok(()) |
| } |
|
|
| #[test] |
| fn test_otherwise_accept() -> hyperkitty_core::Result<()> { |
| let source = r#"validity(V) msg { require always_false(); otherwise accept; }"#; |
| let program = compile(source)?; |
| let evaluator = Evaluator::new(program); |
| let bindings = HashMap::new(); |
|
|
| |
| assert!(evaluator.evaluate(&bindings)?); |
| Ok(()) |
| } |
|
|
| #[test] |
| fn test_otherwise_reject() -> hyperkitty_core::Result<()> { |
| let source = r#"validity(V) msg { require always_false(); otherwise reject; }"#; |
| let program = compile(source)?; |
| let evaluator = Evaluator::new(program); |
| let bindings = HashMap::new(); |
|
|
| |
| assert!(!evaluator.evaluate(&bindings)?); |
| Ok(()) |
| } |
| } |
|
|