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

#include "Test.h"

#include "GrQuad.h"

#define ASSERT(cond) REPORTER_ASSERT(r, cond)
#define ASSERTF(cond, ...) REPORTER_ASSERT(r, cond, __VA_ARGS__)
#define TEST(name) DEF_TEST(GrQuadList##name, r)

struct TestData {
    int fItem1;
    float fItem2;
};

// Simple factories to make placeholder quads used in the tests. The 2D quads
// will have the kRect quad type.
static GrQuad make_2d_quad() {
    return GrQuad(SkRect::MakeLTRB(1.f, 2.f, 3.f, 4.f));
}
static bool is_2d_quad(const GrPerspQuad& quad) {
    return quad.x(0) == 1.f && quad.x(1) == 1.f && quad.x(2) == 3.f && quad.x(3) == 3.f &&
           quad.y(0) == 2.f && quad.y(1) == 4.f && quad.y(2) == 2.f && quad.y(3) == 4.f &&
           quad.w(0) == 1.f && quad.w(1) == 1.f && quad.w(2) == 1.f && quad.w(3) == 1.f;
}

static GrPerspQuad make_2d_persp_quad() {
    return GrPerspQuad(SkRect::MakeLTRB(5.f, 6.f, 7.f, 8.f), SkMatrix::I());
}
static bool is_2d_persp_quad(const GrPerspQuad& quad) {
    return quad.x(0) == 5.f && quad.x(1) == 5.f && quad.x(2) == 7.f && quad.x(3) == 7.f &&
           quad.y(0) == 6.f && quad.y(1) == 8.f && quad.y(2) == 6.f && quad.y(3) == 8.f &&
           quad.w(0) == 1.f && quad.w(1) == 1.f && quad.w(2) == 1.f && quad.w(3) == 1.f;
}

static GrPerspQuad make_3d_persp_quad() {
    // This perspective matrix leaves x and y unmodified, and sets w to the persp2 value
    SkMatrix p = SkMatrix::I();
    p[SkMatrix::kMPersp2] = 13.f;
    SkASSERT(p.hasPerspective()); // Sanity check
    return GrPerspQuad(SkRect::MakeLTRB(9.f, 10.f, 11.f, 12.f), p);
}
static bool is_3d_persp_quad(const GrPerspQuad& quad) {
    return quad.x(0) == 9.f && quad.x(1) == 9.f && quad.x(2) == 11.f && quad.x(3) == 11.f &&
           quad.y(0) == 10.f && quad.y(1) == 12.f && quad.y(2) == 10.f && quad.y(3) == 12.f &&
           quad.w(0) == 13.f && quad.w(1) == 13.f && quad.w(2) == 13.f && quad.w(3) == 13.f;
}

TEST(Add2D) {
    GrQuadList list2D;
    // Add a plain quad, a 2D persp quad, and then a 3D persp quad, then read back and make sure
    // the coordinates make sense (including that the type was lifted to perspective).
    list2D.push_back(make_2d_quad(), GrQuadType::kRect);
    list2D.push_back(make_2d_persp_quad(), GrQuadType::kRect);

    // Check 2D state of the list
    ASSERTF(list2D.count() == 2, "Unexpected count: %d", list2D.count());
    ASSERTF(list2D.quadType() == GrQuadType::kRect, "Unexpected quad type: %d",
            (uint32_t) list2D.quadType());
    ASSERTF(is_2d_quad(list2D[0]), "Incorrect quad at i=0");
    ASSERTF(is_2d_persp_quad(list2D[1]), "Incorrect quad at i=1");

    // Force the 2D quads to be updated to store ws by adding a perspective quad
    list2D.push_back(make_3d_persp_quad(), GrQuadType::kPerspective);
    ASSERTF(list2D.quadType() == GrQuadType::kPerspective,
            "Expected 2D list to be upgraded to perspective");

    // Re-check full state of list after type upgrade
    ASSERTF(list2D.count() == 3, "Unexpected count: %d", list2D.count());
    ASSERTF(is_2d_quad(list2D[0]), "Incorrect quad at i=0 after upgrade");
    ASSERTF(is_2d_persp_quad(list2D[1]), "Incorrect quad at i=1 after upgrade");
    ASSERTF(is_3d_persp_quad(list2D[2]), "Incorrect quad at i=2");
}

