#include <assert.h>

#include "basic_testing.h"

#include "../chess_paths.h"

struct chessboard {
    unsigned int C;
    unsigned int R;
};

int value_at(const struct chessboard * c, unsigned int column, unsigned int row) {
    row = c->R - row - 1;
    column += row;
    column *= column + 1;
    return column/2 + row;
}

unsigned int columns(const struct chessboard * c) {
    return c->C;
}

unsigned int rows(const struct chessboard * c) {
    return c->R;
};

TEST(dec_pawn) {
    struct chessboard c = {.C = 10, .R = 10 };
    struct piece_position p;
    p.piece = PAWN;
    p.column = 5;
    p.row = 2;
    assert_uint_eq(decreasing_path_len(&c, &p), 7);
    assert_uint_eq(p.column, 5);
    assert_uint_eq(p.row, 9);
    TEST_PASSED;
}

TEST(dec_king) {
    struct chessboard c = {.C = 10, .R = 10 };
    struct piece_position p;
    p.piece = KING;
    p.column = 5;
    p.row = 2;
    assert_uint_eq(decreasing_path_len(&c, &p), 7);
    assert_uint_eq(p.column, 0);
    assert_uint_eq(p.row, 9);
    TEST_PASSED;
}

TEST(dec_queen) {
    struct chessboard c = {.C = 10, .R = 10 };
    struct piece_position p;
    p.piece = QUEEN;
    p.column = 5;
    p.row = 2;
    assert_uint_eq(decreasing_path_len(&c, &p), 2);
    assert_uint_eq(p.column, 0);
    assert_uint_eq(p.row, 9);
    TEST_PASSED;
}

TEST(dec_knight) {
    struct chessboard c = {.C = 10, .R = 10 };
    struct piece_position p;
    p.piece = KNIGHT;
    p.column = 5;
    p.row = 2;
    assert_uint_eq(decreasing_path_len(&c, &p), 4);
    assert_uint_eq(p.column, 0);
    assert_uint_eq(p.row, 9);
    TEST_PASSED;
}

TEST(dec_bishop) {
    struct chessboard c = {.C = 10, .R = 10 };
    struct piece_position p;
    p.piece = BISHOP;
    p.column = 5;
    p.row = 2;
    assert_uint_eq(decreasing_path_len(&c, &p), 2);
    assert_uint_eq(p.column, 2);
    assert_uint_eq(p.row, 9);
    TEST_PASSED;
}

TEST(dec_rook) {
    struct chessboard c = {.C = 10, .R = 10 };
    struct piece_position p;
    p.piece = ROOK;
    p.column = 5;
    p.row = 2;
    assert_uint_eq(decreasing_path_len(&c, &p), 2);
    assert_uint_eq(p.column, 0);
    assert_uint_eq(p.row, 9);
    TEST_PASSED;
}

int main() {
    RUN_TEST(dec_pawn);
    RUN_TEST(dec_king);
    RUN_TEST(dec_queen);
    RUN_TEST(dec_knight);
    RUN_TEST(dec_bishop);
    RUN_TEST(dec_rook);
    PRINT_TEST_RESULTS;
    assert(ALL_TESTS_PASSED);
}
