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

#include "include/core/SkSpan.h"
#include "include/core/SkTypes.h"
#include "include/private/SkFloatingPoint.h"
#include "src/core/SkBezierCurves.h"
#include "src/pathops/SkPathOpsCubic.h"
#include "src/pathops/SkPathOpsPoint.h"
#include "src/pathops/SkPathOpsTypes.h"
#include "tests/Test.h"

#include <algorithm>
#include <array>
#include <cstring>
#include <iterator>
#include <string>

// Grouping the test inputs into DoublePoints makes the test cases easier to read.
struct DoublePoint {
    double x;
    double y;
};

static bool nearly_equal(double expected, double actual) {
    if (sk_double_nearly_zero(expected)) {
        return sk_double_nearly_zero(actual);
    }
    return sk_doubles_nearly_equal_ulps(expected, actual, 64);
}

static void testChopCubicAtT(skiatest::Reporter* reporter, const std::string& name,
                             SkSpan<const DoublePoint> curveInputs, double t,
                             SkSpan<const DoublePoint> expectedOutputs) {
    skiatest::ReporterContext subtest(reporter, name);
    REPORTER_ASSERT(reporter, curveInputs.size() == 4,
                    "Invalid test case. Should have 4 input points.");
    REPORTER_ASSERT(reporter, t >= 0.0 && t <= 1.0,
                    "Invalid test case. t %f should be in [0, 1]", t);
    // Two cubic curves, sharing an input point
    REPORTER_ASSERT(reporter, expectedOutputs.size() == 7,
                    "Invalid test case. Should have 7 output points.");


    {
        skiatest::ReporterContext subsubtest(reporter, "Pathops Implementation");
        SkDCubic input;
        std::memcpy(&input.fPts[0], curveInputs.data(), 8 * sizeof(double));
        SkDCubicPair output = input.chopAt(t);

        for (int i = 0; i < 7; ++i) {
            REPORTER_ASSERT(reporter,
                            nearly_equal(expectedOutputs[i].x, output.pts[i].fX) &&
                            nearly_equal(expectedOutputs[i].y, output.pts[i].fY),
                            "(%.16f, %.16f) != (%.16f, %.16f) at index %d",
                            expectedOutputs[i].x, expectedOutputs[i].y,
                            output.pts[i].fX, output.pts[i].fY, i);
        }
    }
    {
        skiatest::ReporterContext subsubtest(reporter, "SkBezier Implementation");
        std::array<double, 8> input;
        std::array<double, 14> output;
        SkASSERT_RELEASE(curveInputs.size_bytes() >= 8 * sizeof(double));
        std::memcpy(input.data(), curveInputs.data(), 8 * sizeof(double));
        SkBezierCubic::Subdivide(input.data(), t, output.data());

        for (int i = 0; i < 7; ++i) {
            REPORTER_ASSERT(reporter,
                            nearly_equal(expectedOutputs[i].x, output[i*2]) &&
                            nearly_equal(expectedOutputs[i].y, output[i*2 + 1]),
                            "(%.16f, %.16f) != (%.16f, %.16f) at index %d",
                            expectedOutputs[i].x, expectedOutputs[i].y,
                            output[i*2], output[i*2 + 1], i);
        }
    }
}

