Documentation
#![feature(test)]

extern crate test;
extern crate fac;

use std::path::{PathBuf,Path};
use std::collections::HashMap;

fn create_hashmap(sz: usize) -> HashMap<PathBuf, usize> {
    let mut i = 0;
    let mut map = HashMap::new();
    for p in fac::git::ls_files() {
        map.insert(p, i);
        i += 1;
        if i == sz {
            return map;
        }
    }
    panic!("I cannot create a map this big!");
}

fn create_usize_hashmap(sz: usize) -> HashMap<usize, usize> {
    let mut i = 10;
    let mut map = HashMap::new();
    for p in 0..sz {
        map.insert(p, i);
        i += 1
    }
    map
}

#[cfg(test)]
mod tests {
    use super::*;
    use test::Bencher;

    #[bench]
    fn git_go_to_top(b: &mut Bencher) {
        b.iter(|| fac::git::go_to_top());
    }

    #[bench]
    fn git_dir(b: &mut Bencher) {
        b.iter(|| fac::git::git_dir());
    }

    #[bench]
    fn git_ls_files(b: &mut Bencher) {
        b.iter(|| fac::git::ls_files());
    }

    #[bench]
    fn access_hashmap_10(b: &mut Bencher) {
        let map = create_hashmap(10);
        let p = map.keys().next().unwrap();
        b.iter(|| map[p]);
    }

    #[bench]
    fn access_hashmap_100(b: &mut Bencher) {
        let map = create_hashmap(100);
        let p = map.keys().next().unwrap();
        b.iter(|| map[p]);
    }

    #[bench]
    fn access_usize_hashmap_10(b: &mut Bencher) {
        let map = create_usize_hashmap(10);
        let p = map.keys().next().unwrap();
        b.iter(|| map[p]);
    }

    #[bench]
    fn access_usize_hashmap_100(b: &mut Bencher) {
        let map = create_usize_hashmap(100);
        let p = map.keys().next().unwrap();
        b.iter(|| map[p]);
    }

    #[bench]
    fn env(b: &mut Bencher) {
        fac::build::env::hash();
        b.iter(|| fac::build::env::hash());
    }

    #[bench]
    fn hashstat_hosts(b: &mut Bencher) {
        b.iter(|| fac::build::hashstat::hashstat(&Path::new("/etc/hosts")));
    }

    #[bench]
    fn stat_hosts(b: &mut Bencher) {
        b.iter(|| fac::build::hashstat::stat(&Path::new("/etc/hosts")));
    }

    #[bench]
    fn hashstat_words(b: &mut Bencher) {
        b.iter(|| fac::build::hashstat::hashstat(&Path::new("/usr/share/dict/american-english")));
    }

    #[bench]
    fn stat_words(b: &mut Bencher) {
        b.iter(|| fac::build::hashstat::stat(&Path::new("/usr/share/dict/american-english")));
    }
}