// 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 "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 FakeLayerTreeHostImpl : public LayerTreeHostImpl {
 public:
  FakeLayerTreeHostImpl(Proxy* proxy,
                        SharedBitmapManager* manager,
                        TaskGraphRunner* task_graph_runner);
  FakeLayerTreeHostImpl(const LayerTreeSettings& settings,
                        Proxy* proxy,
                        SharedBitmapManager* manager,
                        TaskGraphRunner* task_graph_runner);
  ~FakeLayerTreeHostImpl() override;

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

  void CreatePendingTree() override;

  BeginFrameArgs CurrentBeginFrameArgs() const override;
  void AdvanceToNextFrame(base::TimeDelta advance_by);
  void UpdateNumChildrenAndDrawPropertiesForActiveTree();
  static void UpdateNumChildrenAndDrawProperties(LayerTreeImpl* layerTree);
  static int RecursiveUpdateNumChildren(LayerImpl* layer);

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

 private:
  FakeLayerTreeHostImplClient client_;
  FakeRenderingStatsInstrumentation stats_instrumentation_;
};

}  // namespace cc

#endif  // CC_TEST_FAKE_LAYER_TREE_HOST_IMPL_H_
