#![cfg(feature = "testing")]
use crate::manifest::{CapabilityManifest, TraitValue};
use crate::registry::LocaleProfile;
use crate::traits::{Direction, MorphType, NormType, SegType, TraitKey, TransType};
pub const SIMULATED_WORM_JSON: &str = r#"{
"metadata": {
"version": "v1.0.0-simulated",
"build_date": "2026-05-01T12:00:00Z",
"checksum": "a1b2c3d4e5f6g7h8i9j0"
},
"aliases": {
"in": "id",
"in-ID": "id",
"iw": "he",
"no": "nb",
"zh-TW": "zh-Hant",
"zh-CN": "zh-Hans"
},
"profiles": [
{
"ID": "en-US",
"MORPH": "FUSIONAL",
"BASE_SEG": "SPACE",
"ALT_SEG": null,
"DIRECTION": "LTR",
"HAS_BIDI": false,
"REQUIRES_SHAPING": false,
"PLURALS": ["one", "other"],
"UNICODE_BLOCKS": [],
"NORMALIZATION": "NFC",
"TRANSLITERATION": "NONE"
},
{
"ID": "ar-EG",
"MORPH": "TEMPLATIC",
"BASE_SEG": "SPACE",
"ALT_SEG": null,
"DIRECTION": "RTL",
"HAS_BIDI": true,
"REQUIRES_SHAPING": true,
"PLURALS": ["zero", "one", "two", "few", "many", "other"],
"UNICODE_BLOCKS": [],
"NORMALIZATION": "NFC",
"TRANSLITERATION": "NONE"
},
{
"ID": "he",
"MORPH": "TEMPLATIC",
"BASE_SEG": "SPACE",
"ALT_SEG": null,
"DIRECTION": "RTL",
"HAS_BIDI": true,
"REQUIRES_SHAPING": false,
"PLURALS": ["one", "two", "many", "other"],
"UNICODE_BLOCKS": [],
"NORMALIZATION": "NFC",
"TRANSLITERATION": "NONE"
},
{
"ID": "id",
"MORPH": "FUSIONAL",
"BASE_SEG": "SPACE",
"ALT_SEG": null,
"DIRECTION": "LTR",
"HAS_BIDI": false,
"REQUIRES_SHAPING": false,
"PLURALS": ["other"],
"UNICODE_BLOCKS": [],
"NORMALIZATION": "NFC",
"TRANSLITERATION": "NONE"
},
{
"ID": "nb",
"MORPH": "FUSIONAL",
"BASE_SEG": "SPACE",
"ALT_SEG": null,
"DIRECTION": "LTR",
"HAS_BIDI": false,
"REQUIRES_SHAPING": false,
"PLURALS": ["one", "other"],
"UNICODE_BLOCKS": [],
"NORMALIZATION": "NFC",
"TRANSLITERATION": "NONE"
},
{
"ID": "zh-Hant",
"MORPH": "ISOLATING",
"BASE_SEG": "CHARACTER",
"ALT_SEG": null,
"DIRECTION": "TTB",
"HAS_BIDI": false,
"REQUIRES_SHAPING": false,
"PLURALS": ["other"],
"UNICODE_BLOCKS": [],
"NORMALIZATION": "NFC",
"TRANSLITERATION": "NONE"
},
{
"ID": "zh-Hans",
"MORPH": "ISOLATING",
"BASE_SEG": "CHARACTER",
"ALT_SEG": null,
"DIRECTION": "LTR",
"HAS_BIDI": false,
"REQUIRES_SHAPING": false,
"PLURALS": ["other"],
"UNICODE_BLOCKS": [],
"NORMALIZATION": "NFC",
"TRANSLITERATION": "NONE"
},
{
"ID": "th-TH",
"MORPH": "ISOLATING",
"BASE_SEG": "DICTIONARY",
"ALT_SEG": null,
"DIRECTION": "LTR",
"HAS_BIDI": false,
"REQUIRES_SHAPING": true,
"PLURALS": ["other"],
"UNICODE_BLOCKS": [],
"NORMALIZATION": "NFC",
"TRANSLITERATION": "NONE"
},
{
"ID": "ja-JP",
"MORPH": "AGGLUTINATIVE",
"BASE_SEG": "CHARACTER",
"ALT_SEG": "DICTIONARY",
"DIRECTION": "LTR",
"HAS_BIDI": false,
"REQUIRES_SHAPING": false,
"PLURALS": ["other"],
"UNICODE_BLOCKS": [],
"NORMALIZATION": "NFC",
"TRANSLITERATION": "NONE"
},
{
"ID": "pi",
"MORPH": "FUSIONAL",
"BASE_SEG": "SPACE",
"ALT_SEG": null,
"DIRECTION": "LTR",
"HAS_BIDI": false,
"REQUIRES_SHAPING": false,
"PLURALS": ["one", "other"],
"UNICODE_BLOCKS": [],
"NORMALIZATION": "NFC",
"TRANSLITERATION": "NONE"
},
{
"ID": "sa",
"MORPH": "FUSIONAL",
"BASE_SEG": "SPACE",
"ALT_SEG": null,
"DIRECTION": "LTR",
"HAS_BIDI": false,
"REQUIRES_SHAPING": true,
"PLURALS": ["one", "two", "other"],
"UNICODE_BLOCKS": [],
"NORMALIZATION": "NFC",
"TRANSLITERATION": "ICU_TRANSFORM",
"REQUIRED_RESOURCE": "icu_indic"
}
]
}"#;
pub fn en_us_profile() -> LocaleProfile {
LocaleProfile {
id: "en-US".to_string(),
morph: MorphType::FUSIONAL,
base_seg: SegType::SPACE,
alt_seg: None,
direction: Direction::LTR,
has_bidi: false,
requires_shaping: false,
plurals: vec!["one".into(), "other".into()],
unicode_blocks: vec!["Basic Latin".into()],
normalization: NormType::NFC,
transliteration: TransType::NONE,
required_resource: None,
}
}
pub fn ar_eg_profile() -> LocaleProfile {
LocaleProfile {
id: "ar-EG".to_string(),
morph: MorphType::TEMPLATIC,
base_seg: SegType::SPACE,
alt_seg: None,
direction: Direction::RTL,
has_bidi: true,
requires_shaping: true,
plurals: vec![
"zero".into(),
"one".into(),
"two".into(),
"few".into(),
"many".into(),
"other".into(),
],
unicode_blocks: vec!["Arabic".into()],
normalization: NormType::NFC,
transliteration: TransType::NONE,
required_resource: None,
}
}
pub fn th_th_profile() -> LocaleProfile {
LocaleProfile {
id: "th-TH".to_string(),
morph: MorphType::ISOLATING,
base_seg: SegType::DICTIONARY,
alt_seg: None,
direction: Direction::LTR,
has_bidi: false,
requires_shaping: true,
plurals: vec!["other".into()],
unicode_blocks: vec!["Thai".into()],
normalization: NormType::NFC,
transliteration: TransType::ICU_TRANSFORM,
required_resource: Some("icu_thai".into()),
}
}
pub fn ja_jp_profile() -> LocaleProfile {
LocaleProfile {
id: "ja-JP".to_string(),
morph: MorphType::AGGLUTINATIVE,
base_seg: SegType::CHARACTER,
alt_seg: Some(SegType::DICTIONARY), direction: Direction::LTR,
has_bidi: false,
requires_shaping: false,
plurals: vec!["other".into()],
unicode_blocks: vec!["Hiragana".into(), "Katakana".into(), "CJK Unified Ideographs".into()],
normalization: NormType::NFC,
transliteration: TransType::NONE,
required_resource: None,
}
}
pub fn pi_profile() -> LocaleProfile {
LocaleProfile {
id: "pi".to_string(),
morph: MorphType::FUSIONAL,
base_seg: SegType::SPACE,
alt_seg: None,
direction: Direction::LTR,
has_bidi: false,
requires_shaping: false,
plurals: vec!["one".into(), "other".into()],
unicode_blocks: vec!["Basic Latin".into(), "Latin Extended Additional".into()],
normalization: NormType::NFC,
transliteration: TransType::NONE,
required_resource: None,
}
}
pub fn sa_profile() -> LocaleProfile {
LocaleProfile {
id: "sa".to_string(),
morph: MorphType::FUSIONAL,
base_seg: SegType::SPACE,
alt_seg: None,
direction: Direction::LTR,
has_bidi: false,
requires_shaping: true, plurals: vec!["one".into(), "two".into(), "other".into()], unicode_blocks: vec!["Devanagari".into()],
normalization: NormType::NFC,
transliteration: TransType::ICU_TRANSFORM, required_resource: Some("icu_indic".to_string()),
}
}
pub fn th_th_manifest() -> CapabilityManifest {
let mut manifest = CapabilityManifest::new("th-TH".to_string());
manifest.traits.insert(TraitKey::PrimaryDirection, TraitValue::Direction(Direction::LTR));
manifest
.traits
.insert(TraitKey::SegmentationStrategy, TraitValue::SegType(SegType::DICTIONARY));
manifest.traits.insert(TraitKey::RequiresShaping, TraitValue::Boolean(true));
manifest.metadata.insert("registry_version".into(), "SIMULATED".into());
manifest
}