TEST(Board, block_refCount) {
  int init_array[] = {
    3,3,3,3,3,3,3,3,3,3,3,
    3,0,1,1,1,0,0,0,0,0,3,
    3,1,2,2,1,0,0,0,2,0,3,
    3,0,1,2,2,1,0,0,0,0,3,
    3,0,1,2,0,0,0,0,0,0,3,
    3,0,0,1,0,1,0,0,0,0,3,
    3,0,0,0,0,0,0,0,0,0,3,
    3,2,2,2,0,0,0,0,0,0,3,
    3,1,1,1,2,0,0,0,1,0,3,
    3,1,2,0,0,0,0,0,0,0,3,
    3,3,3,3,3,3,3,3,3,3,3
  };
  Board board(9, init_array);

  EXPECT_EQ(1, board.getBelongBlock(0,1)->refCount());
  EXPECT_EQ(4, board.getBelongBlock(1,0)->refCount());
  EXPECT_EQ(1, board.getBelongBlock(2,4)->refCount());
  EXPECT_EQ(1, board.getBelongBlock(4,4)->refCount());

  board.put(3,4,1);
  EXPECT_EQ(4, board.getBelongBlock(3,4)->refCount());
  board.undo();
  EXPECT_EQ(1, board.getBelongBlock(2,4)->refCount());
  EXPECT_EQ(1, board.getBelongBlock(4,4)->refCount());

  BlockPtr oldBlock = board.getBelongBlock(1,1);
  EXPECT_EQ(5, oldBlock->refCount());
  board.put(3,3,1);
  EXPECT_EQ(1, oldBlock->refCount());
  board.undo();
  EXPECT_EQ(5, oldBlock->refCount());
}
TEST(Board, refCount_test_for_snapshot) {
  int init_array[] = {
    3,3,3,3,3,3,3,3,3,3,3,
    3,0,1,1,1,0,0,0,0,0,3,
    3,1,2,2,1,0,0,0,2,0,3,
    3,0,1,2,2,1,1,0,0,0,3,
    3,0,1,2,0,0,0,0,0,0,3,
    3,0,0,1,1,1,0,0,0,0,3,
    3,0,0,0,0,0,0,0,0,0,3,
    3,0,0,0,0,0,0,0,0,0,3,
    3,0,0,1,0,0,0,0,1,0,3,
    3,0,0,0,0,0,0,0,0,0,3,
    3,3,3,3,3,3,3,3,3,3,3
  };
  Board board(9, init_array);

  board.put(5,3,2);
  EXPECT_EQ(2, board.getBelongBlock(5,3)->refCount());
  board.put(5,4,1);
  EXPECT_EQ(5, board.getBelongBlock(5,4)->refCount());
  board.put(3,3,2);
  EXPECT_EQ(7, board.getBelongBlock(3,3)->refCount());
  BlockPtr old = board.getBelongBlock(3,3);
  board.put(4,3,1);
  EXPECT_EQ(9, board.getBelongBlock(4,3)->refCount());
  EXPECT_EQ(2, old->refCount());
  board.takeSnapshot();
  board.put(3,3,2);
  board.put(3,2,1);
  board.restoreStateFromSnapshot();
  EXPECT_EQ(9, board.getBelongBlock(4,3)->refCount());
  board.undo();
  EXPECT_EQ(2, board.getBelongBlock(4,2)->refCount());
  EXPECT_EQ(5, board.getBelongBlock(4,4)->refCount());
  EXPECT_EQ(7, board.getBelongBlock(3,3)->refCount());
}