#![allow(unknown_lints, deprecated, bare_trait_objects)]
extern crate cfg_rust_features;
extern crate create_temp_subdir;
use std::collections::{BTreeSet, HashSet};
use std::env;
use std::error::Error;
use std::hash::Hash;
use std::iter::FromIterator;
use cfg_rust_features::{emit_rerun_if_changed_file, CfgRustFeatures, FeatureCategory};
use create_temp_subdir::TempSubDir;
type ResultDynErr<T> = Result<T, Box<Error>>;
type FeatureName = &'static str;
type EnabledFeatures = cfg_rust_features::EnabledFeatures<FeatureName>;
fn pretend_build_script() -> ResultDynErr<EnabledFeatures>
{
emit_rerun_if_changed_file(file!());
Ok(try!(try!(CfgRustFeatures::new()).emit_multiple(vec![
"arbitrary_self_types",
"inner_deref",
"destructuring_assignment",
"error_in_core",
"iter_zip",
"never_type",
"question_mark",
"rust1",
"step_trait",
"unstable_features",
"unwrap_infallible",
])))
}
fn main()
{
let out_dir = TempSubDir::new("intgtest-pretend_build_script").unwrap();
env::set_var("OUT_DIR", &out_dir);
assert_enabled_features(&pretend_build_script().unwrap());
}
fn assert_enabled_features(enabled: &EnabledFeatures)
{
type Feature = (FeatureName, BTreeSet<FeatureCategory>);
macro_rules! set {
[$t:ty: $($e:expr),*] => {
<$t>::from_iter(vec![$($e),*])
}
}
macro_rules! hset {
[$($rest:tt)*] => {
set![HashSet<_>: $($rest)*]
}
}
macro_rules! bset {
[$($rest:tt)*] => {
set![BTreeSet<_>: $($rest)*]
}
}
fn bset_from_hset<T: Clone + Hash + Ord>(hset: &HashSet<T>) -> BTreeSet<T>
{
hset.iter().cloned().collect()
}
fn from_enabled_features(enabled_features: &EnabledFeatures) -> HashSet<Feature>
{
enabled_features
.iter()
.filter_map(|(&k, v)| v.as_ref().map(|c| (k, bset_from_hset(c))))
.collect()
}
fn assert_enabled_fits_required_and_allowed<T: Hash + Eq>(
enabled: &HashSet<T>,
required: &HashSet<T>,
allowed: &HashSet<T>,
)
{
assert!(enabled.is_superset(required));
assert!(enabled.is_subset(allowed));
}
let required = hset![("rust1", bset!["comp", "lang", "lib"])];
let optional = hset![
("unstable_features", bset!["comp"]),
("arbitrary_self_types", bset!["lang"]),
("destructuring_assignment", bset!["lang"]),
("never_type", bset!["lang"]),
("question_mark", bset!["lang"]),
("error_in_core", bset!["lib"]),
("inner_deref", bset!["lib"]),
("iter_zip", bset!["lib"]),
("step_trait", bset!["lib"]),
("unwrap_infallible", bset!["lib"])
];
let allowed = &required | &optional;
let enabled = from_enabled_features(enabled);
assert_enabled_fits_required_and_allowed(&enabled, &required, &allowed);
}