Files
another-boids-in-rust/vendor/ttf-parser/tests/tables/hmtx.rs

115 lines
3.0 KiB
Rust

use std::num::NonZeroU16;
use ttf_parser::GlyphId;
use ttf_parser::hmtx::Table;
use crate::{convert, Unit::*};
macro_rules! nzu16 {
($n:expr) => { NonZeroU16::new($n).unwrap() };
}
#[test]
fn simple_case() {
let data = convert(&[
UInt16(1), // advance width [0]
Int16(2), // side bearing [0]
]);
let table = Table::parse(1, nzu16!(1), &data).unwrap();
assert_eq!(table.advance(GlyphId(0)), Some(1));
assert_eq!(table.side_bearing(GlyphId(0)), Some(2));
}
#[test]
fn empty() {
assert!(Table::parse(1, nzu16!(1), &[]).is_none());
}
#[test]
fn zero_metrics() {
let data = convert(&[
UInt16(1), // advance width [0]
Int16(2), // side bearing [0]
]);
assert!(Table::parse(0, nzu16!(1), &data).is_none());
}
#[test]
fn smaller_than_glyphs_count() {
let data = convert(&[
UInt16(1), // advance width [0]
Int16(2), // side bearing [0]
Int16(3), // side bearing [1]
]);
let table = Table::parse(1, nzu16!(2), &data).unwrap();
assert_eq!(table.advance(GlyphId(0)), Some(1));
assert_eq!(table.side_bearing(GlyphId(0)), Some(2));
assert_eq!(table.advance(GlyphId(1)), Some(1));
assert_eq!(table.side_bearing(GlyphId(1)), Some(3));
}
#[test]
fn no_additional_side_bearings() {
let data = convert(&[
UInt16(1), // advance width [0]
Int16(2), // side bearing [0]
// A single side bearing should be present here.
// We should simply ignore it and not return None during Table parsing.
]);
let table = Table::parse(1, nzu16!(2), &data).unwrap();
assert_eq!(table.advance(GlyphId(0)), Some(1));
assert_eq!(table.side_bearing(GlyphId(0)), Some(2));
}
#[test]
fn less_metrics_than_glyphs() {
let data = convert(&[
UInt16(1), // advance width [0]
Int16(2), // side bearing [0]
UInt16(3), // advance width [1]
Int16(4), // side bearing [1]
Int16(5), // side bearing [2]
]);
let table = Table::parse(2, nzu16!(1), &data).unwrap();
assert_eq!(table.side_bearing(GlyphId(0)), Some(2));
assert_eq!(table.side_bearing(GlyphId(1)), Some(4));
assert_eq!(table.side_bearing(GlyphId(2)), None);
}
#[test]
fn glyph_out_of_bounds_0() {
let data = convert(&[
UInt16(1), // advance width [0]
Int16(2), // side bearing [0]
]);
let table = Table::parse(1, nzu16!(1), &data).unwrap();
assert_eq!(table.advance(GlyphId(0)), Some(1));
assert_eq!(table.side_bearing(GlyphId(0)), Some(2));
assert_eq!(table.advance(GlyphId(1)), None);
assert_eq!(table.side_bearing(GlyphId(1)), None);
}
#[test]
fn glyph_out_of_bounds_1() {
let data = convert(&[
UInt16(1), // advance width [0]
Int16(2), // side bearing [0]
Int16(3), // side bearing [1]
]);
let table = Table::parse(1, nzu16!(2), &data).unwrap();
assert_eq!(table.advance(GlyphId(1)), Some(1));
assert_eq!(table.side_bearing(GlyphId(1)), Some(3));
assert_eq!(table.advance(GlyphId(2)), None);
assert_eq!(table.side_bearing(GlyphId(2)), None);
}