use crate::{
    Literal, BoolLit,
    test_util::assert_parse_ok_eq,
};

macro_rules! assert_bool_parse {
    ($input:literal, $expected:expr) => {
        assert_parse_ok_eq(
            $input, Literal::parse($input), Literal::Bool($expected), "Literal::parse");
        assert_parse_ok_eq($input, BoolLit::parse($input), $expected, "BoolLit::parse");
    };
}



#[test]
fn parse_ok() {
    assert_bool_parse!("false", BoolLit::False);
    assert_bool_parse!("true", BoolLit::True);
}

#[test]
fn parse_err() {
    assert!(Literal::parse("fa").is_err());
    assert!(Literal::parse("fal").is_err());
    assert!(Literal::parse("fals").is_err());
    assert!(Literal::parse(" false").is_err());
    assert!(Literal::parse("false ").is_err());
    assert!(Literal::parse("False").is_err());

    assert!(Literal::parse("tr").is_err());
    assert!(Literal::parse("tru").is_err());
    assert!(Literal::parse(" true").is_err());
    assert!(Literal::parse("true ").is_err());
    assert!(Literal::parse("True").is_err());
}

#[test]
fn value() {
    assert!(!BoolLit::False.value());
    assert!(BoolLit::True.value());
}

#[test]
fn as_str() {
    assert_eq!(BoolLit::False.as_str(), "false");
    assert_eq!(BoolLit::True.as_str(), "true");
}
