/*
 * Copyright 2012 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */
#include "PathOpsTestCommon.h"
#include "SkPathOpsTriangle.h"
#include "Test.h"
#include "TestClassDef.h"

static const SkDTriangle tests[] = {
    {{{2, 0}, {3, 1}, {2, 2}}},
    {{{3, 1}, {2, 2}, {1, 1}}},
    {{{3, 0}, {2, 1}, {3, 2}}},
};

static const SkDPoint inPoint[] = {
    {2.5, 1},
    {2, 1.5},
    {2.5, 1},
};

static const SkDPoint outPoint[] = {
    {3, 0},
    {2.5, 2},
    {2.5, 2},
};

static const size_t tests_count = SK_ARRAY_COUNT(tests);

DEF_TEST(PathOpsTriangleUtilities, reporter) {
    for (size_t index = 0; index < tests_count; ++index) {
        const SkDTriangle& triangle = tests[index];
        SkASSERT(ValidTriangle(triangle));
        bool result = triangle.contains(inPoint[index]);
        if (!result) {
            SkDebugf("%s [%d] expected point in triangle\n", __FUNCTION__, index);
            REPORTER_ASSERT(reporter, 0);
        }
        result = triangle.contains(outPoint[index]);
        if (result) {
            SkDebugf("%s [%d] expected point outside triangle\n", __FUNCTION__, index);
            REPORTER_ASSERT(reporter, 0);
        }
    }
}

static const SkDTriangle oneOff[] = {
    {{{271.03291625750461, 5.0402503630087025e-05}, {275.21652430019037, 3.6997300650817753},
      {279.25839233398438, 7.7416000366210938}}},

    {{{271.03291625750461, 5.0402503617874572e-05}, {275.21652430019037, 3.6997300650817877},
      {279.25839233398438, 7.7416000366210938}}}
};

static const size_t oneOff_count = SK_ARRAY_COUNT(oneOff);

DEF_TEST(PathOpsTriangleOneOff, reporter) {
    for (size_t index = 0; index < oneOff_count; ++index) {
        const SkDTriangle& triangle = oneOff[index];
        SkASSERT(ValidTriangle(triangle));
        for (int inner = 0; inner < 3; ++inner) {
            bool result = triangle.contains(triangle.fPts[inner]);
            if (result) {
                SkDebugf("%s [%d][%d] point on triangle is not in\n", __FUNCTION__, index, inner);
                REPORTER_ASSERT(reporter, 0);
            }
        }
    }
}