DEF_TEST(ChopCubicAtT_NormalizedCubic, reporter) {
    testChopCubicAtT(reporter, "Cubic between 0,0, and 1,1, t=0",
        {{{ 0, 0 }, { .12, 1.8 }, { .92, -1.65 }, { 1.0, 1.0 }}},
        0.0,
        {{{  0.000000,  0.000000 }, {  0.000000,  0.000000 }, {  0.000000,  0.000000 },
          {  0.000000,  0.000000 },
          {  0.120000,  1.800000 }, {  0.920000, -1.650000 }, {  1.000000,  1.000000 }}}
    );

    testChopCubicAtT(reporter, "Cubic between 0,0, and 1,1, t=0.1",
        {{{ 0, 0 }, { .12, 1.8 }, { .92, -1.65 }, { 1.0, 1.0 }}},
        0.1,
        {{{  0.000000,  0.000000 }, {  0.012000,  0.180000 }, {  0.030800,  0.307500 },
          {  0.055000,  0.393850 },
          {  0.272800,  1.171000 }, {  0.928000, -1.385000 }, {  1.000000,  1.000000 }}}
    );

    testChopCubicAtT(reporter, "Cubic between 0,0, and 1,1, t=0.2",
        {{{ 0, 0 }, { .12, 1.8 }, { .92, -1.65 }, { 1.0, 1.0 }}},
        0.2,
        {{{  0.000000,  0.000000 }, {  0.024000,  0.360000 }, {  0.075200,  0.510000 },
          {  0.142400,  0.540800 },
          {  0.411200,  0.664000 }, {  0.936000, -1.120000 }, {  1.000000,  1.000000 }}}
    );

    testChopCubicAtT(reporter, "Cubic between 0,0, and 1,1, t=0.3",
        {{{ 0, 0 }, { .12, 1.8 }, { .92, -1.65 }, { 1.0, 1.0 }}},
        0.3,
        {{{  0.000000,  0.000000 }, {  0.036000,  0.540000 }, {  0.133200,  0.607500 },
          {  0.253800,  0.508950 },
          {  0.535200,  0.279000 }, {  0.944000, -0.855000 }, {  1.000000,  1.000000 }}}
    );

    testChopCubicAtT(reporter, "Cubic between 0,0, and 1,1, t=0.4",
        {{{ 0, 0 }, { .12, 1.8 }, { .92, -1.65 }, { 1.0, 1.0 }}},
        0.4,
        {{{  0.000000,  0.000000 }, {  0.048000,  0.720000 }, {  0.204800,  0.600000 },
          {  0.380800,  0.366400 },
          {  0.644800,  0.016000 }, {  0.952000, -0.590000 }, {  1.000000,  1.000000 }}}
    );

    testChopCubicAtT(reporter, "Cubic between 0,0, and 1,1, t=0.5",
        {{{ 0, 0 }, { .12, 1.8 }, { .92, -1.65 }, { 1.0, 1.0 }}},
        0.5,
        {{{  0.000000,  0.000000 }, {  0.060000,  0.900000 }, {  0.290000,  0.487500 },
          {  0.515000,  0.181250 },
          {  0.740000, -0.125000 }, {  0.960000, -0.325000 }, {  1.000000,  1.000000 }}}
    );

    testChopCubicAtT(reporter, "Cubic between 0,0, and 1,1, t=0.6",
        {{{ 0, 0 }, { .12, 1.8 }, { .92, -1.65 }, { 1.0, 1.0 }}},
        0.6,
        {{{  0.000000,  0.000000 }, {  0.072000,  1.080000 }, {  0.388800,  0.270000 },
          {  0.648000,  0.021600 },
          {  0.820800, -0.144000 }, {  0.968000, -0.060000 }, {  1.000000,  1.000000 }}}
    );

    testChopCubicAtT(reporter, "Cubic between 0,0, and 1,1, t=0.7",
        {{{ 0, 0 }, { .12, 1.8 }, { .92, -1.65 }, { 1.0, 1.0 }}},
        0.7,
        {{{  0.000000,  0.000000 }, {  0.084000,  1.260000 }, {  0.501200, -0.052500 },
          {  0.771400, -0.044450 },
          {  0.887200, -0.041000 }, {  0.976000,  0.205000 }, {  1.000000,  1.000000 }}}
    );

    testChopCubicAtT(reporter, "Cubic between 0,0, and 1,1, t=0.8",
        {{{ 0, 0 }, { .12, 1.8 }, { .92, -1.65 }, { 1.0, 1.0 }}},
        0.8,
        {{{  0.000000,  0.000000 }, {  0.096000,  1.440000 }, {  0.627200, -0.480000 },
          {  0.876800,  0.051200 },
          {  0.939200,  0.184000 }, {  0.984000,  0.470000 }, {  1.000000,  1.000000 }}}
    );

    testChopCubicAtT(reporter, "Cubic between 0,0, and 1,1, t=0.9",
        {{{ 0, 0 }, { .12, 1.8 }, { .92, -1.65 }, { 1.0, 1.0 }}},
        0.9,
        {{{  0.000000,  0.000000 }, {  0.108000,  1.620000 }, {  0.766800, -1.012500 },
          {  0.955800,  0.376650 },
          {  0.976800,  0.531000 }, {  0.992000,  0.735000 }, {  1.000000,  1.000000 }}}
    );

    testChopCubicAtT(reporter, "Cubic between 0,0, and 1,1, t=1.0",
        {{{ 0, 0 }, { .12, 1.8 }, { .92, -1.65 }, { 1.0, 1.0 }}},
        1.0,
        {{{  0.000000,  0.000000 }, {  0.120000,  1.800000 }, {  0.920000, -1.650000 },
          {  1.000000,  1.000000 },
          {  1.000000,  1.000000 }, {  1.000000,  1.000000 }, {  1.000000,  1.000000 }}}
    );
}

