+void big_iteration_test (CuTest* tc) {
+ static const int n = 10000;
+
+#ifdef TEST_STRING_KEYS
+ map_t *map = map_alloc(map_type_, &DATATYPE_NSTRING);
+ nstring_t *s = ns_alloc(9);
+ nstring_t *s3 = ns_alloc(3); strcpy(s3->data, "k3");
+ nstring_t *s4 = ns_alloc(3); strcpy(s4->data, "k4");
+ map_key_t k3 = (map_key_t)s3;
+ map_key_t k4 = (map_key_t)s4;
+ map_key_t key = (map_key_t)s;
+#else
+ map_t *map = map_alloc(map_type_, NULL);
+ map_key_t k3 = (map_key_t)3;
+ map_key_t k4 = (map_key_t)4;
+ map_key_t key;
+#endif
+
+ for (int i = 1; i <= n; ++i) {
+#ifdef TEST_STRING_KEYS
+ s->len = 1 + snprintf(s->data, 9, "k%d", i);
+#else
+ key = (map_key_t)i;
+#endif
+ ASSERT_EQUAL( DOES_NOT_EXIST, map_get(map, key) );
+ ASSERT_EQUAL( DOES_NOT_EXIST, map_set(map, key, i) );
+ ASSERT_EQUAL( i, map_get(map, key) );
+ rcu_update(); // In a quiecent state.
+ }
+
+ ASSERT_EQUAL( n, map_count(map) );
+ ASSERT_EQUAL( n, iterator_size(map) );
+
+ uint64_t sum = 0;
+ map_val_t val;
+ map_iter_t *iter = map_iter_begin(map, 0);
+ while ((val = map_iter_next(iter, NULL)) != DOES_NOT_EXIST) {
+ sum += val;
+ }
+ map_iter_free(iter);
+ ASSERT_EQUAL(n*(n+1)/2, sum);
+ ASSERT_EQUAL(3, map_remove(map, k3));
+ ASSERT_EQUAL(4, map_remove(map, k4));
+ sum = 0;
+ iter = map_iter_begin(map, 0);
+ while ((val = map_iter_next(iter, NULL)) != DOES_NOT_EXIST) {
+ sum += val;
+ }
+ map_iter_free(iter);
+ ASSERT_EQUAL(n*(n+1)/2 - (3+4), sum);
+
+#ifdef TEST_STRING_KEYS
+ nbd_free(s);
+#endif