Home | History | Annotate | Download | only in tests
      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 "SkRandom.h"
     10 #include "SkRect.h"
     11 
     12 #ifdef SK_SCALAR_IS_FLOAT
     13 static float make_zero() {
     14     return sk_float_sin(0);
     15 }
     16 #endif
     17 
     18 struct RectCenter {
     19     SkIRect  fRect;
     20     SkIPoint fCenter;
     21 };
     22 
     23 static void test_center(skiatest::Reporter* reporter) {
     24     static const RectCenter gData[] = {
     25         { { 0, 0, 0, 0 }, { 0, 0 } },
     26         { { 0, 0, 1, 1 }, { 0, 0 } },
     27         { { -1, -1, 0, 0 }, { -1, -1 } },
     28         { { 0, 0, 10, 7 }, { 5, 3 } },
     29         { { 0, 0, 11, 6 }, { 5, 3 } },
     30     };
     31     for (size_t index = 0; index < SK_ARRAY_COUNT(gData); ++index) {
     32         REPORTER_ASSERT(reporter,
     33                         gData[index].fRect.centerX() == gData[index].fCenter.x());
     34         REPORTER_ASSERT(reporter,
     35                         gData[index].fRect.centerY() == gData[index].fCenter.y());
     36     }
     37 
     38     SkMWCRandom rand;
     39     for (int i = 0; i < 10000; ++i) {
     40         SkIRect r;
     41 
     42         r.set(rand.nextS() >> 2, rand.nextS() >> 2,
     43               rand.nextS() >> 2, rand.nextS() >> 2);
     44         int cx = r.centerX();
     45         int cy = r.centerY();
     46         REPORTER_ASSERT(reporter, ((r.left() + r.right()) >> 1) == cx);
     47         REPORTER_ASSERT(reporter, ((r.top() + r.bottom()) >> 1) == cy);
     48     }
     49 }
     50 
     51 static void check_invalid(skiatest::Reporter* reporter,
     52                           SkScalar l, SkScalar t, SkScalar r, SkScalar b) {
     53     SkRect rect;
     54     rect.set(l, t, r, b);
     55     REPORTER_ASSERT(reporter, !rect.isFinite());
     56 }
     57 
     58 // Tests that isFinite() will reject any rect with +/-inf values
     59 // as one of its coordinates.
     60 static void TestInfRect(skiatest::Reporter* reporter) {
     61 #ifdef SK_SCALAR_IS_FLOAT
     62     float inf = 1 / make_zero();    // infinity
     63     float nan = inf * 0;
     64     SkASSERT(!(nan == nan));
     65 #else
     66     SkFixed inf = SK_FixedNaN;
     67     SkFixed nan = SK_FixedNaN;
     68 #endif
     69     SkScalar small = SkIntToScalar(10);
     70     SkScalar big = SkIntToScalar(100);
     71 
     72     REPORTER_ASSERT(reporter, SkRect::MakeEmpty().isFinite());
     73 
     74     SkRect rect = SkRect::MakeXYWH(small, small, big, big);
     75     REPORTER_ASSERT(reporter, rect.isFinite());
     76 
     77     const SkScalar invalid[] = { nan, inf, -inf };
     78     for (size_t i = 0; i < SK_ARRAY_COUNT(invalid); ++i) {
     79         check_invalid(reporter, small, small, big, invalid[i]);
     80         check_invalid(reporter, small, small, invalid[i], big);
     81         check_invalid(reporter, small, invalid[i], big, big);
     82         check_invalid(reporter, invalid[i], small, big, big);
     83     }
     84 
     85     test_center(reporter);
     86 }
     87 
     88 // need tests for SkStrSearch
     89 
     90 #include "TestClassDef.h"
     91 DEFINE_TESTCLASS("InfRect", InfRectTestClass, TestInfRect)
     92