DEF_TEST(ChopCubicAtT_ArbitraryCubic, reporter) {
    testChopCubicAtT(reporter, "Arbitrary Cubic, t=0.1234",
        {{{ -10, -20 }, { -7, 5 }, { 14, -2 }, { 3, 13 }}},
        0.1234,
        {{{-10.00000000000000, -20.00000000000000 },
          { -9.62980000000000, -16.91500000000000 },
          { -8.98550392000000, -14.31728192000000 },
          { -8.16106580520000, -12.10537539118400 },
          { -2.30448192000000,   3.60740632000000 },
          { 12.64260000000000,  -0.14900000000000 },
          {  3.00000000000000,  13.00000000000000 }}}
    );

    testChopCubicAtT(reporter, "Arbitrary Cubic, t=0.3456",
        {{{ -10, -20 }, { -7, 5 }, { 14, -2 }, { 3, 13 }}},
        0.3456,
        {{{-10.00000000000000, -20.00000000000000 },
          { -8.96320000000000, -11.36000000000000 },
          { -5.77649152000000,  -6.54205952000000 },
          { -2.50378670080000,  -3.31715344793600 },
          {  3.69314048000000,   2.78926592000000 },
          { 10.19840000000000,   3.18400000000000 },
          {  3.00000000000000,  13.00000000000000 }}}
    );

    testChopCubicAtT(reporter, "Arbitrary Cubic, t=0.8765",
        {{{ -10, -20 }, { -7, 5 }, { 14, -2 }, { 3, 13 }}},
        0.8765,
        {{{-10.00000000000000, -20.00000000000000 },
          { -7.37050000000000,   1.91250000000000 },
          {  9.08754050000000,  -0.75907200000000 },
          {  5.70546664375000,   8.34743124475000 },
          {  5.22892800000000,   9.63054950000000 },
          {  4.35850000000000,  11.14750000000000 },
          {  3.00000000000000,  13.00000000000000 }}}
    );
}

