Improve test coverage
authorMatthias Clasen <mclasen@redhat.com>
Mon, 6 Jun 2011 04:28:38 +0000 (00:28 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Mon, 6 Jun 2011 04:28:38 +0000 (00:28 -0400)
Duplicate the atomic tests for the functions, and
test the new atomic operations as well.

glib/tests/atomic.c

index 771e853..52d429c 100644 (file)
 int
 main (void)
 {
-  guint u;
-  gint s;
-  gpointer vp;
-  int *ip;
-  gsize gs;
+  guint u, u2;
+  gint s, s2;
+  gpointer vp, vp2;
+  int *ip, *ip2;
+  gsize gs, gs2;
+  gboolean res;
 
   g_atomic_int_set (&u, 5);
-  g_atomic_int_get (&u);
-  g_atomic_int_compare_and_exchange (&u, 6, 7);
+  u2 = g_atomic_int_get (&u);
+  g_assert_cmpint (u2, ==, 5);
+  res = g_atomic_int_compare_and_exchange (&u, 6, 7);
+  g_assert (!res);
+  g_assert_cmpint (u, ==, 5);
   g_atomic_int_add (&u, 1);
+  g_assert_cmpint (u, ==, 6);
   g_atomic_int_inc (&u);
-  (void) g_atomic_int_dec_and_test (&u);
+  g_assert_cmpint (u, ==, 7);
+  res = g_atomic_int_dec_and_test (&u);
+  g_assert (!res);
+  g_assert_cmpint (u, ==, 6);
+  u2 = g_atomic_int_and (&u, 5);
+  g_assert_cmpint (u2, ==, 6);
+  g_assert_cmpint (u, ==, 4);
+  u2 = g_atomic_int_or (&u, 8);
+  g_assert_cmpint (u2, ==, 4);
+  g_assert_cmpint (u, ==, 12);
+  u2 = g_atomic_int_xor (&u, 4);
+  g_assert_cmpint (u2, ==, 12);
+  g_assert_cmpint (u, ==, 8);
 
   g_atomic_int_set (&s, 5);
-  g_atomic_int_get (&s);
-  g_atomic_int_compare_and_exchange (&s, 6, 7);
+  s2 = g_atomic_int_get (&s);
+  g_assert_cmpint (s2, ==, 5);
+  res = g_atomic_int_compare_and_exchange (&s, 6, 7);
+  g_assert (!res);
+  g_assert_cmpint (s, ==, 5);
   g_atomic_int_add (&s, 1);
+  g_assert_cmpint (s, ==, 6);
   g_atomic_int_inc (&s);
-  (void) g_atomic_int_dec_and_test (&s);
+  g_assert_cmpint (s, ==, 7);
+  res = g_atomic_int_dec_and_test (&s);
+  g_assert (!res);
+  g_assert_cmpint (s, ==, 6);
+  s2 = g_atomic_int_and (&s, 5);
+  g_assert_cmpint (s2, ==, 6);
+  g_assert_cmpint (s, ==, 4);
+  s2 = g_atomic_int_or (&s, 8);
+  g_assert_cmpint (s2, ==, 4);
+  g_assert_cmpint (s, ==, 12);
+  s2 = g_atomic_int_xor (&s, 4);
+  g_assert_cmpint (s2, ==, 12);
+  g_assert_cmpint (s, ==, 8);
 
   g_atomic_pointer_set (&vp, 0);
-  g_atomic_pointer_get (&vp);
-  g_atomic_pointer_compare_and_exchange (&vp, 0, 0);
+  vp2 = g_atomic_pointer_get (&vp);
+  g_assert (vp2 == 0);
+  res = g_atomic_pointer_compare_and_exchange (&vp, 0, 0);
+  g_assert (res);
+  g_assert (vp == 0);
 
   g_atomic_pointer_set (&ip, 0);
-  g_atomic_pointer_get (&ip);
-  g_atomic_pointer_compare_and_exchange (&ip, 0, 0);
+  ip2 = g_atomic_pointer_get (&ip);
+  g_assert (ip2 == 0);
+  res = g_atomic_pointer_compare_and_exchange (&ip, 0, 0);
+  g_assert (res);
+  g_assert (ip == 0);
 
   g_atomic_pointer_set (&gs, 0);
-  g_atomic_pointer_get (&gs);
-  g_atomic_pointer_compare_and_exchange (&gs, 0, 0);
+  gs2 = (gsize) g_atomic_pointer_get (&gs);
+  g_assert (gs2 == 0);
+  res = g_atomic_pointer_compare_and_exchange (&gs, 0, 0);
+  g_assert (res);
+  g_assert (gs == 0);
+  gs2 = g_atomic_pointer_add (&gs, 5);
+  g_assert (gs2 == 0);
+  g_assert (gs == 5);
+  gs2 = g_atomic_pointer_and (&gs, 6);
+  g_assert (gs2 == 5);
+  g_assert (gs == 4);
+  gs2 = g_atomic_pointer_or (&gs, 8);
+  g_assert (gs2 == 4);
+  g_assert (gs == 12);
+  gs2 = g_atomic_pointer_xor (&gs, 4);
+  g_assert (gs2 == 12);
+  g_assert (gs == 8);
+
+  /* repeat, without the macros */
+#undef g_atomic_int_set
+#undef g_atomic_int_get
+#undef g_atomic_int_compare_and_exchange
+#undef g_atomic_int_add
+#undef g_atomic_int_inc
+#undef g_atomic_int_and
+#undef g_atomic_int_or
+#undef g_atomic_int_xor
+#undef g_atomic_int_dec_and_test
+#undef g_atomic_pointer_set
+#undef g_atomic_pointer_get
+#undef g_atomic_pointer_compare_and_exchange
+#undef g_atomic_pointer_add
+#undef g_atomic_pointer_and
+#undef g_atomic_pointer_or
+#undef g_atomic_pointer_xor
+
+  g_atomic_int_set ((gint*)&u, 5);
+  u2 = g_atomic_int_get ((gint*)&u);
+  g_assert_cmpint (u2, ==, 5);
+  res = g_atomic_int_compare_and_exchange ((gint*)&u, 6, 7);
+  g_assert (!res);
+  g_assert_cmpint (u, ==, 5);
+  g_atomic_int_add ((gint*)&u, 1);
+  g_assert_cmpint (u, ==, 6);
+  g_atomic_int_inc ((gint*)&u);
+  g_assert_cmpint (u, ==, 7);
+  res = g_atomic_int_dec_and_test ((gint*)&u);
+  g_assert (!res);
+  g_assert_cmpint (u, ==, 6);
+  u2 = g_atomic_int_and (&u, 5);
+  g_assert_cmpint (u2, ==, 6);
+  g_assert_cmpint (u, ==, 4);
+  u2 = g_atomic_int_or (&u, 8);
+  g_assert_cmpint (u2, ==, 4);
+  g_assert_cmpint (u, ==, 12);
+  u2 = g_atomic_int_xor (&u, 4);
+  g_assert_cmpint (u2, ==, 12);
+
+  g_atomic_int_set (&s, 5);
+  s2 = g_atomic_int_get (&s);
+  g_assert_cmpint (s2, ==, 5);
+  res = g_atomic_int_compare_and_exchange (&s, 6, 7);
+  g_assert (!res);
+  g_assert_cmpint (s, ==, 5);
+  g_atomic_int_add (&s, 1);
+  g_assert_cmpint (s, ==, 6);
+  g_atomic_int_inc (&s);
+  g_assert_cmpint (s, ==, 7);
+  res = g_atomic_int_dec_and_test (&s);
+  g_assert (!res);
+  g_assert_cmpint (s, ==, 6);
+  s2 = g_atomic_int_and ((guint*)&s, 5);
+  g_assert_cmpint (s2, ==, 6);
+  g_assert_cmpint (s, ==, 4);
+  s2 = g_atomic_int_or ((guint*)&s, 8);
+  g_assert_cmpint (s2, ==, 4);
+  g_assert_cmpint (s, ==, 12);
+  s2 = g_atomic_int_xor ((guint*)&s, 4);
+  g_assert_cmpint (s2, ==, 12);
+  g_assert_cmpint (s, ==, 8);
+
+  g_atomic_pointer_set (&vp, 0);
+  vp2 = g_atomic_pointer_get (&vp);
+  g_assert (vp2 == 0);
+  res = g_atomic_pointer_compare_and_exchange (&vp, 0, 0);
+  g_assert (res);
+  g_assert (vp == 0);
+
+  g_atomic_pointer_set (&ip, 0);
+  ip2 = g_atomic_pointer_get (&ip);
+  g_assert (ip2 == 0);
+  res = g_atomic_pointer_compare_and_exchange (&ip, 0, 0);
+  g_assert (res);
+  g_assert (ip == 0);
+
+  g_atomic_pointer_set (&gs, 0);
+  gs2 = (gsize) g_atomic_pointer_get (&gs);
+  g_assert (gs2 == 0);
+  res = g_atomic_pointer_compare_and_exchange (&gs, 0, 0);
+  g_assert (res);
+  g_assert (gs == 0);
+  gs2 = g_atomic_pointer_add (&gs, 5);
+  g_assert (gs2 == 0);
+  g_assert (gs == 5);
+  gs2 = g_atomic_pointer_and (&gs, 6);
+  g_assert (gs2 == 5);
+  g_assert (gs == 4);
+  gs2 = g_atomic_pointer_or (&gs, 8);
+  g_assert (gs2 == 4);
+  g_assert (gs == 12);
+  gs2 = g_atomic_pointer_xor (&gs, 4);
+  g_assert (gs2 == 12);
+  g_assert (gs == 8);
 
   return 0;
 }