Documentation
extern crate sudoku;
use sudoku::{Grid, Solve, Sudoku};

#[cfg_attr(feature = "2D", test)]
#[cfg(feature = "2D")]
fn test_solve_o3_2d() {
    let puzzle: Sudoku = include_str!("../tests/sudokus/solvable/2D-O3.txt")
        .parse()
        .unwrap();
    let solution = puzzle.solution();
    assert!(solution.is_ok());
}

#[cfg_attr(feature = "2D", test)]
#[cfg_attr(feature = "2D", ignore)]
#[cfg(feature = "2D")]
fn test_solve_o4_2d() {
    let puzzle: Sudoku = include_str!("../tests/sudokus/solvable/2D-O4.txt")
        .parse()
        .unwrap();
    let solution = puzzle.solution();
    assert!(solution.is_ok());
}

#[cfg_attr(feature = "2D", test)]
#[cfg_attr(feature = "2D", ignore)]
#[cfg(feature = "2D")]
fn test_uniquely_solveable() {
    let puzzle: Sudoku = include_str!("../tests/sudokus/solvable/2D-O3.txt")
        .parse()
        .unwrap();
    assert!(puzzle.is_uniquely_solvable());
    let puzzle: Sudoku = include_str!("../tests/sudokus/solvable/2D-O4.txt")
        .parse()
        .unwrap();
    assert!(puzzle.is_uniquely_solvable());
}

#[cfg_attr(feature = "2D", test)]
#[cfg(feature = "2D")]
fn test_group_is_complete_and_is_valid() {
    let solution = include_str!("../tests/sudokus/solvable/2D-O3.txt")
        .parse::<Sudoku>()
        .unwrap()
        .solution()
        .unwrap();
    for point in solution.points() {
        for group in solution.groups(point).iter() {
            assert!(group.is_complete());
            assert!(group.is_valid());
        }
    }
}