package org.foobar.minesweeper.model;

import static org.junit.Assert.assertEquals;

import java.util.Random;

import org.junit.Before;
import org.junit.Test;
import org.mockito.MockitoAnnotations;

public class ModelTest {
  @SuppressWarnings("serial")
  private final Random random = new Random() {
    @Override protected int next(int bits) {
      return 1;
    }
  };

  private Minefield field;

  @Before
  public void setUp() throws Exception {
    MockitoAnnotations.initMocks(this);
    field = new Minefield(10, 10, 10, random);
  }

  @Test(expected=IllegalArgumentException.class)
  public void constructor() {
    field = new Minefield(-1, 0, 0);
  }

  @Test
  public void numberOfMines() {
    assertEquals(field.getMines(), 10);

    field.getSquare(0, 0).reveal();

    int mines = 0;

    for(int i=0; i<field.getRowCount(); i++) {
      for(int j=0; j<field.getColumnCount(); j++) {
        if (field.getSquare(i, j).isMine())
          mines++;
      }
    }

    assertEquals(mines, field.getMines());
  }

  @Test(expected=IndexOutOfBoundsException.class)
  public void getNegativeRow() {
    field.getSquare(-1, 0);
  }

  @Test(expected=IndexOutOfBoundsException.class)
  public void getNegativeColumn() {
    field.getSquare(0, -1);
  }
  @Test(expected=IndexOutOfBoundsException.class)
  public void getOutOfBoundsRow() {
    field.getSquare(10, 0);
  }
  @Test(expected=IndexOutOfBoundsException.class)
  public void getOutOfBoundsColumn() {
    field.getSquare(0, 10);
  }
}

add test from master branch