//! Prior carriage (extensions/prior-carriage.md §15, §16; extensions/http-delivery.md §8.7, §8.8): the //! committed corpus `live-conformance/prior-carriage/` regenerates byte for byte from the sets //! other corpora commit, holds no other file, every case in it gets the outcome it states, and //! http-delivery §13 lists every reason the reference reports for §8.7 and §8.8. #![cfg(feature = "prior_carriage")] use std::path::PathBuf; use wai::prior_carriage::{corpus, CODES, HTTP_CODES}; fn wai_dir() -> PathBuf { PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("..") } fn corpus_dir() -> PathBuf { wai_dir().join("live-conformance/prior-carriage") } #[test] fn the_committed_corpus_regenerates() { let files = corpus::committed(&corpus_dir()).expect("the committed corpus"); let generated = corpus::generate(&corpus_dir()).expect("the corpus generates"); let extra: Vec<&String> = files.keys().filter(|k| !generated.contains_key(*k)).collect(); let missing: Vec<&String> = generated.keys().filter(|k| !files.contains_key(*k)).collect(); let differ: Vec<&String> = generated.iter().filter(|(k, v)| files.get(*k).is_some_and(|f| f != *v)).map(|(k, _)| k).collect(); assert!(extra.is_empty() && missing.is_empty() && differ.is_empty(), "extra {extra:?}, missing {missing:?}, differ {differ:?}: run `wai_prior_carriage_vectors gen`"); } #[test] fn every_case_gets_its_stated_outcome() { let files = corpus::committed(&corpus_dir()).expect("the committed corpus"); let fails = corpus::verify(&corpus_dir(), &files); assert!(fails.is_empty(), "{}", fails.join("\n")); } /// The rows http-delivery §13 adds for §8.7 and §8.8 name exactly `HTTP_CODES`, in order. #[test] fn http_delivery_lists_the_reasons() { let text = std::fs::read_to_string(wai_dir().join("extensions/http-delivery.md")).expect("the extension"); let at = text.find("\n## 13. Reasons").expect("a §13"); let end = text[at + 1..].find("\n## ").map_or(text.len(), |e| at + 1 + e); let listed: Vec = text[at..end] .lines() .filter(|l| l.contains("| §8.7") || l.contains("| §8.8")) .flat_map(|l| l.split('|').nth(1).unwrap_or("").split('`').skip(1).step_by(2).map(String::from).collect::>()) .collect(); let want: Vec = HTTP_CODES.iter().map(|c| c.to_string()).collect(); assert_eq!(listed, want, "§13's rows for §8.7 and §8.8 and HTTP_CODES differ"); } /// prior-carriage §20 lists exactly `CODES`, each once, in order. #[test] fn prior_carriage_lists_the_reasons() { let text = std::fs::read_to_string(wai_dir().join("extensions/prior-carriage.md")).expect("the extension"); let at = text.find("\n## 20. Refusals").expect("a §20"); let end = text[at + 1..].find("\n## ").map_or(text.len(), |e| at + 1 + e); let listed: Vec = text[at..end].lines().filter(|l| l.starts_with("| `")).filter_map(|l| l.split('`').nth(1).map(String::from)).collect(); let want: Vec = CODES.iter().map(|c| c.to_string()).collect(); assert_eq!(listed, want, "§20's table and CODES differ"); }