feature-set 0.1.1

User defined feature set
Documentation
use crate::action::Action;
use crate::add_optional;
use crate::add_provide;
use crate::add_require;
use crate::del_provide;
use crate::del_require;
use crate::provide::Provide;
use crate::FeatureSet;
use crate::Require;

const PROVIDED: &[Action<Provide>] = &[
    add_provide(("foo", 0), "2012-02-21", (1, 2, 3)),
    add_provide(("bar", 1), "2012-02-21", (1, 2, 3)),
    add_provide(("baz", 0), "2012-02-21", (1, 2, 3)),
    add_provide(("baz", 1), "2012-02-21", (1, 2, 3)),
    add_provide(("qux", 1), "2012-02-21", (1, 2, 3)),
    del_provide(("baz", 0), "2012-02-21", (1, 2, 3)),
];

#[test]
fn test_provide() {
    let fs = FeatureSet::from_provides(PROVIDED);
    assert_eq!("bar:v1, baz:v1, foo:v0, qux:v1", fs.to_string());
}

#[test]
fn test_dup_provide() {
    const DUP_PROVIDED: &[Action<Provide>] = &[
        add_provide(("foo", 0), "2012-02-21", (1, 2, 3)),
        add_provide(("foo", 0), "2012-02-22", (1, 2, 4)),
    ];

    assert!(std::panic::catch_unwind(|| FeatureSet::from_provides(DUP_PROVIDED)).is_err());
}

const REQUIRED: &[Action<Require>] = &[
    add_require(("foo", 0), "2012-02-21", (1, 2, 3)),
    add_require(("bar", 0), "2012-02-21", (1, 2, 3)),
    add_optional(("bar", 1), "2012-02-21", (1, 2, 3)),
    del_require(("bar", 0), "2012-02-21", (1, 2, 3)),
];

#[test]
fn test_require() {
    let fs = FeatureSet::from_required(REQUIRED, false);
    assert_eq!("foo:v0", fs.to_string());

    let fs = FeatureSet::from_required(REQUIRED, true);
    assert_eq!("bar:v1, foo:v0", fs.to_string());
}

#[test]
fn test_dup_require() {
    const DUP_REQUIRED: &[Action<Require>] = &[
        add_require(("foo", 0), "2012-02-21", (1, 2, 3)),
        add_require(("foo", 0), "2012-02-22", (1, 2, 4)),
    ];

    assert!(std::panic::catch_unwind(|| FeatureSet::from_required(DUP_REQUIRED, false)).is_err());
}