You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

235 lines
7.1 KiB

  1. /*
  2. * caca-test testsuite program for libcaca
  3. * Copyright (c) 2009 Sam Hocevar <sam@hocevar.net>
  4. * All Rights Reserved
  5. *
  6. * $Id$
  7. *
  8. * This program is free software. It comes without any warranty, to
  9. * the extent permitted by applicable law. You can redistribute it
  10. * and/or modify it under the terms of the Do What The Fuck You Want
  11. * To Public License, Version 2, as published by Sam Hocevar. See
  12. * http://sam.zoy.org/wtfpl/COPYING for more details.
  13. */
  14. #include "config.h"
  15. #include <cppunit/extensions/HelperMacros.h>
  16. #include <cppunit/TestCaller.h>
  17. #include <cppunit/TestCase.h>
  18. #include <cppunit/TestSuite.h>
  19. #include "caca.h"
  20. class DirtyTest : public CppUnit::TestCase
  21. {
  22. CPPUNIT_TEST_SUITE(DirtyTest);
  23. CPPUNIT_TEST(test_create);
  24. CPPUNIT_TEST(test_put_char_dirty);
  25. CPPUNIT_TEST(test_put_char_not_dirty);
  26. CPPUNIT_TEST(test_box);
  27. CPPUNIT_TEST(test_blit);
  28. CPPUNIT_TEST_SUITE_END();
  29. public:
  30. DirtyTest() : CppUnit::TestCase("Dirty Rectangles Test") {}
  31. void setUp() {}
  32. void tearDown() {}
  33. void test_create()
  34. {
  35. caca_canvas_t *cv;
  36. int i, dx, dy, dw, dh;
  37. /* Check that the dirty rectangle contains the whole canvas
  38. * upon creation. */
  39. cv = caca_create_canvas(WIDTH, HEIGHT);
  40. i = caca_get_dirty_rect_count(cv);
  41. CPPUNIT_ASSERT_EQUAL(i, 1);
  42. caca_get_dirty_rect(cv, 0, &dx, &dy, &dw, &dh);
  43. CPPUNIT_ASSERT_EQUAL(dx, 0);
  44. CPPUNIT_ASSERT_EQUAL(dy, 0);
  45. CPPUNIT_ASSERT_EQUAL(dw, caca_get_canvas_width(cv));
  46. CPPUNIT_ASSERT_EQUAL(dh, caca_get_canvas_height(cv));
  47. /* Invalidate the dirty rectangle and check that it stays so. */
  48. caca_clear_dirty_rect_list(cv);
  49. i = caca_get_dirty_rect_count(cv);
  50. CPPUNIT_ASSERT_EQUAL(i, 0);
  51. caca_free_canvas(cv);
  52. }
  53. void test_put_char_dirty()
  54. {
  55. caca_canvas_t *cv;
  56. int i, dx, dy, dw, dh;
  57. cv = caca_create_canvas(WIDTH, HEIGHT);
  58. caca_clear_dirty_rect_list(cv);
  59. caca_put_char(cv, 7, 3, 'x');
  60. i = caca_get_dirty_rect_count(cv);
  61. CPPUNIT_ASSERT_EQUAL(i, 1);
  62. caca_get_dirty_rect(cv, 0, &dx, &dy, &dw, &dh);
  63. CPPUNIT_ASSERT_EQUAL(dx, 7);
  64. CPPUNIT_ASSERT_EQUAL(dy, 3);
  65. CPPUNIT_ASSERT_EQUAL(dw, 1);
  66. CPPUNIT_ASSERT_EQUAL(dh, 1);
  67. caca_clear_canvas(cv);
  68. caca_clear_dirty_rect_list(cv);
  69. caca_put_char(cv, 7, 3, 0x2f06 /* ⼆ */);
  70. i = caca_get_dirty_rect_count(cv);
  71. CPPUNIT_ASSERT_EQUAL(i, 1);
  72. caca_get_dirty_rect(cv, 0, &dx, &dy, &dw, &dh);
  73. CPPUNIT_ASSERT_EQUAL(dx, 7);
  74. CPPUNIT_ASSERT_EQUAL(dy, 3);
  75. CPPUNIT_ASSERT_EQUAL(dw, 2);
  76. CPPUNIT_ASSERT_EQUAL(dh, 1);
  77. caca_clear_canvas(cv);
  78. caca_put_char(cv, 7, 3, 0x2f06 /* ⼆ */);
  79. caca_clear_dirty_rect_list(cv);
  80. caca_put_char(cv, 7, 3, 'x');
  81. i = caca_get_dirty_rect_count(cv);
  82. CPPUNIT_ASSERT_EQUAL(i, 1);
  83. caca_get_dirty_rect(cv, 0, &dx, &dy, &dw, &dh);
  84. CPPUNIT_ASSERT_EQUAL(dx, 7);
  85. CPPUNIT_ASSERT_EQUAL(dy, 3);
  86. CPPUNIT_ASSERT_EQUAL(dw, 2);
  87. CPPUNIT_ASSERT_EQUAL(dh, 1);
  88. caca_clear_canvas(cv);
  89. caca_put_char(cv, 7, 3, 0x2f06 /* ⼆ */);
  90. caca_clear_dirty_rect_list(cv);
  91. caca_put_char(cv, 8, 3, 'x');
  92. i = caca_get_dirty_rect_count(cv);
  93. CPPUNIT_ASSERT_EQUAL(i, 1);
  94. caca_get_dirty_rect(cv, 0, &dx, &dy, &dw, &dh);
  95. CPPUNIT_ASSERT_EQUAL(dx, 7);
  96. CPPUNIT_ASSERT_EQUAL(dy, 3);
  97. CPPUNIT_ASSERT_EQUAL(dw, 2);
  98. CPPUNIT_ASSERT_EQUAL(dh, 1);
  99. caca_clear_canvas(cv);
  100. caca_put_char(cv, 7, 3, 0x2f06 /* ⼆ */);
  101. caca_clear_dirty_rect_list(cv);
  102. caca_put_char(cv, 6, 3, 0x2f06 /* ⼆ */);
  103. i = caca_get_dirty_rect_count(cv);
  104. CPPUNIT_ASSERT_EQUAL(i, 1);
  105. caca_get_dirty_rect(cv, 0, &dx, &dy, &dw, &dh);
  106. CPPUNIT_ASSERT_EQUAL(dx, 6);
  107. CPPUNIT_ASSERT_EQUAL(dy, 3);
  108. CPPUNIT_ASSERT_EQUAL(dw, 3);
  109. CPPUNIT_ASSERT_EQUAL(dh, 1);
  110. caca_clear_canvas(cv);
  111. caca_put_char(cv, 7, 3, 0x2f06 /* ⼆ */);
  112. caca_clear_dirty_rect_list(cv);
  113. caca_put_char(cv, 8, 3, 0x2f06 /* ⼆ */);
  114. i = caca_get_dirty_rect_count(cv);
  115. CPPUNIT_ASSERT_EQUAL(i, 1);
  116. caca_get_dirty_rect(cv, 0, &dx, &dy, &dw, &dh);
  117. CPPUNIT_ASSERT_EQUAL(dx, 7);
  118. CPPUNIT_ASSERT_EQUAL(dy, 3);
  119. CPPUNIT_ASSERT_EQUAL(dw, 3);
  120. CPPUNIT_ASSERT_EQUAL(dh, 1);
  121. }
  122. void test_put_char_not_dirty()
  123. {
  124. caca_canvas_t *cv;
  125. int i;
  126. cv = caca_create_canvas(WIDTH, HEIGHT);
  127. /* Check that pasting the same character does not cause
  128. * a dirty rectangle to be created. */
  129. caca_put_char(cv, 7, 3, 'x');
  130. caca_clear_dirty_rect_list(cv);
  131. caca_put_char(cv, 7, 3, 'x');
  132. i = caca_get_dirty_rect_count(cv);
  133. CPPUNIT_ASSERT_EQUAL(i, 0);
  134. caca_clear_canvas(cv);
  135. caca_put_char(cv, 7, 3, 0x2f06 /* ⼆ */);
  136. caca_clear_dirty_rect_list(cv);
  137. caca_put_char(cv, 7, 3, 0x2f06 /* ⼆ */);
  138. i = caca_get_dirty_rect_count(cv);
  139. CPPUNIT_ASSERT_EQUAL(i, 0);
  140. }
  141. void test_box()
  142. {
  143. caca_canvas_t *cv;
  144. int i, dx, dy, dw, dh;
  145. cv = caca_create_canvas(WIDTH, HEIGHT);
  146. caca_clear_dirty_rect_list(cv);
  147. caca_fill_box(cv, 7, 3, 14, 9, 'x');
  148. i = caca_get_dirty_rect_count(cv);
  149. CPPUNIT_ASSERT_EQUAL(i, 1);
  150. caca_get_dirty_rect(cv, 0, &dx, &dy, &dw, &dh);
  151. CPPUNIT_ASSERT_EQUAL(dx, 7);
  152. CPPUNIT_ASSERT_EQUAL(dy, 3);
  153. CPPUNIT_ASSERT_EQUAL(dw, 14);
  154. CPPUNIT_ASSERT_EQUAL(dh, 9);
  155. caca_clear_dirty_rect_list(cv);
  156. caca_fill_box(cv, 7, 3, 14, 9, 'x');
  157. i = caca_get_dirty_rect_count(cv);
  158. CPPUNIT_ASSERT_EQUAL(i, 0);
  159. }
  160. void test_blit()
  161. {
  162. caca_canvas_t *cv, *cv2;
  163. int i, dx, dy, dw, dh;
  164. cv = caca_create_canvas(WIDTH, HEIGHT);
  165. caca_clear_dirty_rect_list(cv);
  166. cv2 = caca_create_canvas(2, 2);
  167. caca_fill_box(cv2, 0, 0, 2, 1, 'x');
  168. /* Check that blitting a canvas make a dirty rectangle
  169. * only for modified lines */
  170. caca_blit(cv, 1, 1, cv2, NULL);
  171. i = caca_get_dirty_rect_count(cv);
  172. CPPUNIT_ASSERT_EQUAL(i, 1);
  173. caca_get_dirty_rect(cv, 0, &dx, &dy, &dw, &dh);
  174. CPPUNIT_ASSERT(dx == 1);
  175. CPPUNIT_ASSERT(dy == 1);
  176. CPPUNIT_ASSERT(dw >= 2);
  177. CPPUNIT_ASSERT(dh == 1);
  178. caca_clear_canvas(cv);
  179. caca_clear_dirty_rect_list(cv);
  180. /* Check that blitting a canvas make a dirty rectangle
  181. * only for modified chars when we have a mask */
  182. caca_blit(cv, 1, 1, cv2, cv2);
  183. i = caca_get_dirty_rect_count(cv);
  184. CPPUNIT_ASSERT_EQUAL(i, 1);
  185. caca_get_dirty_rect(cv, 0, &dx, &dy, &dw, &dh);
  186. CPPUNIT_ASSERT(dx == 1);
  187. CPPUNIT_ASSERT(dy == 1);
  188. CPPUNIT_ASSERT(dw == 2);
  189. CPPUNIT_ASSERT(dh == 1);
  190. }
  191. private:
  192. static int const WIDTH = 80, HEIGHT = 50;
  193. };
  194. CPPUNIT_TEST_SUITE_REGISTRATION(DirtyTest);