use asdi::features::{FeatureSet, FEATURE_NEGATION}; use asdi::MaybePositive; mod common; use crate::common::{quick_program_check, quick_program_check_with_options}; #[test] fn is_positive() { quick_program_check_with_options( "foo(X, Y) :- bar(X, Z), foo(Z, Y).", FeatureSet::default().add_support_for(&FEATURE_NEGATION), |p| { assert!(p.is_positive()); }, ) } #[test] fn is_non_positive() { quick_program_check_with_options( "foo(X, Y) :- bar(X, Y), NOT foo(X, Z), baz(Z).", FeatureSet::default().add_support_for(&FEATURE_NEGATION), |p| { assert!(!p.is_positive()); }, ) } // ------------------------------------------------------------------------------------------------ #[test] fn is_linear() { quick_program_check( r#" .assert bar(integer, integer). .infer foo(integer, integer). .infer far(integer, integer). foo(X, Y) :- bar(X, Y). foo(X, Y) :- far(X, Y). foo(X, Y) :- bar(X, Y), far(X, Y)."#, |p| { assert!(p.is_linear()); }, ) } #[test] fn is_non_linear() { quick_program_check( r#" .assert bar(integer, integer). .infer foo(integer, integer). .infer far(integer, integer). foo(X, Y) :- foo(X, Y), bar(X, Y), far(X, Y)."#, |p| { assert!(!p.is_linear()); }, ) } // ------------------------------------------------------------------------------------------------ #[test] fn is_guarded() { quick_program_check("foo(X, Y) :- bar(X, Y), foo(Z, Y), guard(X, Y, Z).", |p| { assert!(p.is_guarded()); }) } #[test] fn is_non_guarded() { quick_program_check("foo(X, Y) :- bar(X, Y), foo(Z, Y).", |p| { assert!(!p.is_guarded()); }) } // ------------------------------------------------------------------------------------------------ #[test] fn is_frontier_guarded() { quick_program_check("foo(X, Y) :- bar(X, Z), foo(Y, Z), guard(X, Y).", |p| { assert!(p.is_frontier_guarded()); }) } #[test] fn is_non_frontier_guarded() { quick_program_check("foo(X, Y) :- bar(X, Z), foo(Y, Z).", |p| { assert!(!p.is_frontier_guarded()); }) } // ------------------------------------------------------------------------------------------------ #[test] fn is_non_recursive() { quick_program_check("foo(X, Y) :- bar(X, Y).", |p| { assert!(!p.is_recursive()); }) } #[test] fn is_recursive() { quick_program_check("foo(X, Y) :- bar(X, Z), foo(Z, Y).", |p| { assert!(p.is_recursive()); }) }