/*
 * 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 "SkPathOpsLine.h"
#include "Test.h"
#include "TestClassDef.h"

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

static const SkDPoint left[] = {
    {2, 1},
    {1, 0},
    {1, 1},
    {1, 2},
    {2, 0},
    {2, 1}
};

static const size_t tests_count = SK_ARRAY_COUNT(tests);

DEF_TEST(PathOpsLineUtilities, reporter) {
    for (size_t index = 0; index < tests_count; ++index) {
        const SkDLine& line = tests[index];
        SkASSERT(ValidLine(line));
        SkDLine line2;
        SkPoint pts[2] = {line[0].asSkPoint(), line[1].asSkPoint()};
        line2.set(pts);
        REPORTER_ASSERT(reporter, line[0] == line2[0] && line[1] == line2[1]);
        const SkDPoint& pt = left[index];
        SkASSERT(ValidPoint(pt));
        double result = line.isLeft(pt);
        if ((result <= 0 && index >= 1) || (result < 0 && index == 0)) {
            SkDebugf("%s [%d] expected left\n", __FUNCTION__, index);
            REPORTER_ASSERT(reporter, 0);
        }
        line2 = line.subDivide(1, 0);
        REPORTER_ASSERT(reporter, line[0] == line2[1] && line[1] == line2[0]);
        line2 = SkDLine::SubDivide(pts, 1, 0);
        REPORTER_ASSERT(reporter, line[0] == line2[1] && line[1] == line2[0]);
        SkDPoint mid = line.ptAtT(.5);
        REPORTER_ASSERT(reporter, approximately_equal((line[0].fX + line[1].fX) / 2, mid.fX));
        REPORTER_ASSERT(reporter, approximately_equal((line[0].fY + line[1].fY) / 2, mid.fY));
    }
}
