Added SILC Bit Operations API.
[silc.git] / lib / silcutil / tests / test_silcbitops.c
diff --git a/lib/silcutil/tests/test_silcbitops.c b/lib/silcutil/tests/test_silcbitops.c
new file mode 100644 (file)
index 0000000..adbd8d0
--- /dev/null
@@ -0,0 +1,137 @@
+/* Bit operation tests */
+
+#include "silc.h"
+
+int main(int argc, char **argv)
+{
+  SilcBool success = FALSE;
+  SILC_BITMAP_DECLARE(bitmap, 500);
+  int size = SILC_BITMAP_SIZE(500), bit;
+
+  if (argc > 1 && !strcmp(argv[1], "-d")) {
+    silc_log_debug(TRUE);
+    silc_log_quick(TRUE);
+    silc_log_debug_hexdump(TRUE);
+    silc_log_set_debug_string("*bit*");
+  }
+
+  silc_bit_clear_bitmap(bitmap, size);
+
+  SILC_LOG_DEBUG(("Setting bit 0"));
+  if (!silc_bit_set(bitmap, size, 0))
+    goto err;
+  bit = silc_bit_get(bitmap, size, 0);
+  SILC_LOG_DEBUG(("Get bit 0: %d", bit));
+  if (bit < 0)
+    goto err;
+  if (bit != 1)
+    goto err;
+
+  SILC_LOG_DEBUG(("Setting bit 100"));
+  if (!silc_bit_set(bitmap, size, 100))
+    goto err;
+  bit = silc_bit_get(bitmap, size, 100);
+  SILC_LOG_DEBUG(("Get bit 100: %d", bit));
+  if (bit < 0)
+    goto err;
+  if (bit != 1)
+    goto err;
+
+  SILC_LOG_DEBUG(("Clear bit 100"));
+  if (!silc_bit_clear(bitmap, size, 100))
+    goto err;
+  bit = silc_bit_get(bitmap, size, 100);
+  SILC_LOG_DEBUG(("Get bit 100: %d", bit));
+  if (bit < 0)
+    goto err;
+  if (bit != 0)
+    goto err;
+
+  SILC_LOG_DEBUG(("Toggle bit 99"));
+  if (!silc_bit_toggle(bitmap, size, 99))
+    goto err;
+  bit = silc_bit_get(bitmap, size, 99);
+  SILC_LOG_DEBUG(("Get bit 99: %d", bit));
+  if (bit < 0)
+    goto err;
+  if (bit != 1)
+    goto err;
+
+  SILC_LOG_DEBUG(("Test and toggle bit 499"));
+  bit = silc_bit_test_and_toggle(bitmap, size, 499);
+  if (bit != 0)
+    goto err;
+  bit = silc_bit_get(bitmap, size, 499);
+  SILC_LOG_DEBUG(("Get bit 499: %d", bit));
+  if (bit < 0)
+    goto err;
+  if (bit != 1)
+    goto err;
+
+  SILC_LOG_DEBUG(("Test and set bit 10"));
+  bit = silc_bit_test_and_set(bitmap, size, 10);
+  if (bit != 0)
+    goto err;
+  bit = silc_bit_get(bitmap, size, 10);
+  SILC_LOG_DEBUG(("Get bit 10: %d", bit));
+  if (bit < 0)
+    goto err;
+  if (bit != 1)
+    goto err;
+
+  SILC_LOG_DEBUG(("Test overflow"));
+  if (silc_bit_set(bitmap, size, 1500))
+    goto err;
+  SILC_LOG_DEBUG(("Overflow detected"));
+
+  SILC_LOG_DEBUG(("Find first set bit"));
+  bit = silc_bit_ffs(bitmap, size);
+  SILC_LOG_DEBUG(("First set bit: %d", bit));
+  if (bit != 0)
+    goto err;
+
+  SILC_LOG_DEBUG(("Find next set bit"));
+  bit = silc_bit_fns(bitmap, size, bit + 1);
+  SILC_LOG_DEBUG(("Next set bit: %d", bit));
+  if (bit != 10)
+    goto err;
+
+  SILC_LOG_DEBUG(("Find all set bits"));
+  bit = 0;
+  do {
+    bit = silc_bit_fns(bitmap, size, bit);
+    if (bit != -1) {
+      SILC_LOG_DEBUG(("Set bit: %d", bit));
+      bit++;
+    }
+  } while (bit != -1);
+
+  SILC_LOG_DEBUG(("Find first zero bit"));
+  bit = silc_bit_ffz(bitmap, size);
+  SILC_LOG_DEBUG(("First zero bit: %d", bit));
+  if (bit != 1)
+    goto err;
+
+  SILC_LOG_DEBUG(("Find next zero bit"));
+  bit = silc_bit_fnz(bitmap, size, bit + 1);
+  SILC_LOG_DEBUG(("Next zero bit: %d", bit));
+  if (bit != 2)
+    goto err;
+
+  SILC_LOG_DEBUG(("Clear bitmap"));
+  silc_bit_clear_bitmap(bitmap, size);
+
+  SILC_LOG_DEBUG(("Check for set bits"));
+  bit = silc_bit_ffs(bitmap, size);
+  if (bit > 0)
+    goto err;
+  SILC_LOG_DEBUG(("No set bits"));
+
+  success = TRUE;
+
+ err:
+  SILC_LOG_DEBUG(("Testing was %s", success ? "SUCCESS" : "FAILURE"));
+  fprintf(stderr, "Testing was %s\n", success ? "SUCCESS" : "FAILURE");
+
+  return success;
+}