use super::Gen;
use crate::ParseRuleError;
rule_struct!(Life);
impl Life {
parse_bs!(8);
parse_rule!();
}
pub trait ParseLife {
fn from_bs(b: Vec<u8>, s: Vec<u8>) -> Self;
fn parse_rule(input: &str) -> Result<Self, ParseRuleError>
where
Self: Sized,
{
let Life { b, s } = Life::parse_rule(input)?;
Ok(Self::from_bs(b, s))
}
}
pub trait ParseLifeGen {
fn from_bsg(b: Vec<u8>, s: Vec<u8>, gen: usize) -> Self;
fn parse_rule(input: &str) -> Result<Self, ParseRuleError>
where
Self: Sized,
{
let Gen {
rule: Life { b, s },
gen,
} = Life::parse_rule_gen(input)?;
Ok(Self::from_bsg(b, s, gen))
}
}
#[cfg(test)]
mod tests {
use super::*;
struct Rule;
impl ParseLife for Rule {
fn from_bs(_b: Vec<u8>, _s: Vec<u8>) -> Self {
Rule
}
}
struct GenRule;
impl ParseLifeGen for GenRule {
fn from_bsg(_b: Vec<u8>, _s: Vec<u8>, _gen: usize) -> Self {
GenRule
}
}
#[test]
fn valid_rules() -> Result<(), ParseRuleError> {
Rule::parse_rule("B3/S23")?;
Rule::parse_rule("B3S23")?;
Rule::parse_rule("b3s23")?;
Rule::parse_rule("23/3")?;
Rule::parse_rule("23/")?;
Ok(())
}
#[test]
fn invalid_rules() {
assert_eq!(
Rule::parse_rule("B3/S23h").err(),
Some(ParseRuleError::ExtraJunk)
);
assert_eq!(
Rule::parse_rule("B3/23").err(),
Some(ParseRuleError::Missing('S'))
);
assert_eq!(
Rule::parse_rule("B2e3-anq/S12-a3").err(),
Some(ParseRuleError::Missing('S'))
);
assert_eq!(
Rule::parse_rule("233").err(),
Some(ParseRuleError::Missing('/'))
);
}
#[test]
fn valid_rules_gen() -> Result<(), ParseRuleError> {
GenRule::parse_rule("B3/S23/C3")?;
GenRule::parse_rule("B3S23G3")?;
GenRule::parse_rule("g3b3s23")?;
GenRule::parse_rule("B3/S23")?;
GenRule::parse_rule("23/3/3")?;
GenRule::parse_rule("23//3")?;
GenRule::parse_rule("23/3")?;
Ok(())
}
#[test]
fn invalid_rules_gen() {
assert_eq!(
GenRule::parse_rule("B3/S23h").err(),
Some(ParseRuleError::ExtraJunk)
);
assert_eq!(
GenRule::parse_rule("B3/S23/").err(),
Some(ParseRuleError::MissingNumber)
);
assert_eq!(
GenRule::parse_rule("g1b3s23").err(),
Some(ParseRuleError::GenLessThan2)
);
assert_eq!(
GenRule::parse_rule("2333").err(),
Some(ParseRuleError::Missing('/'))
);
assert_eq!(
GenRule::parse_rule("23/3/18446744073709551617").err(),
Some(ParseRuleError::GenOverflow)
);
}
}