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 {
#[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_opts.encode_format_areas(&mut qr.body, 4u8);
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);
}
}