multilinear 0.6.0

Interactive story simulation using constrained parallel aspects
Documentation
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)
    );
}