putpng 1.0.1

Replacement for the doom modding tools grabpng and setpng
Documentation
//! # grabpng/setpng alternative
//! This is a tool for editing grAb chunks for Doom modding like [grabpng/setpng](https://zdoom.org/wiki/SetPNG).
//!
//! # Example
//! ```rust,ignore
//! use putpng::prelude::*;
//!
//! fn main() {
//!     let crc = Crc32::new();
//!     let path = "sample.png";
//!
//!     grab(path, &crc, 30, 20).unwrap();
//!     crop(path, &crc).unwrap();
//! }
//! ```

#![allow(nonstandard_style)]
mod calc;
pub mod crc;
pub mod crop;
pub mod grab;
pub mod prelude;

#[cfg(test)]
mod calc_tests {
    use crate::calc::*;

    #[test]
    fn add() {
        assert_eq!(eval("1 + 2", 0, 0), Ok(3));
    }

    #[test]
    fn subtract() {
        assert_eq!(eval("2 - 1", 0, 0), Ok(1));
    }

    #[test]
    fn multiply() {
        assert_eq!(eval("2 * 3", 0, 0), Ok(6));
    }

    #[test]
    fn divide() {
        assert_eq!(eval("6 / 2", 0, 0), Ok(3));
    }

    #[test]
    fn divide_floor() {
        assert_eq!(eval("3 / 4", 0, 0), Ok(0));
    }

    #[test]
    fn width_and_height() {
        assert_eq!(eval("w + h", 10, 20), Ok(30));
    }

    #[test]
    fn operator_precedence() {
        assert_eq!(eval("1 + 2 * 3", 0, 0), Ok(7));
        assert_eq!(eval("1 * 2 + 3", 0, 0), Ok(5));
    }

    #[test]
    fn unary_operator() {
        assert_eq!(eval("-1 + 2", 0, 0), Ok(1));
    }

    #[test]
    fn unary_operator_chain() {
        assert_eq!(eval("1 + - 2", 0, 0), Ok(-1));
        assert_eq!(eval("1 + -- 2", 0, 0), Ok(3));
    }

    #[test]
    fn paren_expressions() {
        assert_eq!(eval("(1 + 2) * 3", 0, 0), Ok(9));
        assert_eq!(eval("1 + (2 * 3)", 0, 0), Ok(7));
        assert_eq!(eval("1 + (2 + 3) * 4", 0, 0), Ok(21));
    }

    #[test]
    fn long_expressions() {
        assert_eq!(eval("1 + 2 * 3 - 4 / 5", 0, 0), Ok(7));
        assert_eq!(eval("1 + 2 * (3 - 4) / 5", 0, 0), Ok(1));
        assert_eq!(eval("1 + (2 * 3 - 4) / 5", 0, 0), Ok(1));
        assert_eq!(eval("(1 + 2) * (3 - 4) / (5 + 6)", 0, 0), Ok(0));
    }

    #[test]
    fn empty_parens() {
        assert_eq!(eval("()", 0, 0), Err(Error::MisplacedCloseParen));
    }

    #[test]
    fn unknown_character() {
        assert_eq!(eval("1 + @", 0, 0), Err(Error::UnknownCharacter('@')));
    }

    #[test]
    fn misplaced_integer() {
        assert_eq!(
            eval("1 + 2 3", 0, 0),
            Err(Error::MisplacedInteger("3".into()))
        );
    }

    #[test]
    fn misplaced_operator() {
        assert_eq!(eval("1 * * 2", 0, 0), Err(Error::MisplacedOperator('*')));
    }

    #[test]
    fn dangling_operator() {
        assert_eq!(eval("1 +", 0, 0), Err(Error::DanglingOperator('+')));
    }

    #[test]
    fn misplaced_open_paren() {
        assert_eq!(eval("1 (", 0, 0), Err(Error::MisplacedOpenParen));
    }

    #[test]
    fn misplaced_close_paren() {
        assert_eq!(eval(")", 0, 0), Err(Error::MisplacedCloseParen));
    }

    #[test]
    fn dangling_open_paren() {
        assert_eq!(eval("(", 0, 0), Err(Error::DanglingOpenParen));
    }

    #[test]
    fn dangling_close_paren() {
        assert_eq!(eval("2 )", 0, 0), Err(Error::DanglingCloseParen));
    }

    #[test]
    fn empty_expression() {
        assert_eq!(eval("", 0, 0), Err(Error::EmptyExpression));
    }

    #[test]
    fn divide_by_zero() {
        assert_eq!(eval("1 / 0", 0, 0), Err(Error::DivideByZero));
    }
}