// This module does unit testing of m_libcbase.

#include <assert.h>
#include <stdio.h>
#include <stdlib.h>

#include "pub_tool_basics.h"  /* UInt et al, needed for pub_tool_vki.h */
#include "pub_tool_vki.h"
#include "m_libcbase.c"

#define  CHECK(x) \
   if (!x) { fprintf(stderr, "failure: %s:%d\n", __FILE__, __LINE__); }


void test_VG_STREQ(void)
{
   CHECK( ! VG_STREQ(NULL,    NULL) );  // Nb: strcmp() considers these equal
   CHECK( ! VG_STREQ(NULL,    "ab") );  // Nb: strcmp() seg faults on this
   CHECK( ! VG_STREQ("ab",    NULL) );  // Nb: strcmp() seg faults on this
   CHECK( ! VG_STREQ("",      "a")  );
   CHECK( ! VG_STREQ("a",     "")   );
   CHECK( ! VG_STREQ("abc",   "abcd"));
   CHECK( ! VG_STREQ("abcd",  "abc") );
   CHECK( ! VG_STREQ("Abcd",  "abcd"));
   CHECK( ! VG_STREQ("abcd",  "Abcd"));

   CHECK( VG_STREQ("",     "") );
   CHECK( VG_STREQ("a",    "a") );
   CHECK( VG_STREQ("abcd", "abcd") );
}

void test_VG_STREQN(void)
{
   CHECK( ! VG_STREQN(0, NULL,    NULL) );
   CHECK( ! VG_STREQN(5, NULL,    NULL) );
   CHECK( ! VG_STREQN(0, NULL,    "ab") );
   CHECK( ! VG_STREQN(5, NULL,    "ab") );
   CHECK( ! VG_STREQN(0, "ab",    NULL) );
   CHECK( ! VG_STREQN(1, "",      "a")  );
   CHECK( ! VG_STREQN(1, "a",     "")   );
   CHECK( ! VG_STREQN(4, "abc",   "abcd"));
   CHECK( ! VG_STREQN(4, "abcd",  "abc") );
   CHECK( ! VG_STREQN(1, "Abcd",  "abcd"));
   CHECK( ! VG_STREQN(4, "Abcd",  "abcd"));
   CHECK( ! VG_STREQN(4, "abcd",  "abce"));
   CHECK( ! VG_STREQN(9, "abcd",  "abce"));

   CHECK( VG_STREQN(0, "",     "") );
   CHECK( VG_STREQN(1, "",     "") );
   CHECK( VG_STREQN(0, "a",    "a") );
   CHECK( VG_STREQN(1, "a",    "a") );
   CHECK( VG_STREQN(2, "a",    "a") );
   CHECK( VG_STREQN(9, "a",    "a") );
   CHECK( VG_STREQN(1, "ab",   "ac"));
   CHECK( VG_STREQN(3, "abcd", "abce"));
}

// On PPC/Linux VKI_PAGE_SIZE is a variable, not a macro.
#if defined(VGP_ppc32_linux) || defined(VGP_ppc64_linux)
unsigned long VKI_PAGE_SIZE  = 1UL << 12;
#elif defined(VGP_arm64_linux)
unsigned long VKI_PAGE_SIZE  = 1UL << 16;
#endif

