Make our tests fail again
Although now they test that the conversion was lossless, which is extremely important for this program to be useful
This commit is contained in:
parent
9e4e1bbc02
commit
4894c4a072
6 changed files with 310 additions and 23 deletions
|
|
@ -11,3 +11,6 @@ crc = "^1.0.0"
|
||||||
libc = "^0.2.4"
|
libc = "^0.2.4"
|
||||||
libz-sys = "^1.0.0"
|
libz-sys = "^1.0.0"
|
||||||
regex = "^0.1.8"
|
regex = "^0.1.8"
|
||||||
|
|
||||||
|
[dev-dependencies]
|
||||||
|
image = "^0.6.1"
|
||||||
|
|
|
||||||
|
|
@ -574,10 +574,10 @@ impl PngData {
|
||||||
pub fn reduce_bit_depth(&mut self) -> bool {
|
pub fn reduce_bit_depth(&mut self) -> bool {
|
||||||
if self.ihdr_data.bit_depth != BitDepth::Sixteen {
|
if self.ihdr_data.bit_depth != BitDepth::Sixteen {
|
||||||
if self.ihdr_data.color_type == ColorType::Indexed ||
|
if self.ihdr_data.color_type == ColorType::Indexed ||
|
||||||
self.ihdr_data.color_type == ColorType::Grayscale {
|
self.ihdr_data.color_type == ColorType::Grayscale {
|
||||||
return match reduce_bit_depth_8_or_less(self) {
|
return match reduce_bit_depth_8_or_less(self) {
|
||||||
Some(_) => true,
|
Some(_) => true,
|
||||||
None => false
|
None => false,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
|
|
||||||
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 25 KiB |
326
tests/oxipng.rs
326
tests/oxipng.rs
|
|
@ -1,5 +1,8 @@
|
||||||
|
extern crate image;
|
||||||
extern crate oxipng;
|
extern crate oxipng;
|
||||||
|
|
||||||
|
use image::GenericImage;
|
||||||
|
use image::Pixel;
|
||||||
use oxipng::png;
|
use oxipng::png;
|
||||||
use std::collections::HashSet;
|
use std::collections::HashSet;
|
||||||
use std::fs::remove_file;
|
use std::fs::remove_file;
|
||||||
|
|
@ -47,8 +50,8 @@ fn get_opts(input: &Path) -> oxipng::Options {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn reduce_rgba_png() {
|
fn rgba_should_be_rgba() {
|
||||||
let input = PathBuf::from("tests/files/test_rgba.png");
|
let input = PathBuf::from("tests/files/rgba_should_be_rgba.png");
|
||||||
let opts = get_opts(&input);
|
let opts = get_opts(&input);
|
||||||
let output = opts.out_file.clone();
|
let output = opts.out_file.clone();
|
||||||
|
|
||||||
|
|
@ -59,23 +62,28 @@ fn reduce_rgba_png() {
|
||||||
assert!(output.exists());
|
assert!(output.exists());
|
||||||
|
|
||||||
let png = match png::PngData::new(&output) {
|
let png = match png::PngData::new(&output) {
|
||||||
Ok(x) => {
|
Ok(x) => x,
|
||||||
remove_file(output).ok();
|
|
||||||
x
|
|
||||||
},
|
|
||||||
Err(x) => {
|
Err(x) => {
|
||||||
remove_file(output).ok();
|
remove_file(output).ok();
|
||||||
panic!(x.to_owned())
|
panic!(x.to_owned())
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
assert!(png.ihdr_data.color_type == png::ColorType::Indexed);
|
assert!(png.ihdr_data.color_type == png::ColorType::RGBA);
|
||||||
assert!(png.ihdr_data.bit_depth == png::BitDepth::Eight);
|
assert!(png.ihdr_data.bit_depth == png::BitDepth::Eight);
|
||||||
|
|
||||||
|
let old_png = image::open(&input).unwrap();
|
||||||
|
let new_png = image::open(&output).unwrap();
|
||||||
|
|
||||||
|
remove_file(output).ok();
|
||||||
|
|
||||||
|
// Conversion should be lossless
|
||||||
|
assert!(old_png.pixels().map(|x| x.2.channels().to_owned()).collect::<Vec<Vec<u8>>>() == new_png.pixels().map(|x| x.2.channels().to_owned()).collect::<Vec<Vec<u8>>>());
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn reduce_rgb_png() {
|
fn rgba_should_be_rgb() {
|
||||||
let input = PathBuf::from("tests/files/test_rgb.png");
|
let input = PathBuf::from("tests/files/rgba_should_be_rgb.png");
|
||||||
let opts = get_opts(&input);
|
let opts = get_opts(&input);
|
||||||
let output = opts.out_file.clone();
|
let output = opts.out_file.clone();
|
||||||
|
|
||||||
|
|
@ -86,23 +94,28 @@ fn reduce_rgb_png() {
|
||||||
assert!(output.exists());
|
assert!(output.exists());
|
||||||
|
|
||||||
let png = match png::PngData::new(&output) {
|
let png = match png::PngData::new(&output) {
|
||||||
Ok(x) => {
|
Ok(x) => x,
|
||||||
remove_file(output).ok();
|
|
||||||
x
|
|
||||||
},
|
|
||||||
Err(x) => {
|
Err(x) => {
|
||||||
remove_file(output).ok();
|
remove_file(output).ok();
|
||||||
panic!(x.to_owned())
|
panic!(x.to_owned())
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
assert!(png.ihdr_data.color_type == png::ColorType::Indexed);
|
assert!(png.ihdr_data.color_type == png::ColorType::RGB);
|
||||||
assert!(png.ihdr_data.bit_depth == png::BitDepth::Eight);
|
assert!(png.ihdr_data.bit_depth == png::BitDepth::Eight);
|
||||||
|
|
||||||
|
let old_png = image::open(&input).unwrap();
|
||||||
|
let new_png = image::open(&output).unwrap();
|
||||||
|
|
||||||
|
remove_file(output).ok();
|
||||||
|
|
||||||
|
// Conversion should be lossless
|
||||||
|
assert!(old_png.pixels().map(|x| x.2.channels().to_owned()).collect::<Vec<Vec<u8>>>() == new_png.pixels().map(|x| x.2.channels().to_owned()).collect::<Vec<Vec<u8>>>());
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn reduce_palette_png() {
|
fn rgba_should_be_palette() {
|
||||||
let input = PathBuf::from("tests/files/test_palette.png");
|
let input = PathBuf::from("tests/files/rgba_should_be_palette.png");
|
||||||
let opts = get_opts(&input);
|
let opts = get_opts(&input);
|
||||||
let output = opts.out_file.clone();
|
let output = opts.out_file.clone();
|
||||||
|
|
||||||
|
|
@ -113,10 +126,7 @@ fn reduce_palette_png() {
|
||||||
assert!(output.exists());
|
assert!(output.exists());
|
||||||
|
|
||||||
let png = match png::PngData::new(&output) {
|
let png = match png::PngData::new(&output) {
|
||||||
Ok(x) => {
|
Ok(x) => x,
|
||||||
remove_file(output).ok();
|
|
||||||
x
|
|
||||||
},
|
|
||||||
Err(x) => {
|
Err(x) => {
|
||||||
remove_file(output).ok();
|
remove_file(output).ok();
|
||||||
panic!(x.to_owned())
|
panic!(x.to_owned())
|
||||||
|
|
@ -125,11 +135,243 @@ fn reduce_palette_png() {
|
||||||
|
|
||||||
assert!(png.ihdr_data.color_type == png::ColorType::Indexed);
|
assert!(png.ihdr_data.color_type == png::ColorType::Indexed);
|
||||||
assert!(png.ihdr_data.bit_depth == png::BitDepth::Eight);
|
assert!(png.ihdr_data.bit_depth == png::BitDepth::Eight);
|
||||||
|
|
||||||
|
let old_png = image::open(&input).unwrap();
|
||||||
|
let new_png = image::open(&output).unwrap();
|
||||||
|
|
||||||
|
remove_file(output).ok();
|
||||||
|
|
||||||
|
// Conversion should be lossless
|
||||||
|
assert!(old_png.pixels().map(|x| x.2.channels().to_owned()).collect::<Vec<Vec<u8>>>() == new_png.pixels().map(|x| x.2.channels().to_owned()).collect::<Vec<Vec<u8>>>());
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn rgba_should_be_grayscale_alpha() {
|
||||||
|
let input = PathBuf::from("tests/files/rgba_should_be_grayscale_alpha.png");
|
||||||
|
let opts = get_opts(&input);
|
||||||
|
let output = opts.out_file.clone();
|
||||||
|
|
||||||
|
match oxipng::optimize(&input, &opts) {
|
||||||
|
Ok(_) => (),
|
||||||
|
Err(x) => panic!(x.to_owned())
|
||||||
|
};
|
||||||
|
assert!(output.exists());
|
||||||
|
|
||||||
|
let png = match png::PngData::new(&output) {
|
||||||
|
Ok(x) => x,
|
||||||
|
Err(x) => {
|
||||||
|
remove_file(output).ok();
|
||||||
|
panic!(x.to_owned())
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
assert!(png.ihdr_data.color_type == png::ColorType::GrayscaleAlpha);
|
||||||
|
assert!(png.ihdr_data.bit_depth == png::BitDepth::Eight);
|
||||||
|
|
||||||
|
let old_png = image::open(&input).unwrap();
|
||||||
|
let new_png = image::open(&output).unwrap();
|
||||||
|
|
||||||
|
remove_file(output).ok();
|
||||||
|
|
||||||
|
// Conversion should be lossless
|
||||||
|
assert!(old_png.pixels().map(|x| x.2.channels().to_owned()).collect::<Vec<Vec<u8>>>() == new_png.pixels().map(|x| x.2.channels().to_owned()).collect::<Vec<Vec<u8>>>());
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn rgba_should_be_grayscale() {
|
||||||
|
let input = PathBuf::from("tests/files/rgba_should_be_grayscale.png");
|
||||||
|
let opts = get_opts(&input);
|
||||||
|
let output = opts.out_file.clone();
|
||||||
|
|
||||||
|
match oxipng::optimize(&input, &opts) {
|
||||||
|
Ok(_) => (),
|
||||||
|
Err(x) => panic!(x.to_owned())
|
||||||
|
};
|
||||||
|
assert!(output.exists());
|
||||||
|
|
||||||
|
let png = match png::PngData::new(&output) {
|
||||||
|
Ok(x) => x,
|
||||||
|
Err(x) => {
|
||||||
|
remove_file(output).ok();
|
||||||
|
panic!(x.to_owned())
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
assert!(png.ihdr_data.color_type == png::ColorType::Grayscale);
|
||||||
|
assert!(png.ihdr_data.bit_depth == png::BitDepth::Eight);
|
||||||
|
|
||||||
|
let old_png = image::open(&input).unwrap();
|
||||||
|
let new_png = image::open(&output).unwrap();
|
||||||
|
|
||||||
|
remove_file(output).ok();
|
||||||
|
|
||||||
|
// Conversion should be lossless
|
||||||
|
assert!(old_png.pixels().map(|x| x.2.channels().to_owned()).collect::<Vec<Vec<u8>>>() == new_png.pixels().map(|x| x.2.channels().to_owned()).collect::<Vec<Vec<u8>>>());
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn rgb_should_be_rgb() {
|
||||||
|
let input = PathBuf::from("tests/files/rgb_should_be_rgb.png");
|
||||||
|
let opts = get_opts(&input);
|
||||||
|
let output = opts.out_file.clone();
|
||||||
|
|
||||||
|
match oxipng::optimize(&input, &opts) {
|
||||||
|
Ok(_) => (),
|
||||||
|
Err(x) => panic!(x.to_owned())
|
||||||
|
};
|
||||||
|
assert!(output.exists());
|
||||||
|
|
||||||
|
let png = match png::PngData::new(&output) {
|
||||||
|
Ok(x) => x,
|
||||||
|
Err(x) => {
|
||||||
|
remove_file(output).ok();
|
||||||
|
panic!(x.to_owned())
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
assert!(png.ihdr_data.color_type == png::ColorType::RGB);
|
||||||
|
assert!(png.ihdr_data.bit_depth == png::BitDepth::Eight);
|
||||||
|
|
||||||
|
let old_png = image::open(&input).unwrap();
|
||||||
|
let new_png = image::open(&output).unwrap();
|
||||||
|
|
||||||
|
remove_file(output).ok();
|
||||||
|
|
||||||
|
// Conversion should be lossless
|
||||||
|
assert!(old_png.pixels().map(|x| x.2.channels().to_owned()).collect::<Vec<Vec<u8>>>() == new_png.pixels().map(|x| x.2.channels().to_owned()).collect::<Vec<Vec<u8>>>());
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn rgb_should_be_palette() {
|
||||||
|
let input = PathBuf::from("tests/files/rgb_should_be_palette.png");
|
||||||
|
let opts = get_opts(&input);
|
||||||
|
let output = opts.out_file.clone();
|
||||||
|
|
||||||
|
match oxipng::optimize(&input, &opts) {
|
||||||
|
Ok(_) => (),
|
||||||
|
Err(x) => panic!(x.to_owned())
|
||||||
|
};
|
||||||
|
assert!(output.exists());
|
||||||
|
|
||||||
|
let png = match png::PngData::new(&output) {
|
||||||
|
Ok(x) => x,
|
||||||
|
Err(x) => {
|
||||||
|
remove_file(output).ok();
|
||||||
|
panic!(x.to_owned())
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
assert!(png.ihdr_data.color_type == png::ColorType::Indexed);
|
||||||
|
assert!(png.ihdr_data.bit_depth == png::BitDepth::Eight);
|
||||||
|
|
||||||
|
let old_png = image::open(&input).unwrap();
|
||||||
|
let new_png = image::open(&output).unwrap();
|
||||||
|
|
||||||
|
remove_file(output).ok();
|
||||||
|
|
||||||
|
// Conversion should be lossless
|
||||||
|
assert!(old_png.pixels().map(|x| x.2.channels().to_owned()).collect::<Vec<Vec<u8>>>() == new_png.pixels().map(|x| x.2.channels().to_owned()).collect::<Vec<Vec<u8>>>());
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn rgb_should_be_grayscale() {
|
||||||
|
let input = PathBuf::from("tests/files/rgb_should_be_grayscale.png");
|
||||||
|
let opts = get_opts(&input);
|
||||||
|
let output = opts.out_file.clone();
|
||||||
|
|
||||||
|
match oxipng::optimize(&input, &opts) {
|
||||||
|
Ok(_) => (),
|
||||||
|
Err(x) => panic!(x.to_owned())
|
||||||
|
};
|
||||||
|
assert!(output.exists());
|
||||||
|
|
||||||
|
let png = match png::PngData::new(&output) {
|
||||||
|
Ok(x) => x,
|
||||||
|
Err(x) => {
|
||||||
|
remove_file(output).ok();
|
||||||
|
panic!(x.to_owned())
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
assert!(png.ihdr_data.color_type == png::ColorType::Grayscale);
|
||||||
|
assert!(png.ihdr_data.bit_depth == png::BitDepth::Eight);
|
||||||
|
|
||||||
|
let old_png = image::open(&input).unwrap();
|
||||||
|
let new_png = image::open(&output).unwrap();
|
||||||
|
|
||||||
|
remove_file(output).ok();
|
||||||
|
|
||||||
|
// Conversion should be lossless
|
||||||
|
assert!(old_png.pixels().map(|x| x.2.channels().to_owned()).collect::<Vec<Vec<u8>>>() == new_png.pixels().map(|x| x.2.channels().to_owned()).collect::<Vec<Vec<u8>>>());
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn palette_should_be_palette() {
|
||||||
|
let input = PathBuf::from("tests/files/palette_should_be_palette.png");
|
||||||
|
let opts = get_opts(&input);
|
||||||
|
let output = opts.out_file.clone();
|
||||||
|
|
||||||
|
match oxipng::optimize(&input, &opts) {
|
||||||
|
Ok(_) => (),
|
||||||
|
Err(x) => panic!(x.to_owned())
|
||||||
|
};
|
||||||
|
assert!(output.exists());
|
||||||
|
|
||||||
|
let png = match png::PngData::new(&output) {
|
||||||
|
Ok(x) => x,
|
||||||
|
Err(x) => {
|
||||||
|
remove_file(output).ok();
|
||||||
|
panic!(x.to_owned())
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
assert!(png.ihdr_data.color_type == png::ColorType::Indexed);
|
||||||
|
assert!(png.ihdr_data.bit_depth == png::BitDepth::Eight);
|
||||||
|
|
||||||
|
let old_png = image::open(&input).unwrap();
|
||||||
|
let new_png = image::open(&output).unwrap();
|
||||||
|
|
||||||
|
remove_file(output).ok();
|
||||||
|
|
||||||
|
// Conversion should be lossless
|
||||||
|
assert!(old_png.pixels().map(|x| x.2.channels().to_owned()).collect::<Vec<Vec<u8>>>() == new_png.pixels().map(|x| x.2.channels().to_owned()).collect::<Vec<Vec<u8>>>());
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn palette_should_be_grayscale() {
|
||||||
|
let input = PathBuf::from("tests/files/palette_should_be_grayscale.png");
|
||||||
|
let opts = get_opts(&input);
|
||||||
|
let output = opts.out_file.clone();
|
||||||
|
|
||||||
|
match oxipng::optimize(&input, &opts) {
|
||||||
|
Ok(_) => (),
|
||||||
|
Err(x) => panic!(x.to_owned())
|
||||||
|
};
|
||||||
|
assert!(output.exists());
|
||||||
|
|
||||||
|
let png = match png::PngData::new(&output) {
|
||||||
|
Ok(x) => x,
|
||||||
|
Err(x) => {
|
||||||
|
remove_file(output).ok();
|
||||||
|
panic!(x.to_owned())
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
assert!(png.ihdr_data.color_type == png::ColorType::Grayscale);
|
||||||
|
assert!(png.ihdr_data.bit_depth == png::BitDepth::Eight);
|
||||||
|
|
||||||
|
let old_png = image::open(&input).unwrap();
|
||||||
|
let new_png = image::open(&output).unwrap();
|
||||||
|
|
||||||
|
remove_file(output).ok();
|
||||||
|
|
||||||
|
// Conversion should be lossless
|
||||||
|
assert!(old_png.pixels().map(|x| x.2.channels().to_owned()).collect::<Vec<Vec<u8>>>() == new_png.pixels().map(|x| x.2.channels().to_owned()).collect::<Vec<Vec<u8>>>());
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn strip_headers() {
|
fn strip_headers() {
|
||||||
let input = PathBuf::from("tests/files/test_rgb.png");
|
let input = PathBuf::from("tests/files/rgb_should_be_palette.png");
|
||||||
let mut opts = get_opts(&input);
|
let mut opts = get_opts(&input);
|
||||||
opts.strip = true;
|
opts.strip = true;
|
||||||
let output = opts.out_file.clone();
|
let output = opts.out_file.clone();
|
||||||
|
|
@ -153,3 +395,45 @@ fn strip_headers() {
|
||||||
|
|
||||||
assert!(!png.aux_headers.contains_key("tEXt"));
|
assert!(!png.aux_headers.contains_key("tEXt"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
#[ignore]
|
||||||
|
fn downgrade_16_to_8() {
|
||||||
|
unimplemented!();
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
#[ignore]
|
||||||
|
fn downgrade_8_to_4() {
|
||||||
|
unimplemented!();
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
#[ignore]
|
||||||
|
fn downgrade_8_to_2() {
|
||||||
|
unimplemented!();
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
#[ignore]
|
||||||
|
fn downgrade_8_to_1() {
|
||||||
|
unimplemented!();
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
#[ignore]
|
||||||
|
fn downgrade_4_to_2() {
|
||||||
|
unimplemented!();
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
#[ignore]
|
||||||
|
fn downgrade_4_to_1() {
|
||||||
|
unimplemented!();
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
#[ignore]
|
||||||
|
fn downgrade_2_to_1() {
|
||||||
|
unimplemented!();
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue