run.c 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. #include <ccan/tap/tap.h>
  2. #define CCAN_JMAP_DEBUG
  3. #include <ccan/jmap/jmap.c>
  4. struct map {
  5. JMAP_MEMBERS(unsigned long, unsigned long);
  6. };
  7. int main(int argc, char *argv[])
  8. {
  9. struct map *map;
  10. unsigned long i, *value;
  11. const char *err;
  12. plan_tests(51);
  13. map = jmap_new(struct map);
  14. ok1(jmap_error(map) == NULL);
  15. ok1(jmap_test(map, 0) == false);
  16. ok1(jmap_del(map, 0) == false);
  17. ok1(jmap_add(map, 0, 1) == true);
  18. ok1(jmap_test(map, 0) == true);
  19. ok1(jmap_get(map, 0) == 1);
  20. ok1(jmap_get(map, 1) == 0);
  21. ok1(jmap_del(map, 0) == true);
  22. ok1(jmap_popcount(map, 0, -1) == 0);
  23. ok1(jmap_nth(map, 0, 0) == 0);
  24. ok1(jmap_nth(map, 0, -1) == (size_t)-1);
  25. ok1(jmap_first(map) == 0);
  26. ok1(jmap_last(map) == 0);
  27. ok1(jmap_getval(map, 0) == NULL);
  28. /* Map a million indices, 16 apart. */
  29. for (i = 0; i < 1000000; i++)
  30. jmap_add(map, (i << 4) + 1, (i << 5) + 1);
  31. /* This only take 6.3MB on my 32-bit system. */
  32. diag("%u bytes memory used\n", (unsigned)JudyLMemUsed(map->raw.judy));
  33. ok1(jmap_get(map, 1) == 1);
  34. ok1(jmap_get(map, (999999 << 4) + 1) == (999999 << 5) + 1);
  35. ok1(jmap_popcount(map, 0, -1) == 1000000);
  36. ok1(jmap_nth(map, 0, -1) == 1);
  37. ok1(jmap_nth(map, 999999, -1) == (999999 << 4) + 1);
  38. ok1(jmap_nth(map, 1000000, -1) == (size_t)-1);
  39. ok1(jmap_first(map) == 1);
  40. ok1(jmap_last(map) == (999999 << 4) + 1);
  41. ok1(jmap_next(map, 1) == (1 << 4) + 1);
  42. ok1(jmap_next(map, (999999 << 4) + 1) == 0);
  43. ok1(jmap_prev(map, 2) == 1);
  44. ok1(jmap_prev(map, 0) == 0);
  45. ok1(jmap_error(map) == NULL);
  46. /* Accessors. */
  47. value = jmap_getval(map, 1);
  48. ok1(value && *value == 1);
  49. *value = 2;
  50. ok1(jmap_get(map, 1) == 2);
  51. jmap_putval(map, &value);
  52. ok1(jmap_get(map, 1) == 2);
  53. ok1(jmap_set(map, 1, 1));
  54. value = jmap_getval(map, (999999 << 4) + 1);
  55. ok1(value && *value == (999999 << 5) + 1);
  56. jmap_putval(map, &value);
  57. value = jmap_nthval(map, 0, &i);
  58. ok1(i == 1);
  59. ok1(value && *value == 1);
  60. jmap_putval(map, &value);
  61. value = jmap_nthval(map, 999999, &i);
  62. ok1(i == (999999 << 4) + 1);
  63. ok1(value && *value == (999999 << 5) + 1);
  64. jmap_putval(map, &value);
  65. ok1(jmap_nthval(map, 1000000, &i) == NULL);
  66. value = jmap_firstval(map, &i);
  67. ok1(i == 1);
  68. ok1(value && *value == 1);
  69. jmap_putval(map, &value);
  70. ok1(jmap_prevval(map, &i) == NULL);
  71. i = 1;
  72. value = jmap_nextval(map, &i);
  73. ok1(i == (1 << 4) + 1);
  74. ok1(value && *value == (1 << 5) + 1);
  75. jmap_putval(map, &value);
  76. value = jmap_lastval(map, &i);
  77. ok1(i == (999999 << 4) + 1);
  78. ok1(value && *value == (999999 << 5) + 1);
  79. jmap_putval(map, &value);
  80. ok1(jmap_nextval(map, &i) == NULL);
  81. i = (999999 << 4) + 1;
  82. value = jmap_prevval(map, &i);
  83. ok1(i == (999998 << 4) + 1);
  84. ok1(value && *value == (999998 << 5) + 1);
  85. jmap_putval(map, &value);
  86. /* Test error handling */
  87. JU_ERRNO(&map->raw.err) = 100;
  88. JU_ERRID(&map->raw.err) = 991;
  89. err = jmap_error(map);
  90. ok1(err);
  91. ok1(strstr(err, "100"));
  92. ok1(strstr(err, "991"));
  93. ok1(err == map->raw.errstr);
  94. jmap_free(map);
  95. return exit_status();
  96. }