TEST(Add3D) {
    // Now make a list that starts with a 3D persp quad, then has conventional quads added to it
    // and make sure its state is correct
    GrQuadList list3D;
    list3D.push_back(make_3d_persp_quad(), GrQuadType::kPerspective);
    list3D.push_back(make_2d_persp_quad(), GrQuadType::kRect);
    list3D.push_back(make_2d_quad(), GrQuadType::kRect);

    ASSERTF(list3D.count() == 3, "Unexpected count: %d", list3D.count());
    ASSERTF(is_3d_persp_quad(list3D[0]), "Incorrect quad at i=0");
    ASSERTF(is_2d_persp_quad(list3D[1]), "Incorrect quad at i=1");
    ASSERTF(is_2d_quad(list3D[2]), "Incorrect quad at i=2");
}

TEST(AddWithMetadata2D) {
    // As above, but also make sure that the metadata is saved and read properly
    GrTQuadList<TestData> list2D;
    // Add a plain quad, a 2D persp quad, and then a 3D persp quad, then read back and make sure
    // the coordinates make sense (including that the type was lifted to perspective).
    list2D.push_back(make_2d_quad(), GrQuadType::kRect, {1, 1.f});
    list2D.push_back(make_2d_persp_quad(), GrQuadType::kRect, {2, 2.f});

    // Check 2D state of the list
    ASSERTF(list2D.count() == 2, "Unexpected count: %d", list2D.count());
    ASSERTF(list2D.quadType() == GrQuadType::kRect, "Unexpected quad type: %d",
            (uint32_t) list2D.quadType());
    ASSERTF(is_2d_quad(list2D[0]), "Incorrect quad at i=0");
    ASSERTF(list2D.metadata(0).fItem1 == 1 && list2D.metadata(0).fItem2 == 1.f,
            "Incorrect metadata at i=0");
    ASSERTF(is_2d_persp_quad(list2D[1]), "Incorrect quad at i=1");
    ASSERTF(list2D.metadata(1).fItem1 == 2 && list2D.metadata(1).fItem2 == 2.f,
            "Incorrect metadata at i=1");

    // Force the 2D quads to be updated to store ws by adding a perspective quad
    list2D.push_back(make_3d_persp_quad(), GrQuadType::kPerspective, {3, 3.f});
    ASSERTF(list2D.quadType() == GrQuadType::kPerspective,
            "Expected 2D list to be upgraded to perspective");

    // Re-check full state of list after type upgrade
    ASSERTF(list2D.count() == 3, "Unexpected count: %d", list2D.count());
    ASSERTF(is_2d_quad(list2D[0]), "Incorrect quad at i=0 after upgrade");
    ASSERTF(list2D.metadata(0).fItem1 == 1 && list2D.metadata(0).fItem2 == 1.f,
            "Incorrect metadata at i=0");
    ASSERTF(is_2d_persp_quad(list2D[1]), "Incorrect quad at i=1 after upgrade");
    ASSERTF(list2D.metadata(1).fItem1 == 2 && list2D.metadata(1).fItem2 == 2.f,
            "Incorrect metadata at i=1");
    ASSERTF(is_3d_persp_quad(list2D[2]), "Incorrect quad at i=2");
    ASSERTF(list2D.metadata(2).fItem1 == 3 && list2D.metadata(2).fItem2 == 3.f,
            "Incorrect metadata at i=2");
}

