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

#ifndef CC_TEST_FAKE_LAYER_TREE_HOST_IMPL_H_
#define CC_TEST_FAKE_LAYER_TREE_HOST_IMPL_H_

#include "base/sequenced_task_runner.h"
#include "cc/test/fake_layer_tree_host_impl_client.h"
#include "cc/test/fake_rendering_stats_instrumentation.h"
#include "cc/trees/layer_tree_host_impl.h"
#include "cc/trees/single_thread_proxy.h"

namespace cc {

class AnimationHost;

class FakeLayerTreeHostImpl : public LayerTreeHostImpl {
 public:
  FakeLayerTreeHostImpl(TaskRunnerProvider* task_runner_provider,
                        TaskGraphRunner* task_graph_runner);
  FakeLayerTreeHostImpl(const LayerTreeSettings& settings,
                        TaskRunnerProvider* task_runner_provider,
                        TaskGraphRunner* task_graph_runner);
  FakeLayerTreeHostImpl(
      const LayerTreeSettings& settings,
      TaskRunnerProvider* task_runner_provider,
      TaskGraphRunner* task_graph_runner,
      scoped_refptr<base::SequencedTaskRunner> image_worker_task_runner);
  ~FakeLayerTreeHostImpl() override;

  void ForcePrepareToDraw() {
    LayerTreeHostImpl::FrameData frame_data;
    PrepareToDraw(&frame_data);
    DidDrawAllLayers(frame_data);
  }

  void CreatePendingTree() override;

  void NotifyTileStateChanged(const Tile* tile) override;
  viz::BeginFrameArgs CurrentBeginFrameArgs() const override;
  void AdvanceToNextFrame(base::TimeDelta advance_by);
  void UpdateNumChildrenAndDrawPropertiesForActiveTree();
  static void UpdateNumChildrenAndDrawProperties(LayerTreeImpl* layerTree);

  using LayerTreeHostImpl::ActivateSyncTree;
  using LayerTreeHostImpl::prepare_tiles_needed;
  using LayerTreeHostImpl::is_likely_to_require_a_draw;
  using LayerTreeHostImpl::RemoveRenderPasses;

  bool notify_tile_state_changed_called() const {
    return notify_tile_state_changed_called_;
  }
  void set_notify_tile_state_changed_called(bool called) {
    notify_tile_state_changed_called_ = called;
  }

  AnimationHost* animation_host() const;

  FakeLayerTreeHostImplClient* client() { return &client_; }

 private:
  FakeLayerTreeHostImplClient client_;
  FakeRenderingStatsInstrumentation stats_instrumentation_;
  bool notify_tile_state_changed_called_;
};

}  // namespace cc

#endif  // CC_TEST_FAKE_LAYER_TREE_HOST_IMPL_H_
