/*
 * 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 "include/core/SkPaint.h"
#include "include/core/SkPicture.h"
#include "include/core/SkPictureRecorder.h"
#include "include/core/SkRect.h"
#include "tests/Test.h"
#include "tools/debugger/DebugLayerManager.h"

// Adds one full update, one partial update, and requests one image a few frames later.
static void test_basic(skiatest::Reporter* reporter) {
  // prepare supporting objects
  int layerWidth = 100;
  int layerHeight = 100;

  // make a picture that fully updates the layer
  SkPictureRecorder rec;
  SkCanvas* canvas = rec.beginRecording(layerWidth, layerHeight);
  canvas->clear(0x00000000);
  SkPaint paint;
  paint.setColor(SK_ColorBLUE);
  canvas->drawOval(SkRect::MakeLTRB(1,1,99,99), paint);
  canvas->flush();
  auto picture1 = rec.finishRecordingAsPicture();
  SkIRect dirtyRectFull = SkIRect::MakeLTRB(0, 0, layerWidth, layerHeight);

  // make a second picture that acts as a partial update.
  SkPictureRecorder rec2;
  canvas = rec2.beginRecording(layerWidth, layerHeight);
  paint.setColor(SK_ColorGREEN);
  canvas->drawOval(SkRect::MakeLTRB(40,40,60,60), paint);
  canvas->flush();
  auto picture2 = rec2.finishRecordingAsPicture();
  SkIRect dirtyRectPartial = SkIRect::MakeLTRB(40,40,60,60);

  int node = 2;

  // create and exercise DebugLayerManager
  DebugLayerManager dlm;
  dlm.storeSkPicture(node, 0, picture1, dirtyRectFull);
  dlm.storeSkPicture(node, 10, picture2, dirtyRectPartial);
  auto frames = dlm.listFramesForNode(node);

  // Confirm the layer manager stored these at the right places.
  REPORTER_ASSERT(reporter, frames.size() == 2);
  REPORTER_ASSERT(reporter, frames[0] == 0);
  REPORTER_ASSERT(reporter, frames[1] == 10);

  SkPixmap pixmap;
  // request an image of the layer between the two updates.
  for (int i=0; i<10; i++) {
    auto image = dlm.getLayerAsImage(node, i);
    REPORTER_ASSERT(reporter, image->width() == layerWidth);
    REPORTER_ASSERT(reporter, image->height() == layerHeight);
    // confirm center is blue, proving only first pic was drawn.
    image->peekPixels(&pixmap);
    SkColor paintColor = pixmap.getColor(50, 50);
    REPORTER_ASSERT(reporter, paintColor == SK_ColorBLUE);
  }

  // For any images after the second draw, confirm the center is green, but the area just outside
  // that smaller circle is still blue, proving dlm drew both pictures.
  for (int i=10; i<12; i++) {
    auto image = dlm.getLayerAsImage(node, i);
    REPORTER_ASSERT(reporter, image->width() == layerWidth);
    REPORTER_ASSERT(reporter, image->height() == layerHeight);
    image->peekPixels(&pixmap);
    auto innerColor = pixmap.getColor(50, 50);
    REPORTER_ASSERT(reporter, innerColor == SK_ColorGREEN);
    auto outerColor = pixmap.getColor(10, 50);
    REPORTER_ASSERT(reporter, outerColor == SK_ColorBLUE);
  }


}

DEF_TEST(DebugLayerManagerTest, reporter) {
  test_basic(reporter);
}