TEST(AddWithMetadata3D) {
    // Now make a list that starts with a 3D persp quad, then has conventional quads added to it
    // and make sure its state is correct
    GrTQuadList<TestData> list3D;
    list3D.push_back(make_3d_persp_quad(), GrQuadType::kPerspective, {3, 3.f});
    list3D.push_back(make_2d_persp_quad(), GrQuadType::kRect, {2, 2.f});
    list3D.push_back(make_2d_quad(), GrQuadType::kRect, {1, 1.f});

    ASSERTF(list3D.count() == 3, "Unexpected count: %d", list3D.count());
    ASSERTF(is_3d_persp_quad(list3D[0]), "Incorrect quad at i=0");
    ASSERTF(list3D.metadata(0).fItem1 == 3 && list3D.metadata(0).fItem2 == 3.f,
            "Incorrect metadata at i=0");
    ASSERTF(is_2d_persp_quad(list3D[1]), "Incorrect quad at i=1");
    ASSERTF(list3D.metadata(1).fItem1 == 2 && list3D.metadata(1).fItem2 == 2.f,
            "Incorrect metadata at i=1");
    ASSERTF(is_2d_quad(list3D[2]), "Incorrect quad at i=2");
    ASSERTF(list3D.metadata(2).fItem1 == 1 && list3D.metadata(2).fItem2 == 1.f,
            "Incorrect metadata at i=2");
}

TEST(Concat2DWith2D) {
    GrQuadList a2D;
    a2D.push_back(make_2d_quad(), GrQuadType::kRect);
    GrQuadList b2D;
    b2D.push_back(make_2d_persp_quad(), GrQuadType::kRect);

    a2D.concat(b2D);

    ASSERTF(a2D.count() == 2, "Unexpected count: %d", a2D.count());
    ASSERTF(is_2d_quad(a2D[0]), "Incorrect quad at i=0");
    ASSERTF(is_2d_persp_quad(a2D[1]), "Incorrect quad at i=1");
}

TEST(Concat2DWith3D) {
    GrQuadList a2D;
    a2D.push_back(make_2d_quad(), GrQuadType::kRect);
    GrQuadList b3D;
    b3D.push_back(make_3d_persp_quad(), GrQuadType::kPerspective);

    a2D.concat(b3D);

    ASSERTF(a2D.count() == 2, "Unexpected count: %d", a2D.count());
    ASSERTF(is_2d_quad(a2D[0]), "Incorrect quad at i=0");
    ASSERTF(is_3d_persp_quad(a2D[1]), "Incorrect quad at i=1");
}

TEST(Concat3DWith2D) {
    GrQuadList a3D;
    a3D.push_back(make_3d_persp_quad(), GrQuadType::kPerspective);
    GrQuadList b2D;
    b2D.push_back(make_2d_quad(), GrQuadType::kRect);

    a3D.concat(b2D);

    ASSERTF(a3D.count() == 2, "Unexpected count: %d", a3D.count());
    ASSERTF(is_3d_persp_quad(a3D[0]), "Incorrect quad at i=0");
    ASSERTF(is_2d_quad(a3D[1]), "Incorrect quad at i=1");
}

TEST(Concat3DWith3D) {
    GrQuadList a3D;
    a3D.push_back(make_3d_persp_quad(), GrQuadType::kPerspective);
    GrQuadList b3D;
    b3D.push_back(make_3d_persp_quad(), GrQuadType::kPerspective);

    a3D.concat(b3D);

    ASSERTF(a3D.count() == 2, "Unexpected count: %d", a3D.count());
    ASSERTF(is_3d_persp_quad(a3D[0]), "Incorrect quad at i=0");
    ASSERTF(is_3d_persp_quad(a3D[1]), "Incorrect quad at i=1");
}

TEST(Concat2DWith2DMetadata) {
    GrTQuadList<TestData> a2D;
    a2D.push_back(make_2d_quad(), GrQuadType::kRect, {1, 1.f});
    GrTQuadList<TestData> b2D;
    b2D.push_back(make_2d_persp_quad(), GrQuadType::kRect, {2, 2.f});

    a2D.concat(b2D);

    ASSERTF(a2D.count() == 2, "Unexpected count: %d", a2D.count());
    ASSERTF(is_2d_quad(a2D[0]), "Incorrect quad at i=0");
    ASSERTF(a2D.metadata(0).fItem1 == 1 && a2D.metadata(0).fItem2 == 1.f,
            "Incorrect metadata at i=0");
    ASSERTF(is_2d_persp_quad(a2D[1]), "Incorrect quad at i=1");
    ASSERTF(a2D.metadata(1).fItem1 == 2 && a2D.metadata(1).fItem2 == 2.f,
            "Incorrect metadata at i=1");
}

