/tests/conform/test-model.c

https://github.com/nobled/clutter · C · 435 lines · 345 code · 90 blank · 0 comment · 38 complexity · 25e54e51883426cd5999e65b7f65f2d8 MD5 · raw file

  1. #include <stdlib.h>
  2. #include <string.h>
  3. #include <clutter/clutter.h>
  4. #include "test-conform-common.h"
  5. typedef struct _ModelData
  6. {
  7. ClutterModel *model;
  8. guint n_row;
  9. } ModelData;
  10. enum
  11. {
  12. COLUMN_FOO, /* G_TYPE_STRING */
  13. COLUMN_BAR, /* G_TYPE_INT */
  14. N_COLUMNS
  15. };
  16. static const struct {
  17. const gchar *expected_foo;
  18. gint expected_bar;
  19. } base_model[] = {
  20. { "String 1", 1 },
  21. { "String 2", 2 },
  22. { "String 3", 3 },
  23. { "String 4", 4 },
  24. { "String 5", 5 },
  25. { "String 6", 6 },
  26. { "String 7", 7 },
  27. { "String 8", 8 },
  28. { "String 9", 9 },
  29. };
  30. static const struct {
  31. const gchar *expected_foo;
  32. gint expected_bar;
  33. } forward_base[] = {
  34. { "String 1", 1 },
  35. { "String 2", 2 },
  36. { "String 3", 3 },
  37. { "String 4", 4 },
  38. { "String 5", 5 },
  39. { "String 6", 6 },
  40. { "String 7", 7 },
  41. { "String 8", 8 },
  42. { "String 9", 9 },
  43. };
  44. static const struct {
  45. const gchar *expected_foo;
  46. gint expected_bar;
  47. } backward_base[] = {
  48. { "String 9", 9 },
  49. { "String 8", 8 },
  50. { "String 7", 7 },
  51. { "String 6", 6 },
  52. { "String 5", 5 },
  53. { "String 4", 4 },
  54. { "String 3", 3 },
  55. { "String 2", 2 },
  56. { "String 1", 1 },
  57. };
  58. static const struct {
  59. const gchar *expected_foo;
  60. gint expected_bar;
  61. } filter_odd[] = {
  62. { "String 1", 1 },
  63. { "String 3", 3 },
  64. { "String 5", 5 },
  65. { "String 7", 7 },
  66. { "String 9", 9 },
  67. };
  68. static const struct {
  69. const gchar *expected_foo;
  70. gint expected_bar;
  71. } filter_even[] = {
  72. { "String 8", 8 },
  73. { "String 6", 6 },
  74. { "String 4", 4 },
  75. { "String 2", 2 },
  76. };
  77. static inline void
  78. compare_iter (ClutterModelIter *iter,
  79. const gint expected_row,
  80. const gchar *expected_foo,
  81. const gint expected_bar)
  82. {
  83. gchar *foo = NULL;
  84. gint bar = 0;
  85. gint row = 0;
  86. row = clutter_model_iter_get_row (iter);
  87. clutter_model_iter_get (iter,
  88. COLUMN_FOO, &foo,
  89. COLUMN_BAR, &bar,
  90. -1);
  91. if (g_test_verbose ())
  92. g_print ("Row %d => %d: Got [ '%s', '%d' ], expected [ '%s', '%d' ]\n",
  93. row, expected_row,
  94. foo, bar,
  95. expected_foo, expected_bar);
  96. g_assert_cmpint (row, ==, expected_row);
  97. g_assert_cmpstr (foo, ==, expected_foo);
  98. g_assert_cmpint (bar, ==, expected_bar);
  99. g_free (foo);
  100. }
  101. static void
  102. on_row_added (ClutterModel *model,
  103. ClutterModelIter *iter,
  104. gpointer data)
  105. {
  106. ModelData *model_data = data;
  107. compare_iter (iter,
  108. model_data->n_row,
  109. base_model[model_data->n_row].expected_foo,
  110. base_model[model_data->n_row].expected_bar);
  111. model_data->n_row += 1;
  112. }
  113. static gboolean
  114. filter_even_rows (ClutterModel *model,
  115. ClutterModelIter *iter,
  116. gpointer dummy G_GNUC_UNUSED)
  117. {
  118. gint bar_value;
  119. clutter_model_iter_get (iter, COLUMN_BAR, &bar_value, -1);
  120. if (bar_value % 2 == 0)
  121. return TRUE;
  122. return FALSE;
  123. }
  124. static gboolean
  125. filter_odd_rows (ClutterModel *model,
  126. ClutterModelIter *iter,
  127. gpointer dummy G_GNUC_UNUSED)
  128. {
  129. gint bar_value;
  130. clutter_model_iter_get (iter, COLUMN_BAR, &bar_value, -1);
  131. if (bar_value % 2 != 0)
  132. return TRUE;
  133. return FALSE;
  134. }
  135. void
  136. test_list_model_filter (TestConformSimpleFixture *fixture,
  137. gconstpointer data)
  138. {
  139. ModelData test_data = { NULL, 0 };
  140. ClutterModelIter *iter;
  141. gint i;
  142. test_data.model = clutter_list_model_new (N_COLUMNS,
  143. G_TYPE_STRING, "Foo",
  144. G_TYPE_INT, "Bar");
  145. test_data.n_row = 0;
  146. for (i = 1; i < 10; i++)
  147. {
  148. gchar *foo = g_strdup_printf ("String %d", i);
  149. clutter_model_append (test_data.model,
  150. COLUMN_FOO, foo,
  151. COLUMN_BAR, i,
  152. -1);
  153. g_free (foo);
  154. }
  155. if (g_test_verbose ())
  156. g_print ("Forward iteration (filter odd)...\n");
  157. clutter_model_set_filter (test_data.model, filter_odd_rows, NULL, NULL);
  158. iter = clutter_model_get_first_iter (test_data.model);
  159. g_assert (iter != NULL);
  160. i = 0;
  161. while (!clutter_model_iter_is_last (iter))
  162. {
  163. compare_iter (iter, i,
  164. filter_odd[i].expected_foo,
  165. filter_odd[i].expected_bar);
  166. iter = clutter_model_iter_next (iter);
  167. i += 1;
  168. }
  169. g_object_unref (iter);
  170. if (g_test_verbose ())
  171. g_print ("Backward iteration (filter even)...\n");
  172. clutter_model_set_filter (test_data.model, filter_even_rows, NULL, NULL);
  173. iter = clutter_model_get_last_iter (test_data.model);
  174. g_assert (iter != NULL);
  175. i = 0;
  176. do
  177. {
  178. compare_iter (iter, G_N_ELEMENTS (filter_even) - i - 1,
  179. filter_even[i].expected_foo,
  180. filter_even[i].expected_bar);
  181. iter = clutter_model_iter_prev (iter);
  182. i += 1;
  183. }
  184. while (!clutter_model_iter_is_first (iter));
  185. g_object_unref (iter);
  186. if (g_test_verbose ())
  187. g_print ("get_iter_at_row...\n");
  188. clutter_model_set_filter (test_data.model, filter_odd_rows, NULL, NULL);
  189. for (i = 0; i < 5; i++)
  190. {
  191. iter = clutter_model_get_iter_at_row (test_data.model, i);
  192. compare_iter (iter, i ,
  193. filter_odd[i].expected_foo,
  194. filter_odd[i].expected_bar);
  195. g_object_unref (iter);
  196. }
  197. iter = clutter_model_get_iter_at_row (test_data.model, 5);
  198. g_assert (iter == NULL);
  199. g_object_unref (test_data.model);
  200. }
  201. void
  202. test_list_model_iterate (TestConformSimpleFixture *fixture,
  203. gconstpointer data)
  204. {
  205. ModelData test_data = { NULL, 0 };
  206. ClutterModelIter *iter;
  207. gint i;
  208. test_data.model = clutter_list_model_new (N_COLUMNS,
  209. G_TYPE_STRING, "Foo",
  210. G_TYPE_INT, "Bar");
  211. test_data.n_row = 0;
  212. g_signal_connect (test_data.model, "row-added",
  213. G_CALLBACK (on_row_added),
  214. &test_data);
  215. for (i = 1; i < 10; i++)
  216. {
  217. gchar *foo = g_strdup_printf ("String %d", i);
  218. clutter_model_append (test_data.model,
  219. COLUMN_FOO, foo,
  220. COLUMN_BAR, i,
  221. -1);
  222. g_free (foo);
  223. }
  224. if (g_test_verbose ())
  225. g_print ("Forward iteration...\n");
  226. iter = clutter_model_get_first_iter (test_data.model);
  227. g_assert (iter != NULL);
  228. i = 0;
  229. while (!clutter_model_iter_is_last (iter))
  230. {
  231. compare_iter (iter, i,
  232. forward_base[i].expected_foo,
  233. forward_base[i].expected_bar);
  234. iter = clutter_model_iter_next (iter);
  235. i += 1;
  236. }
  237. g_object_unref (iter);
  238. if (g_test_verbose ())
  239. g_print ("Backward iteration...\n");
  240. iter = clutter_model_get_last_iter (test_data.model);
  241. g_assert (iter != NULL);
  242. i = 0;
  243. do
  244. {
  245. compare_iter (iter, G_N_ELEMENTS (backward_base) - i - 1,
  246. backward_base[i].expected_foo,
  247. backward_base[i].expected_bar);
  248. iter = clutter_model_iter_prev (iter);
  249. i += 1;
  250. }
  251. while (!clutter_model_iter_is_first (iter));
  252. compare_iter (iter, G_N_ELEMENTS (backward_base) - i - 1,
  253. backward_base[i].expected_foo,
  254. backward_base[i].expected_bar);
  255. g_object_unref (iter);
  256. g_object_unref (test_data.model);
  257. }
  258. void
  259. test_list_model_populate (TestConformSimpleFixture *fixture,
  260. gconstpointer data)
  261. {
  262. ModelData test_data = { NULL, 0 };
  263. gint i;
  264. test_data.model = clutter_list_model_new (N_COLUMNS,
  265. G_TYPE_STRING, "Foo",
  266. G_TYPE_INT, "Bar");
  267. test_data.n_row = 0;
  268. g_signal_connect (test_data.model, "row-added",
  269. G_CALLBACK (on_row_added),
  270. &test_data);
  271. for (i = 1; i < 10; i++)
  272. {
  273. gchar *foo = g_strdup_printf ("String %d", i);
  274. clutter_model_append (test_data.model,
  275. COLUMN_FOO, foo,
  276. COLUMN_BAR, i,
  277. -1);
  278. g_free (foo);
  279. }
  280. g_object_unref (test_data.model);
  281. }
  282. void
  283. test_list_model_from_script (TestConformSimpleFixture *fixture,
  284. gconstpointer dummy)
  285. {
  286. ClutterScript *script = clutter_script_new ();
  287. GObject *model;
  288. GError *error = NULL;
  289. gchar *test_file;
  290. const gchar *name;
  291. GType type;
  292. ClutterModelIter *iter;
  293. GValue value = { 0, };
  294. test_file = clutter_test_get_data_file ("test-script-model.json");
  295. clutter_script_load_from_file (script, test_file, &error);
  296. if (g_test_verbose () && error)
  297. g_print ("Error: %s", error->message);
  298. #if GLIB_CHECK_VERSION (2, 20, 0)
  299. g_assert_no_error (error);
  300. #else
  301. g_assert (error == NULL);
  302. #endif /* GLIB_CHECK_VERSION (2, 20, 0) */
  303. model = clutter_script_get_object (script, "test-model");
  304. g_assert (CLUTTER_IS_MODEL (model));
  305. g_assert (clutter_model_get_n_columns (CLUTTER_MODEL (model)) == 3);
  306. name = clutter_model_get_column_name (CLUTTER_MODEL (model), 0);
  307. type = clutter_model_get_column_type (CLUTTER_MODEL (model), 0);
  308. if (g_test_verbose ())
  309. g_print ("column[0]: %s, type: %s\n", name, g_type_name (type));
  310. g_assert (strcmp (name, "text-column") == 0);
  311. g_assert (type == G_TYPE_STRING);
  312. name = clutter_model_get_column_name (CLUTTER_MODEL (model), 2);
  313. type = clutter_model_get_column_type (CLUTTER_MODEL (model), 2);
  314. if (g_test_verbose ())
  315. g_print ("column[2]: %s, type: %s\n", name, g_type_name (type));
  316. g_assert (strcmp (name, "actor-column") == 0);
  317. g_assert (type == CLUTTER_TYPE_RECTANGLE);
  318. g_assert (clutter_model_get_n_rows (CLUTTER_MODEL (model)) == 3);
  319. iter = clutter_model_get_iter_at_row (CLUTTER_MODEL (model), 0);
  320. clutter_model_iter_get_value (iter, 0, &value);
  321. g_assert (G_VALUE_HOLDS_STRING (&value));
  322. g_assert (strcmp (g_value_get_string (&value), "text-row-1") == 0);
  323. g_value_unset (&value);
  324. clutter_model_iter_get_value (iter, 1, &value);
  325. g_assert (G_VALUE_HOLDS_INT (&value));
  326. g_assert (g_value_get_int (&value) == 1);
  327. g_value_unset (&value);
  328. clutter_model_iter_get_value (iter, 2, &value);
  329. g_assert (G_VALUE_HOLDS_OBJECT (&value));
  330. g_assert (g_value_get_object (&value) == NULL);
  331. g_value_unset (&value);
  332. iter = clutter_model_iter_next (iter);
  333. clutter_model_iter_get_value (iter, 2, &value);
  334. g_assert (G_VALUE_HOLDS_OBJECT (&value));
  335. g_assert (CLUTTER_IS_RECTANGLE (g_value_get_object (&value)));
  336. g_value_unset (&value);
  337. iter = clutter_model_iter_next (iter);
  338. clutter_model_iter_get_value (iter, 2, &value);
  339. g_assert (G_VALUE_HOLDS_OBJECT (&value));
  340. g_assert (CLUTTER_IS_RECTANGLE (g_value_get_object (&value)));
  341. g_assert (strcmp (clutter_actor_get_name (g_value_get_object (&value)),
  342. "actor-row-3") == 0);
  343. g_value_unset (&value);
  344. g_object_unref (iter);
  345. }