atomwrite 0.1.35

Atomic file operations CLI for LLM agents — read, write, edit, search, replace with NDJSON output
Documentation
mod tests {
    use super::*;

    #[test]
    fn normalize_underscore_and_encoding() {
        assert_eq!(normalize_bcp47_tag("pt_BR.UTF-8"), "pt-BR");
        assert_eq!(normalize_bcp47_tag("en_US.utf8"), "en-US");
        assert_eq!(normalize_bcp47_tag("C"), "");
        assert_eq!(normalize_bcp47_tag("POSIX"), "");
        assert_eq!(normalize_bcp47_tag("C.UTF-8"), "");
    }

    #[test]
    fn parse_langid_accepts_normalized() {
        let id = parse_langid("pt_BR.UTF-8").expect("parse");
        assert_eq!(id.language.as_str(), "pt");
        assert_eq!(
            id.region.as_ref().map(|r| r.as_str()),
            Some("BR")
        );
    }

    #[test]
    fn negotiate_pt_to_pt_br() {
        assert_eq!(negotiate_to_idioma(&["pt"]), Idioma::PtBr);
        assert_eq!(negotiate_to_idioma(&["pt-BR"]), Idioma::PtBr);
        assert_eq!(negotiate_to_idioma(&["pt_BR"]), Idioma::PtBr);
        assert_eq!(negotiate_to_idioma(&["en-GB"]), Idioma::En);
        assert_eq!(negotiate_to_idioma(&["ja-JP"]), Idioma::En);
    }

    #[test]
    fn resolve_cli_beats_system() {
        let state = resolve_locale(
            Some("en"),
            Some("pt-BR".into()),
            None,
        );
        assert_eq!(state.idioma, Idioma::En);
        assert_eq!(state.source, LocaleSource::CliFlag);
    }

    #[test]
    fn resolve_system_pt() {
        let state = resolve_locale(None, Some("pt_BR.UTF-8".into()), None);
        assert_eq!(state.idioma, Idioma::PtBr);
        assert_eq!(state.source, LocaleSource::System);
        assert!(!state.detection_failed);
    }

    #[test]
    fn resolve_c_locale_falls_to_default() {
        let state = resolve_locale(None, Some("C.UTF-8".into()), None);
        assert_eq!(state.idioma, Idioma::En);
        assert_eq!(state.source, LocaleSource::Default);
        assert!(state.detection_failed);
    }

    #[test]
    fn resolve_persisted_beats_system() {
        let dir = tempfile::tempdir().unwrap();
        let path = dir.path().join("locale");
        fs::write(&path, "pt-BR\n").unwrap();
        let state = resolve_locale(None, Some("en-US".into()), Some(path));
        assert_eq!(state.idioma, Idioma::PtBr);
        assert_eq!(state.source, LocaleSource::Persisted);
    }

    #[test]
    fn parse_cli_locale_rejects_unknown_language() {
        assert!(parse_cli_locale("ja-JP").is_err());
        assert_eq!(parse_cli_locale("pt_BR").unwrap(), "pt-BR");
        assert_eq!(parse_cli_locale("en").unwrap(), "en");
    }

    #[test]
    fn idioma_methods() {
        assert_eq!(Idioma::PtBr.fallback(), Idioma::En);
        assert_eq!(Idioma::En.direcao(), TextDirection::Ltr);
        assert_eq!(Idioma::AVAILABLE.len(), 2);
    }
}