use std::str::FromStr; use libtest_mimic::{Arguments, Trial}; use serde::Deserialize; use type_safe_id::{DynamicType, TypeSafeId}; use uuid::Uuid; #[derive(Deserialize)] struct Valid { name: String, typeid: String, prefix: String, uuid: Uuid, } #[derive(Deserialize)] struct Invalid { name: String, typeid: String, description: String, } type Id = TypeSafeId; fn main() { let mut tests = vec![]; let valid: Vec = serde_yaml::from_str(include_str!("spec/valid.yml")).unwrap(); let invalid: Vec = serde_yaml::from_str(include_str!("spec/invalid.yml")).unwrap(); for test in valid { tests.push(Trial::test(format!("valid::{}", test.name), move || { let id = match Id::from_str(&test.typeid) { Ok(id) => id, Err(e) => return Err(e.to_string().into()), }; if id.uuid() != test.uuid { return Err(format!("expected {:?}, got {:?}", test.uuid, id.uuid()).into()); } if id.type_prefix() != test.prefix { return Err( format!("expected {:?}, got {:?}", test.prefix, id.type_prefix()).into(), ); } if id.to_string() == test.typeid { Ok(()) } else { Err(format!("expected {:?}, got {:?}", test.typeid, id.to_string()).into()) } })) } for test in invalid { tests.push(Trial::test( format!("invalid::{}", test.name), move || match Id::from_str(&test.typeid) { Ok(_) => Err(test.description.into()), Err(_) => Ok(()), }, )) } let args = Arguments::from_args(); libtest_mimic::run(&args, tests).exit_if_failed(); }