static void testCubicExtrema(skiatest::Reporter* reporter, const std::string& name,
                             double A, double B, double C, double D,
                             SkSpan<const double> expectedExtrema) {
    skiatest::ReporterContext subtest(reporter, name);
    // Validate test case
    REPORTER_ASSERT(reporter, expectedExtrema.size() <= 2,
                    "Invalid test case, up to 2 extrema allowed");
    {
        const double inputs[8] = {A, 0, B, 0, C, 0, D, 0};
        std::array<double, 4> bezier = SkBezierCubic::ConvertToPolynomial(inputs, false);
        // The X extrema of the Bezier curve represented by the 4 provided X coordinates
        // (Start, Control Point 1, Control Point 2, Stop) are where the derivative of that
        // polynomial is zero. We can verify this for the expected Extrema.
        // lowercase letters to emphasize we are referring to Bezier curve (using t),
        // not X,Y values.
        auto [a, b, c, d] = bezier;
        a *= 3; // derivative (at^3 -> 3at^2)
        b *= 2; // derivative (bt^2 -> 2bt)
        c *= 1; // derivative (ct^1 -> c)
        d = 0;  // derivative (d    -> 0)
        for (size_t i = 0; i < expectedExtrema.size(); i++) {
            double t = expectedExtrema[i];
            REPORTER_ASSERT(reporter, t >= 0 && t <= 1,
                            "Invalid test case root %zu. Roots must be in [0, 1]", i);
            double shouldBeZero = a * t * t + b * t + c;
            REPORTER_ASSERT(reporter, sk_double_nearly_zero(shouldBeZero),
                    "Invalid test case root %zu. %1.16f != 0", i, shouldBeZero);
        }
    }

    {
        skiatest::ReporterContext subsubtest(reporter, "Pathops Implementation");
        double extrema[2] = {0, 0};
        // This implementation expects the coefficients to be (X, Y), (X, Y), (X, Y), (X, Y)
        // but it ignores the values at odd indices.
        const double inputs[8] = {A, 0, B, 0, C, 0, D, 0};
        int extremaCount = SkDCubic::FindExtrema(&inputs[0], extrema);
        REPORTER_ASSERT(reporter, expectedExtrema.size() == size_t(extremaCount),
                        "Wrong number of extrema returned %zu != %d",
                        expectedExtrema.size(), extremaCount);

        // We don't care which order the roots are returned from the algorithm.
        // For determinism, we will sort them (and ensure the provided solutions are also sorted).
        std::sort(std::begin(extrema), std::begin(extrema) + extremaCount);
        for (int i = 0; i < extremaCount; i++) {
            if (sk_double_nearly_zero(expectedExtrema[i])) {
                REPORTER_ASSERT(reporter, sk_double_nearly_zero(extrema[i]),
                                "0 != %1.16e at index %d", extrema[i], i);
            } else {
                REPORTER_ASSERT(reporter,
                                sk_doubles_nearly_equal_ulps(expectedExtrema[i], extrema[i], 64),
                                "%1.16f != %1.16f at index %d", expectedExtrema[i], extrema[i], i);
            }
        }
    }
}

DEF_TEST(CubicExtrema_FindsLocalMinAndMaxInRangeZeroToOneInclusive, reporter) {
    // All answers are given with 16 significant digits (max for a double) or as an integer
    // when the answer is exact.
    // Note that the Y coordinates do not impact the X extrema, so they are omitted from
    // the test case (and labeled as N in the subtest names)

    // https://www.desmos.com/calculator/fejoovy3v1
    testCubicExtrema(reporter, "(24, N) (-46, N) (-29, N) (-6, N) has 2 local extrema",
                    24, -46, 29, -6,
                    {{0.3476582809885365,
                      0.7895966209722478}});

    testCubicExtrema(reporter, "(10, N) (3, N) (7, N) (10, N) has 2 extrema, only 1 in range",
                10, 3, 7, 10,
                SKSPAN_INIT_ONE(0.4097697891418150)
                // 0.4097697891418150259166930 according to WolframAlpha
                // 1.423563544191518307416640 is the other root, but omitted because it is not
                //                            between 0 and 1 inclusive.
                );

    testCubicExtrema(reporter, "(10, N) (9.99, N) (20.01, N) (10, N) with extrema near endpoints",
                10, 9.99, 20.01, 20,
                {{ 0.0004987532413361362,
                //0.0004987532413361221515157644 according to Wolfram Alpha (2.8e-12% error)
                  0.9995012467586639,
                //0.9995012467586638778484842 according to Wolfram Alpha
                 }});

    testCubicExtrema(reporter, "(10, N) (10, N) (20, N) (20, N) has extrema at endpoints",
                    10, 10, 20, 20,
                    {{0.0,
                      1.0}});

    // The polynomial for these points is just c(t) = 15t + 10, which has no local extrema.
    testCubicExtrema(reporter, "(10, N) (15, N) (20, N) (25, N) has no extrema at all",
                    10, 15, 20, 25,
                    {});

    // The polynomial for these points is monotonically increasing, so no local extrema.
    testCubicExtrema(reporter, "(10, N) (14, N) (14, N) (20, N) has no extrema at all",
                    10, 14, 14, 20,
                    {});

    // The polynomial for these points has a stationary point at t = 0.5, but still no extrema.
    testCubicExtrema(reporter, "(10, N) (14, N) (14, N) (20, N) has no extrema at all",
                    10, 18, 12, 20,
                    {});

    testCubicExtrema(reporter, "(10, N) (16, N) (16, N) (10, N) has a single local maximum",
                10, 16, 16, 10,
                SKSPAN_INIT_ONE(0.5));

    testCubicExtrema(reporter, "(10, N) (8, N) (8, N) (10, N) has a single local minima",
                10, 8, 8, 10,
                SKSPAN_INIT_ONE(0.5));

    // The polynomial for these points is c(t) = 10. Taking the derivative of that results in
    // c'(t) = 0, which has infinite solutions. Our linear solver handles this case by saying
    // it just has a single solution at t = 0.
    testCubicExtrema(reporter, "(10, N) (10, N) (10, N) (10, N) is defined to have an extrema at 0",
                10, 10, 10, 10,
                SKSPAN_INIT_ONE(0.0));
}

