use anyhow::anyhow;
use apple_products_parser::*;
use pest::Parser;
use thiserror::Error;
#[test]
fn name_test() -> anyhow::Result<()> {
let pair = Grammar::parse(Rule::name, "MacBook Pro 14")?
.next()
.ok_or_else(|| anyhow!("no pair"))?;
assert_eq!(pair.as_str(), "MacBook Pro 14");
assert_eq!(pair.as_span().start(), 0);
assert_eq!(pair.as_span().end(), 14);
let pair = Grammar::parse(Rule::name, "&#@!");
assert!(pair.is_err());
let pair = Grammar::parse(Rule::name, "");
assert!(pair.is_err());
Ok(())
}
#[test]
fn price_test() -> anyhow::Result<()> {
let pair = Grammar::parse(Rule::price, "1999.99")?
.next()
.ok_or_else(|| anyhow!("no pair"))?;
assert_eq!(pair.as_str(), "1999.99");
assert_eq!(pair.as_span().start(), 0);
assert_eq!(pair.as_span().end(), 7);
let pair = Grammar::parse(Rule::price, "19b9.99");
assert!(pair.is_err());
let pair = Grammar::parse(Rule::price, ".199999");
assert!(pair.is_err());
let pair = Grammar::parse(Rule::price, "");
assert!(pair.is_err());
Ok(())
}
#[test]
fn date_of_release_test() -> anyhow::Result<()> {
let pair = Grammar::parse(Rule::date_of_release, "24-10-2023")?
.next()
.ok_or_else(|| anyhow!("no pair"))?;
assert_eq!(pair.as_str(), "24-10-2023");
assert_eq!(pair.as_span().start(), 0);
assert_eq!(pair.as_span().end(), 10);
let pair = Grammar::parse(Rule::date_of_release, "24-1o-2023i");
assert!(pair.is_err());
let pair = Grammar::parse(Rule::date_of_release, "24-10-20");
assert!(pair.is_err());
let pair = Grammar::parse(Rule::date_of_release, "24-2023");
assert!(pair.is_err());
let pair = Grammar::parse(Rule::date_of_release, "33-10-2023");
assert!(pair.is_err());
let pair = Grammar::parse(Rule::date_of_release, "24-13-2023");
assert!(pair.is_err());
let pair = Grammar::parse(Rule::date_of_release, "");
assert!(pair.is_err());
Ok(())
}
#[test]
fn type_test() -> anyhow::Result<()> {
let pair = Grammar::parse(Rule::device_type, "Smartphone")?
.next()
.ok_or_else(|| anyhow!("no pair"))?;
assert_eq!(pair.as_str(), "Smartphone");
let pair = Grammar::parse(Rule::device_type, "Laptop")?
.next()
.ok_or_else(|| anyhow!("no pair"))?;
assert_eq!(pair.as_str(), "Laptop");
let pair = Grammar::parse(Rule::device_type, "Phone");
assert!(pair.is_err());
Ok(())
}
#[test]
fn screen_size_test() -> anyhow::Result<()> {
let pair = Grammar::parse(Rule::screen_size, "13.3 inches")?
.next()
.ok_or_else(|| anyhow!("no pair"))?;
assert_eq!(pair.as_str(), "13.3 inches");
let pair = Grammar::parse(Rule::screen_size, "13.3");
assert!(pair.is_err());
let pair = Grammar::parse(Rule::screen_size, "13.a inches");
assert!(pair.is_err());
Ok(())
}
#[test]
fn storage_test() -> anyhow::Result<()> {
let pair = Grammar::parse(Rule::storage, "512GB")?
.next()
.ok_or_else(|| anyhow!("no pair"))?;
assert_eq!(pair.as_str(), "512GB");
let pair = Grammar::parse(Rule::storage, "1TB")?
.next()
.ok_or_else(|| anyhow!("no pair"))?;
assert_eq!(pair.as_str(), "1TB");
let pair = Grammar::parse(Rule::storage, "512");
assert!(pair.is_err());
let pair = Grammar::parse(Rule::storage, "1NB");
assert!(pair.is_err());
Ok(())
}
#[test]
fn color_test() -> anyhow::Result<()> {
let pair = Grammar::parse(Rule::color, "Pacific Blue")?
.next()
.ok_or_else(|| anyhow!("no pair"))?;
assert_eq!(pair.as_str(), "Pacific Blue");
let pair = Grammar::parse(Rule::color, "?!@");
assert!(pair.is_err());
let pair = Grammar::parse(Rule::color, "");
assert!(pair.is_err());
Ok(())
}
#[test]
fn availability_test() -> anyhow::Result<()> {
let pair = Grammar::parse(Rule::availability, "true")?
.next()
.ok_or_else(|| anyhow!("no pair"))?;
assert_eq!(pair.as_str(), "true");
let pair = Grammar::parse(Rule::availability, "false")?
.next()
.ok_or_else(|| anyhow!("no pair"))?;
assert_eq!(pair.as_str(), "false");
let pair = Grammar::parse(Rule::availability, "yes");
assert!(pair.is_err());
Ok(())
}
#[test]
fn ram_test() -> anyhow::Result<()> {
let pair = Grammar::parse(Rule::ram, "16GB")?
.next()
.ok_or_else(|| anyhow!("no pair"))?;
assert_eq!(pair.as_str(), "16GB");
let pair = Grammar::parse(Rule::ram, "1TB")?
.next()
.ok_or_else(|| anyhow!("no pair"))?;
assert_eq!(pair.as_str(), "1TB");
let pair = Grammar::parse(Rule::ram, "16");
assert!(pair.is_err());
let pair = Grammar::parse(Rule::ram, "16NB");
assert!(pair.is_err());
Ok(())
}