// Copyright (c) 2018 The Chromium 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 "testing/gtest/include/gtest/gtest.h"
#include "third_party/skia/include/core/SkPixmap.h"
#include "third_party/skia/include/core/SkStream.h"
#include "third_party/skia/include/core/SkSurface.h"
#include "third_party/skia/modules/skottie/include/Skottie.h"

TEST(Skottie, Basic) {
  // Just a solid green layer.
  static constexpr char anim_data[] =
      "{"
      "  \"v\" : \"4.12.0\","
      "  \"fr\": 30,"
      "  \"w\" : 400,"
      "  \"h\" : 200,"
      "  \"ip\": 0,"
      "  \"op\": 150,"
      "  \"assets\": [],"

      "  \"layers\": ["
      "    {"
      "      \"ty\": 1,"
      "      \"sw\": 400,"
      "      \"sh\": 200,"
      "      \"sc\": \"#00ff00\","
      "      \"ip\": 0,"
      "      \"op\": 150"
      "    }"
      "  ]"
      "}";

  SkMemoryStream stream(anim_data, strlen(anim_data));
  auto anim = skottie::Animation::Make(&stream);

  ASSERT_TRUE(anim);
  EXPECT_EQ(strcmp(anim->version().c_str(), "4.12.0"), 0);
  EXPECT_EQ(anim->size().width(), 400.0f);
  EXPECT_EQ(anim->size().height(), 200.0f);
  EXPECT_EQ(anim->duration(), 5.0f);

  auto surface = SkSurface::MakeRasterN32Premul(400, 200);
  anim->seek(0);
  anim->render(surface->getCanvas());

  SkPixmap pixmap;
  ASSERT_TRUE(surface->peekPixels(&pixmap));

  for (int i = 0; i < pixmap.width(); ++i) {
    for (int j = 0; j < pixmap.height(); ++j) {
      EXPECT_EQ(pixmap.getColor(i, j), 0xff00ff00);
    }
  }
}
