]> git.scottworley.com Git - slidingtile/commitdiff
Input validation
authorScott Worley <scottworley@scottworley.com>
Thu, 31 Dec 2015 08:22:27 +0000 (00:22 -0800)
committerScott Worley <scottworley@scottworley.com>
Thu, 31 Dec 2015 08:22:27 +0000 (00:22 -0800)
sliding_tile_lib.cc
sliding_tile_lib.h
sliding_tile_lib_test.cc

index 24642f1480cdc78c671afa16f3436c350e9b6164..3b7806bd0a204eb113146871eb5deaedcfbb7fd3 100644 (file)
@@ -21,6 +21,29 @@ signed char adjacent[BOARD_SIZE][5] = {
   11,  14,  -1,  -1,  -1,
 };
 
+bool Board::is_valid() {
+  bool seen[BOARD_SIZE];
+  for (int i = 0; i < BOARD_SIZE; i++) {
+    seen[i] = false;
+  }
+
+  for (int i = 0; i < BOARD_SIZE; i++) {
+    if (board[i] < 0 || board[i] >= BOARD_SIZE || seen[board[i]]) {
+      return false;
+    }
+    seen[board[i]] = true;
+  }
+
+  // Redundant because pigeon-hole-principle, but check anyway
+  for (int i = 0; i < BOARD_SIZE; i++) {
+    if (!seen[i]) {
+      return false;
+    }
+  }
+
+  return true;
+}
+
 std::istream& operator>>(std::istream& is, Board& board) {
   for (int i = 0; i < BOARD_SIZE; i++) {
     if (!is.good()) {
@@ -35,5 +58,8 @@ std::istream& operator>>(std::istream& is, Board& board) {
     is >> numeric;
     board.board[i] = numeric;
   }
+  if (!board.is_valid()) {
+    is.setstate(std::istream::failbit);
+  }
   return is;
 }
index 1ffe6fa24c3deaf33f1a4f475ff9eff0e8e26ca3..89c65c1ee51c7b3ecc2a0e6c561c2a2e6c78a9db 100644 (file)
@@ -8,6 +8,7 @@ const int BOARD_SIZE = BOARD_DIM * BOARD_DIM;
 
 struct Board {
   signed char board[BOARD_SIZE];
+  bool is_valid();
 };
 std::istream& operator>>(std::istream& is, Board& board);
 
index a0a6b52b01f97903359ee26120021a5c2b50e413..7f032a436761d278e8fdf61230f0d94607516408 100644 (file)
@@ -55,3 +55,24 @@ TEST(Board, NonNumericInput) {
   is >> b;
   EXPECT_TRUE(is.fail());
 }
+
+TEST(Board, RepeatedTileInput) {
+  std::istringstream is{"15,15,9,13,3,1,12,8,0,11,6,4,7,5,2,10"};
+  Board b;
+  is >> b;
+  EXPECT_TRUE(is.fail());
+}
+
+TEST(Board, LowTileInput) {
+  std::istringstream is{"-1,14,9,13,3,1,12,8,0,11,6,4,7,5,2,10"};
+  Board b;
+  is >> b;
+  EXPECT_TRUE(is.fail());
+}
+
+TEST(Board, HighTileInput) {
+  std::istringstream is{"16,14,9,13,3,1,12,8,0,11,6,4,7,5,2,10"};
+  Board b;
+  is >> b;
+  EXPECT_TRUE(is.fail());
+}