import { Gameboard } from '../src/components/gameboard';

const gb = new Gameboard();
it('should place ships at random coordinates', () => {
    // wait
});

it('should return random coordinates', () => {
    const size = 3;
    const coordinates = gb.generateCoordinates(size);

    for (let i = 0; i < coordinates.length; i++) {
        expect(coordinates[i][0]).toBeLessThan(11);
        expect(coordinates[i][1]).toBeLessThan(11);
        expect(coordinates[i][0]).toBeGreaterThan(0);
        expect(coordinates[i][1]).toBeGreaterThan(0);
    }
    // expect(coordinates).toBe(3);
    expect(coordinates).toHaveLength(size);
});

it('should create 5 ships', () => {
    expect(gb.ships).toHaveLength(5);
});

it('should create 5 ships with lengths of 2,3,3,4,5', () => {
    const size = [2, 3, 3, 4, 5];
    for (let i = 0; i < 5; i++) {
        expect(gb.ships[i].length).toBe(size[i]);
    }
});

it('should contain unique random coordinates for each ship', () => {
    let ships = [];
    let count = 0;
    let duplicates = false;

    gb.ships.forEach((ship) => {
        for (let i = 0; i < ship.coordinates.length; i++) {
            let test = ships.find(
                (s) =>
                    JSON.stringify(s) === JSON.stringify(ship.coordinates[i]),
            );
            if (!test) ships.push(ship.coordinates[i]);
            if (test) {
                duplicates = true;
            }
        }
    });
    expect(duplicates).toBeFalsy();
});

it('should show a ship was hit and increase the hit count', () => {
    let attacks = [8, 5];
    gb.ships[0].coordinates = [[8, 5]];
    gb.receiveAttack(attacks);
    expect(gb.ships[0].hits).toBe(1);
});

it('should report if a ship is sunk', () => {
    gb.ships[0].length = 1;
    expect(gb.ships[0].isSunk()).toBeTruthy();
});

it('should track hits and misses', () => {
    expect(gb.scoreboard.hits.size).toBe(1);
    expect(gb.scoreboard.misses.size).toBe(0);

    gb.receiveAttack([-1, -1]);
    expect(gb.scoreboard.misses.size).toBe(1);
});

it('should have a sunk count of 1 and only four ships now', () => {
    gb.shipStatus();
    expect(gb.ships).toHaveLength(4);
    expect(gb.sunkShipCount).toBe(1);
});