blob: be9c6ec903e9a0a6088885e56118200c9fad5743 [file] [log] [blame]
reed@google.com63c1ad82011-04-18 14:15:36 +00001#include "Test.h"
2#include "SkClampRange.h"
3#include "SkRandom.h"
4
5static skiatest::Reporter* gReporter;
6
reed@google.com13659f12011-04-18 19:59:38 +00007static void debug_me() {
8 if (NULL == gReporter) {
9 SkDebugf("dsfdssd\n");
10 }
11}
12
13#ifdef USE_REPORTER
14
15#define R_ASSERT(cond) \
16 do { if (!(cond)) { \
17 debug_me(); \
18 REPORTER_ASSERT(gReporter, cond); \
19 }} while (0)
20
21#else
22#define R_ASSERT(cond) \
23 do { if (!(cond)) { \
24 debug_me(); \
25 }} while (0)
26#endif
27
reed@google.com63c1ad82011-04-18 14:15:36 +000028static int classify_value(SkFixed fx, int v0, int v1) {
29 if (fx <= 0) {
30 return v0;
31 }
32 if (fx >= 0xFFFF) {
33 return v1;
34 }
reed@google.com13659f12011-04-18 19:59:38 +000035 R_ASSERT(false);
reed@google.com63c1ad82011-04-18 14:15:36 +000036 return 0;
37}
38
39#define V0 -42
40#define V1 1024
41
42static void slow_check(const SkClampRange& range,
43 SkFixed fx, SkFixed dx, int count) {
44 SkASSERT(range.fCount0 + range.fCount1 + range.fCount2 == count);
reed@google.com13659f12011-04-18 19:59:38 +000045
reed@google.com63c1ad82011-04-18 14:15:36 +000046 int i;
reed@google.com13659f12011-04-18 19:59:38 +000047 if (range.fOverflowed) {
48 fx = range.fFx1;
49 for (i = 0; i < range.fCount1; i++) {
50 R_ASSERT(fx >= 0 && fx <= 0xFFFF);
51 fx += dx;
52 }
53 } else {
54 for (i = 0; i < range.fCount0; i++) {
55 int v = classify_value(fx, V0, V1);
56 R_ASSERT(v == range.fV0);
57 fx += dx;
58 }
59 if (range.fCount1 > 0 && fx != range.fFx1) {
60 SkDebugf("%x %x\n", fx, range.fFx1);
61 R_ASSERT(!"bad fFx1");
62 return;
63 }
64 for (i = 0; i < range.fCount1; i++) {
65 R_ASSERT(fx >= 0 && fx <= 0xFFFF);
66 fx += dx;
67 }
68 for (i = 0; i < range.fCount2; i++) {
69 int v = classify_value(fx, V0, V1);
70 R_ASSERT(v == range.fV1);
71 fx += dx;
72 }
reed@google.com63c1ad82011-04-18 14:15:36 +000073 }
74}
75
76static void test_range(SkFixed fx, SkFixed dx, int count) {
77 SkClampRange range;
78 range.init(fx, dx, count, V0, V1);
79 slow_check(range, fx, dx, count);
80}
81
82#define ff(x) SkIntToFixed(x)
83
reed@google.com13659f12011-04-18 19:59:38 +000084void TestClampRange(skiatest::Reporter* reporter);
85void TestClampRange(skiatest::Reporter* reporter) {
reed@google.com63c1ad82011-04-18 14:15:36 +000086 gReporter = reporter;
87
88 test_range(0, 0, 20);
89 test_range(0xFFFF, 0, 20);
90 test_range(-ff(2), 0, 20);
91 test_range( ff(2), 0, 20);
92
93 test_range(-10, 1, 20);
94 test_range(10, -1, 20);
95 test_range(-10, 3, 20);
96 test_range(10, -3, 20);
reed@google.com13659f12011-04-18 19:59:38 +000097
98 test_range(ff(1), ff(16384), 100);
99 test_range(ff(-1), ff(-16384), 100);
100 test_range(ff(1)/2, ff(16384), 100);
101 test_range(ff(1)/2, ff(-16384), 100);
102
reed@google.com63c1ad82011-04-18 14:15:36 +0000103 SkRandom rand;
104
105 // test non-overflow cases
106 for (int i = 0; i < 1000000; i++) {
107 SkFixed fx = rand.nextS() >> 1;
108 SkFixed sx = rand.nextS() >> 1;
109 int count = rand.nextU() % 1000 + 1;
110 SkFixed dx = (sx - fx) / count;
111 test_range(fx, dx, count);
112 }
113
114 // test overflow cases
reed@google.com13659f12011-04-18 19:59:38 +0000115 for (int i = 0; i < 100000; i++) {
reed@google.com63c1ad82011-04-18 14:15:36 +0000116 SkFixed fx = rand.nextS();
reed@google.com13659f12011-04-18 19:59:38 +0000117 SkFixed dx = rand.nextS();
reed@google.com63c1ad82011-04-18 14:15:36 +0000118 int count = rand.nextU() % 1000 + 1;
reed@google.com63c1ad82011-04-18 14:15:36 +0000119 test_range(fx, dx, count);
120 }
121}
122
reed@google.com13659f12011-04-18 19:59:38 +0000123#ifdef USE_REPORTER
124
reed@google.com63c1ad82011-04-18 14:15:36 +0000125#include "TestClassDef.h"
126DEFINE_TESTCLASS("ClampRange", ClampRangeClass, TestClampRange)
reed@google.com13659f12011-04-18 19:59:38 +0000127
128#endif