static void testCubicInflectionPoints(skiatest::Reporter* reporter, const std::string& name,
                                      SkSpan<const DoublePoint> curveInputs,
                                      SkSpan<const double> expectedTValues) {
    skiatest::ReporterContext subtest(reporter, name);
    // Validate test case
    REPORTER_ASSERT(reporter, curveInputs.size() == 4,
                    "Invalid test case. Input curve should have 4 points");
    REPORTER_ASSERT(reporter, expectedTValues.size() <= 2,
                    "Invalid test case, up to 2 inflection points possible");

    for (size_t i = 0; i < expectedTValues.size(); i++) {
        double t = expectedTValues[i];
        REPORTER_ASSERT(reporter, t >= 0.0 && t <= 1.0,
                        "Invalid test case t %zu. Should be between 0 and 1 inclusive.", i);

        auto inputs = reinterpret_cast<const double*>(curveInputs.data());
        auto [Ax, Bx, Cx, Dx] = SkBezierCubic::ConvertToPolynomial(inputs, false);
        auto [Ay, By, Cy, Dy] = SkBezierCubic::ConvertToPolynomial(inputs, true);

        // verify that X' * Y'' - X'' * Y' == 0 at the given t
        // https://stackoverflow.com/a/35906870
        double curvature = (3 * (Bx * Ay - Ax * By)) * t * t +
                           (3 * (Cx * Ay - Ax * Cy)) * t +
                           (Cx * By - Bx * Cy);

        REPORTER_ASSERT(reporter, sk_double_nearly_zero(curvature),
                        "Invalid test case t %zu. 0 != %1.16f.", i, curvature);

        if (i > 0) {
            REPORTER_ASSERT(reporter, expectedTValues[i - 1] <= expectedTValues[i],
                            "Invalid test case t %zu. Sort intersections in ascending order", i);
        }
    }

    {
        skiatest::ReporterContext subsubtest(reporter, "Pathops Implementation");
        SkDCubic inputCubic;
        for (int i = 0; i < 4; i++) {
            inputCubic.fPts[i].fX = curveInputs[i].x;
            inputCubic.fPts[i].fY = curveInputs[i].y;
        }
        double actualTValues[2] = {0, 0};
        int inflectionsFound = inputCubic.findInflections(actualTValues);
        REPORTER_ASSERT(reporter, expectedTValues.size() == size_t(inflectionsFound),
                        "Wrong number of roots returned %zu != %d", expectedTValues.size(),
                        inflectionsFound);

        // We don't care which order the t values which are returned from the algorithm.
        // For determinism, we will sort them (and ensure the provided solutions are also sorted).
        std::sort(std::begin(actualTValues), std::begin(actualTValues) + inflectionsFound);
        for (int i = 0; i < inflectionsFound; i++) {
            REPORTER_ASSERT(reporter,
                    nearly_equal(expectedTValues[i], actualTValues[i]),
                    "%.16f != %.16f at index %d", expectedTValues[i], actualTValues[i], i);
        }
    }
}

