use multilinear::{Change, InvalidChangeError, MultilinearInfo};
#[test]
fn test_add_event() {
let mut info = MultilinearInfo::new();
let aspect1 = info.add_aspect();
let aspect2 = info.add_aspect();
let change = vec![
Change::condition(aspect1, 1),
Change::transition(aspect2, 0, 1),
];
let event = info.add_event().with_change(&change).unwrap().event();
assert_eq!(event.0, 0);
}
#[test]
fn test_unrelated_empty() {
let mut info = MultilinearInfo::new();
let aspect1 = info.add_aspect();
let aspect2 = info.add_aspect();
let change = vec![
Change::condition(aspect1, 1),
Change::transition(aspect2, 0, 1),
];
let mut event_edit = info.add_event().with_change(&change).unwrap();
assert_eq!(
event_edit.add_change(&[]),
Err(InvalidChangeError::ConflictingChanges)
);
}
#[test]
fn test_duplicate_aspect() {
let mut info = MultilinearInfo::new();
let aspect = info.add_aspect();
let change = vec![Change::condition(aspect, 0), Change::condition(aspect, 0)];
let mut event_edit = info.add_event();
assert_eq!(
event_edit.add_change(&change),
Err(InvalidChangeError::DuplicateAspect)
);
}
#[test]
fn test_overlapping_changes() {
let mut info = MultilinearInfo::new();
let aspect = info.add_aspect();
let change1 = vec![Change::transition(aspect, 0, 1)];
let change2 = vec![Change::transition(aspect, 0, 2)];
let change3 = vec![Change::transition(aspect, 1, 1)];
let mut event_edit = info.add_event().with_change(&change1).unwrap();
assert_eq!(
event_edit.add_change(&change2),
Err(InvalidChangeError::ConflictingChanges)
);
assert_eq!(
event_edit.add_change(&change3),
Err(InvalidChangeError::ConflictingChanges)
);
}
#[test]
fn test_unrelated_changes() {
let mut info = MultilinearInfo::new();
let aspect1 = info.add_aspect();
let aspect2 = info.add_aspect();
let aspect3 = info.add_aspect();
let change1 = vec![Change::transition(aspect1, 0, 1)];
let change2 = vec![Change::transition(aspect2, 0, 1)];
let change3 = vec![Change::transition(aspect3, 0, 1)];
let mut event_edit = info.add_event().with_change(&change1).unwrap();
assert_eq!(
event_edit.add_change(&change2),
Err(InvalidChangeError::ConflictingChanges)
);
assert_eq!(
event_edit.add_change(&change3),
Err(InvalidChangeError::ConflictingChanges)
);
}
#[test]
fn test_change_triangle() {
let mut info = MultilinearInfo::new();
let aspect1 = info.add_aspect();
let aspect2 = info.add_aspect();
let aspect3 = info.add_aspect();
let change1 = vec![
Change::transition(aspect1, 0, 1),
Change::transition(aspect2, 0, 1),
];
let change2 = vec![
Change::transition(aspect2, 0, 1),
Change::transition(aspect3, 0, 1),
];
let change3 = vec![
Change::transition(aspect3, 0, 1),
Change::transition(aspect1, 0, 1),
];
let mut event_edit = info.add_event().with_change(&change1).unwrap();
assert_eq!(
event_edit.add_change(&change2),
Err(InvalidChangeError::ConflictingChanges)
);
assert_eq!(
event_edit.add_change(&change3),
Err(InvalidChangeError::ConflictingChanges)
);
}