postscript 0.2.2

The package provides a parser for PostScript fonts.
Documentation
use postscript::type2::Program;

use setup;

macro_rules! operations(
    ($(($operator:ident, [$($number:expr),*]),)*) => ({
        use postscript::type2::compound::Operator;
        use postscript::type2::primitive::Number;
        let mut operations = vec![];
        $(operations.push((Operator::$operator, vec![$(Number::Integer($number)),*]));)*
        operations
    });
);

#[test]
fn program_all() {
    let set = setup();
    let global = &set.global_subroutines;
    let local = &set.local_subroutines[0];

    for code in set.charstrings[0].iter() {
        let mut program = Program::new(code, global, local);
        while let Some(..) = program.next().unwrap() {
        }
    }
}

#[test]
fn program_one() {
    let set = setup();

    let code = &set.charstrings[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) = program.next().unwrap() {
        operations.push(operation);
    }

    assert_eq!(operations, operations![
        (HStemHM, [-95, -15, 66, -61, 52, 403, 46, 82, 63, 20, 62]),
        (HintMask, [45, 89, -58, 36, 212, 84, -38, 36]),
        (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]),
    ]);
}