/*
 * Copyright 2011 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#include "SkRandom.h"
#include "SkRect.h"
#include "Test.h"

static float make_zero() {
    return sk_float_sin(0);
}

struct RectCenter {
    SkIRect  fRect;
    SkIPoint fCenter;
};

static void test_center(skiatest::Reporter* reporter) {
    static const RectCenter gData[] = {
        { { 0, 0, 0, 0 }, { 0, 0 } },
        { { 0, 0, 1, 1 }, { 0, 0 } },
        { { -1, -1, 0, 0 }, { -1, -1 } },
        { { 0, 0, 10, 7 }, { 5, 3 } },
        { { 0, 0, 11, 6 }, { 5, 3 } },
    };
    for (size_t index = 0; index < SK_ARRAY_COUNT(gData); ++index) {
        REPORTER_ASSERT(reporter,
                        gData[index].fRect.centerX() == gData[index].fCenter.x());
        REPORTER_ASSERT(reporter,
                        gData[index].fRect.centerY() == gData[index].fCenter.y());
    }

    SkRandom rand;
    for (int i = 0; i < 10000; ++i) {
        SkIRect r;

        r.set(rand.nextS() >> 2, rand.nextS() >> 2,
              rand.nextS() >> 2, rand.nextS() >> 2);
        int cx = r.centerX();
        int cy = r.centerY();
        REPORTER_ASSERT(reporter, ((r.left() + r.right()) >> 1) == cx);
        REPORTER_ASSERT(reporter, ((r.top() + r.bottom()) >> 1) == cy);
    }
}

static void check_invalid(skiatest::Reporter* reporter,
                          SkScalar l, SkScalar t, SkScalar r, SkScalar b) {
    SkRect rect;
    rect.set(l, t, r, b);
    REPORTER_ASSERT(reporter, !rect.isFinite());
}

// Tests that isFinite() will reject any rect with +/-inf values
// as one of its coordinates.
DEF_TEST(InfRect, reporter) {
    float inf = 1 / make_zero();    // infinity
    float nan = inf * 0;
    SkASSERT(!(nan == nan));
    SkScalar small = SkIntToScalar(10);
    SkScalar big = SkIntToScalar(100);

    REPORTER_ASSERT(reporter, SkRect::MakeEmpty().isFinite());

    SkRect rect = SkRect::MakeXYWH(small, small, big, big);
    REPORTER_ASSERT(reporter, rect.isFinite());

    const SkScalar invalid[] = { nan, inf, -inf };
    for (size_t i = 0; i < SK_ARRAY_COUNT(invalid); ++i) {
        check_invalid(reporter, small, small, big, invalid[i]);
        check_invalid(reporter, small, small, invalid[i], big);
        check_invalid(reporter, small, invalid[i], big, big);
        check_invalid(reporter, invalid[i], small, big, big);
    }

    test_center(reporter);
}

// need tests for SkStrSearch
