You can quite easily use this along with OpenForager's source ( https://github.com/pixelgriffin/OpenForager ) and some human mouse movement (google around) to put together a fully functional bilge bot.
For example, (without HMM)

They ensure that when people make changes to code, that everything still works as expected. Sometimes changes can affect areas of code that you may not expect, or you make a change that's supposed to be the same functionally but perhaps is written more cleanly or without unnecessary code. Good unit tests are there as a safety net for you and any other developer working on your code. They're also a nice indication for when you've written some code poorly, if something can't be unit tested (and that's because of something within your control) it's not written well.

Looked over the tests, often it's best to use ASSERT_TRUE and ASSERT_FALSE instead of ASSERT_EQUALS for booleans.
Looking at board_t, the definition as a vector<char> is a bit wonky but it's nice in that you can use the overloaded == for ASSERT_EQUALS comparisons
otherwise looking good, you may want to use the following algo for moving pieces up instead:

Code:

scan over all c in columns
scan over all places r in c
if target to fill is set and r is not empty //second
swap(r, target to fill) //first
target to fill += BOARD_WIDTH //move target one down
else if r is empty
target to fill = r //first
target to fill is set //second
reset target to fill //or just define the scope properly

for this target to fill should be pair_type<int_type r, bool set>
disclaimer: disclaimed