guild-cli 0.1.0

Rust-native polyglot monorepo orchestrator
Documentation
use proptest::prelude::*;

use guild_cli::{DependsOn, ProjectName, TargetName};

proptest! {
    #[test]
    fn test_project_name_roundtrip(s in "[a-z][a-z0-9_-]{0,30}") {
        let name: ProjectName = s.parse().unwrap();
        let roundtrip: ProjectName = name.to_string().parse().unwrap();
        prop_assert_eq!(name, roundtrip);
    }

    #[test]
    fn test_target_name_roundtrip(s in "[a-z][a-z0-9_-]{0,30}") {
        let name: TargetName = s.parse().unwrap();
        let roundtrip: TargetName = name.to_string().parse().unwrap();
        prop_assert_eq!(name, roundtrip);
    }

    #[test]
    fn test_depends_on_local_roundtrip(s in "[a-z][a-z0-9_-]{0,30}") {
        let dep: DependsOn = s.parse().unwrap();
        let roundtrip: DependsOn = dep.to_string().parse().unwrap();
        prop_assert_eq!(dep, roundtrip);
    }

    #[test]
    fn test_depends_on_upstream_roundtrip(s in "[a-z][a-z0-9_-]{0,30}") {
        let input = format!("^{s}");
        let dep: DependsOn = input.parse().unwrap();
        let roundtrip: DependsOn = dep.to_string().parse().unwrap();
        prop_assert_eq!(dep, roundtrip);
    }

    #[test]
    fn test_project_name_rejects_empty(s in "\\s*") {
        let trimmed = s.trim();
        if trimmed.is_empty() {
            prop_assert!(trimmed.parse::<ProjectName>().is_err());
        }
    }

    #[test]
    fn test_project_name_rejects_uppercase(s in "[A-Z][a-zA-Z0-9]{0,10}") {
        prop_assert!(s.parse::<ProjectName>().is_err());
    }
}