// Copyright 2012-2015 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.

#[cfg(feature = "bench")]
use std::iter;
#[cfg(feature = "bench")]
use test::Bencher;
#[cfg(feature = "bench")]
use std::prelude::v1::*;

#[cfg(feature = "bench")]
#[bench]
fn cargo_is_xid_start(b: &mut Bencher) {
    let string = iter::repeat('a').take(4096).collect::<String>();

    b.bytes = string.len() as u64;
    b.iter(|| {
        string.chars().all(super::UnicodeXID::is_xid_start)
    });
}

#[cfg(feature = "bench")]
#[bench]
fn stdlib_is_xid_start(b: &mut Bencher) {
    let string = iter::repeat('a').take(4096).collect::<String>();

    b.bytes = string.len() as u64;
    b.iter(|| {
        string.chars().all(char::is_xid_start)
    });
}

#[cfg(feature = "bench")]
#[bench]
fn cargo_xid_continue(b: &mut Bencher) {
    let string = iter::repeat('a').take(4096).collect::<String>();

    b.bytes = string.len() as u64;
    b.iter(|| {
        string.chars().all(super::UnicodeXID::is_xid_continue)
    });
}

#[cfg(feature = "bench")]
#[bench]
fn stdlib_xid_continue(b: &mut Bencher) {
    let string = iter::repeat('a').take(4096).collect::<String>();

    b.bytes = string.len() as u64;
    b.iter(|| {
        string.chars().all(char::is_xid_continue)
    });
}

#[test]
fn test_is_xid_start() {
    let chars = [
        'A', 'Z', 'a', 'z',
        '\u{1000d}', '\u{10026}',
    ];

    for ch in &chars {
        assert!(super::UnicodeXID::is_xid_start(*ch), "{}", ch);
    }
}

#[test]
fn test_is_not_xid_start() {
    let chars = [
        '\x00', '\x01',
        '0', '9',
        ' ', '[', '<', '{', '(',
        '\u{02c2}', '\u{ffff}',
    ];

    for ch in &chars {
        assert!(!super::UnicodeXID::is_xid_start(*ch), "{}", ch);
    }
}

#[test]
fn test_is_xid_continue() {
    let chars = [
        '0', '9', 'A', 'Z', 'a', 'z', '_',
        '\u{1000d}', '\u{10026}',
    ];

    for ch in &chars {
        assert!(super::UnicodeXID::is_xid_continue(*ch), "{}", ch);
    }
}

#[test]
fn test_is_not_xid_continue() {
    let chars = [
        '\x00', '\x01',
        ' ', '[', '<', '{', '(',
        '\u{02c2}', '\u{ffff}',
    ];

    for &ch in &chars {
        assert!(!super::UnicodeXID::is_xid_continue(ch), "{}", ch);
    }
}
