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

static void PathOpsInverseTest(skiatest::Reporter* reporter) {
    SkPath one, two;
    for (int op = kDifference_PathOp; op <= kReverseDifference_PathOp; ++op) {
        for (int oneFill = SkPath::kWinding_FillType; oneFill <= SkPath::kInverseEvenOdd_FillType;
                    ++oneFill) {
            for (int oneDir = SkPath::kCW_Direction; oneDir != SkPath::kCCW_Direction; ++oneDir) {
                one.reset();
                one.setFillType((SkPath::FillType) oneFill);
                one.addRect(0, 0, 6, 6, (SkPath::Direction) oneDir);
                for (int twoFill = SkPath::kWinding_FillType;
                        twoFill <= SkPath::kInverseEvenOdd_FillType; ++twoFill) {
                    for (int twoDir = SkPath::kCW_Direction; twoDir != SkPath::kCCW_Direction;
                            ++twoDir) {
                        two.reset();
                        two.setFillType((SkPath::FillType) twoFill);
                        two.addRect(3, 3, 9, 9, (SkPath::Direction) twoDir);
                        testPathOp(reporter, one, two, (SkPathOp) op);
                    }
                }
            }
        }
    }
}

#include "TestClassDef.h"
DEFINE_TESTCLASS_SHORT(PathOpsInverseTest)