void test_VG_IS_XYZ_ALIGNED(void)
{
   CHECK(   VG_IS_2_ALIGNED(0x0) );
   CHECK( ! VG_IS_2_ALIGNED(0x1) );
   CHECK(   VG_IS_2_ALIGNED(0x2) );
   CHECK( ! VG_IS_2_ALIGNED(0x3) );
   CHECK(   VG_IS_2_ALIGNED(0x4) );
   CHECK( ! VG_IS_2_ALIGNED(0x5) );
   CHECK(   VG_IS_2_ALIGNED(0x6) );
   CHECK( ! VG_IS_2_ALIGNED(0x7) );
   CHECK(   VG_IS_2_ALIGNED(0x8) );
   CHECK( ! VG_IS_2_ALIGNED(0x9) );
   CHECK(   VG_IS_2_ALIGNED(0xa) );
   CHECK( ! VG_IS_2_ALIGNED(0xb) );
   CHECK(   VG_IS_2_ALIGNED(0xc) );
   CHECK( ! VG_IS_2_ALIGNED(0xd) );
   CHECK(   VG_IS_2_ALIGNED(0xe) );
   CHECK( ! VG_IS_2_ALIGNED(0xf) );

   CHECK(   VG_IS_4_ALIGNED(0x0) );
   CHECK( ! VG_IS_4_ALIGNED(0x1) );
   CHECK( ! VG_IS_4_ALIGNED(0x2) );
   CHECK( ! VG_IS_4_ALIGNED(0x3) );
   CHECK(   VG_IS_4_ALIGNED(0x4) );
   CHECK( ! VG_IS_4_ALIGNED(0x5) );
   CHECK( ! VG_IS_4_ALIGNED(0x6) );
   CHECK( ! VG_IS_4_ALIGNED(0x7) );
   CHECK(   VG_IS_4_ALIGNED(0x8) );
   CHECK( ! VG_IS_4_ALIGNED(0x9) );
   CHECK( ! VG_IS_4_ALIGNED(0xa) );
   CHECK( ! VG_IS_4_ALIGNED(0xb) );
   CHECK(   VG_IS_4_ALIGNED(0xc) );
   CHECK( ! VG_IS_4_ALIGNED(0xd) );
   CHECK( ! VG_IS_4_ALIGNED(0xe) );
   CHECK( ! VG_IS_4_ALIGNED(0xf) );

   CHECK(   VG_IS_8_ALIGNED(0x0) );
   CHECK( ! VG_IS_8_ALIGNED(0x1) );
   CHECK( ! VG_IS_8_ALIGNED(0x2) );
   CHECK( ! VG_IS_8_ALIGNED(0x3) );
   CHECK( ! VG_IS_8_ALIGNED(0x4) );
   CHECK( ! VG_IS_8_ALIGNED(0x5) );
   CHECK( ! VG_IS_8_ALIGNED(0x6) );
   CHECK( ! VG_IS_8_ALIGNED(0x7) );
   CHECK(   VG_IS_8_ALIGNED(0x8) );
   CHECK( ! VG_IS_8_ALIGNED(0x9) );
   CHECK( ! VG_IS_8_ALIGNED(0xa) );
   CHECK( ! VG_IS_8_ALIGNED(0xb) );
   CHECK( ! VG_IS_8_ALIGNED(0xc) );
   CHECK( ! VG_IS_8_ALIGNED(0xd) );
   CHECK( ! VG_IS_8_ALIGNED(0xe) );
   CHECK( ! VG_IS_8_ALIGNED(0xf) );

   CHECK(   VG_IS_16_ALIGNED(0x0) );
   CHECK( ! VG_IS_16_ALIGNED(0x1) );
   CHECK( ! VG_IS_16_ALIGNED(0x2) );
   CHECK( ! VG_IS_16_ALIGNED(0x3) );
   CHECK( ! VG_IS_16_ALIGNED(0x4) );
   CHECK( ! VG_IS_16_ALIGNED(0x5) );
   CHECK( ! VG_IS_16_ALIGNED(0x6) );
   CHECK( ! VG_IS_16_ALIGNED(0x7) );
   CHECK( ! VG_IS_16_ALIGNED(0x8) );
   CHECK( ! VG_IS_16_ALIGNED(0x9) );
   CHECK( ! VG_IS_16_ALIGNED(0xa) );
   CHECK( ! VG_IS_16_ALIGNED(0xb) );
   CHECK( ! VG_IS_16_ALIGNED(0xc) );
   CHECK( ! VG_IS_16_ALIGNED(0xd) );
   CHECK( ! VG_IS_16_ALIGNED(0xe) );
   CHECK( ! VG_IS_16_ALIGNED(0xf) );

   CHECK(   VG_IS_WORD_ALIGNED(0x0) );
   CHECK( ! VG_IS_WORD_ALIGNED(0x1) );
   CHECK( ! VG_IS_WORD_ALIGNED(0x2) );
   CHECK( ! VG_IS_WORD_ALIGNED(0x3) );
   // 0x4 case below  
   CHECK( ! VG_IS_WORD_ALIGNED(0x5) );
   CHECK( ! VG_IS_WORD_ALIGNED(0x6) );
   CHECK( ! VG_IS_WORD_ALIGNED(0x7) );
   CHECK(   VG_IS_WORD_ALIGNED(0x8) );
   CHECK( ! VG_IS_WORD_ALIGNED(0x9) );
   CHECK( ! VG_IS_WORD_ALIGNED(0xa) );
   CHECK( ! VG_IS_WORD_ALIGNED(0xb) );
   // 0xc case below  
   CHECK( ! VG_IS_WORD_ALIGNED(0xd) );
   CHECK( ! VG_IS_WORD_ALIGNED(0xe) );
   CHECK( ! VG_IS_WORD_ALIGNED(0xf) );
   if        (4 == sizeof(void*)) {
      CHECK(   VG_IS_WORD_ALIGNED(0x4) );
      CHECK(   VG_IS_WORD_ALIGNED(0xc) );
   } else if (8 == sizeof(void*)) {
      CHECK( ! VG_IS_WORD_ALIGNED(0x4) );
      CHECK( ! VG_IS_WORD_ALIGNED(0xc) );
   } else {
      assert(0);
   }

   CHECK(   VG_IS_PAGE_ALIGNED(0x0) );
   CHECK( ! VG_IS_PAGE_ALIGNED(0x1) );
   CHECK( ! VG_IS_PAGE_ALIGNED(0x2) );
   CHECK( ! VG_IS_PAGE_ALIGNED(0x3) );
   CHECK( ! VG_IS_PAGE_ALIGNED(0x4) );
   CHECK( ! VG_IS_PAGE_ALIGNED(VKI_PAGE_SIZE-1) );
   CHECK(   VG_IS_PAGE_ALIGNED(VKI_PAGE_SIZE  ) );
   CHECK( ! VG_IS_PAGE_ALIGNED(VKI_PAGE_SIZE+1) );
}

