use argumentation::ArgumentationFramework;
use argumentation_values::{Audience, Value, ValueAssignment, ValueBasedFramework};
fn binary_attack(
a_values: &[&str],
b_values: &[&str],
) -> ValueBasedFramework<&'static str> {
let mut base = ArgumentationFramework::new();
base.add_argument("a");
base.add_argument("b");
base.add_attack(&"a", &"b").unwrap();
let mut values = ValueAssignment::new();
for v in a_values {
values.promote("a", Value::new(*v));
}
for v in b_values {
values.promote("b", Value::new(*v));
}
ValueBasedFramework::new(base, values)
}
#[test]
fn pareto_defeat_when_attacker_dominates() {
let vaf = binary_attack(&["life", "autonomy"], &["property"]);
let aud = Audience::total([Value::new("life"), Value::new("property")]);
assert!(vaf.defeats(&"a", &"b", &aud));
}
#[test]
fn pareto_defeat_blocked_when_target_strictly_dominates_every_attacker_value() {
let vaf = binary_attack(&["property"], &["life", "autonomy"]);
let aud = Audience::total([
Value::new("life"),
Value::new("autonomy"),
Value::new("property"),
]);
assert!(!vaf.defeats(&"a", &"b", &aud));
}
#[test]
fn pareto_defeat_one_target_value_can_save_the_target() {
let vaf = binary_attack(&["fairness"], &["fairness", "life"]);
let aud = Audience::total([Value::new("life"), Value::new("fairness")]);
assert!(!vaf.defeats(&"a", &"b", &aud));
}
#[test]
fn pareto_defeat_reduces_to_benchcapon_for_single_values() {
let vaf = binary_attack(&["life"], &["property"]);
let life_audience = Audience::total([Value::new("life"), Value::new("property")]);
let property_audience = Audience::total([Value::new("property"), Value::new("life")]);
assert!(vaf.defeats(&"a", &"b", &life_audience));
assert!(!vaf.defeats(&"a", &"b", &property_audience));
}
#[test]
fn unranked_target_value_does_not_save_target() {
let vaf = binary_attack(&["life"], &["fairness"]);
let aud = Audience::total([Value::new("life")]);
assert!(vaf.defeats(&"a", &"b", &aud));
}
#[test]
fn unranked_attacker_value_can_still_defeat_unranked_target() {
let vaf = binary_attack(&["honor"], &["tradition"]);
let aud = Audience::total([Value::new("life")]);
assert!(vaf.defeats(&"a", &"b", &aud));
}