use crate::zip::cp437::{from_char, is_cp437, to_char, FromCp437}; use crate::zip::datetime::DosDateTime; use crate::zip::{bit::DeflateMode, BitFlag}; use chrono::{DateTime, Local, TimeZone}; #[test] fn test_bit_flag() { macro_rules! bit_flag { ($($get:ident $set:ident)+) => { $( let mut bit_flag = BitFlag::new(0); assert_eq!(bit_flag.$get(), false); bit_flag.$set(true); assert_eq!(bit_flag.$get(), true); bit_flag.$set(false); assert_eq!(bit_flag.$get(), false); )+ }; } bit_flag!( is_encrypted set_encrypted is_imploding_8k set_imploding_8k is_imploding_3sf_trees set_imploding_3sf_trees is_lzma_has_eos_marker set_lzma_has_eos_marker is_has_data_descriptor set_has_data_descriptor is_patched_data set_patched_data is_strong_encryption set_strong_encryption is_utf8 set_utf8 is_cd_encryption set_cd_encryption ); let mut bit_flag = BitFlag::new(0); assert_eq!(bit_flag.deflate_mode(), DeflateMode::Normal); bit_flag.set_deflate_mode(DeflateMode::Maximum); assert_eq!(bit_flag.deflate_mode(), DeflateMode::Maximum); bit_flag.set_deflate_mode(DeflateMode::Fast); assert_eq!(bit_flag.deflate_mode(), DeflateMode::Fast); bit_flag.set_deflate_mode(DeflateMode::SuperFast); assert_eq!(bit_flag.deflate_mode(), DeflateMode::SuperFast); bit_flag.set_deflate_mode(DeflateMode::Normal); assert_eq!(bit_flag.deflate_mode(), DeflateMode::Normal); } #[test] fn test_cp437() { for b in 0..=255 { assert_eq!(from_char(to_char(b)).unwrap(), b); assert!(is_cp437(to_char(b)), "byte: {}", b); } assert_eq!(from_char('Σ'), Some(228)); assert_eq!(from_char('§'), None); assert!(is_cp437('Σ')); assert!(!is_cp437('§')); assert_eq!( Vec::from_cp437("hello world").unwrap(), [104, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100] ); assert_eq!( String::from_cp437([104, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100]), "hello world" ); assert_eq!( Vec::from_cp437("ABCDEFGHIJKLMNOPQRSTUVWXYZ").unwrap(), (65..=90).collect::>() ); assert_eq!( String::from_cp437((97..=122).collect::>()), "abcdefghijklmnopqrstuvwxyz" ); } #[test] fn test_dos_datetime() { let datetime = Local.with_ymd_and_hms(2001, 2, 3, 4, 5, 6).unwrap(); assert_eq!( DateTime::from_dos_date_time(datetime.to_dos_date(), datetime.to_dos_time(), Local) .unwrap(), datetime ); let datetime = Local.with_ymd_and_hms(1999, 9, 9, 9, 9, 9).unwrap(); assert_eq!( DateTime::from_dos_date_time(datetime.to_dos_date(), datetime.to_dos_time(), Local) .unwrap(), Local.with_ymd_and_hms(1999, 9, 9, 9, 9, 8).unwrap() ); // Dos format stores seconds with an accuracy of 2s }