postscript 0.14.1

The package provides a parser for PostScript fonts.
Documentation
extern crate postscript;

use postscript::type2::Program;

#[macro_use]
mod common;

use common::{setup_font_set, Fixture};

macro_rules! operations(
    ($($operator:ident: [$($operand:expr),*],)*) => ({
        use postscript::type2::{Operand, Operator};
        let mut operations = vec![];
        $(operations.push((Operator::$operator, vec![$($operand as Operand),*]));)*
        operations
    });
);

#[test]
fn program_all() {
    let set = setup_font_set(Fixture::SourceSerifPro);
    let global = &set.global_subroutines;
    let local = &set.local_subroutines[0];
    for code in set.char_strings[0].iter() {
        let mut program = Program::new(code, global, local);
        while let Some(..) = ok!(program.next()) {}
    }
}

#[test]
fn program_one() {
    let set = setup_font_set(Fixture::SourceSerifPro);
    let code = &set.char_strings[0][134];
    let global = &set.global_subroutines;
    let local = &set.local_subroutines[0];
    let mut program = Program::new(code, global, local);
    let mut operations = vec![];
    while let Some(operation) = ok!(program.next()) {
        operations.push(operation);
    }
    assert_eq!(program.width(), Some(-95.0));
    assert_eq!(
        operations,
        operations!(
            HStemHM: [-15, 66, -61, 52, 403, 46, 82, 63, 20, 62],
            HintMask: [],
            RMoveTo: [112, 585],
            VHCurveTo: [50, 20, 21, 28, 21, 16, -13, -26, 27],
            HintMask: [],
            HHCurveTo: [-29, 29, 26, -15, 31],
            HVCurveTo: [53, 43, 42, 68, 10, -1, 7, -1, 7],
            HLineTo: [-34],
            VHCurveTo: [-51, -21, -20, -26, -21, -18, 13, 26, -26],
            HintMask: [],
            HHCurveTo: [28, -29, -26, 15, -31],
            HVCurveTo: [-53, -43, -42, -68, -7, 1, -10, 1, -6],
            RMoveTo: [246, -479],
            HintMask: [],
            HHCurveTo: [-41, -58, -19, -14, -33],
            HVCurveTo: [-24, -21, 7, 16, -15],
            VVCurveTo: [-12, 12, -8, 15, 26],
            VHCurveTo: [30, 11, 39, 87, 34],
            RRCurveTo: [21, 8, 36, 12, 35, 10],
            HintMask: [],
            RMoveTo: [159, -196],
            RLineTo: [-5, -5],
            HHCurveTo: [-8, -8, -13, -9, -16],
            HVCurveTo: [-22, -11, 18, 41],
            VLineTo: [216],
            VHCurveTo: [126, -50, 48, -105, -102, -74, -50, -76, -19],
            HHCurveTo: [-26, 3, 16, -17, 28],
            HVCurveTo: [27, 18, 17, 31, 9],
            RLineTo: [20, 69],
            HHCurveTo: [5, 20, 17, 1, 14],
            HVCurveTo: [66, 28, -24, -97],
            VLineTo: [-27],
            RRCurveTo: [-40, -9, -42, -13, -31, -11],
            VVCurveTo: [-135, -49, -31, -46, -57],
            HintMask: [],
            VHCurveTo: [-83, 61, -44, 73, 59, 33, 27, 55, 55],
            HintMask: [],
            HHCurveTo: [-47, 8, 31, -30, 57],
            HVCurveTo: [32, 26, 10, 42, 23],
        )
    );
}