openbox/obt/bsearch_unittest.c
Dana Jansens 047a201498 Fix bugs and add unit tests for BSEARCH()
Also adds running unit tests to the release/go script so we can be
sure that all tests pass before we make a release.
2013-09-01 15:15:53 -04:00

316 lines
9.3 KiB
C

#include "obt/unittest_base.h"
#include "obt/bsearch.h"
#include <glib.h>
static void empty() {
TEST_START();
BSEARCH_SETUP();
int* array = NULL;
guint array_size = 0;
/* Search in an empty array. */
BSEARCH(int, array, 0, array_size, 10);
EXPECT_BOOL_EQ(FALSE, BSEARCH_FOUND());
EXPECT_UINT_EQ(0, BSEARCH_AT());
/* Search in an empty array with a non-zero starting position. */
BSEARCH(int, array, 10, array_size, -10);
EXPECT_BOOL_EQ(FALSE, BSEARCH_FOUND());
EXPECT_UINT_EQ(10, BSEARCH_AT());
TEST_END();
}
static void single_element() {
TEST_START();
BSEARCH_SETUP();
int array[1];
guint array_size = 1;
/* Search for something smaller than the only element. */
array[0] = 20;
BSEARCH(int, array, 0, array_size, -10);
EXPECT_BOOL_EQ(FALSE, BSEARCH_FOUND());
EXPECT_UINT_EQ(0, BSEARCH_AT());
EXPECT_BOOL_EQ(FALSE, BSEARCH_FOUND_NEAREST_SMALLER());
/* Search for something bigger than the only element. */
array[0] = 20;
BSEARCH(int, array, 0, array_size, 30);
EXPECT_BOOL_EQ(FALSE, BSEARCH_FOUND());
EXPECT_UINT_EQ(0, BSEARCH_AT());
EXPECT_BOOL_EQ(TRUE, BSEARCH_FOUND_NEAREST_SMALLER());
/* Search for something smaller than the only element. */
array[0] = -20;
BSEARCH(int, array, 0, array_size, -30);
EXPECT_BOOL_EQ(FALSE, BSEARCH_FOUND());
EXPECT_UINT_EQ(0, BSEARCH_AT());
EXPECT_BOOL_EQ(FALSE, BSEARCH_FOUND_NEAREST_SMALLER());
/* Search for something bigger than the only element. */
array[0] = -20;
BSEARCH(int, array, 0, array_size, 10);
EXPECT_BOOL_EQ(FALSE, BSEARCH_FOUND());
EXPECT_UINT_EQ(0, BSEARCH_AT());
EXPECT_BOOL_EQ(TRUE, BSEARCH_FOUND_NEAREST_SMALLER());
/* Search for the only element that exists. */
array[0] = -20;
BSEARCH(int, array, 0, array_size, -20);
EXPECT_BOOL_EQ(TRUE, BSEARCH_FOUND());
EXPECT_UINT_EQ(0, BSEARCH_AT());
EXPECT_BOOL_EQ(FALSE, BSEARCH_FOUND_NEAREST_SMALLER());
TEST_END();
}
static void single_element_nonzero_start() {
TEST_START();
BSEARCH_SETUP();
int array[10];
guint array_start = 9;
guint array_size = 1;
/* Search for something smaller than the only element. */
array[array_start] = 20;
BSEARCH(int, array, array_start, array_size, -10);
EXPECT_BOOL_EQ(FALSE, BSEARCH_FOUND());
EXPECT_UINT_EQ(array_start, BSEARCH_AT());
EXPECT_BOOL_EQ(FALSE, BSEARCH_FOUND_NEAREST_SMALLER());
/* Search for something bigger than the only element. */
array[array_start] = 20;
BSEARCH(int, array, array_start, array_size, 30);
EXPECT_BOOL_EQ(FALSE, BSEARCH_FOUND());
EXPECT_UINT_EQ(array_start, BSEARCH_AT());
EXPECT_BOOL_EQ(TRUE, BSEARCH_FOUND_NEAREST_SMALLER());
/* Search for something smaller than the only element. */
array[array_start] = -20;
BSEARCH(int, array, array_start, array_size, -30);
EXPECT_BOOL_EQ(FALSE, BSEARCH_FOUND());
EXPECT_UINT_EQ(array_start, BSEARCH_AT());
EXPECT_BOOL_EQ(FALSE, BSEARCH_FOUND_NEAREST_SMALLER());
/* Search for something bigger than the only element. */
array[array_start] = -20;
BSEARCH(int, array, array_start, array_size, 10);
EXPECT_BOOL_EQ(FALSE, BSEARCH_FOUND());
EXPECT_UINT_EQ(array_start, BSEARCH_AT());
EXPECT_BOOL_EQ(TRUE, BSEARCH_FOUND_NEAREST_SMALLER());
/* Search for the only element that exists. */
array[array_start] = -20;
BSEARCH(int, array, array_start, array_size, -20);
EXPECT_BOOL_EQ(TRUE, BSEARCH_FOUND());
EXPECT_UINT_EQ(array_start, BSEARCH_AT());
EXPECT_BOOL_EQ(FALSE, BSEARCH_FOUND_NEAREST_SMALLER());
TEST_END();
}
static void present() {
TEST_START();
BSEARCH_SETUP();
int array[5];
guint array_start = 0;
guint array_size = 5;
array[0] = 10;
array[1] = 12;
array[2] = 14;
array[3] = 16;
array[4] = 18;
/* Search for something that is in the array. */
BSEARCH(int, array, array_start, array_size, 10);
EXPECT_BOOL_EQ(TRUE, BSEARCH_FOUND());
EXPECT_UINT_EQ(0, BSEARCH_AT());
EXPECT_BOOL_EQ(FALSE, BSEARCH_FOUND_NEAREST_SMALLER());
BSEARCH(int, array, array_start, array_size, 12);
EXPECT_BOOL_EQ(TRUE, BSEARCH_FOUND());
EXPECT_UINT_EQ(1, BSEARCH_AT());
EXPECT_BOOL_EQ(FALSE, BSEARCH_FOUND_NEAREST_SMALLER());
BSEARCH(int, array, array_start, array_size, 14);
EXPECT_BOOL_EQ(TRUE, BSEARCH_FOUND());
EXPECT_UINT_EQ(2, BSEARCH_AT());
EXPECT_BOOL_EQ(FALSE, BSEARCH_FOUND_NEAREST_SMALLER());
BSEARCH(int, array, array_start, array_size, 16);
EXPECT_BOOL_EQ(TRUE, BSEARCH_FOUND());
EXPECT_UINT_EQ(3, BSEARCH_AT());
EXPECT_BOOL_EQ(FALSE, BSEARCH_FOUND_NEAREST_SMALLER());
BSEARCH(int, array, array_start, array_size, 18);
EXPECT_BOOL_EQ(TRUE, BSEARCH_FOUND());
EXPECT_UINT_EQ(4, BSEARCH_AT());
EXPECT_BOOL_EQ(FALSE, BSEARCH_FOUND_NEAREST_SMALLER());
TEST_END();
}
static void present_nonzero_start() {
TEST_START();
BSEARCH_SETUP();
int array[5];
guint array_start = 2;
guint array_size = 3;
array[0] = 10;
array[1] = 12;
array[2] = 14;
array[3] = 16;
array[4] = 18;
/* Search for something that is in the array. */
BSEARCH(int, array, array_start, array_size, 10);
EXPECT_BOOL_EQ(FALSE, BSEARCH_FOUND());
EXPECT_UINT_EQ(array_start, BSEARCH_AT());
EXPECT_BOOL_EQ(FALSE, BSEARCH_FOUND_NEAREST_SMALLER());
BSEARCH(int, array, array_start, array_size, 12);
EXPECT_BOOL_EQ(FALSE, BSEARCH_FOUND());
EXPECT_UINT_EQ(array_start, BSEARCH_AT());
EXPECT_BOOL_EQ(FALSE, BSEARCH_FOUND_NEAREST_SMALLER());
BSEARCH(int, array, array_start, array_size, 14);
EXPECT_BOOL_EQ(TRUE, BSEARCH_FOUND());
EXPECT_UINT_EQ(2, BSEARCH_AT());
EXPECT_BOOL_EQ(FALSE, BSEARCH_FOUND_NEAREST_SMALLER());
BSEARCH(int, array, array_start, array_size, 16);
EXPECT_BOOL_EQ(TRUE, BSEARCH_FOUND());
EXPECT_UINT_EQ(3, BSEARCH_AT());
EXPECT_BOOL_EQ(FALSE, BSEARCH_FOUND_NEAREST_SMALLER());
BSEARCH(int, array, array_start, array_size, 18);
EXPECT_BOOL_EQ(TRUE, BSEARCH_FOUND());
EXPECT_UINT_EQ(4, BSEARCH_AT());
EXPECT_BOOL_EQ(FALSE, BSEARCH_FOUND_NEAREST_SMALLER());
TEST_END();
}
static void missing() {
TEST_START();
BSEARCH_SETUP();
int array[5];
guint array_start = 0;
guint array_size = 5;
array[0] = 10;
array[1] = 12;
array[2] = 14;
array[3] = 16;
array[4] = 18;
/* Search for something that is _not_ in the array. */
BSEARCH(int, array, array_start, array_size, 9);
EXPECT_BOOL_EQ(FALSE, BSEARCH_FOUND());
EXPECT_UINT_EQ(0, BSEARCH_AT());
EXPECT_BOOL_EQ(FALSE, BSEARCH_FOUND_NEAREST_SMALLER());
BSEARCH(int, array, array_start, array_size, 11);
EXPECT_BOOL_EQ(FALSE, BSEARCH_FOUND());
EXPECT_UINT_EQ(0, BSEARCH_AT());
EXPECT_BOOL_EQ(TRUE, BSEARCH_FOUND_NEAREST_SMALLER());
BSEARCH(int, array, array_start, array_size, 13);
EXPECT_BOOL_EQ(FALSE, BSEARCH_FOUND());
EXPECT_UINT_EQ(1, BSEARCH_AT());
EXPECT_BOOL_EQ(TRUE, BSEARCH_FOUND_NEAREST_SMALLER());
BSEARCH(int, array, array_start, array_size, 15);
EXPECT_BOOL_EQ(FALSE, BSEARCH_FOUND());
EXPECT_UINT_EQ(2, BSEARCH_AT());
EXPECT_BOOL_EQ(TRUE, BSEARCH_FOUND_NEAREST_SMALLER());
BSEARCH(int, array, array_start, array_size, 17);
EXPECT_BOOL_EQ(FALSE, BSEARCH_FOUND());
EXPECT_UINT_EQ(3, BSEARCH_AT());
EXPECT_BOOL_EQ(TRUE, BSEARCH_FOUND_NEAREST_SMALLER());
BSEARCH(int, array, array_start, array_size, 19);
EXPECT_BOOL_EQ(FALSE, BSEARCH_FOUND());
EXPECT_UINT_EQ(4, BSEARCH_AT());
EXPECT_BOOL_EQ(TRUE, BSEARCH_FOUND_NEAREST_SMALLER());
TEST_END();
}
static void missing_nonzero_start() {
TEST_START();
BSEARCH_SETUP();
int array[5];
guint array_start = 2;
guint array_size = 3;
array[0] = 10;
array[1] = 12;
array[2] = 14;
array[3] = 16;
array[4] = 18;
/* Search for something that is _not_ in the array. */
BSEARCH(int, array, array_start, array_size, 9);
EXPECT_BOOL_EQ(FALSE, BSEARCH_FOUND());
EXPECT_UINT_EQ(array_start, BSEARCH_AT());
EXPECT_BOOL_EQ(FALSE, BSEARCH_FOUND_NEAREST_SMALLER());
BSEARCH(int, array, array_start, array_size, 11);
EXPECT_BOOL_EQ(FALSE, BSEARCH_FOUND());
EXPECT_UINT_EQ(array_start, BSEARCH_AT());
EXPECT_BOOL_EQ(FALSE, BSEARCH_FOUND_NEAREST_SMALLER());
BSEARCH(int, array, array_start, array_size, 13);
EXPECT_BOOL_EQ(FALSE, BSEARCH_FOUND());
EXPECT_UINT_EQ(array_start, BSEARCH_AT());
EXPECT_BOOL_EQ(FALSE, BSEARCH_FOUND_NEAREST_SMALLER());
BSEARCH(int, array, array_start, array_size, 15);
EXPECT_BOOL_EQ(FALSE, BSEARCH_FOUND());
EXPECT_UINT_EQ(2, BSEARCH_AT());
EXPECT_BOOL_EQ(TRUE, BSEARCH_FOUND_NEAREST_SMALLER());
BSEARCH(int, array, array_start, array_size, 17);
EXPECT_BOOL_EQ(FALSE, BSEARCH_FOUND());
EXPECT_UINT_EQ(3, BSEARCH_AT());
EXPECT_BOOL_EQ(TRUE, BSEARCH_FOUND_NEAREST_SMALLER());
BSEARCH(int, array, array_start, array_size, 19);
EXPECT_BOOL_EQ(FALSE, BSEARCH_FOUND());
EXPECT_UINT_EQ(4, BSEARCH_AT());
EXPECT_BOOL_EQ(TRUE, BSEARCH_FOUND_NEAREST_SMALLER());
TEST_END();
}
void run_bsearch_unittest() {
unittest_start_suite("bsearch");
empty();
single_element();
single_element_nonzero_start();
present();
present_nonzero_start();
missing();
missing_nonzero_start();
unittest_end_suite();
}