ClampRangeTest.cpp revision 8f6884aab8aecd7657cf3f9cdbc682f0deca29c5
1/* 2 * Copyright 2011 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8#include "SkRandom.h" 9#include "Test.h" 10#include "gradients/SkClampRange.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 83 84static void test_range(SkFixed fx, SkFixed dx, int count) { 85 SkClampRange range; 86 range.init(fx, dx, count, V0, V1); 87 slow_check(range, fx, dx, count); 88} 89 90#define ff(x) SkIntToFixed(x) 91 92DEF_TEST(ClampRange, 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