void test_VG_ROUND_et_al()
{
   CHECK( 0 == VG_ROUNDDN(0, 1) );
   CHECK( 1 == VG_ROUNDDN(1, 1) );
   CHECK( 2 == VG_ROUNDDN(2, 1) );
   CHECK( 3 == VG_ROUNDDN(3, 1) );
   CHECK( 4 == VG_ROUNDDN(4, 1) );
   CHECK( 5 == VG_ROUNDDN(5, 1) );
   CHECK( 6 == VG_ROUNDDN(6, 1) );
   CHECK( 7 == VG_ROUNDDN(7, 1) );

   CHECK( 0 == VG_ROUNDUP(0, 1) );
   CHECK( 1 == VG_ROUNDUP(1, 1) );
   CHECK( 2 == VG_ROUNDUP(2, 1) );
   CHECK( 3 == VG_ROUNDUP(3, 1) );
   CHECK( 4 == VG_ROUNDUP(4, 1) );
   CHECK( 5 == VG_ROUNDUP(5, 1) );
   CHECK( 6 == VG_ROUNDUP(6, 1) );
   CHECK( 7 == VG_ROUNDUP(7, 1) );

   CHECK( 0 == VG_ROUNDDN(0, 2) );
   CHECK( 0 == VG_ROUNDDN(1, 2) );
   CHECK( 2 == VG_ROUNDDN(2, 2) );
   CHECK( 2 == VG_ROUNDDN(3, 2) );
   CHECK( 4 == VG_ROUNDDN(4, 2) );
   CHECK( 4 == VG_ROUNDDN(5, 2) );
   CHECK( 6 == VG_ROUNDDN(6, 2) );
   CHECK( 6 == VG_ROUNDDN(7, 2) );

   CHECK( 0 == VG_ROUNDUP(0, 2) );
   CHECK( 2 == VG_ROUNDUP(1, 2) );
   CHECK( 2 == VG_ROUNDUP(2, 2) );
   CHECK( 4 == VG_ROUNDUP(3, 2) );
   CHECK( 4 == VG_ROUNDUP(4, 2) );
   CHECK( 6 == VG_ROUNDUP(5, 2) );
   CHECK( 6 == VG_ROUNDUP(6, 2) );
   CHECK( 8 == VG_ROUNDUP(7, 2) );

   CHECK( 0 == VG_ROUNDDN(0, 4) );
   CHECK( 0 == VG_ROUNDDN(1, 4) );
   CHECK( 0 == VG_ROUNDDN(2, 4) );
   CHECK( 0 == VG_ROUNDDN(3, 4) );
   CHECK( 4 == VG_ROUNDDN(4, 4) );
   CHECK( 4 == VG_ROUNDDN(5, 4) );
   CHECK( 4 == VG_ROUNDDN(6, 4) );
   CHECK( 4 == VG_ROUNDDN(7, 4) );

   CHECK( 0 == VG_ROUNDUP(0, 4) );
   CHECK( 4 == VG_ROUNDUP(1, 4) );
   CHECK( 4 == VG_ROUNDUP(2, 4) );
   CHECK( 4 == VG_ROUNDUP(3, 4) );
   CHECK( 4 == VG_ROUNDUP(4, 4) );
   CHECK( 8 == VG_ROUNDUP(5, 4) );
   CHECK( 8 == VG_ROUNDUP(6, 4) );
   CHECK( 8 == VG_ROUNDUP(7, 4) );

   CHECK( 0 == VG_ROUNDDN(0, 8) );
   CHECK( 0 == VG_ROUNDDN(1, 8) );
   CHECK( 0 == VG_ROUNDDN(2, 8) );
   CHECK( 0 == VG_ROUNDDN(3, 8) );
   CHECK( 0 == VG_ROUNDDN(4, 8) );
   CHECK( 0 == VG_ROUNDDN(5, 8) );
   CHECK( 0 == VG_ROUNDDN(6, 8) );
   CHECK( 0 == VG_ROUNDDN(7, 8) );

   CHECK( 0 == VG_ROUNDUP(0, 8) );
   CHECK( 8 == VG_ROUNDUP(1, 8) );
   CHECK( 8 == VG_ROUNDUP(2, 8) );
   CHECK( 8 == VG_ROUNDUP(3, 8) );
   CHECK( 8 == VG_ROUNDUP(4, 8) );
   CHECK( 8 == VG_ROUNDUP(5, 8) );
   CHECK( 8 == VG_ROUNDUP(6, 8) );
   CHECK( 8 == VG_ROUNDUP(7, 8) );

   CHECK( 0             == VG_PGROUNDDN(0) );
   CHECK( 0             == VG_PGROUNDDN(1) );
   CHECK( 0             == VG_PGROUNDDN(2) );
   CHECK( 0             == VG_PGROUNDDN(3) );
   CHECK( 0             == VG_PGROUNDDN(4) );
   CHECK( 0             == VG_PGROUNDDN(VKI_PAGE_SIZE-1) );
   CHECK( VKI_PAGE_SIZE == VG_PGROUNDDN(VKI_PAGE_SIZE  ) );
   CHECK( VKI_PAGE_SIZE == VG_PGROUNDDN(VKI_PAGE_SIZE+1) );

   CHECK( 0               == VG_PGROUNDUP(0) );
   CHECK( VKI_PAGE_SIZE   == VG_PGROUNDUP(1) );
   CHECK( VKI_PAGE_SIZE   == VG_PGROUNDUP(2) );
   CHECK( VKI_PAGE_SIZE   == VG_PGROUNDUP(3) );
   CHECK( VKI_PAGE_SIZE   == VG_PGROUNDUP(4) );
   CHECK( VKI_PAGE_SIZE   == VG_PGROUNDUP(VKI_PAGE_SIZE-1) );
   CHECK( VKI_PAGE_SIZE   == VG_PGROUNDUP(VKI_PAGE_SIZE  ) );
   CHECK( VKI_PAGE_SIZE*2 == VG_PGROUNDUP(VKI_PAGE_SIZE+1) );
}