DEF_TEST(CubicInflectionPoints_FindsConvexityChangesInRangeZeroToOneInclusive, reporter) {
    // All answers are given with 16 significant digits (max for a double) or as an integer
    // when the answer is exact.
    testCubicInflectionPoints(reporter, "curve changes convexity exactly halfway",
                              {{{ 4, 0 }, { -3, 4 }, { 7, 4 }, { 0, 8 }}},
                              SKSPAN_INIT_ONE(0.5));

    // https://www.desmos.com/calculator/8qkmrq3n3e
    testCubicInflectionPoints(reporter, "A curve with one inflection point",
                              {{{ 10, 5 }, { 9, 12 }, { 24, -2 }, { 25, 3 }}},
                              SKSPAN_INIT_ONE(0.5194234849019033));

    // https://www.desmos.com/calculator/sk2bbz56kv
    testCubicInflectionPoints(reporter, "A curve with two inflection points",
                              {{{ 5, 5 }, { 16, 15 }, { 24, -2 }, { 15, 13 }}},
                              {{0.5553407889916796,
                                0.8662808326299419}});

    testCubicInflectionPoints(reporter, "A curve which overlaps itself",
                              {{{ 3, 6 }, { -3, 4 }, { 4, 5 }, { 0, 6 }}},
                              {});

    testCubicInflectionPoints(reporter, "A monotonically increasing curve",
                              {{{ 10, 15 }, { 20, 25 }, { 30, 35 }, { 40, 45 }}},
                               // The curvature equation becomes C(t) = 0, which
                               // our linear solver says has 1 root at t = 0.
                              SKSPAN_INIT_ONE(0.0));
}

static void testBezierCurveHorizontalIntersectBinarySearch(skiatest::Reporter* reporter,
                const std::string& name, SkSpan<const DoublePoint> curveInputs, double xToIntersect,
                SkSpan<const double> expectedTValues,
                bool skipPathops = false) {
    skiatest::ReporterContext subtest(reporter, name);
    // Validate test case
    REPORTER_ASSERT(reporter, curveInputs.size() == 4,
                    "Invalid test case. Input curve should have 4 points");
    REPORTER_ASSERT(reporter, expectedTValues.size() <= 3,
                    "Invalid test case, up to 3 intersections possible");

    for (size_t i = 0; i < expectedTValues.size(); i++) {
        double t = expectedTValues[i];
        REPORTER_ASSERT(reporter, t >= 0.0 && t <= 1.0,
                    "Invalid test case t %zu. Should be between 0 and 1 inclusive.", i);

        auto [x, y] = SkBezierCubic::EvalAt(reinterpret_cast<const double*>(curveInputs.data()), t);
        // This is explicitly approximately_equal and not something more precise because
        // the binary search given by the pathops algorithm is not super precise.
        REPORTER_ASSERT(reporter, approximately_equal(xToIntersect, x),
                    "Invalid test case %zu, %1.16f != %1.16f", i, xToIntersect, x);

        if (i > 0) {
            REPORTER_ASSERT(reporter, expectedTValues[i-1] <= expectedTValues[i],
                    "Invalid test case t %zu. Sort intersections in ascending order", i);
        }
    }

    if (!skipPathops) {
        skiatest::ReporterContext subsubtest(reporter, "Pathops Implementation");
        // This implementation expects the coefficients to be (X, Y), (X, Y), (X, Y), (X, Y)
        // but it ignores the values at odd indices.
        SkDCubic inputCubic;
        for (int i = 0; i < 4; i++) {
            inputCubic.fPts[i].fX = curveInputs[i].x;
            inputCubic.fPts[i].fY = curveInputs[i].y;
        }
        double actualTValues[3] = {0, 0, 0};
        // There are only 2 extrema that could be found, but the searchRoots will put
        // the inflection points (up to 2) and the end points (0, 1) in to this array
        // as well.
        double extremaAndInflections[6] = {0, 0, 0, 0, 0};
        int extrema = SkDCubic::FindExtrema(&inputCubic[0].fX, extremaAndInflections);
        int rootCount = inputCubic.searchRoots(extremaAndInflections, extrema, xToIntersect,
                                               SkDCubic::kXAxis, actualTValues);
        REPORTER_ASSERT(reporter, expectedTValues.size() == size_t(rootCount),
                        "Wrong number of roots returned %zu != %d", expectedTValues.size(),
                        rootCount);

        // We don't care which order the t values which are returned from the algorithm.
        // For determinism, we will sort them (and ensure the provided solutions are also sorted).
        std::sort(std::begin(actualTValues), std::begin(actualTValues) + rootCount);
        for (int i = 0; i < rootCount; i++) {
            REPORTER_ASSERT(reporter,
                    nearly_equal(expectedTValues[i], actualTValues[i]),
                    "%.16f != %.16f at index %d", expectedTValues[i], actualTValues[i], i);
        }
    }
}

