ptrarray.c 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. #include <stdio.h>
  2. #include <glib.h>
  3. #include "test.h"
  4. /* Redefine the private structure only to verify proper allocations */
  5. typedef struct _GPtrArrayPriv {
  6. gpointer *pdata;
  7. guint len;
  8. guint size;
  9. } GPtrArrayPriv;
  10. /* Don't add more than 32 items to this please */
  11. static const char *items [] = {
  12. "Apples", "Oranges", "Plumbs", "Goats", "Snorps", "Grapes",
  13. "Tickle", "Place", "Coffee", "Cookies", "Cake", "Cheese",
  14. "Tseng", "Holiday", "Avenue", "Smashing", "Water", "Toilet",
  15. NULL
  16. };
  17. static GPtrArray *ptrarray_alloc_and_fill(guint *item_count)
  18. {
  19. GPtrArray *array = g_ptr_array_new();
  20. gint i;
  21. for(i = 0; items[i] != NULL; i++) {
  22. g_ptr_array_add(array, (gpointer)items[i]);
  23. }
  24. if(item_count != NULL) {
  25. *item_count = i;
  26. }
  27. return array;
  28. }
  29. static guint guess_size(guint length)
  30. {
  31. guint size = 1;
  32. while(size < length) {
  33. size <<= 1;
  34. }
  35. return size;
  36. }
  37. RESULT ptrarray_alloc()
  38. {
  39. GPtrArrayPriv *array;
  40. guint i;
  41. array = (GPtrArrayPriv *)ptrarray_alloc_and_fill(&i);
  42. if(array->size != guess_size(array->len)) {
  43. return FAILED("Size should be %d, but it is %d",
  44. guess_size(array->len), array->size);
  45. }
  46. if(array->len != i) {
  47. return FAILED("Expected %d node(s) in the array", i);
  48. }
  49. g_ptr_array_free((GPtrArray *)array, TRUE);
  50. return OK;
  51. }
  52. RESULT ptrarray_for_iterate()
  53. {
  54. GPtrArray *array = ptrarray_alloc_and_fill(NULL);
  55. guint i;
  56. for(i = 0; i < array->len; i++) {
  57. char *item = (char *)g_ptr_array_index(array, i);
  58. if(item != items[i]) {
  59. return FAILED(
  60. "Expected item at %d to be %s, but it was %s",
  61. i, items[i], item);
  62. }
  63. }
  64. g_ptr_array_free(array, TRUE);
  65. return OK;
  66. }
  67. static gint foreach_iterate_index = 0;
  68. static char *foreach_iterate_error = NULL;
  69. void foreach_callback(gpointer data, gpointer user_data)
  70. {
  71. char *item = (char *)data;
  72. const char *item_cmp = items[foreach_iterate_index++];
  73. if(foreach_iterate_error != NULL) {
  74. return;
  75. }
  76. if(item != item_cmp) {
  77. foreach_iterate_error = FAILED(
  78. "Expected item at %d to be %s, but it was %s",
  79. foreach_iterate_index - 1, item_cmp, item);
  80. }
  81. }
  82. RESULT ptrarray_foreach_iterate()
  83. {
  84. GPtrArray *array = ptrarray_alloc_and_fill(NULL);
  85. foreach_iterate_index = 0;
  86. foreach_iterate_error = NULL;
  87. g_ptr_array_foreach(array, foreach_callback, array);
  88. g_ptr_array_free(array, TRUE);
  89. return foreach_iterate_error;
  90. }
  91. RESULT ptrarray_set_size()
  92. {
  93. GPtrArray *array = g_ptr_array_new();
  94. guint i, grow_length = 50;
  95. g_ptr_array_add(array, (gpointer)items[0]);
  96. g_ptr_array_add(array, (gpointer)items[1]);
  97. g_ptr_array_set_size(array, grow_length);
  98. if(array->len != grow_length) {
  99. return FAILED("Array length should be 50, it is %d", array->len);
  100. } else if(array->pdata[0] != items[0]) {
  101. return FAILED("Item 0 was overwritten, should be %s", items[0]);
  102. } else if(array->pdata[1] != items[1]) {
  103. return FAILED("Item 1 was overwritten, should be %s", items[1]);
  104. }
  105. for(i = 2; i < array->len; i++) {
  106. if(array->pdata[i] != NULL) {
  107. return FAILED("Item %d is not NULL, it is %p", i, array->pdata[i]);
  108. }
  109. }
  110. g_ptr_array_free(array, TRUE);
  111. return OK;
  112. }
  113. RESULT ptrarray_remove_index()
  114. {
  115. GPtrArray *array;
  116. guint i;
  117. array = ptrarray_alloc_and_fill(&i);
  118. g_ptr_array_remove_index(array, 0);
  119. if(array->pdata[0] != items[1]) {
  120. return FAILED("First item is not %s, it is %s", items[1],
  121. array->pdata[0]);
  122. }
  123. g_ptr_array_remove_index(array, array->len - 1);
  124. if(array->pdata[array->len - 1] != items[array->len]) {
  125. return FAILED("Last item is not %s, it is %s",
  126. items[array->len - 2], array->pdata[array->len - 1]);
  127. }
  128. g_ptr_array_free(array, TRUE);
  129. return OK;
  130. }
  131. RESULT ptrarray_remove()
  132. {
  133. GPtrArray *array;
  134. guint i;
  135. array = ptrarray_alloc_and_fill(&i);
  136. g_ptr_array_remove(array, (gpointer)items[7]);
  137. if(!g_ptr_array_remove(array, (gpointer)items[4])) {
  138. return FAILED("Item %s not removed", items[4]);
  139. }
  140. if(g_ptr_array_remove(array, (gpointer)items[4])) {
  141. return FAILED("Item %s still in array after removal", items[4]);
  142. }
  143. if(array->pdata[array->len - 1] != items[array->len + 1]) {
  144. return FAILED("Last item in GPtrArray not correct");
  145. }
  146. g_ptr_array_free(array, TRUE);
  147. return OK;
  148. }
  149. static gint ptrarray_sort_compare(gconstpointer a, gconstpointer b)
  150. {
  151. gchar *stra = *(gchar **) a;
  152. gchar *strb = *(gchar **) b;
  153. return strcmp(stra, strb);
  154. }
  155. RESULT ptrarray_sort()
  156. {
  157. GPtrArray *array = g_ptr_array_new();
  158. guint i;
  159. gchar *letters [] = { "A", "B", "C", "D", "E" };
  160. g_ptr_array_add(array, letters[0]);
  161. g_ptr_array_add(array, letters[1]);
  162. g_ptr_array_add(array, letters[2]);
  163. g_ptr_array_add(array, letters[3]);
  164. g_ptr_array_add(array, letters[4]);
  165. g_ptr_array_sort(array, ptrarray_sort_compare);
  166. for(i = 0; i < array->len; i++) {
  167. if(array->pdata[i] != letters[i]) {
  168. return FAILED("Array out of order, expected %s got %s",
  169. (gchar *)array->pdata[i], letters[i]);
  170. }
  171. }
  172. g_ptr_array_free(array, TRUE);
  173. return OK;
  174. }
  175. static Test ptrarray_tests [] = {
  176. {"alloc", ptrarray_alloc},
  177. {"for_iterate", ptrarray_for_iterate},
  178. {"foreach_iterate", ptrarray_foreach_iterate},
  179. {"set_size", ptrarray_set_size},
  180. {"remove_index", ptrarray_remove_index},
  181. {"remove", ptrarray_remove},
  182. {"sort", ptrarray_sort},
  183. {NULL, NULL}
  184. };
  185. DEFINE_TEST_GROUP_INIT(ptrarray_tests_init, ptrarray_tests)