diff --git a/cli/src/native/adaptive.rs b/cli/src/native/adaptive.rs index e90ec55..f95b799 100644 --- a/cli/src/native/adaptive.rs +++ b/cli/src/native/adaptive.rs @@ -152,15 +152,13 @@ fn attr_score(base: &BTreeMap, cand: &BTreeMap) for name in names { let w = attr_weight(name); total += w; - match (base.get(name), cand.get(name)) { - (Some(a), Some(b)) => { - if name == "class" { - got += w * token_jaccard(a, b); - } else if a == b { - got += w; - } + // present on only one side → no credit + if let (Some(a), Some(b)) = (base.get(name), cand.get(name)) { + if name == "class" { + got += w * token_jaccard(a, b); + } else if a == b { + got += w; } - _ => {} // present on only one side → no credit } } if total == 0.0 { diff --git a/cli/src/native/snapshot.rs b/cli/src/native/snapshot.rs index 886387d..d03ef03 100644 --- a/cli/src/native/snapshot.rs +++ b/cli/src/native/snapshot.rs @@ -226,7 +226,7 @@ fn build_ax_fingerprint(tree_nodes: &[TreeNode], idx: usize) -> ElementFingerpri /// Collect AX fingerprints for every node that has a backend node id, used as the /// candidate set when relocating a stale @ref. Reuses the same extraction as the /// baseline so the two are scored in the same space. -pub(super) fn collect_fingerprints(tree_nodes: &[TreeNode]) -> Vec<(i64, ElementFingerprint)> { +fn collect_fingerprints(tree_nodes: &[TreeNode]) -> Vec<(i64, ElementFingerprint)> { tree_nodes .iter() .enumerate() diff --git a/cli/src/native/stealth.rs b/cli/src/native/stealth.rs index 6e2d5be..9cffdfd 100644 --- a/cli/src/native/stealth.rs +++ b/cli/src/native/stealth.rs @@ -196,46 +196,6 @@ fn resolve_timezone(locale: Option<&str>) -> Option { /// Best-effort IANA timezone for a locale. Used only for /// `AGENT_BROWSER_TIMEZONE=auto`; unknown locales return `None` so the real /// timezone is left untouched rather than guessing a wrong one. -#[cfg(test)] -mod timezone_tests { - use super::{locale_default_timezone, resolve_timezone}; - - #[test] - fn maps_common_locales_case_insensitively() { - assert_eq!(locale_default_timezone("en-US"), Some("America/New_York")); - assert_eq!(locale_default_timezone("ja-JP"), Some("Asia/Tokyo")); - assert_eq!(locale_default_timezone("zh-CN"), Some("Asia/Shanghai")); - assert_eq!(locale_default_timezone("ZH-TW"), Some("Asia/Taipei")); - assert_eq!(locale_default_timezone("ja"), Some("Asia/Tokyo")); - } - - #[test] - fn unknown_locale_returns_none() { - assert_eq!(locale_default_timezone("xx-YY"), None); - assert_eq!(locale_default_timezone(""), None); - } - - #[test] - fn resolve_timezone_honors_env() { - // Serialized via a single test to avoid cross-test env races on this key. - std::env::remove_var("AGENT_BROWSER_TIMEZONE"); - assert_eq!(resolve_timezone(Some("en-US")), None); - - std::env::set_var("AGENT_BROWSER_TIMEZONE", "Europe/Berlin"); - assert_eq!(resolve_timezone(None), Some("Europe/Berlin".to_string())); - - std::env::set_var("AGENT_BROWSER_TIMEZONE", " "); - assert_eq!(resolve_timezone(Some("en-US")), None); - - std::env::set_var("AGENT_BROWSER_TIMEZONE", "auto"); - assert_eq!(resolve_timezone(Some("ja-JP")), Some("Asia/Tokyo".to_string())); - assert_eq!(resolve_timezone(Some("xx-YY")), None); - assert_eq!(resolve_timezone(None), None); - - std::env::remove_var("AGENT_BROWSER_TIMEZONE"); - } -} - fn locale_default_timezone(locale: &str) -> Option<&'static str> { let tz = match locale.to_ascii_lowercase().as_str() { "en-us" => "America/New_York", @@ -372,3 +332,43 @@ fn build_ua_metadata(ua: &str, locale: Option<&str>) -> serde_json::Value { "wow64": false, }) } + +#[cfg(test)] +mod timezone_tests { + use super::{locale_default_timezone, resolve_timezone}; + + #[test] + fn maps_common_locales_case_insensitively() { + assert_eq!(locale_default_timezone("en-US"), Some("America/New_York")); + assert_eq!(locale_default_timezone("ja-JP"), Some("Asia/Tokyo")); + assert_eq!(locale_default_timezone("zh-CN"), Some("Asia/Shanghai")); + assert_eq!(locale_default_timezone("ZH-TW"), Some("Asia/Taipei")); + assert_eq!(locale_default_timezone("ja"), Some("Asia/Tokyo")); + } + + #[test] + fn unknown_locale_returns_none() { + assert_eq!(locale_default_timezone("xx-YY"), None); + assert_eq!(locale_default_timezone(""), None); + } + + #[test] + fn resolve_timezone_honors_env() { + // Serialized via a single test to avoid cross-test env races on this key. + std::env::remove_var("AGENT_BROWSER_TIMEZONE"); + assert_eq!(resolve_timezone(Some("en-US")), None); + + std::env::set_var("AGENT_BROWSER_TIMEZONE", "Europe/Berlin"); + assert_eq!(resolve_timezone(None), Some("Europe/Berlin".to_string())); + + std::env::set_var("AGENT_BROWSER_TIMEZONE", " "); + assert_eq!(resolve_timezone(Some("en-US")), None); + + std::env::set_var("AGENT_BROWSER_TIMEZONE", "auto"); + assert_eq!(resolve_timezone(Some("ja-JP")), Some("Asia/Tokyo".to_string())); + assert_eq!(resolve_timezone(Some("xx-YY")), None); + assert_eq!(resolve_timezone(None), None); + + std::env::remove_var("AGENT_BROWSER_TIMEZONE"); + } +}