use rlwfc::{Cell, Direction4, GridSystem, Tile};
use std::collections::HashMap;
#[derive(Debug, Clone)]
struct CellWfcData {
state: State,
entropy: f64,
rand_num: i32,
possibility: Vec<usize>, }
#[derive(Debug, Clone, PartialEq)]
enum State {
Collapsed,
Noncollapsed,
Conflict,
}
#[test]
fn test_grid_system_api_compatibility() {
let mut grid = GridSystem::new();
let cells: Vec<_> = (0..4).map(|i| grid.add_cell(Cell::with_id(i))).collect();
let all_cells: Vec<_> = grid.get_all_cells().collect();
assert_eq!(all_cells.len(), 4);
grid.create_edge(cells[0], Some(cells[1])).unwrap();
grid.create_edge(cells[0], Some(cells[2])).unwrap();
let neighbors = grid.get_neighbors(cells[0]);
assert_eq!(neighbors.len(), 2);
assert!(neighbors.contains(&cells[1]));
assert!(neighbors.contains(&cells[2]));
let completed_cell_count = 2;
let is_complete = completed_cell_count == grid.get_cells_count();
assert!(!is_complete);
assert!(grid.find_edge(cells[0], cells[1]).is_some());
assert!(grid.find_edge(cells[1], cells[0]).is_none()); }
#[test]
fn test_tile_system_compatibility() {
let tile1 = Tile::new(0, 10, vec!["A", "B", "C", "D"]);
let tile2 = Tile::new(1, 15, vec!["A", "B", "X", "Y"]);
assert_eq!(tile1.weight, 10);
assert_eq!(tile2.weight, 15);
assert_eq!(tile1.edges.len(), 4);
assert_eq!(tile1.edges[0], "A");
assert_ne!(tile1, tile2);
let tile3 = Tile::new(0, 10, vec!["A", "B", "C", "D"]);
assert_eq!(tile1, tile3); }
#[test]
fn test_direction_system_enhancement() {
let mut grid = GridSystem::new();
let cells = vec![
vec![
grid.add_cell(Cell::with_id(0)),
grid.add_cell(Cell::with_id(1)),
],
vec![
grid.add_cell(Cell::with_id(2)),
grid.add_cell(Cell::with_id(3)),
],
];
let center = cells[0][0];
let east = cells[0][1];
let south = cells[1][0];
grid.create_edge(center, Some(east)).unwrap(); grid.create_edge(center, Some(south)).unwrap();
assert_eq!(
grid.get_neighbor_by_direction(center, Direction4::East),
Some(east)
);
assert_eq!(
grid.get_neighbor_by_direction(center, Direction4::South),
Some(south)
);
assert_eq!(
grid.get_neighbor_by_direction(center, Direction4::West),
None
);
assert_eq!(
grid.get_neighbor_by_direction(center, Direction4::North),
None
);
}
#[test]
fn test_wfc_manager_data_structures() {
let mut grid = GridSystem::new();
let cells: Vec<_> = (0..4).map(|i| grid.add_cell(Cell::with_id(i))).collect();
let mut wfc_cell_data: HashMap<_, CellWfcData> = HashMap::new();
for &cell in &cells {
wfc_cell_data.insert(
cell,
CellWfcData {
state: State::Noncollapsed,
entropy: 2.5,
rand_num: 42,
possibility: vec![0, 1, 2], },
);
}
for &cell in &cells {
let data = &wfc_cell_data[&cell];
assert_eq!(data.state, State::Noncollapsed);
}
let test_cell = cells[0];
let cell_data = &wfc_cell_data[&test_cell];
let tile_weights = vec![10, 15, 5]; let total_weight: i32 = tile_weights.iter().sum();
let rand_num_mod = cell_data.rand_num % total_weight;
assert!(rand_num_mod >= 0);
assert!(rand_num_mod < total_weight);
println!("模拟随机数选择: rand_num={}, mod_result={}, total_weight={}",
cell_data.rand_num, rand_num_mod, total_weight);
if let Some(data) = wfc_cell_data.get_mut(&cells[0]) {
data.state = State::Collapsed;
data.entropy = 0.0;
data.possibility = vec![1]; }
assert_eq!(wfc_cell_data[&cells[0]].state, State::Collapsed);
assert_eq!(wfc_cell_data[&cells[0]].possibility.len(), 1);
assert_eq!(wfc_cell_data[&cells[0]].rand_num, 42);
if let Some(data) = wfc_cell_data.get_mut(&cells[1]) {
data.possibility.clear(); data.entropy = 0.0;
if data.possibility.is_empty() {
data.state = State::Conflict;
println!("检测到冲突:单元格 {:?} 的可能性为零", cells[1]);
}
}
assert_eq!(wfc_cell_data[&cells[1]].state, State::Conflict);
assert!(wfc_cell_data[&cells[1]].possibility.is_empty());
}
#[test]
fn test_propagation_logic_compatibility() {
let mut grid = GridSystem::new();
let center = grid.add_cell(Cell::with_id(0));
let east = grid.add_cell(Cell::with_id(1));
let south = grid.add_cell(Cell::with_id(2));
grid.create_edge(center, Some(east)).unwrap();
grid.create_edge(center, Some(south)).unwrap();
let neighbors = grid.get_neighbors(center);
assert_eq!(neighbors.len(), 2);
for neighbor in neighbors {
assert!(grid.contains_cell(neighbor));
let _neighbor_neighbors = grid.get_neighbors(neighbor);
}
}
#[test]
fn test_compatibility_check_pattern() {
let tile1 = Tile::new(0, 10, vec![1, 2, 3, 4]);
let tile2 = Tile::new(1, 15, vec![1, 2, 5, 6]);
let direction = 0; let is_compatible = tile1.is_compatible_with(&tile2, direction);
assert!(is_compatible);
let direction = 2; let is_compatible = tile1.is_compatible_with(&tile2, direction);
assert!(!is_compatible); }
#[test]
fn test_overall_compatibility() {
let mut grid = GridSystem::new();
let cells: Vec<_> = (0..9).map(|i| grid.add_cell(Cell::with_id(i))).collect();
for i in 0..3 {
for j in 0..3 {
let current_idx = i * 3 + j;
let current = cells[current_idx];
if j < 2 {
let east = cells[current_idx + 1];
grid.create_edge(current, Some(east)).unwrap();
}
if i < 2 {
let south = cells[current_idx + 3];
grid.create_edge(current, Some(south)).unwrap();
}
}
}
assert_eq!(grid.get_cells_count(), 9);
assert!(grid.get_edges_count() > 0);
let center = cells[4]; let neighbors = grid.get_neighbors(center);
assert!(neighbors.len() >= 1);
assert!(grid.validate_structure().is_ok());
println!("✅ 所有兼容性测试通过!");
}