// 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 "canvas_spy.h"
#include "gtest/gtest.h"
#include "third_party/skia/include/core/SkPictureRecorder.h"
#include "third_party/skia/include/core/SkSurface.h"

namespace flutter {
namespace testing {

TEST(CanvasSpyTest, DrawingIsTracked) {
  SkPictureRecorder picture_recorder;
  SkCanvas* canvas = picture_recorder.beginRecording(100, 100);
  CanvasSpy canvas_spy = CanvasSpy(canvas);
  SkCanvas* spy = canvas_spy.GetSpyingCanvas();

  ASSERT_FALSE(canvas_spy.DidDrawIntoCanvas());

  spy->translate(128, 128);
  spy->clear(SK_ColorTRANSPARENT);
  ASSERT_FALSE(canvas_spy.DidDrawIntoCanvas());

  SkPaint paint;
  spy->drawCircle(0, 0, 60, paint);
  ASSERT_TRUE(canvas_spy.DidDrawIntoCanvas());
}

TEST(CanvasSpyTest, SpiedCanvasIsDrawing) {
  auto actual_surface =
      SkSurface::MakeRaster(SkImageInfo::MakeN32Premul(100, 100));
  SkCanvas* actual_canvas = actual_surface->getCanvas();

  auto expected_surface =
      SkSurface::MakeRaster(SkImageInfo::MakeN32Premul(100, 100));
  SkCanvas* expected_canvas = expected_surface->getCanvas();

  CanvasSpy canvas_spy = CanvasSpy(actual_canvas);
  SkCanvas* spy = canvas_spy.GetSpyingCanvas();

  SkNWayCanvas multi_canvas = SkNWayCanvas(100, 100);
  multi_canvas.addCanvas(spy);
  multi_canvas.addCanvas(expected_canvas);

  multi_canvas.clipRect(SkRect::MakeWH(100, 100));
  multi_canvas.clear(SK_ColorRED);
  multi_canvas.scale(.5, .5);
  multi_canvas.clipRect(SkRect::MakeWH(100, 100));
  multi_canvas.clear(SK_ColorBLUE);

  ASSERT_TRUE(canvas_spy.DidDrawIntoCanvas());

  SkPixmap actual;
  SkPixmap expected;

  ASSERT_TRUE(actual_surface->peekPixels(&actual));
  ASSERT_TRUE(expected_surface->peekPixels(&expected));

  const auto size = actual.rowBytes() * actual.height();
  ASSERT_NE(size, 0u);

  ASSERT_EQ(::memcmp(actual.addr(), expected.addr(), size), 0);
}
}  // namespace testing
}  // namespace flutter
