// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "flutter/fml/build_config.h"

#if defined(OS_WIN)
#define _USE_MATH_DEFINES
#endif
#include <cmath>

#include "flutter/flow/matrix_decomposition.h"
#include "gtest/gtest.h"

namespace flutter {
namespace testing {

TEST(MatrixDecomposition, Rotation) {
  SkM44 matrix;

  const auto angle = M_PI_4;
  matrix.setRotate({0.0, 0.0, 1.0}, angle);

  flutter::MatrixDecomposition decomposition(matrix);
  ASSERT_TRUE(decomposition.IsValid());

  const auto sine = sin(angle * 0.5);

  ASSERT_FLOAT_EQ(0, decomposition.rotation().x);
  ASSERT_FLOAT_EQ(0, decomposition.rotation().y);
  ASSERT_FLOAT_EQ(sine, decomposition.rotation().z);
  ASSERT_FLOAT_EQ(cos(angle * 0.5), decomposition.rotation().w);
}

TEST(MatrixDecomposition, Scale) {
  SkM44 matrix;

  const auto scale = 5.0;
  matrix.setScale(scale + 0, scale + 1, scale + 2);

  flutter::MatrixDecomposition decomposition(matrix);
  ASSERT_TRUE(decomposition.IsValid());

  ASSERT_FLOAT_EQ(scale + 0, decomposition.scale().x);
  ASSERT_FLOAT_EQ(scale + 1, decomposition.scale().y);
  ASSERT_FLOAT_EQ(scale + 2, decomposition.scale().z);
}

TEST(MatrixDecomposition, Translate) {
  SkM44 matrix;

  const auto translate = 125.0;
  matrix.setTranslate(translate + 0, translate + 1, translate + 2);

  flutter::MatrixDecomposition decomposition(matrix);
  ASSERT_TRUE(decomposition.IsValid());

  ASSERT_FLOAT_EQ(translate + 0, decomposition.translation().x);
  ASSERT_FLOAT_EQ(translate + 1, decomposition.translation().y);
  ASSERT_FLOAT_EQ(translate + 2, decomposition.translation().z);
}

TEST(MatrixDecomposition, Combination) {
  const auto rotation = M_PI_4;
  const auto scale = 5;
  const auto translate = 125.0;

  SkM44 m1;
  m1.setRotate({0, 0, 1}, rotation);

  SkM44 m2;
  m2.setScale(scale, scale, scale);

  SkM44 m3;
  m3.setTranslate(translate, translate, translate);

  SkM44 combined = m3 * m2 * m1;

  flutter::MatrixDecomposition decomposition(combined);
  ASSERT_TRUE(decomposition.IsValid());

  ASSERT_FLOAT_EQ(translate, decomposition.translation().x);
  ASSERT_FLOAT_EQ(translate, decomposition.translation().y);
  ASSERT_FLOAT_EQ(translate, decomposition.translation().z);

  ASSERT_FLOAT_EQ(scale, decomposition.scale().x);
  ASSERT_FLOAT_EQ(scale, decomposition.scale().y);
  ASSERT_FLOAT_EQ(scale, decomposition.scale().z);

  const auto sine = sin(rotation * 0.5);

  ASSERT_FLOAT_EQ(0, decomposition.rotation().x);
  ASSERT_FLOAT_EQ(0, decomposition.rotation().y);
  ASSERT_FLOAT_EQ(sine, decomposition.rotation().z);
  ASSERT_FLOAT_EQ(cos(rotation * 0.5), decomposition.rotation().w);
}

TEST(MatrixDecomposition, ScaleFloatError) {
  constexpr float scale_increment = 0.00001f;
  for (float scale = 0.0001f; scale < 2.0f; scale += scale_increment) {
    SkM44 matrix;
    matrix.setScale(scale, scale, 1.0f);

    flutter::MatrixDecomposition decomposition3(matrix);
    ASSERT_TRUE(decomposition3.IsValid());

    ASSERT_FLOAT_EQ(scale, decomposition3.scale().x);
    ASSERT_FLOAT_EQ(scale, decomposition3.scale().y);
    ASSERT_FLOAT_EQ(1.f, decomposition3.scale().z);
    ASSERT_FLOAT_EQ(0, decomposition3.rotation().x);
    ASSERT_FLOAT_EQ(0, decomposition3.rotation().y);
    ASSERT_FLOAT_EQ(0, decomposition3.rotation().z);
  }

  SkM44 matrix;
  const auto scale = 1.7734375f;
  matrix.setScale(scale, scale, 1.f);

  // Bug upper bound (empirical)
  const auto scale2 = 1.773437559603f;
  SkM44 matrix2;
  matrix2.setScale(scale2, scale2, 1.f);

  // Bug lower bound (empirical)
  const auto scale3 = 1.7734374403954f;
  SkM44 matrix3;
  matrix3.setScale(scale3, scale3, 1.f);

  flutter::MatrixDecomposition decomposition(matrix);
  ASSERT_TRUE(decomposition.IsValid());

  flutter::MatrixDecomposition decomposition2(matrix2);
  ASSERT_TRUE(decomposition2.IsValid());

  flutter::MatrixDecomposition decomposition3(matrix3);
  ASSERT_TRUE(decomposition3.IsValid());

  ASSERT_FLOAT_EQ(scale, decomposition.scale().x);
  ASSERT_FLOAT_EQ(scale, decomposition.scale().y);
  ASSERT_FLOAT_EQ(1.f, decomposition.scale().z);
  ASSERT_FLOAT_EQ(0, decomposition.rotation().x);
  ASSERT_FLOAT_EQ(0, decomposition.rotation().y);
  ASSERT_FLOAT_EQ(0, decomposition.rotation().z);

  ASSERT_FLOAT_EQ(scale2, decomposition2.scale().x);
  ASSERT_FLOAT_EQ(scale2, decomposition2.scale().y);
  ASSERT_FLOAT_EQ(1.f, decomposition2.scale().z);
  ASSERT_FLOAT_EQ(0, decomposition2.rotation().x);
  ASSERT_FLOAT_EQ(0, decomposition2.rotation().y);
  ASSERT_FLOAT_EQ(0, decomposition2.rotation().z);

  ASSERT_FLOAT_EQ(scale3, decomposition3.scale().x);
  ASSERT_FLOAT_EQ(scale3, decomposition3.scale().y);
  ASSERT_FLOAT_EQ(1.f, decomposition3.scale().z);
  ASSERT_FLOAT_EQ(0, decomposition3.rotation().x);
  ASSERT_FLOAT_EQ(0, decomposition3.rotation().y);
  ASSERT_FLOAT_EQ(0, decomposition3.rotation().z);
}

}  // namespace testing
}  // namespace flutter
