cfg 0.10.1

Library for manipulating context-free grammars.
Documentation
#![cfg(feature = "cfg-predict-sets")]

use cfg::Cfg;
use cfg_predict_sets::{LastSets, PredictSets, sets::PerSymbolSetVal};

use std::collections::BTreeMap;

#[test]
fn test_simple_last_sets() {
    let mut cfg: Cfg = Cfg::new();
    let [start, a, x, b, c, y] = cfg.sym();

    cfg.rule(start)
        .rhs([a, x, b])
        .rhs([c])
        .rule(b)
        .rhs([a, a])
        .rhs([a, c])
        .rule(c)
        .rhs([x])
        .rhs([y])
        .rule(a)
        .rhs([]);
    let sets = LastSets::new(&cfg);
    let sets = sets.predict_sets();

    let mut map = BTreeMap::new();
    let start_set = PerSymbolSetVal {
        has_none: false,
        list: vec![x, y],
    };
    let a_set = PerSymbolSetVal {
        has_none: true,
        list: vec![],
    };
    let b_set = PerSymbolSetVal {
        has_none: true,
        list: vec![x, y],
    };
    let c_set = PerSymbolSetVal {
        has_none: false,
        list: vec![x, y],
    };

    map.insert(start, start_set);
    map.insert(a, a_set);
    map.insert(b, b_set);
    map.insert(c, c_set);

    assert_eq!(sets, &map);
}

#[test]
fn test_simple_last_sets_altered() {
    let mut cfg: Cfg = Cfg::new();
    let [start, a, x, b, c, y] = cfg.sym();

    cfg.rule(start)
        .rhs([a, x, b])
        .rule(b)
        .rhs([a, a])
        .rhs([a, c])
        .rule(c)
        .rhs([x])
        .rhs([y])
        .rule(a)
        .rhs([]);
    let sets = LastSets::new(&cfg);
    let sets = sets.predict_sets();

    let mut map = BTreeMap::new();
    let start_set = PerSymbolSetVal {
        has_none: false,
        list: vec![x, y],
    };
    let a_set = PerSymbolSetVal {
        has_none: true,
        list: vec![],
    };
    let b_set = PerSymbolSetVal {
        has_none: true,
        list: vec![x, y],
    };
    let c_set = PerSymbolSetVal {
        has_none: false,
        list: vec![x, y],
    };

    map.insert(start, start_set);
    map.insert(a, a_set);
    map.insert(b, b_set);
    map.insert(c, c_set);

    assert_eq!(sets, &map);
}