void test_isspace(void)
{
   CHECK(   VG_(isspace)(' ') );
   CHECK(   VG_(isspace)('\n') );
   CHECK(   VG_(isspace)('\t') );
   CHECK( ! VG_(isspace)('3') );
   CHECK( ! VG_(isspace)('x') );
}

void test_isdigit(void)
{
   CHECK(   VG_(isdigit)('0') );
   CHECK(   VG_(isdigit)('1') );
   CHECK(   VG_(isdigit)('5') );
   CHECK(   VG_(isdigit)('9') );
   CHECK( ! VG_(isdigit)('a') );
   CHECK( ! VG_(isdigit)('!') );
}
 
void test_is_dec_digit()
{
   Long x;
   CHECK( is_dec_digit('0', &x) && 0 == x );
   CHECK( is_dec_digit('1', &x) && 1 == x );
   CHECK( is_dec_digit('9', &x) && 9 == x );
}

void test_is_hex_digit()
{
   Long x;
   CHECK( is_hex_digit('0', &x) &&  0 == x );
   CHECK( is_hex_digit('1', &x) &&  1 == x );
   CHECK( is_hex_digit('9', &x) &&  9 == x );
   CHECK( is_hex_digit('a', &x) && 10 == x );
   CHECK( is_hex_digit('f', &x) && 15 == x );
   CHECK( is_hex_digit('A', &x) && 10 == x );
   CHECK( is_hex_digit('F', &x) && 15 == x );
}

