Path: blob/master/libraries/AP_Common/tests/test_bitmask.cpp
9420 views
#include <AP_gtest.h>1#include <AP_HAL/AP_HAL.h>23#include <AP_Common/Bitmask.h>45const AP_HAL::HAL& hal = AP_HAL::get_HAL();67template<int N>8void bitmask_tests(void)9{10Bitmask<N> x;11EXPECT_EQ(0, x.count());12EXPECT_EQ(-1, x.first_set());13x.set(5);14EXPECT_EQ(1, x.count());15EXPECT_EQ(5, x.first_set());16x.clear(5);17EXPECT_EQ(0, x.count());18EXPECT_EQ(-1, x.first_set());1920EXPECT_EQ(-1, x.first_set());21x.set(N-7);22EXPECT_EQ(N-7, x.first_set());23x.clear(N-7);24EXPECT_EQ(-1, x.first_set());2526EXPECT_EQ(-1, x.first_set());27x.set(0);28x.set(5);29x.set(6);30x.set(N-1);31EXPECT_EQ(4, x.count());32EXPECT_EQ(0, x.first_set());33EXPECT_EQ(0, x.first_set());34x.clear(0);35EXPECT_EQ(5, x.first_set());36EXPECT_EQ(5, x.first_set());37x.clear(5);38EXPECT_EQ(6, x.first_set());39EXPECT_EQ(6, x.first_set());40x.clear(6);41EXPECT_EQ(N-1, x.first_set());42EXPECT_EQ(N-1, x.first_set());43x.clear(N-1);44EXPECT_EQ(-1, x.first_set());4546Bitmask<N> x2;47x2 = x;4849#if CONFIG_HAL_BOARD == HAL_BOARD_LINUX50x.clear(N+1);51#elif CONFIG_HAL_BOARD == HAL_BOARD_SITL52EXPECT_EXIT(x.clear(N+1), testing::KilledBySignal(SIGABRT), "AP_InternalError::error_t::bitmask_range");53#endif5455#if CONFIG_HAL_BOARD == HAL_BOARD_LINUX56x.set(N+1);57#elif CONFIG_HAL_BOARD == HAL_BOARD_SITL58EXPECT_EXIT(x.set(N+1), testing::KilledBySignal(SIGABRT), "AP_InternalError::error_t::bitmask_range");59#endif6061for (uint8_t i=0; i<N; i++) {62EXPECT_EQ(x2.get(i), x.get(i));63}6465#if CONFIG_HAL_BOARD == HAL_BOARD_LINUX66EXPECT_EQ(false, x.get(N+1));67EXPECT_EQ(false, x2.get(N+1));68#elif CONFIG_HAL_BOARD == HAL_BOARD_SITL69EXPECT_EXIT(x2.get(N+1), testing::KilledBySignal(SIGABRT), "AP_InternalError::error_t::bitmask_range");70#endif71}7273// bitmasks are composed of 32 bit words, so test those boundaries74TEST(Bitmask, Tests31) { bitmask_tests<31>(); }75TEST(Bitmask, Tests32) { bitmask_tests<32>(); }76TEST(Bitmask, Tests33) { bitmask_tests<33>(); }77TEST(Bitmask, Tests47) { bitmask_tests<47>(); }78TEST(Bitmask, Tests48) { bitmask_tests<48>(); }79TEST(Bitmask, Tests49) { bitmask_tests<49>(); }80TEST(Bitmask, Tests63) { bitmask_tests<63>(); }81TEST(Bitmask, Tests64) { bitmask_tests<64>(); }82TEST(Bitmask, Tests65) { bitmask_tests<65>(); }8384template<int N>85void bitmask_setall(void)86{87Bitmask<N> x;88EXPECT_EQ(-1, x.first_set());89EXPECT_EQ(false, x.get(N-4));90EXPECT_EQ(0, x.count());91x.setall();92EXPECT_EQ(0, x.first_set());93EXPECT_EQ(N, x.count());94x.clear(0);95EXPECT_EQ(1, x.first_set());96x.clear(1);97EXPECT_EQ(2, x.first_set());98EXPECT_EQ(true, x.get(N-4));99EXPECT_EQ(false, x.empty());100x.clearall();101EXPECT_EQ(-1, x.first_set());102EXPECT_EQ(false, x.get(N-4));103EXPECT_EQ(true, x.empty());104EXPECT_EQ(0, x.count());105}106107TEST(Bitmask, SetAll31) { bitmask_setall<31>(); }108TEST(Bitmask, SetAll32) { bitmask_setall<32>(); }109TEST(Bitmask, SetAll33) { bitmask_setall<33>(); }110TEST(Bitmask, SetAll47) { bitmask_setall<47>(); }111TEST(Bitmask, SetAll48) { bitmask_setall<48>(); }112TEST(Bitmask, SetAll49) { bitmask_setall<49>(); }113TEST(Bitmask, SetAll63) { bitmask_setall<63>(); }114TEST(Bitmask, SetAll64) { bitmask_setall<64>(); }115TEST(Bitmask, SetAll65) { bitmask_setall<65>(); }116117template<int N>118void bitmask_assignment(void)119{120Bitmask<N> x;121x.set(0);122x.set(5);123x.set(6);124x.set(N-1);125126Bitmask<N> y;127y = x;128EXPECT_EQ(true, x == y);129x.clear(0);130EXPECT_EQ(true, y.get(0));131EXPECT_EQ(true, y.get(5));132EXPECT_EQ(true, y.get(6));133EXPECT_EQ(true, y.get(N-1));134}135136TEST(Bitmask, Assignment31) { bitmask_assignment<31>(); }137TEST(Bitmask, Assignment32) { bitmask_assignment<32>(); }138TEST(Bitmask, Assignment33) { bitmask_assignment<33>(); }139TEST(Bitmask, Assignment47) { bitmask_assignment<47>(); }140TEST(Bitmask, Assignment48) { bitmask_assignment<48>(); }141TEST(Bitmask, Assignment49) { bitmask_assignment<49>(); }142TEST(Bitmask, Assignment63) { bitmask_assignment<63>(); }143TEST(Bitmask, Assignment64) { bitmask_assignment<64>(); }144TEST(Bitmask, Assignment65) { bitmask_assignment<65>(); }145146AP_GTEST_PANIC()147AP_GTEST_MAIN()148149150