use oxideav_scribe::Face;
const DEJAVU_BYTES: &[u8] = include_bytes!("fixtures/DejaVuSans.ttf");
const INTER_BYTES: &[u8] = include_bytes!("fixtures/InterVariable.ttf");
#[test]
fn explicit_latn_matches_auto_probe_smcp_on_inter() {
let face = Face::from_ttf_bytes(INTER_BYTES.to_vec()).expect("Inter parses");
let auto = face.shape_text("abc", &[*b"smcp"]);
let explicit = face.shape_text_with_script("abc", *b"latn", &[*b"smcp"]);
assert_eq!(auto, explicit);
}
#[test]
fn explicit_latn_matches_auto_probe_liga_on_dejavu() {
let face = Face::from_ttf_bytes(DEJAVU_BYTES.to_vec()).expect("DejaVu parses");
let auto = face.shape_text("fi", &[*b"liga"]);
let explicit = face.shape_text_with_script("fi", *b"latn", &[*b"liga"]);
assert_eq!(auto, explicit);
assert_eq!(auto.len(), 1, "fi ligature collapses to one glyph");
}
#[test]
fn unknown_script_tag_is_cmap_identity() {
let face = Face::from_ttf_bytes(INTER_BYTES.to_vec()).expect("Inter parses");
let cmap_only = face.shape_text("abc", &[]);
let unknown = face.shape_text_with_script("abc", *b"zzzz", &[*b"smcp"]);
assert_eq!(cmap_only, unknown);
}
#[test]
fn empty_text_is_empty_vec() {
let face = Face::from_ttf_bytes(INTER_BYTES.to_vec()).expect("Inter parses");
let result = face.shape_text_with_script("", *b"latn", &[*b"smcp"]);
assert!(result.is_empty());
}
#[test]
fn empty_features_is_cmap_identity() {
let face = Face::from_ttf_bytes(INTER_BYTES.to_vec()).expect("Inter parses");
let cmap_only = face.shape_text("Hello", &[]);
let explicit_empty = face.shape_text_with_script("Hello", *b"latn", &[]);
let explicit_empty_unknown = face.shape_text_with_script("Hello", *b"zzzz", &[]);
assert_eq!(cmap_only, explicit_empty);
assert_eq!(cmap_only, explicit_empty_unknown);
}
#[test]
fn explicit_dflt_unknown_feature_is_cmap_identity() {
let face = Face::from_ttf_bytes(INTER_BYTES.to_vec()).expect("Inter parses");
let cmap_only = face.shape_text("abc", &[]);
let explicit = face.shape_text_with_script("abc", *b"DFLT", &[*b"zzzz"]);
assert_eq!(cmap_only, explicit);
}
#[test]
fn caller_order_preserved_under_explicit_script() {
let face = Face::from_ttf_bytes(INTER_BYTES.to_vec()).expect("Inter parses");
let smcp_alone = face.shape_text_with_script("abc", *b"latn", &[*b"smcp"]);
let smcp_then_case = face.shape_text_with_script("abc", *b"latn", &[*b"smcp", *b"case"]);
assert_eq!(smcp_alone, smcp_then_case);
}
#[test]
fn explicit_cmap_baseline_agrees_with_auto_probe() {
let face = Face::from_ttf_bytes(INTER_BYTES.to_vec()).expect("Inter parses");
let auto_cmap = face.shape_text("The quick brown fox", &[]);
let explicit_cmap = face.shape_text_with_script("The quick brown fox", *b"latn", &[]);
assert_eq!(auto_cmap, explicit_cmap);
assert_eq!(auto_cmap.len(), "The quick brown fox".chars().count());
}