void test_strtoll_and_strtod(void)
{
   // For VG_(strtoll*)()
   typedef struct {
      HChar* str;        // The string to convert.
      Long   res;        // The result.
      HChar  endptr_val; // The char one past the end of the converted text.
   } StrtollInputs;

   // VG_(strtoll10)()
   {
      StrtollInputs a[] = {
         // If there's no number at the head of the string, return 0, and
         // make 'endptr' point to the start of the string.
         { .str = "",      .res = 0, .endptr_val = '\0' },
         { .str = " \n\t", .res = 0, .endptr_val = ' '  },
         { .str = "one",   .res = 0, .endptr_val = 'o'  },
         { .str = "\ntwo", .res = 0, .endptr_val = '\n' },

         // Successful conversion.  Leading whitespace is ignored.  A single
         // '-' or '+' is accepted.
         { .str =  "0",            .res =       0, .endptr_val = '\0' },
         { .str = "+0",            .res =       0, .endptr_val = '\0' },
         { .str = "-0",            .res =       0, .endptr_val = '\0' },
         { .str =  "1",            .res =       1, .endptr_val = '\0' },
         { .str = "+1",            .res =       1, .endptr_val = '\0' },
         { .str = "-1",            .res =      -1, .endptr_val = '\0' },
         { .str = "12",            .res =      12, .endptr_val = '\0' },
         { .str = "-567",          .res =    -567, .endptr_val = '\0' },
         { .str = "1234567",       .res = 1234567, .endptr_val = '\0' },
         { .str = "007",           .res =       7, .endptr_val = '\0' },
         { .str = "   +42",        .res =      42, .endptr_val = '\0' },
         { .str = "\n\t\r\v  -56", .res =     -56, .endptr_val = '\0' },
         { .str = "123xyz",        .res =     123, .endptr_val = 'x'  },
         { .str = " -123abc",      .res =    -123, .endptr_val = 'a'  },

         // Whitespace after the +/- is not allowed;  conversion fails.
         { .str = "+ 1",   .res =  0, .endptr_val = '+' },
         { .str = "-\n1",  .res =  0, .endptr_val = '-' },
      };

      // Nb: We test the results against strtoll() as well.
      int i;
      for (i = 0; i < (sizeof(a) / sizeof(StrtollInputs)); i++) {
         HChar* endptr1;
         HChar* endptr2;
         Long      res1 = VG_(strtoll10)(a[i].str, &endptr1);
         long long res2 =     strtoll   (a[i].str, &endptr2, 10);
         //printf("res1 = %lld, *endptr1 = '%c'\n", res1, *endptr1);
         //printf("res2 = %lld, *endptr2 = '%c'\n", res2, *endptr2);
         CHECK(a[i].res == res1 && a[i].endptr_val == *endptr1);
         CHECK(res2     == res1 && *endptr2        == *endptr1);
      }
   }

   // VG_(strtoll16)()
   {
      StrtollInputs a[] = {
         // If there's no number at the head of the string, return 0, and
         // make 'endptr' point to the start of the string.
         { .str = "",      .res = 0, .endptr_val = '\0' },
         { .str = " \n\t", .res = 0, .endptr_val = ' '  },
         { .str = "one",   .res = 0, .endptr_val = 'o'  },
         { .str = "\ntwo", .res = 0, .endptr_val = '\n' },

         // Successful conversion.  Leading whitespace is ignored.  A single
         // '-' or '+' is accepted.  "0X" and "0x" are also allowed at the
         // front, but if no digits follow, just the "0" is converted.
         { .str =   "0",           .res =        0, .endptr_val = '\0' },
         { .str = "0x0",           .res =        0, .endptr_val = '\0' },
         { .str = "0X0",           .res =        0, .endptr_val = '\0' },
         { .str = "0x",            .res =        0, .endptr_val = 'x'  },
         { .str = "0Xg",           .res =        0, .endptr_val = 'X'  },
         { .str =   "0",           .res =        0, .endptr_val = '\0' },
         { .str =  "+0",           .res =        0, .endptr_val = '\0' },
         { .str =  "-0",           .res =        0, .endptr_val = '\0' },
         { .str =   "1",           .res =        1, .endptr_val = '\0' },
         { .str =  "+1",           .res =        1, .endptr_val = '\0' },
         { .str =  "-1",           .res =       -1, .endptr_val = '\0' },
         { .str =  "1a",           .res =       26, .endptr_val = '\0' },
         { .str = "-5F7",          .res =    -1527, .endptr_val = '\0' },
         { .str = "0x1234567",     .res = 19088743, .endptr_val = '\0' },
         { .str = "007",           .res =        7, .endptr_val = '\0' },
         { .str = "0X00ABCD",      .res =    43981, .endptr_val = '\0' },
         { .str = "   +AbC",       .res =     2748, .endptr_val = '\0' },
         { .str = "   -0xAbC",     .res =    -2748, .endptr_val = '\0' },
         { .str = "   -0xxx",      .res =        0, .endptr_val = 'x'  },
         { .str = "\n\t\r\v  -56", .res =      -86, .endptr_val = '\0' },
         { .str = "123xyz",        .res =      291, .endptr_val = 'x'  },
         { .str = " -123defghi",   .res = -1195503, .endptr_val = 'g'  },

         // Whitespace after the +/- is not allowed;  conversion fails.
         { .str = "+ 1",    .res =  0, .endptr_val = '+' },
         { .str = "-\n0x1", .res =  0, .endptr_val = '-' },
      };

      // Nb: We test the results against strtoll() as well.
      int i;
      for (i = 0; i < (sizeof(a) / sizeof(StrtollInputs)); i++) {
         HChar* endptr1;
         HChar* endptr2;
         Long      res1 = VG_(strtoll16)(a[i].str, &endptr1);
         long long res2 =     strtoll   (a[i].str, &endptr2, 16);
         //printf("  res1 = %lld, *endptr1 = '%c'\n", res1, *endptr1);
         //printf("  res2 = %lld, *endptr2 = '%c'\n", res2, *endptr2);
         CHECK(a[i].res == res1 && a[i].endptr_val == *endptr1);
         CHECK(res2     == res1 && *endptr2        == *endptr1);
      }
   }

   // VG_(strtod)()
   // XXX: todo
}

