ClampRangeTest.cpp revision e0e7cfe44bb9d66d76120a79e5275c294bacaa22
1
2/*
3 * Copyright 2011 Google Inc.
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
8#include "Test.h"
9#include "gradients/SkClampRange.h"
10#include "SkRandom.h"
11
12static skiatest::Reporter* gReporter;
13
14static void debug_me() {
15    if (NULL == gReporter) {
16        SkDebugf("dsfdssd\n");
17    }
18}
19
20#ifdef USE_REPORTER
21
22#define R_ASSERT(cond)                  \
23    do { if (!(cond)) {                 \
24    debug_me();                         \
25    REPORTER_ASSERT(gReporter, cond);   \
26    }} while (0)
27
28#else
29#define R_ASSERT(cond)                  \
30    do { if (!(cond)) {                 \
31    debug_me();                         \
32    }} while (0)
33#endif
34
35static int classify_value(SkFixed fx, int v0, int v1) {
36    if (fx <= 0) {
37        return v0;
38    }
39    if (fx >= 0xFFFF) {
40        return v1;
41    }
42    R_ASSERT(false);
43    return 0;
44}
45
46#define V0  -42
47#define V1  1024
48
49static void slow_check(const SkClampRange& range,
50                       SkFixed fx, SkFixed dx, int count) {
51    SkASSERT(range.fCount0 + range.fCount1 + range.fCount2 == count);
52
53    int i;
54    if (range.fOverflowed) {
55        fx = range.fFx1;
56        for (i = 0; i < range.fCount1; i++) {
57            R_ASSERT(fx >= 0 && fx <= 0xFFFF);
58            fx += dx;
59        }
60    } else {
61        for (i = 0; i < range.fCount0; i++) {
62            int v = classify_value(fx, V0, V1);
63            R_ASSERT(v == range.fV0);
64            fx += dx;
65        }
66        if (range.fCount1 > 0 && fx != range.fFx1) {
67            SkDebugf("%x %x\n", fx, range.fFx1);
68            R_ASSERT(false); // bad fFx1
69            return;
70        }
71        for (i = 0; i < range.fCount1; i++) {
72            R_ASSERT(fx >= 0 && fx <= 0xFFFF);
73            fx += dx;
74        }
75        for (i = 0; i < range.fCount2; i++) {
76            int v = classify_value(fx, V0, V1);
77            R_ASSERT(v == range.fV1);
78            fx += dx;
79        }
80    }
81}
82
83static void test_range(SkFixed fx, SkFixed dx, int count) {
84    SkClampRange range;
85    range.init(fx, dx, count, V0, V1);
86    slow_check(range, fx, dx, count);
87}
88
89#define ff(x)   SkIntToFixed(x)
90
91void TestClampRange(skiatest::Reporter* reporter);
92void TestClampRange(skiatest::Reporter* reporter) {
93    gReporter = reporter;
94
95    test_range(0, 0, 20);
96    test_range(0xFFFF, 0, 20);
97    test_range(-ff(2), 0, 20);
98    test_range( ff(2), 0, 20);
99
100    test_range(-10, 1, 20);
101    test_range(10, -1, 20);
102    test_range(-10, 3, 20);
103    test_range(10, -3, 20);
104
105    test_range(ff(1),  ff(16384),  100);
106    test_range(ff(-1), ff(-16384), 100);
107    test_range(ff(1)/2, ff(16384), 100);
108    test_range(ff(1)/2, ff(-16384), 100);
109
110    SkRandom rand;
111
112    // test non-overflow cases
113    for (int i = 0; i < 1000000; i++) {
114        SkFixed fx = rand.nextS() >> 1;
115        SkFixed sx = rand.nextS() >> 1;
116        int count = rand.nextU() % 1000 + 1;
117        SkFixed dx = (sx - fx) / count;
118        test_range(fx, dx, count);
119    }
120
121    // test overflow cases
122    for (int i = 0; i < 100000; i++) {
123        SkFixed fx = rand.nextS();
124        SkFixed dx = rand.nextS();
125        int count = rand.nextU() % 1000 + 1;
126        test_range(fx, dx, count);
127    }
128}
129
130#ifdef USE_REPORTER
131
132#include "TestClassDef.h"
133DEFINE_TESTCLASS("ClampRange", ClampRangeClass, TestClampRange)
134
135#endif
136