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
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#![allow(dead_code)]

pub mod qr_encoder;

use qr_encoder::util::{codeword_info, square_count};
use qr_encoder::config::{ECLevel, QRConfig, EncodingMode, ecc_format};
use qr_encoder::cell::CellType;
use qr_encoder::qr::QR;


fn qr_config_with_general_opts(version: usize, ec_level: ECLevel, encoding_mode: EncodingMode, message: Vec<u8>) -> QRConfig {
    QRConfig {
        version: version,
        data: message,
        encoding: 0,
        codewords: vec![],
        codeword_properties: codeword_info(version, &ec_level),
        mask: 4,
        encoding_mode: encoding_mode,
        debug_mode: false,
        requires_alignment: version > 6,
        finder_points: [
            (0, 0),
            ((square_count(version) - 7), 0),
            (0, (square_count(version) - 7))
        ],
        size: (((version - 1) * 4) + 21),
        err_correction_level: ec_level
    }
}

fn create_qr(config: &QRConfig) -> QR {
    QR {
        body: config.create_body() }
}

#[cfg(test)]
mod tests {
    // use super::qr_encoder::util::{args};
    // use super::qr_encoder::qr::{QROptions, QR};

    // #[test]
    // fn test_qr_create() {
    //     let qr_opt = args();
    // }

    #[test]
    fn test_ecc_version_info() {
        use super::qr_encoder::config::ecc_format;
        let gen_poly = 7973;
        let mut version = 7;

        let mut expected_outcome = 0b000111110010010100u32;
        let mut actual_outcome = ecc_format::<u32>(version, gen_poly, None);

        assert_eq!(expected_outcome, actual_outcome);

        version = 8;
        expected_outcome = 0b1000010110111100u32;
        actual_outcome = ecc_format::<u32>(version, gen_poly, None);

        assert_eq!(expected_outcome, actual_outcome);

        version = 33;
        expected_outcome = 0b100001011011110000u32;
        actual_outcome = ecc_format::<u32>(version, gen_poly, None);

        assert_eq!(expected_outcome, actual_outcome);
    }

    #[test]
    fn test_ecc_format() {
        use super::*;


        let message = String::from("Hello, World!").into_bytes();
        let mut qr_opts = qr_config_with_general_opts(7, ECLevel::Low, EncodingMode::Byte, message);
        let mut qr = create_qr(&qr_opts);
        qr.setup(&mut qr_opts);
        // qr.encode_data(&qr_opts);
        qr_opts.encode_format_areas(&mut qr.body, 4u8);

        // assert_eq!(4, qr_opts.mask);
        let mut index = qr_opts.size * 8;
        let mut actual_format_bytestring = 0;
        let expected_format_bytestring = 0b110011000101111;
        let mut pos = 14;

        while index >= 8 {

            let cell = &qr.body[index];
            match cell.module_type {
                CellType::Format => {
                    if cell.is_black() {
                        actual_format_bytestring |= (1 << pos);   
                    }
                    pos -= 1;
                },
                _ => {}
            }

            if index == 8 {
                break;
            }

            if index % qr_opts.size == 8 {
                index -= qr_opts.size;
            } else {
                index += 1;
            }
        }
        
        assert_eq!(expected_format_bytestring, actual_format_bytestring);
    }
}