void test_log2(void)
{
   CHECK( -1 == VG_(log2)(0) );
   CHECK(  0 == VG_(log2)(1) );
   CHECK(  1 == VG_(log2)(2) );
   CHECK( -1 == VG_(log2)(3) );
   CHECK(  2 == VG_(log2)(4) );
   CHECK( -1 == VG_(log2)(5) );
   CHECK( -1 == VG_(log2)(6) );
   CHECK( -1 == VG_(log2)(7) );
   CHECK(  3 == VG_(log2)(8) );

   CHECK( -1 == VG_(log2)( 15) );
   CHECK(  4 == VG_(log2)( 16) );
   CHECK( -1 == VG_(log2)( 17) );

   CHECK( -1 == VG_(log2)( 63) );
   CHECK(  6 == VG_(log2)( 64) );
   CHECK( -1 == VG_(log2)( 65) );

   CHECK( -1 == VG_(log2)(255) );
   CHECK(  8 == VG_(log2)(256) );
   CHECK( -1 == VG_(log2)(257) );

   CHECK( -1 == VG_(log2)(65535) );
   CHECK( 16 == VG_(log2)(65536) );
   CHECK( -1 == VG_(log2)(65537) );

   CHECK( -1 == VG_(log2)(16777215) );
   CHECK( 24 == VG_(log2)(16777216) );
   CHECK( -1 == VG_(log2)(16777217) );

   CHECK( -1 == VG_(log2)(2147483647U) );
   CHECK( 31 == VG_(log2)(2147483648U) );
   CHECK( -1 == VG_(log2)(2147483649U) );

   CHECK( -1 == VG_(log2)(4294967295U) );    // Max UInt
}

