package edu.ics211.h09;

import static org.junit.Assert.*;

import java.util.ArrayList;

import org.junit.Test;

/**
 * Represents a LegalValuesTest.
 *
 * @author Cam Moore
 *
 */
public class LegalValuesTest {

  @Test
  public void test() {
    int[][] simple = { { 11, 2, 5, 7, 4, 10, 9, 15, 6, 14, 0, 1, 12, 3, 8, 13 },
        { 14, 4, 0, 9, 11, 8, 2, 12, 13, 5, 3, 10, 15, 1, 7, 6 },
        { 1, 10, 15, 12, 6, 13, 7, 3, 4, 9, 8, 2, 11, 5, 14, 0 },
        { 13, 8, 6, 3, 5, 14, 1, 0, 11, 7, 15, 12, 10, 9, 4, 2 },
        { 0, 7, 14, 2, 8, 11, 4, 9, 1, 6, 10, 5, 13, 12, 3, 15 },
        { 3, 5, 9, 1, 10, 12, 14, 7, 2, 4, 13, 15, 8, 0, 6, 11 },
        { 12, 15, 10, 13, 2, 1, 3, 6, 8, 11, 14, 0, 7, 4, 5, 9 },
        { 6, 11, 8, 4, 0, 15, 5, 13, 7, 12, 9, 3, 14, 2, 10, 1 },
        { 2, 14, 1, 15, 3, 7, 11, 4, 5, 10, 6, 9, 0, 13, 12, 8 },
        { 7, 6, 12, 8, 9, 2, 10, 5, 0, 13, 1, 11, 4, 14, 15, 3 },
        { 4, 9, 3, 5, 14, 0, 13, 8, 15, 2, 12, 7, 6, 11, 1, 10 },
        { 10, 13, 11, 0, 15, 6, 12, 1, 3, 8, 4, 14, 9, 7, 2, 5 },
        { 9, 1, 2, 14, 7, 4, 0, 11, 10, 15, 5, 6, 3, 8, 13, 12 },
        { 8, 3, 7, 10, 13, 9, 6, 2, 12, 1, 11, 4, 5, 15, 0, 14 },
        { 15, 0, 4, 11, 12, 5, 8, 10, 14, 3, 2, 13, 1, 6, 9, 7 },
        { 5, 12, 13, 6, 1, 3, 15, 14, 9, 0, 7, 8, 2, 10, 11, 4 } };
    ArrayList<Integer> legal = HexadecimalSudoku.legalValues(simple, 0, 2);
    assertTrue(legal == null);
    simple[0][2] = -1;
    legal = HexadecimalSudoku.legalValues(simple, 0, 2);
    assertTrue(legal.size() == 1);
    assertTrue(legal.get(0) == 5);
    int[][] example2 = {
        { 4, -1, -1, 9, -1, 14, -1, 0, -1, -1, -1, 6, -1, -1, -1, -1 },
        { 3, -1, -1, 2, -1, -1, -1, -1, -1, 8, 5, 11, 10, 0, -1, 14 },
        { 13, -1, -1, -1, 10, 2, 8, -1, 1, 12, -1, -1, -1, -1, 9, -1 },
        { 10, 7, -1, -1, 4, -1, 3, 15, -1, -1, -1, -1, -1, 8, -1, 12 },
        { 5, -1, 3, -1, -1, 12, 4, -1, 13, -1, -1, -1, -1, 11, -1, -1 },
        { 14, -1, -1, -1, -1, 0, -1, 13, 15, -1, 9, -1, 6, 3, 8, -1 },
        { 7, 8, -1, 15, -1, 3, 1, 10, 14, -1, -1, 4, -1, 5, -1, -1 },
        { 11, 10, 1, -1, -1, -1, 9, -1, -1, -1, -1, -1, -1, -1, 0, 4 },
        { 9, 3, 13, -1, 7, 8, 15, -1, 6, -1, -1, 0, -1, 14, -1, -1 },
        { 8, -1, 15, 1, -1, -1, -1, -1, 5, -1, -1, 14, 0, 12, 10, -1 },
        { 6, -1, -1, 14, 12, 10, -1, -1, 3, -1, 15, 13, 8, -1, 1, 7 },
        { 0, -1, -1, 7, -1, -1, 2, 1, -1, -1, -1, 8, 15, -1, -1, -1 },
        { 12, 0, 7, -1, 8, -1, 11, -1, 10, -1, 1, -1, 5, -1, -1, -1 },
        { 1, 6, -1, -1, -1, -1, 5, 2, -1, -1, -1, 7, 11, 10, 15, -1 },
        { 2, -1, 14, 5, 13, -1, 10, -1, -1, -1, 4, -1, 9, -1, 7, 8 },
        { 15, -1, 9, 10, -1, 1, -1, -1, -1, 2, -1, -1, -1, 6, 4, -1 } };
    legal = HexadecimalSudoku.legalValues(example2, 0, 1);
    assertTrue(legal.size() == 5);
    assertTrue(legal.get(0) == 1);
    assertTrue(legal.get(1) == 5);
    assertTrue(legal.get(2) == 11);
    assertTrue(legal.get(3) == 12);
    assertTrue(legal.get(4) == 15);
    int[][] example4 = { { 15, 4, -1, -1, 8, -1, -1, 0, 7, 12, -1, -1, -1, -1, 9, 11 },
        { 0, 12, -1, -1, 13, 6, -1, -1, -1, -1, -1, -1, 8, -1, 15, 5 },
        { 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, 15, 13, -1, 1, 3, 7 },
        { 9, 7, 11, -1, -1, 1, -1, 15, 8, -1, 6, -1, 0, -1, -1, 14 },
        { 13, 8, 5, -1, -1, 15, -1, 14, -1, -1, 10, 12, 2, -1, 7, -1 },
        { 11, -1, 7, 15, 1, 12, -1, 13, -1, 2, -1, -1, -1, -1, 10, -1 },
        { 10, 6, 14, -1, -1, 7, -1, -1, 4, -1, -1, -1, -1, 15, -1, -1 },
        { 2, -1, 12, 9, -1, -1, -1, -1, 1, -1, -1, -1, 14, -1, -1, 13 },
        { 7, -1, 4, -1, -1, 9, -1, 2, -1, 10, 8, -1, 13, 5, -1, -1 },
        { 14, 15, 2, -1, 5, -1, -1, -1, -1, -1, 13, 9, -1, -1, -1, -1 },
        { 12, -1, 8, -1, -1, 11, -1, -1, 5, -1, -1, 7, 15, 0, 2, -1 },
        { 3, -1, 6, -1, 7, 13, -1, -1, 15, 1, -1, -1, -1, 8, -1, 10 },
        { 4, -1, -1, -1, -1, -1, -1, 5, 10, -1, -1, 3, -1, 13, 1, 0 },
        { 5, -1, 3, -1, -1, 10, -1, -1, -1, 8, -1, -1, -1, -1, -1, 15 },
        { 1, -1, 0, 7, 6, 3, -1, 4, 9, -1, 14, -1, -1, -1, -1, -1 },
        { 6, -1, 15, -1, 9, -1, -1, 1, 13, -1, 5, -1, -1, 14, -1, -1 } };
    legal = HexadecimalSudoku.legalValues(example4, 9, 6);
    assertTrue(legal.size() == 8);
    assertTrue(legal.get(0) == 0);
    assertTrue(legal.get(1) == 1);
    assertTrue(legal.get(2) == 3);
    assertTrue(legal.get(3) == 4);
    assertTrue(legal.get(4) == 6);
    assertTrue(legal.get(5) == 8);
    assertTrue(legal.get(6) == 10);
    assertTrue(legal.get(7) == 12);
  }

}
