ClampRangeTest.cpp revision ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976e
1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc.
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
7ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */
863c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com#include "Test.h"
963c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com#include "SkClampRange.h"
1063c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com#include "SkRandom.h"
1163c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com
1263c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.comstatic skiatest::Reporter* gReporter;
1363c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com
1413659f1f8d2e705c565203d45870b1afcd47cf98reed@google.comstatic void debug_me() {
1513659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com    if (NULL == gReporter) {
1613659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com        SkDebugf("dsfdssd\n");
1713659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com    }
1813659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com}
1913659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com
2013659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com#ifdef USE_REPORTER
2113659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com
2213659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com#define R_ASSERT(cond)                  \
2313659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com    do { if (!(cond)) {                 \
2413659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com    debug_me();                         \
2513659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com    REPORTER_ASSERT(gReporter, cond);   \
2613659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com    }} while (0)
2713659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com
2813659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com#else
2913659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com#define R_ASSERT(cond)                  \
3013659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com    do { if (!(cond)) {                 \
3113659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com    debug_me();                         \
3213659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com    }} while (0)
3313659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com#endif
3413659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com
3563c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.comstatic int classify_value(SkFixed fx, int v0, int v1) {
3663c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com    if (fx <= 0) {
3763c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com        return v0;
3863c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com    }
3963c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com    if (fx >= 0xFFFF) {
4063c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com        return v1;
4163c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com    }
4213659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com    R_ASSERT(false);
4363c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com    return 0;
4463c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com}
4563c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com
4663c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com#define V0  -42
4763c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com#define V1  1024
4863c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com
4963c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.comstatic void slow_check(const SkClampRange& range,
5063c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com                       SkFixed fx, SkFixed dx, int count) {
5163c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com    SkASSERT(range.fCount0 + range.fCount1 + range.fCount2 == count);
5213659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com
5363c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com    int i;
5413659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com    if (range.fOverflowed) {
5513659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com        fx = range.fFx1;
5613659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com        for (i = 0; i < range.fCount1; i++) {
5713659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com            R_ASSERT(fx >= 0 && fx <= 0xFFFF);
5813659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com            fx += dx;
5913659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com        }
6013659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com    } else {
6113659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com        for (i = 0; i < range.fCount0; i++) {
6213659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com            int v = classify_value(fx, V0, V1);
6313659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com            R_ASSERT(v == range.fV0);
6413659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com            fx += dx;
6513659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com        }
6613659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com        if (range.fCount1 > 0 && fx != range.fFx1) {
6713659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com            SkDebugf("%x %x\n", fx, range.fFx1);
6813659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com            R_ASSERT(!"bad fFx1");
6913659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com            return;
7013659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com        }
7113659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com        for (i = 0; i < range.fCount1; i++) {
7213659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com            R_ASSERT(fx >= 0 && fx <= 0xFFFF);
7313659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com            fx += dx;
7413659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com        }
7513659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com        for (i = 0; i < range.fCount2; i++) {
7613659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com            int v = classify_value(fx, V0, V1);
7713659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com            R_ASSERT(v == range.fV1);
7813659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com            fx += dx;
7913659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com        }
8063c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com    }
8163c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com}
8263c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com
8363c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.comstatic void test_range(SkFixed fx, SkFixed dx, int count) {
8463c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com    SkClampRange range;
8563c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com    range.init(fx, dx, count, V0, V1);
8663c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com    slow_check(range, fx, dx, count);
8763c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com}
8863c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com
8963c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com#define ff(x)   SkIntToFixed(x)
9063c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com
9113659f1f8d2e705c565203d45870b1afcd47cf98reed@google.comvoid TestClampRange(skiatest::Reporter* reporter);
9213659f1f8d2e705c565203d45870b1afcd47cf98reed@google.comvoid TestClampRange(skiatest::Reporter* reporter) {
9363c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com    gReporter = reporter;
9463c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com
9563c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com    test_range(0, 0, 20);
9663c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com    test_range(0xFFFF, 0, 20);
9763c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com    test_range(-ff(2), 0, 20);
9863c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com    test_range( ff(2), 0, 20);
9963c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com
10063c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com    test_range(-10, 1, 20);
10163c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com    test_range(10, -1, 20);
10263c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com    test_range(-10, 3, 20);
10363c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com    test_range(10, -3, 20);
10413659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com
10513659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com    test_range(ff(1),  ff(16384),  100);
10613659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com    test_range(ff(-1), ff(-16384), 100);
10713659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com    test_range(ff(1)/2, ff(16384), 100);
10813659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com    test_range(ff(1)/2, ff(-16384), 100);
10913659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com
11063c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com    SkRandom rand;
11163c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com
11263c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com    // test non-overflow cases
11363c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com    for (int i = 0; i < 1000000; i++) {
11463c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com        SkFixed fx = rand.nextS() >> 1;
11563c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com        SkFixed sx = rand.nextS() >> 1;
11663c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com        int count = rand.nextU() % 1000 + 1;
11763c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com        SkFixed dx = (sx - fx) / count;
11863c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com        test_range(fx, dx, count);
11963c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com    }
12063c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com
12163c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com    // test overflow cases
12213659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com    for (int i = 0; i < 100000; i++) {
12363c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com        SkFixed fx = rand.nextS();
12413659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com        SkFixed dx = rand.nextS();
12563c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com        int count = rand.nextU() % 1000 + 1;
12663c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com        test_range(fx, dx, count);
12763c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com    }
12863c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com}
12963c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com
13013659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com#ifdef USE_REPORTER
13113659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com
13263c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.com#include "TestClassDef.h"
13363c1ad82fc4232daff1b686cc78bba4c6a42916dreed@google.comDEFINE_TESTCLASS("ClampRange", ClampRangeClass, TestClampRange)
13413659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com
13513659f1f8d2e705c565203d45870b1afcd47cf98reed@google.com#endif
136