// 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.

#ifndef FLOW_TESTING_MOCK_LAYER_H_
#define FLOW_TESTING_MOCK_LAYER_H_

#include "flutter/flow/layers/layer.h"

namespace flutter {
namespace testing {

// Mock implementation of the |Layer| interface that does nothing but paint
// the specified |path| into the canvas.  It records the |PrerollContext| and
// |PaintContext| data passed in by its parent |Layer|, so the test can later
// verify the data against expected values.
class MockLayer : public Layer {
 public:
  MockLayer(SkPath path,
            SkPaint paint = SkPaint(),
            bool fake_has_platform_view = false,
            bool fake_needs_system_composite = false,
            bool fake_reads_surface = false);

  void Preroll(PrerollContext* context, const SkMatrix& matrix) override;
  void Paint(PaintContext& context) const override;

  const MutatorsStack& parent_mutators() { return parent_mutators_; }
  const SkMatrix& parent_matrix() { return parent_matrix_; }
  const SkRect& parent_cull_rect() { return parent_cull_rect_; }
  float parent_elevation() { return parent_elevation_; }
  bool parent_has_platform_view() { return parent_has_platform_view_; }

 private:
  MutatorsStack parent_mutators_;
  SkMatrix parent_matrix_;
  SkRect parent_cull_rect_ = SkRect::MakeEmpty();
  SkPath fake_paint_path_;
  SkPaint fake_paint_;
  float parent_elevation_ = 0;
  bool parent_has_platform_view_ = false;
  bool fake_has_platform_view_ = false;
  bool fake_needs_system_composite_ = false;
  bool fake_reads_surface_ = false;

  FML_DISALLOW_COPY_AND_ASSIGN(MockLayer);
};

}  // namespace testing
}  // namespace flutter

#endif  // FLOW_TESTING_MOCK_LAYER_H_