DEF_TEST(BezierCurveHorizontalIntersectBinarySearch, reporter) {
    // All answers are given with 16 significant digits (max for a double) or as an integer
    // when the answer is exact.
    // The Y values in these curves do not impact the test case, but make it easier to visualize
    // when plotting the curves to verify the solutions.
    testBezierCurveHorizontalIntersectBinarySearch(reporter,
           "straight curve crosses once @ 2.0",
           {{{ 0, 0 }, { 0, 0 }, { 10, 10 }, { 10, 10 }}},
           2.0,
           SKSPAN_INIT_ONE(0.2871407270431519));

    testBezierCurveHorizontalIntersectBinarySearch(reporter,
           "straight curve crosses once @ 6.0",
           {{{ 0, 0 }, { 3, 3 }, { 6, 6 }, { 10, 10 }}},
           6.0,
           SKSPAN_INIT_ONE(0.6378342509269714));


    testBezierCurveHorizontalIntersectBinarySearch(reporter,
           "out and back curve exactly touches @ 3.0",
           {{{ 0, 0 }, { 4, 4 }, { 4, 4 }, { 0, 8 }}},
           3.0,
           // The binary search algorithm (currently) gets close to, but not quite 0.5
           {{0.4999389648437500,
            0.5000610351562500}});

    testBezierCurveHorizontalIntersectBinarySearch(reporter,
           "out and back curve crosses twice @ 2.0",
           {{{ 0, 0 }, { 4, 4 }, { 4, 4 }, { 0, 8 }}},
           2.0,
           {{0.2113248705863953,
            0.7886751294136047}});

    testBezierCurveHorizontalIntersectBinarySearch(reporter,
           "out and back curve never crosses 4.0",
           {{{ 0, 0 }, { 4, 4 }, { 4, 4 }, { 0, 8 }}},
           4.0,
           {});


    testBezierCurveHorizontalIntersectBinarySearch(reporter,
            "left right left curve crosses three times @ 2.0",
           {{{ 4, 0 }, { -3, 4 }, { 7, 4 }, { 0, 8 }}},
           2.0,
           {{  0.1361965624455005,
           // 0.1361965624455005397216403 according to Wolfram Alpha
              0.5,
              0.8638034375544995
           // 0.8638034375544994602783597 according to Wolfram Alpha
            }},
            // PathOps version fails to find these roots (has not been investigated yet)
            true /* = skipPathops */);

    testBezierCurveHorizontalIntersectBinarySearch(reporter,
            "left right left curve crosses one time @ 1.0",
           {{{ 4, 0 }, { -3, 4 }, { 7, 4 }, { 0, 8 }}},
           1.0,
           SKSPAN_INIT_ONE(0.9454060400510326)
           // 0.9454060415952252910201453 according to Wolfram Alpha
           );

    testBezierCurveHorizontalIntersectBinarySearch(reporter,
            "left right left curve crosses three times @ 2.5",
           {{{ 4, 0 }, { -3, 4 }, { 7, 4 }, { 0, 8 }}},
           2.5,
           {{  0.0898667385750473,
           // 0.08986673805184604633583244 according to Wolfram Alpha
              0.6263520961813417,
           // 0.6263521357441907129444252 according to Wolfram Alpha
              0.7837811281217468,
           // 0.7837811262039632407197424 according to Wolfram Alpha
            }});
}
