@Test
  public void dfsSimple() {
    System.out.println("Depth First Search - simple");

    char[][] expectedPath = {
      {'%', '%', '%', '%', '%', '%', '%', '%', '%', '%', '%', '%'},
      {'%', '.', '.', '.', '.', '.', '%', '.', '.', '.', '.', '%'},
      {'%', '%', '%', '%', '%', '.', '.', '.', '%', '%', 'P', '%'},
      {'%', '%', '%', '%', '%', '%', '%', '%', '%', '%', '%', '%'}
    };

    Search x = new DepthFirstSearch("test-files/simpleMaze.txt");
    MazeSolution actual = x.solve();

    assertEquals(actual.pathCost, 12);
    assertEquals(actual.numNodesExpanded, 12);
    assertMazesAreEqual(actual, expectedPath);
  }
  @Test
  public void dfsSmall() {
    System.out.println("Depth First Search - small");

    char[][] expectedPath = {
      {
        '%', '%', '%', '%', '%', '%', '%', '%', '%', '%', '%', '%', '%', '%', '%', '%', '%', '%',
        '%', '%', '%', '%', '%'
      },
      {
        '%', '.', '%', ' ', ' ', ' ', '%', ' ', ' ', ' ', '%', ' ', ' ', ' ', '%', ' ', ' ', ' ',
        '%', ' ', '%', ' ', '%'
      },
      {
        '%', '.', '%', '%', ' ', '%', ' ', '%', '%', '%', '%', '%', ' ', '%', ' ', ' ', ' ', '.',
        '.', '.', ' ', ' ', '%'
      },
      {
        '%', '.', '%', '.', '.', '.', '.', '.', '.', '.', '%', ' ', ' ', ' ', '%', ' ', '%', '.',
        '%', '.', '%', ' ', '%'
      },
      {
        '%', '.', '.', '.', '%', '%', ' ', '%', '%', '.', '%', '%', '%', ' ', '%', '.', '.', '.',
        '%', '.', '%', '%', '%'
      },
      {
        '%', ' ', '%', ' ', '%', ' ', ' ', ' ', '%', '.', '.', '.', '.', '.', '.', '.', '%', ' ',
        '%', '.', '.', 'P', '%'
      },
      {
        '%', '%', '%', '%', '%', '%', '%', '%', '%', '%', '%', '%', '%', '%', '%', '%', '%', '%',
        '%', '%', '%', '%', '%'
      },
    };

    Search x = new DepthFirstSearch("test-files/smallMaze.txt");
    MazeSolution actual = x.solve();

    System.out.println(actual.toString());
    assertEquals(actual.pathCost, 32);
    assertEquals(actual.numNodesExpanded, 57);
    assertMazesAreEqual(actual, expectedPath);
  }
  @Test
  public void dfsVsBfs2() {
    System.out.println("Depth First Search - should go long way around to right");

    char[][] expectedPath = {
      {'%', '%', '%', '%', '%', '%', '%'},
      {'%', ' ', ' ', '.', '.', '.', '%'},
      {'%', ' ', 'P', '%', '%', '.', '%'},
      {'%', ' ', '.', '.', '.', '.', '%'},
      {'%', '%', '%', '%', '%', '%', '%'}
    };

    Search x = new DepthFirstSearch("test-files/dfsVsBfs2.txt");
    MazeSolution actual = x.solve();

    System.out.println(actual.toString());

    assertEquals(actual.pathCost, 8);
    assertEquals(actual.numNodesExpanded, 8);
    assertMazesAreEqual(actual, expectedPath);
  }
  @Test
  public void badGreedy() {
    System.out.println("Depth First Search - does great on bad greedy");

    char[][] expectedPath = {
      {'%', '%', '%', '%', '%', '%'},
      {'%', ' ', ' ', ' ', '%', '%'},
      {'%', 'P', ' ', '%', '.', '%'},
      {'%', '.', '%', ' ', '.', '%'},
      {'%', '.', '.', '.', '.', '%'},
      {'%', '%', '%', '%', '%', '%'}
    };

    Search x = new DepthFirstSearch("test-files/badGreedy.txt");
    MazeSolution actual = x.solve();

    System.out.println(actual.toString());

    assertEquals(actual.pathCost, 7);
    assertEquals(actual.numNodesExpanded, 7);
    assertMazesAreEqual(actual, expectedPath);
  }