aboutsummaryrefslogtreecommitdiff
path: root/src/zip/tests.rs
blob: a8ac634cf90e1445377eab05d1a17a8e8dacc510 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
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::<Vec<u8>>()
    );

    assert_eq!(
        String::from_cp437((97..=122).collect::<Vec<u8>>()),
        "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
}