use tuv::{QRMatrix, Module};
#[test]
fn trace_data_placement_order() {
let mut m = QRMatrix::new(1);
m.place_function_patterns();
let s = m.size;
let mut positions = Vec::new();
let mut col: isize = s as isize - 1;
let mut row: isize = s as isize - 1;
let mut going_up = true;
let mut step = 0;
while col >= 0 {
let module = m.get(col as usize, row as usize);
let is_data = matches!(module, Module::Data(_));
if step < 50 || step > 200 {
eprintln!("Step {:3}: ({:2}, {:2}) going_{} is_data={}",
step, col, row, if going_up { "up " } else { "down"}, is_data);
} else if step == 50 {
eprintln!("... (truncated)");
}
if is_data {
positions.push((col as usize, row as usize));
}
if going_up {
if row == 0 {
col -= 1;
if col < 0 { break; }
row = 1; going_up = false;
} else {
row -= 1;
}
} else {
if row >= (s as isize) - 1 {
col -= 1;
if col < 0 { break; }
row = (s as isize) - 2; going_up = true;
} else {
row += 1;
}
}
step += 1;
if step > 300 { break; }
}
eprintln!("\nTotal data positions available: {}", positions.len());
let head_len = positions.len().min(20);
let tail_start = positions.len().saturating_sub(20);
eprintln!("First 20 positions: {:?}", &positions[..head_len]);
eprintln!("Last 20 positions: {:?}", &positions[tail_start..]);
eprintln!("\nExpected for V1-M: 208 data bits = 208 positions");
eprintln!("Actual positions found: {}", positions.len());
}