/*
 * Copyright (C) 2014 Google Inc. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1.  Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 * 2.  Redistributions in binary form must reproduce the above copyright
 *     notice, this list of conditions and the following disclaimer in the
 *     documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

#include "sky/engine/platform/transforms/TransformOperations.h"

#include "sky/engine/platform/geometry/FloatBox.h"
#include "sky/engine/platform/geometry/FloatBoxTestHelpers.h"
#include "sky/engine/platform/transforms/IdentityTransformOperation.h"
#include "sky/engine/platform/transforms/Matrix3DTransformOperation.h"
#include "sky/engine/platform/transforms/MatrixTransformOperation.h"
#include "sky/engine/platform/transforms/PerspectiveTransformOperation.h"
#include "sky/engine/platform/transforms/RotateTransformOperation.h"
#include "sky/engine/platform/transforms/ScaleTransformOperation.h"
#include "sky/engine/platform/transforms/SkewTransformOperation.h"
#include "sky/engine/platform/transforms/TranslateTransformOperation.h"

#include <gtest/gtest.h>

using namespace blink;
namespace {

static const TransformOperations identityOperations;

static void EmpiricallyTestBounds(const TransformOperations& from,
    const TransformOperations& to,
    const double& minProgress,
    const double& maxProgress)
{
    FloatBox box(200, 500, 100, 100, 300, 200);
    FloatBox bounds;

    EXPECT_TRUE(to.blendedBoundsForBox(box, from, minProgress, maxProgress, &bounds));
    bool firstTime = true;

    FloatBox empiricalBounds;
    static const size_t numSteps = 10;
    for (size_t step = 0; step < numSteps; ++step) {
        float t = step / (numSteps - 1);
        t = minProgress + (maxProgress - minProgress) * t;
        TransformOperations operations = from.blend(to, t);
        TransformationMatrix matrix;
        operations.apply(FloatSize(0, 0), matrix);
        FloatBox transformed = box;
        matrix.transformBox(transformed);

        if (firstTime)
            empiricalBounds = transformed;
        else
            empiricalBounds.unionBounds(transformed);
        firstTime = false;
    }

    ASSERT_PRED_FORMAT2(FloatBoxTest::AssertContains, bounds, empiricalBounds);
}

TEST(TransformOperationsTest, AbsoluteAnimatedTranslatedBoundsTest)
{
    TransformOperations fromOps;
    TransformOperations toOps;
    fromOps.operations().append(TranslateTransformOperation::create(Length(-30, blink::Fixed), Length(20, blink::Fixed), 15, TransformOperation::Translate3D));
    toOps.operations().append(TranslateTransformOperation::create(Length(10, blink::Fixed), Length(10, blink::Fixed), 200, TransformOperation::Translate3D));
    FloatBox box(0, 0, 0, 10, 10, 10);
    FloatBox bounds;

    EXPECT_TRUE(toOps.blendedBoundsForBox(box, identityOperations, 0, 1, &bounds));
    EXPECT_PRED_FORMAT2(FloatBoxTest::AssertAlmostEqual, FloatBox(0, 0, 0, 20, 20, 210), bounds);

    EXPECT_TRUE(identityOperations.blendedBoundsForBox(box, toOps, 0, 1, &bounds));
    EXPECT_PRED_FORMAT2(FloatBoxTest::AssertAlmostEqual, FloatBox(0, 0, 0, 20, 20, 210), bounds);

    EXPECT_TRUE(identityOperations.blendedBoundsForBox(box, fromOps, 0, 1, &bounds));
    EXPECT_PRED_FORMAT2(FloatBoxTest::AssertAlmostEqual, FloatBox(-30, 0, 0, 40, 30, 25), bounds);

    EXPECT_TRUE(toOps.blendedBoundsForBox(box, fromOps, 0, 1, &bounds));
    EXPECT_PRED_FORMAT2(FloatBoxTest::AssertAlmostEqual, FloatBox(-30, 10, 15, 50, 20, 195), bounds);

    EXPECT_TRUE(toOps.blendedBoundsForBox(box, fromOps, -0.5, 1.25, &bounds));
    EXPECT_PRED_FORMAT2(FloatBoxTest::AssertAlmostEqual, FloatBox(-50, 7.5, -77.5, 80, 27.5, 333.75), bounds);
}

TEST(TransformOperationsTest, EmpiricalAnimatedTranslatedBoundsTest)
{
    float testTransforms[][2][3] = {
        { { 0, 0, 0 }, { 10, 10, 0 } } ,
        { { -100, 202.5, -32.6 }, { 43.2, 56.1, 89.75 } },
        { { 43.2, 56.1, 89.75 }, { -100, 202.5, -32.6 } }
    };

    // All progressions for animations start and end at 0, 1 respectively,
    // we can go outside of these bounds, but will always at least contain
    // [0,1].
    float progress[][2] = {
        { 0, 1 },
        { -.25, 1.25 }
    };

    for (size_t i = 0; i < WTF_ARRAY_LENGTH(testTransforms); ++i) {
        for (size_t j = 0; j < WTF_ARRAY_LENGTH(progress); ++j) {
            TransformOperations fromOps;
            TransformOperations toOps;
            fromOps.operations().append(TranslateTransformOperation::create(Length(testTransforms[i][0][0], blink::Fixed), Length(testTransforms[i][0][1], blink::Fixed), testTransforms[i][0][2], TransformOperation::Translate3D));
            toOps.operations().append(TranslateTransformOperation::create(Length(testTransforms[i][1][0], blink::Fixed), Length(testTransforms[i][1][1], blink::Fixed), testTransforms[i][1][2], TransformOperation::Translate3D));
            EmpiricallyTestBounds(fromOps, toOps, 0, 1);
        }
    }
}

TEST(TransformOperationsTest, AbsoluteAnimatedScaleBoundsTest)
{
    TransformOperations fromOps;
    TransformOperations toOps;
    fromOps.operations().append(ScaleTransformOperation::create(4, -3, TransformOperation::Scale));
    toOps.operations().append(ScaleTransformOperation::create(5, 2, TransformOperation::Scale));

    FloatBox box(0, 0, 0, 10, 10, 10);
    FloatBox bounds;

    EXPECT_TRUE(toOps.blendedBoundsForBox(box, identityOperations, 0, 1, &bounds));
    EXPECT_PRED_FORMAT2(FloatBoxTest::AssertAlmostEqual, FloatBox(0, 0, 0, 50, 20, 10), bounds);

    EXPECT_TRUE(identityOperations.blendedBoundsForBox(box, toOps, 0, 1, &bounds));
    EXPECT_PRED_FORMAT2(FloatBoxTest::AssertAlmostEqual, FloatBox(0, 0, 0, 50, 20, 10), bounds);

    EXPECT_TRUE(identityOperations.blendedBoundsForBox(box, fromOps, 0, 1, &bounds));
    EXPECT_PRED_FORMAT2(FloatBoxTest::AssertAlmostEqual, FloatBox(0, -30, 0, 40, 40, 10), bounds);

    EXPECT_TRUE(toOps.blendedBoundsForBox(box, fromOps, 0, 1, &bounds));
    EXPECT_PRED_FORMAT2(FloatBoxTest::AssertAlmostEqual, FloatBox(0, -30, 0, 50, 50, 10), bounds);

    EXPECT_TRUE(toOps.blendedBoundsForBox(box, fromOps, -0.5, 1.25, &bounds));
    EXPECT_PRED_FORMAT2(FloatBoxTest::AssertAlmostEqual, FloatBox(0, -55, 0, 52.5, 87.5, 10), bounds);
}

TEST(TransformOperationsTest, EmpiricalAnimatedScaleBoundsTest)
{

    float testTransforms[][2][3] = {
        { { 1, 1, 1 }, { 10, 10, -32}},
        { { 1, 2, 5 }, { -1, -2, -4}},
        { { 0, 0, 0 }, { 1, 2, 3}},
        { { 0, 0, 0 }, { 0, 0, 0}}
    };

    // All progressions for animations start and end at 0, 1 respectively,
    // we can go outside of these bounds, but will always at least contain
    // [0,1].
    float progress[][2] = {
        { 0, 1 },
        { -.25f, 1.25f }
    };

    for (size_t i = 0; i < WTF_ARRAY_LENGTH(testTransforms); ++i) {
        for (size_t j = 0; j < WTF_ARRAY_LENGTH(progress); ++j) {
            TransformOperations fromOps;
            TransformOperations toOps;
            fromOps.operations().append(TranslateTransformOperation::create(Length(testTransforms[i][0][0], blink::Fixed), Length(testTransforms[i][0][1], blink::Fixed), testTransforms[i][0][2], TransformOperation::Translate3D));
            toOps.operations().append(TranslateTransformOperation::create(Length(testTransforms[i][1][0], blink::Fixed), Length(testTransforms[i][1][1], blink::Fixed), testTransforms[i][1][2], TransformOperation::Translate3D));
            EmpiricallyTestBounds(fromOps, toOps, 0, 1);
        }
    }
}

TEST(TransformOperationsTest, AbsoluteAnimatedRotationBounds)
{
    TransformOperations fromOps;
    TransformOperations toOps;
    fromOps.operations().append(RotateTransformOperation::create(0, TransformOperation::Rotate));
    toOps.operations().append(RotateTransformOperation::create(360, TransformOperation::Rotate));
    float sqrt2 = sqrt(2.0f);
    FloatBox box(-sqrt2, -sqrt2, 0, sqrt2, sqrt2, 0);
    FloatBox bounds;

    // Since we're rotating 360 degrees, any box with dimensions between 0 and
    // 2 * sqrt(2) should give the same result.
    float sizes[] = { 0, 0.1f, sqrt2, 2*sqrt2 };
    toOps.blendedBoundsForBox(box, fromOps, 0, 1, &bounds);
    for (size_t i = 0; i < WTF_ARRAY_LENGTH(sizes); ++i) {
        box.setSize(FloatPoint3D(sizes[i], sizes[i], 0));

        EXPECT_TRUE(toOps.blendedBoundsForBox(box, fromOps, 0, 1, &bounds));
        EXPECT_PRED_FORMAT2(FloatBoxTest::AssertAlmostEqual, FloatBox(-2, -2, 0, 4, 4, 0), bounds);
    }
}

TEST(TransformOperationsTest, AbsoluteAnimatedExtremeRotationBounds)
{
    // If the normal is off-plane, we can have up to 6 exrema (min/max in each
    // dimension between) the endpoints of the arg. This makes sure we are
    // catching all 6.
    TransformOperations fromOps;
    TransformOperations toOps;
    fromOps.operations().append(RotateTransformOperation::create(1, 1, 1, 30, TransformOperation::Rotate3D));
    toOps.operations().append(RotateTransformOperation::create(1, 1, 1, 390,  TransformOperation::Rotate3D));

    FloatBox box(1, 0, 0, 0, 0, 0);
    FloatBox bounds;
    float min = -1 / 3.0f;
    float max = 1;
    float size = max - min;
    EXPECT_TRUE(toOps.blendedBoundsForBox(box, fromOps, 0, 1, &bounds));
    EXPECT_PRED_FORMAT2(FloatBoxTest::AssertAlmostEqual, FloatBox(min, min, min, size, size, size), bounds);
}

TEST(TransformOperationsTest, AbsoluteAnimatedAxisRotationBounds)
{
    // We can handle rotations about a single axis. If the axes are different,
    // we revert to matrix interpolation for which inflated bounds cannot be
    // computed.
    TransformOperations fromOps;
    TransformOperations toSame;
    TransformOperations toOpposite;
    TransformOperations toDifferent;
    fromOps.operations().append(RotateTransformOperation::create(1, 1, 1, 30, TransformOperation::Rotate3D));
    toSame.operations().append(RotateTransformOperation::create(1, 1, 1, 390,  TransformOperation::Rotate3D));
    toOpposite.operations().append(RotateTransformOperation::create(-1, -1, -1, 390,  TransformOperation::Rotate3D));
    toDifferent.operations().append(RotateTransformOperation::create(1, 3, 1, 390,  TransformOperation::Rotate3D));

    FloatBox box(1, 0, 0, 0, 0, 0);
    FloatBox bounds;
    EXPECT_TRUE(toSame.blendedBoundsForBox(box, fromOps, 0, 1, &bounds));
    EXPECT_TRUE(toOpposite.blendedBoundsForBox(box, fromOps, 0, 1, &bounds));
    EXPECT_FALSE(toDifferent.blendedBoundsForBox(box, fromOps, 0, 1, &bounds));
}

TEST(TransformOperationsTest, AbsoluteAnimatedOnAxisRotationBounds)
{
    // If we rotate a point that is on the axis of rotation, the box should not
    // change at all.
    TransformOperations fromOps;
    TransformOperations toOps;
    fromOps.operations().append(RotateTransformOperation::create(1, 1, 1, 30, TransformOperation::Rotate3D));
    toOps.operations().append(RotateTransformOperation::create(1, 1, 1, 390,  TransformOperation::Rotate3D));

    FloatBox box(1, 1, 1, 0, 0, 0);
    FloatBox bounds;

    EXPECT_TRUE(toOps.blendedBoundsForBox(box, fromOps, 0, 1, &bounds));
    EXPECT_PRED_FORMAT2(FloatBoxTest::AssertAlmostEqual, box, bounds);
}

// This would have been best as anonymous structs, but |WTF_ARRAY_LENGTH|
// does not get along with anonymous structs once we support C++11
// WTF_ARRAY_LENGTH will automatically support anonymous structs.

struct ProblematicAxisTest {
    double x;
    double y;
    double z;
    FloatBox expected;
};

TEST(TransformOperationsTest, AbsoluteAnimatedProblematicAxisRotationBounds)
{
    // Zeros in the components of the axis osf rotation turned out to be tricky to
    // deal with in practice. This function tests some potentially problematic
    // axes to ensure sane behavior.

    // Some common values used in the expected boxes.
    float dim1 = 0.292893f;
    float dim2 = sqrt(2.0f);
    float dim3 = 2 * dim2;

    ProblematicAxisTest tests[] = {
        { 0, 0, 0, FloatBox(1, 1, 1, 0, 0, 0) },
        { 1, 0, 0, FloatBox(1, -dim2, -dim2, 0, dim3, dim3) },
        { 0, 1, 0, FloatBox(-dim2, 1, -dim2, dim3, 0, dim3) },
        { 0, 0, 1, FloatBox(-dim2, -dim2, 1, dim3, dim3, 0) },
        { 1, 1, 0, FloatBox(dim1, dim1, -1, dim2, dim2, 2) },
        { 0, 1, 1, FloatBox(-1, dim1, dim1, 2, dim2, dim2) },
        { 1, 0, 1, FloatBox(dim1, -1, dim1, dim2, 2, dim2) }
    };

    for (size_t i = 0; i < WTF_ARRAY_LENGTH(tests); ++i) {
        float x = tests[i].x;
        float y = tests[i].y;
        float z = tests[i].z;
        TransformOperations fromOps;
        fromOps.operations().append(RotateTransformOperation::create(x, y, z, 0, TransformOperation::Rotate3D));
        TransformOperations toOps;
        toOps.operations().append(RotateTransformOperation::create(x, y, z, 360, TransformOperation::Rotate3D));
        FloatBox box(1, 1, 1, 0, 0, 0);
        FloatBox bounds;

        EXPECT_TRUE(toOps.blendedBoundsForBox(
            box, fromOps, 0, 1, &bounds));
        EXPECT_PRED_FORMAT2(FloatBoxTest::AssertAlmostEqual, tests[i].expected, bounds);
    }
}


TEST(TransformOperationsTest, BlendedBoundsForRotationEmpiricalTests)
{
    float axes[][3] = {
        { 1, 1, 1 },
        { -1, -1, -1 },
        { -1, 2, 3 },
        { 1, -2, 3 },
        { 0, 0, 0 },
        { 1, 0, 0 },
        { 0, 1, 0 },
        { 0, 0, 1 },
        { 1, 1, 0 },
        { 0, 1, 1 },
        { 1, 0, 1 },
        { -1, 0, 0 },
        { 0, -1, 0 },
        { 0, 0, -1 },
        { -1, -1, 0 },
        { 0, -1, -1 },
        { -1, 0, -1 }
    };

    float angles[][2] = {
        { 5, 100 },
        { 10, 5 },
        { 0, 360 },
        { 20, 180 },
        { -20, -180 },
        { 180, -220 },
        { 220, 320 },
        { 1020, 1120 },
        {-3200, 120 },
        {-9000, -9050 }
    };

    float progress[][2] = {
        { 0, 1 },
        { -0.25f, 1.25f }
    };

    for (size_t i = 0; i < WTF_ARRAY_LENGTH(axes); ++i) {
        for (size_t j = 0; j < WTF_ARRAY_LENGTH(angles); ++j) {
            for (size_t k = 0; k < WTF_ARRAY_LENGTH(progress); ++k) {
                float x = axes[i][0];
                float y = axes[i][1];
                float z = axes[i][2];

                TransformOperations fromOps;
                TransformOperations toOps;

                fromOps.operations().append(RotateTransformOperation::create(x, y, z, angles[j][0], TransformOperation::Rotate3D));
                toOps.operations().append(RotateTransformOperation::create(x, y, z, angles[j][1], TransformOperation::Rotate3D));
                EmpiricallyTestBounds(fromOps, toOps, progress[k][0], progress[k][1]);
            }
        }
    }
}

TEST(TransformOperationsTest, AbsoluteAnimatedPerspectiveBoundsTest)
{
    TransformOperations fromOps;
    TransformOperations toOps;
    fromOps.operations().append(PerspectiveTransformOperation::create(10));
    toOps.operations().append(PerspectiveTransformOperation::create(30));
    FloatBox box(0, 0, 0, 10, 10, 10);
    FloatBox bounds;
    toOps.blendedBoundsForBox(box, fromOps, 0, 1, &bounds);
    EXPECT_PRED_FORMAT2(FloatBoxTest::AssertAlmostEqual, FloatBox(0, 0, 0, 15, 15, 15), bounds);

    fromOps.blendedBoundsForBox(box, toOps, -0.25, 1.25, &bounds);
    EXPECT_PRED_FORMAT2(FloatBoxTest::AssertAlmostEqual, FloatBox(-40, -40, -40, 52, 52, 52), bounds);
}

TEST(TransformOperationsTest, EmpiricalAnimatedPerspectiveBoundsTest)
{
    float depths[][2] = {
        { 600, 400 },
        { 800, 1000 },
        { 800, std::numeric_limits<float>::infinity() }
    };

    float progress[][2] = {
        { 0, 1 },
        {-0.1f, 1.1f }
    };

    for (size_t i = 0; i < WTF_ARRAY_LENGTH(depths); ++i) {
        for (size_t j = 0; j < WTF_ARRAY_LENGTH(progress); ++j) {
            TransformOperations fromOps;
            TransformOperations toOps;

            fromOps.operations().append(PerspectiveTransformOperation::create(depths[i][0]));
            toOps.operations().append(PerspectiveTransformOperation::create(depths[i][1]));

            EmpiricallyTestBounds(fromOps, toOps, progress[j][0], progress[j][1]);
        }
    }
}


TEST(TransformOperationsTest, AnimatedSkewBoundsTest)
{
    TransformOperations fromOps;
    TransformOperations toOps;
    fromOps.operations().append(SkewTransformOperation::create(-45, 0, TransformOperation::Skew));
    toOps.operations().append(SkewTransformOperation::create(0, 45, TransformOperation::Skew));
    FloatBox box(0, 0, 0, 10, 10, 10);
    FloatBox bounds;

    toOps.blendedBoundsForBox(box, identityOperations, 0, 1, &bounds);
    ASSERT_PRED_FORMAT2(FloatBoxTest::AssertAlmostEqual, FloatBox(0, 0, 0, 10, 20, 10), bounds);

    identityOperations.blendedBoundsForBox(box, fromOps, 0, 1, &bounds);
    ASSERT_PRED_FORMAT2(FloatBoxTest::AssertAlmostEqual, FloatBox(-10, 0, 0, 20, 10, 10), bounds);

    toOps.blendedBoundsForBox(box, fromOps, 0, 1, &bounds);
    ASSERT_PRED_FORMAT2(FloatBoxTest::AssertAlmostEqual, FloatBox(-10, 0, 0, 20, 20, 10), bounds);

    fromOps.blendedBoundsForBox(box, toOps, 0, 1, &bounds);
    ASSERT_PRED_FORMAT2(FloatBoxTest::AssertAlmostEqual, FloatBox(-10, 0, 0, 20, 20, 10), bounds);
}

TEST(TransformOperationsTest, NonCommutativeRotations)
{
    TransformOperations fromOps;
    fromOps.operations().append(RotateTransformOperation::create(1, 0, 0, 0, TransformOperation::Rotate3D));
    fromOps.operations().append(RotateTransformOperation::create(0, 1, 0, 0, TransformOperation::Rotate3D));
    TransformOperations toOps;
    toOps.operations().append(RotateTransformOperation::create(1, 0, 0, 45, TransformOperation::Rotate3D));
    toOps.operations().append(RotateTransformOperation::create(0, 1, 0, 135, TransformOperation::Rotate3D));

    FloatBox box(0, 0, 0, 1, 1, 1);
    FloatBox bounds;

    double minProgress = 0;
    double maxProgress = 1;
    EXPECT_TRUE(toOps.blendedBoundsForBox(
        box, fromOps, minProgress, maxProgress, &bounds));

    TransformOperations operations = toOps.blend(fromOps, maxProgress);
    TransformationMatrix blendedTransform;
    operations.apply(FloatSize(0, 0), blendedTransform);

    FloatPoint3D blendedPoint(0.9f, 0.9f, 0);
    blendedPoint = blendedTransform.mapPoint(blendedPoint);
    FloatBox expandedBounds = bounds;
    expandedBounds.expandTo(blendedPoint);

    ASSERT_PRED_FORMAT2(FloatBoxTest::AssertAlmostEqual, bounds, expandedBounds);
}

TEST(TransformOperationsTest, AbsoluteSequenceBoundsTest)
{
    TransformOperations fromOps;
    TransformOperations toOps;

    fromOps.operations().append(TranslateTransformOperation::create(Length(1, Fixed), Length(-5, Fixed), 1, TransformOperation::Translate3D));
    fromOps.operations().append(ScaleTransformOperation::create(-1, 2, 3, TransformOperation::Scale3D));
    fromOps.operations().append(TranslateTransformOperation::create(Length(2, Fixed), Length(4, Fixed), -1, TransformOperation::Translate3D));

    toOps.operations().append(TranslateTransformOperation::create(Length(13, Fixed), Length(-1, Fixed), 5, TransformOperation::Translate3D));
    toOps.operations().append(ScaleTransformOperation::create(-3, -2, 5, TransformOperation::Scale3D));
    toOps.operations().append(TranslateTransformOperation::create(Length(6, Fixed), Length(-2, Fixed), 3, TransformOperation::Translate3D));

    FloatBox box(1, 2, 3, 4, 4, 4);
    FloatBox bounds;

    EXPECT_TRUE(toOps.blendedBoundsForBox(box, fromOps, -0.5, 1.5, &bounds));
    EXPECT_PRED_FORMAT2(FloatBoxTest::AssertAlmostEqual, FloatBox(-57, -59, -1, 76, 112, 80), bounds);

    EXPECT_TRUE(toOps.blendedBoundsForBox(box, fromOps, 0, 1, &bounds));
    EXPECT_PRED_FORMAT2(FloatBoxTest::AssertAlmostEqual, FloatBox(-32, -25, 7, 42, 44, 48), bounds);

    EXPECT_TRUE(toOps.blendedBoundsForBox(box, identityOperations, 0, 1, &bounds));
    EXPECT_PRED_FORMAT2(FloatBoxTest::AssertAlmostEqual, FloatBox(-33, -13, 3, 57, 19, 52), bounds);

    EXPECT_TRUE(identityOperations.blendedBoundsForBox(box, fromOps, 0, 1, &bounds));
    EXPECT_PRED_FORMAT2(FloatBoxTest::AssertAlmostEqual, FloatBox(-7, -3, 2, 15, 23, 20), bounds);
}

} // namespace
