source: libcaca/trunk/tests/dirty.cpp @ 3557

Last change on this file since 3557 was 3557, checked in by Pascal Terjan, 10 years ago
  • Also test blitting with mask
  • Property svn:keywords set to Id
File size: 7.1 KB
Line 
1/*
2 *  caca-test     testsuite program for libcaca
3 *  Copyright (c) 2009 Sam Hocevar <sam@hocevar.net>
4 *                All Rights Reserved
5 *
6 *  $Id: dirty.cpp 3557 2009-07-19 21:12:39Z pterjan $
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
15#include "config.h"
16
17#include <cppunit/extensions/HelperMacros.h>
18#include <cppunit/TestCaller.h>
19#include <cppunit/TestCase.h>
20#include <cppunit/TestSuite.h>
21
22#include "caca.h"
23
24class DirtyTest : public CppUnit::TestCase
25{
26    CPPUNIT_TEST_SUITE(DirtyTest);
27    CPPUNIT_TEST(test_create);
28    CPPUNIT_TEST(test_put_char_dirty);
29    CPPUNIT_TEST(test_put_char_not_dirty);
30    CPPUNIT_TEST(test_box);
31    CPPUNIT_TEST(test_blit);
32    CPPUNIT_TEST_SUITE_END();
33
34public:
35    DirtyTest() : CppUnit::TestCase("Dirty Rectangles Test") {}
36
37    void setUp() {}
38
39    void tearDown() {}
40
41    void test_create()
42    {
43        caca_canvas_t *cv;
44        int i, dx, dy, dw, dh;
45
46        /* Check that the dirty rectangle contains the whole canvas
47         * upon creation. */
48        cv = caca_create_canvas(WIDTH, HEIGHT);
49        i = caca_get_dirty_rect_count(cv);
50        CPPUNIT_ASSERT_EQUAL(i, 1);
51
52        caca_get_dirty_rect(cv, 0, &dx, &dy, &dw, &dh);
53        CPPUNIT_ASSERT_EQUAL(dx, 0);
54        CPPUNIT_ASSERT_EQUAL(dy, 0);
55        CPPUNIT_ASSERT_EQUAL(dw, caca_get_canvas_width(cv));
56        CPPUNIT_ASSERT_EQUAL(dh, caca_get_canvas_height(cv));
57
58        /* Invalidate the dirty rectangle and check that it stays so. */
59        caca_clear_dirty_rect_list(cv);
60        i = caca_get_dirty_rect_count(cv);
61        CPPUNIT_ASSERT_EQUAL(i, 0);
62
63        caca_free_canvas(cv);
64    }
65
66    void test_put_char_dirty()
67    {
68        caca_canvas_t *cv;
69        int i, dx, dy, dw, dh;
70
71        cv = caca_create_canvas(WIDTH, HEIGHT);
72
73        caca_clear_dirty_rect_list(cv);
74        caca_put_char(cv, 7, 3, 'x');
75        i = caca_get_dirty_rect_count(cv);
76        CPPUNIT_ASSERT_EQUAL(i, 1);
77        caca_get_dirty_rect(cv, 0, &dx, &dy, &dw, &dh);
78        CPPUNIT_ASSERT_EQUAL(dx, 7);
79        CPPUNIT_ASSERT_EQUAL(dy, 3);
80        CPPUNIT_ASSERT_EQUAL(dw, 1);
81        CPPUNIT_ASSERT_EQUAL(dh, 1);
82
83        caca_clear_canvas(cv);
84        caca_clear_dirty_rect_list(cv);
85        caca_put_char(cv, 7, 3, 0x2f06 /* ⼆ */);
86        i = caca_get_dirty_rect_count(cv);
87        CPPUNIT_ASSERT_EQUAL(i, 1);
88        caca_get_dirty_rect(cv, 0, &dx, &dy, &dw, &dh);
89        CPPUNIT_ASSERT_EQUAL(dx, 7);
90        CPPUNIT_ASSERT_EQUAL(dy, 3);
91        CPPUNIT_ASSERT_EQUAL(dw, 2);
92        CPPUNIT_ASSERT_EQUAL(dh, 1);
93
94        caca_clear_canvas(cv);
95        caca_put_char(cv, 7, 3, 0x2f06 /* ⼆ */);
96        caca_clear_dirty_rect_list(cv);
97        caca_put_char(cv, 7, 3, 'x');
98        i = caca_get_dirty_rect_count(cv);
99        CPPUNIT_ASSERT_EQUAL(i, 1);
100        caca_get_dirty_rect(cv, 0, &dx, &dy, &dw, &dh);
101        CPPUNIT_ASSERT_EQUAL(dx, 7);
102        CPPUNIT_ASSERT_EQUAL(dy, 3);
103        CPPUNIT_ASSERT_EQUAL(dw, 2);
104        CPPUNIT_ASSERT_EQUAL(dh, 1);
105
106        caca_clear_canvas(cv);
107        caca_put_char(cv, 7, 3, 0x2f06 /* ⼆ */);
108        caca_clear_dirty_rect_list(cv);
109        caca_put_char(cv, 8, 3, 'x');
110        i = caca_get_dirty_rect_count(cv);
111        CPPUNIT_ASSERT_EQUAL(i, 1);
112        caca_get_dirty_rect(cv, 0, &dx, &dy, &dw, &dh);
113        CPPUNIT_ASSERT_EQUAL(dx, 7);
114        CPPUNIT_ASSERT_EQUAL(dy, 3);
115        CPPUNIT_ASSERT_EQUAL(dw, 2);
116        CPPUNIT_ASSERT_EQUAL(dh, 1);
117
118        caca_clear_canvas(cv);
119        caca_put_char(cv, 7, 3, 0x2f06 /* ⼆ */);
120        caca_clear_dirty_rect_list(cv);
121        caca_put_char(cv, 6, 3, 0x2f06 /* ⼆ */);
122        i = caca_get_dirty_rect_count(cv);
123        CPPUNIT_ASSERT_EQUAL(i, 1);
124        caca_get_dirty_rect(cv, 0, &dx, &dy, &dw, &dh);
125        CPPUNIT_ASSERT_EQUAL(dx, 6);
126        CPPUNIT_ASSERT_EQUAL(dy, 3);
127        CPPUNIT_ASSERT_EQUAL(dw, 3);
128        CPPUNIT_ASSERT_EQUAL(dh, 1);
129
130        caca_clear_canvas(cv);
131        caca_put_char(cv, 7, 3, 0x2f06 /* ⼆ */);
132        caca_clear_dirty_rect_list(cv);
133        caca_put_char(cv, 8, 3, 0x2f06 /* ⼆ */);
134        i = caca_get_dirty_rect_count(cv);
135        CPPUNIT_ASSERT_EQUAL(i, 1);
136        caca_get_dirty_rect(cv, 0, &dx, &dy, &dw, &dh);
137        CPPUNIT_ASSERT_EQUAL(dx, 7);
138        CPPUNIT_ASSERT_EQUAL(dy, 3);
139        CPPUNIT_ASSERT_EQUAL(dw, 3);
140        CPPUNIT_ASSERT_EQUAL(dh, 1);
141    }
142
143    void test_put_char_not_dirty()
144    {
145        caca_canvas_t *cv;
146        int i;
147
148        cv = caca_create_canvas(WIDTH, HEIGHT);
149
150        /* Check that pasting the same character does not cause
151         * a dirty rectangle to be created. */
152        caca_put_char(cv, 7, 3, 'x');
153        caca_clear_dirty_rect_list(cv);
154        caca_put_char(cv, 7, 3, 'x');
155        i = caca_get_dirty_rect_count(cv);
156        CPPUNIT_ASSERT_EQUAL(i, 0);
157
158        caca_clear_canvas(cv);
159        caca_put_char(cv, 7, 3, 0x2f06 /* ⼆ */);
160        caca_clear_dirty_rect_list(cv);
161        caca_put_char(cv, 7, 3, 0x2f06 /* ⼆ */);
162        i = caca_get_dirty_rect_count(cv);
163        CPPUNIT_ASSERT_EQUAL(i, 0);
164    }
165
166    void test_box()
167    {
168        caca_canvas_t *cv;
169        int i, dx, dy, dw, dh;
170
171        cv = caca_create_canvas(WIDTH, HEIGHT);
172        caca_clear_dirty_rect_list(cv);
173
174        caca_fill_box(cv, 7, 3, 14, 9, 'x');
175        i = caca_get_dirty_rect_count(cv);
176        CPPUNIT_ASSERT_EQUAL(i, 1);
177        caca_get_dirty_rect(cv, 0, &dx, &dy, &dw, &dh);
178        CPPUNIT_ASSERT_EQUAL(dx, 7);
179        CPPUNIT_ASSERT_EQUAL(dy, 3);
180        CPPUNIT_ASSERT_EQUAL(dw, 14);
181        CPPUNIT_ASSERT_EQUAL(dh, 9);
182
183        caca_clear_dirty_rect_list(cv);
184        caca_fill_box(cv, 7, 3, 14, 9, 'x');
185        i = caca_get_dirty_rect_count(cv);
186        CPPUNIT_ASSERT_EQUAL(i, 0);
187    }
188
189    void test_blit()
190    {
191        caca_canvas_t *cv, *cv2;
192        int i, dx, dy, dw, dh;
193
194        cv = caca_create_canvas(WIDTH, HEIGHT);
195        caca_clear_dirty_rect_list(cv);
196        cv2 = caca_create_canvas(2, 2);
197        caca_fill_box(cv2, 0, 0, 2, 1, 'x');
198
199        /* Check that blitting a canvas make a dirty rectangle
200         * only for modified lines */
201
202        caca_blit(cv, 1, 1, cv2, NULL);
203        i = caca_get_dirty_rect_count(cv);
204        CPPUNIT_ASSERT_EQUAL(i, 1);
205        caca_get_dirty_rect(cv, 0, &dx, &dy, &dw, &dh);
206
207        CPPUNIT_ASSERT(dx == 1);
208        CPPUNIT_ASSERT(dy == 1);
209        CPPUNIT_ASSERT(dw >= 2);
210        CPPUNIT_ASSERT(dh == 1);
211
212        caca_clear_canvas(cv);
213        caca_clear_dirty_rect_list(cv);
214
215        /* Check that blitting a canvas make a dirty rectangle
216         * only for modified chars when we have a mask */
217
218        caca_blit(cv, 1, 1, cv2, cv2);
219        i = caca_get_dirty_rect_count(cv);
220        CPPUNIT_ASSERT_EQUAL(i, 1);
221        caca_get_dirty_rect(cv, 0, &dx, &dy, &dw, &dh);
222
223        CPPUNIT_ASSERT(dx == 1);
224        CPPUNIT_ASSERT(dy == 1);
225        CPPUNIT_ASSERT(dw == 2);
226        CPPUNIT_ASSERT(dh == 1);
227    }
228
229private:
230    static int const WIDTH = 80, HEIGHT = 50;
231};
232
233CPPUNIT_TEST_SUITE_REGISTRATION(DirtyTest);
234
Note: See TracBrowser for help on using the repository browser.