TEST(Concat2DWith3DMetadata) {
    GrTQuadList<TestData> a2D;
    a2D.push_back(make_2d_quad(), GrQuadType::kRect, {1, 1.f});
    GrTQuadList<TestData> b3D;
    b3D.push_back(make_3d_persp_quad(), GrQuadType::kPerspective, {2, 2.f});

    a2D.concat(b3D);

    ASSERTF(a2D.count() == 2, "Unexpected count: %d", a2D.count());
    ASSERTF(is_2d_quad(a2D[0]), "Incorrect quad at i=0");
    ASSERTF(a2D.metadata(0).fItem1 == 1 && a2D.metadata(0).fItem2 == 1.f,
            "Incorrect metadata at i=0");
    ASSERTF(is_3d_persp_quad(a2D[1]), "Incorrect quad at i=1");
    ASSERTF(a2D.metadata(1).fItem1 == 2 && a2D.metadata(1).fItem2 == 2.f,
            "Incorrect metadata at i=1");
}

TEST(Concat3DWith2DMetadata) {
    GrTQuadList<TestData> a3D;
    a3D.push_back(make_3d_persp_quad(), GrQuadType::kPerspective, {1, 1.f});
    GrTQuadList<TestData> b2D;
    b2D.push_back(make_2d_quad(), GrQuadType::kRect, {2, 2.f});

    a3D.concat(b2D);

    ASSERTF(a3D.count() == 2, "Unexpected count: %d", a3D.count());
    ASSERTF(is_3d_persp_quad(a3D[0]), "Incorrect quad at i=0");
    ASSERTF(a3D.metadata(0).fItem1 == 1 && a3D.metadata(0).fItem2 == 1.f,
            "Incorrect metadata at i=0");
    ASSERTF(is_2d_quad(a3D[1]), "Incorrect quad at i=1");
    ASSERTF(a3D.metadata(1).fItem1 == 2 && a3D.metadata(1).fItem2 == 2.f,
            "Incorrect metadata at i=1");
}

TEST(Concat3DWith3DMetadata) {
    GrTQuadList<TestData> a3D;
    a3D.push_back(make_3d_persp_quad(), GrQuadType::kPerspective, {1, 1.f});
    GrTQuadList<TestData> b3D;
    b3D.push_back(make_3d_persp_quad(), GrQuadType::kPerspective, {2, 2.f});

    a3D.concat(b3D);

    ASSERTF(a3D.count() == 2, "Unexpected count: %d", a3D.count());
    ASSERTF(is_3d_persp_quad(a3D[0]), "Incorrect quad at i=0");
    ASSERTF(a3D.metadata(0).fItem1 == 1 && a3D.metadata(0).fItem2 == 1.f,
            "Incorrect metadata at i=0");
    ASSERTF(is_3d_persp_quad(a3D[1]), "Incorrect quad at i=1");
    ASSERTF(a3D.metadata(1).fItem1 == 2 && a3D.metadata(1).fItem2 == 2.f,
            "Incorrect metadata at i=1");
}

TEST(WriteMetadata) {
    GrTQuadList<TestData> list;
    list.push_back(make_2d_quad(), GrQuadType::kRect, {1, 1.f});
    ASSERTF(list.metadata(0).fItem1 == 1 && list.metadata(0).fItem2 == 1.f,
            "Incorrect metadata at i=0"); // Sanity check

    // Rewrite metadata within the list and read back
    list.metadata(0).fItem1 = 2;
    list.metadata(0).fItem2 = 2.f;
    ASSERTF(list.metadata(0).fItem1 == 2 && list.metadata(0).fItem2 == 2.f,
            "Incorrect metadata at i=0 after edit");
}