void test_random(void)
{
   // Hmm, it's really hard to unit test a pseudo-random number generator.
   // So no testing here, sorry.
}

//-----------------------------------------------------------------------
// main
//-----------------------------------------------------------------------

int main(void)
{
   // Nb: the order of the tests is based on the order of the code in
   // m_libcbase.c, except that macros defined in pub_tool_libcbase.h are
   // tested first.
 
   //--------------------------------------------------------------------
   // pub_tool_libcbase.h macros
   //--------------------------------------------------------------------
   test_VG_STREQ();
   test_VG_STREQN();
   test_VG_IS_XYZ_ALIGNED();
   test_VG_ROUND_et_al();

   //--------------------------------------------------------------------
   // Char functions
   //--------------------------------------------------------------------
   test_isspace();
   test_isdigit();

   //--------------------------------------------------------------------
   // String-to-number functions
   //--------------------------------------------------------------------
   test_is_dec_digit();
   test_is_hex_digit();
   test_strtoll_and_strtod();

   //--------------------------------------------------------------------
   // String functions
   //--------------------------------------------------------------------
   // XXX: more todo: VG_(str_*)

   //--------------------------------------------------------------------
   // Mem functions
   //--------------------------------------------------------------------
   // XXX: todo: VG_(mem*)

   //--------------------------------------------------------------------
   // Miscellaneous functions
   //--------------------------------------------------------------------
   // XXX: todo: VG_(ssort)
   test_log2();
   test_random();
 
   return 0;
}

