use argumentation::ArgumentationFramework;
use argumentation_values::{Audience, Value, ValueAssignment, ValueBasedFramework};
fn hal_carla_vaf() -> ValueBasedFramework<&'static str> {
let mut base = ArgumentationFramework::new();
for arg in ["h1", "c1", "h2", "c2"] {
base.add_argument(arg);
}
base.add_attack(&"h1", &"c1").unwrap();
base.add_attack(&"c1", &"h1").unwrap();
base.add_attack(&"c2", &"h2").unwrap();
base.add_attack(&"h2", &"c1").unwrap();
let mut values = ValueAssignment::new();
values.promote("h1", Value::new("life"));
values.promote("c1", Value::new("property"));
values.promote("h2", Value::new("fairness"));
values.promote("c2", Value::new("life"));
ValueBasedFramework::new(base, values)
}
#[test]
fn life_over_property_grounds_hal() {
let vaf = hal_carla_vaf();
let audience = Audience::total([Value::new("life"), Value::new("property")]);
let grounded = vaf.grounded_for(&audience).unwrap();
assert!(grounded.contains("h1"), "h1 should be grounded under [life > property]");
assert!(grounded.contains("c2"), "c2 should be grounded under [life > property]");
assert!(!grounded.contains("c1"), "c1 should be defeated under [life > property]");
assert!(!grounded.contains("h2"), "h2 should be defeated under [life > property]");
}
#[test]
fn property_over_life_grounds_carla() {
let vaf = hal_carla_vaf();
let audience = Audience::total([Value::new("property"), Value::new("life")]);
let grounded = vaf.grounded_for(&audience).unwrap();
assert!(grounded.contains("c1"), "c1 should be grounded under [property > life]");
assert!(grounded.contains("c2"), "c2 should be grounded under [property > life]");
assert!(!grounded.contains("h1"), "h1 should be defeated under [property > life]");
assert!(!grounded.contains("h2"), "h2 should be defeated under [property > life]");
}
#[test]
fn incomparable_audience_yields_dung_result() {
let vaf = hal_carla_vaf();
let audience = Audience::from_tiers(vec![vec![
Value::new("life"),
Value::new("property"),
]]);
let grounded = vaf.grounded_for(&audience).unwrap();
assert!(grounded.contains("c2"), "c2 always grounded (no in-edges)");
assert!(!grounded.contains("h1"), "h1 not grounded under symmetric attack");
assert!(!grounded.contains("c1"), "c1 not grounded under symmetric attack");
assert!(!grounded.contains("h2"), "h2 defeated by grounded c2");
}
#[test]
fn accepted_for_matches_grounded_for_unique_extension() {
let vaf = hal_carla_vaf();
let audience = Audience::total([Value::new("life"), Value::new("property")]);
assert!(vaf.accepted_for(&audience, &"h1").unwrap());
assert!(vaf.accepted_for(&audience, &"c2").unwrap());
assert!(!vaf.accepted_for(&audience, &"c1").unwrap());
assert!(!vaf.accepted_for(&audience, &"h2").unwrap());
}