// Pruebas con assert. Se corren desde code/week-11, con build/lab/solver_tests.
// Agreguen las suyas: cada función nueva, con un caso que puedan calcular a mano.
#include <assert.h>
#include <stdio.h>

#include "board.h"
#include "solver.h"
#include "subset_sum.h"

static void test_subset_sum_small(void) {
    int values[] = {3, 9, 5};
    long nodes = 0;
    assert(subset_sum(values, 3, 8, &nodes) == 1);   // 3 + 5
    assert(subset_sum(values, 3, 0, &nodes) == 1);   // el subconjunto vacío
    assert(subset_sum(values, 3, 7, &nodes) == 0);
    assert(nodes == 15);                             // sin solución: 2 + 4 + 8 + 1
}

static void test_can_place(void) {
    Board board;
    assert(board_load("lab/data/facil.txt", &board));
    // Esta celda de la fila 0 está vacía, y 3 ya está en esa fila.
    assert(can_place(&board, 0, 4, 3) == 0);
    // Esta otra está vacía, y 4 ya está en la columna 3.
    assert(can_place(&board, 3, 3, 4) == 0);
    // 8 ya está en la caja de (0, 4), en la fila 1 y la columna 5.
    assert(can_place(&board, 0, 4, 8) == 0);
    assert(can_place(&board, 0, 4, 5) == 1);
}

static void test_in_order_solves_the_easy_board(void) {
    Board board;
    long nodes = 0;
    assert(board_load("lab/data/facil.txt", &board));
    assert(solve_in_order(&board, &nodes) == 1);
    assert(nodes == 72);
    assert(board_is_legal(&board));
    assert(board.cells[0][2] == 8);
}

static void test_fewest_options_solves_the_easy_board(void) {
    Board board;
    long nodes = 0;
    assert(board_load("lab/data/facil.txt", &board));
    assert(count_options(&board, 0, 2) == 3);    // 5, 7 u 8
    assert(count_options(&board, 0, 4) == 2);    // 1 o 5
    assert(solve_fewest_options(&board, &nodes) == 1);
    assert(nodes == 38);
    assert(board_is_legal(&board));
}

int main(void) {
    test_subset_sum_small();
    test_can_place();
    test_in_order_solves_the_easy_board();
    test_fewest_options_solves_the_easy_board();
    printf("todas las pruebas pasaron\n");
    return 0;
}
