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

#include "cc/layers/heads_up_display_layer.h"
#include "cc/layers/layer.h"
#include "cc/test/layer_tree_test.h"
#include "cc/trees/layer_tree_host.h"

namespace cc {
namespace {

class HeadsUpDisplayTest : public LayerTreeTest {
 protected:
  virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE {
    // Enable the HUD without requiring text.
    settings->initial_debug_state.show_property_changed_rects = true;
  }
};

class DrawsContentLayer : public Layer {
 public:
  static scoped_refptr<DrawsContentLayer> Create() {
    return make_scoped_refptr(new DrawsContentLayer());
  }
  virtual bool DrawsContent() const OVERRIDE { return true; }

 private:
  DrawsContentLayer() : Layer() {}
  virtual ~DrawsContentLayer() {}
};

class HudWithRootLayerChange : public HeadsUpDisplayTest {
 public:
  HudWithRootLayerChange()
      : root_layer1_(DrawsContentLayer::Create()),
        root_layer2_(DrawsContentLayer::Create()),
        num_commits_(0) {}

  virtual void BeginTest() OVERRIDE {
    root_layer1_->SetBounds(gfx::Size(30, 30));
    root_layer2_->SetBounds(gfx::Size(30, 30));

    PostSetNeedsCommitToMainThread();
  }

  virtual void DidCommit() OVERRIDE {
    ++num_commits_;

    ASSERT_TRUE(layer_tree_host()->hud_layer());

    switch (num_commits_) {
      case 1:
        // Change directly to a new root layer.
        layer_tree_host()->SetRootLayer(root_layer1_);
        break;
      case 2:
        EXPECT_EQ(root_layer1_.get(), layer_tree_host()->hud_layer()->parent());
        // Unset the root layer.
        layer_tree_host()->SetRootLayer(NULL);
        break;
      case 3:
        EXPECT_EQ(0, layer_tree_host()->hud_layer()->parent());
        // Change back to the previous root layer.
        layer_tree_host()->SetRootLayer(root_layer1_);
        break;
      case 4:
        EXPECT_EQ(root_layer1_.get(), layer_tree_host()->hud_layer()->parent());
        // Unset the root layer.
        layer_tree_host()->SetRootLayer(NULL);
        break;
      case 5:
        EXPECT_EQ(0, layer_tree_host()->hud_layer()->parent());
        // Change to a new root layer from a null root.
        layer_tree_host()->SetRootLayer(root_layer2_);
        break;
      case 6:
        EXPECT_EQ(root_layer2_.get(), layer_tree_host()->hud_layer()->parent());
        // Change directly back to the last root layer/
        layer_tree_host()->SetRootLayer(root_layer1_);
        break;
      case 7:
        EXPECT_EQ(root_layer1_.get(), layer_tree_host()->hud_layer()->parent());
        EndTest();
        break;
    }
  }

  virtual void AfterTest() OVERRIDE {}

 private:
  scoped_refptr<DrawsContentLayer> root_layer1_;
  scoped_refptr<DrawsContentLayer> root_layer2_;
  int num_commits_;
};

MULTI_THREAD_TEST_F(HudWithRootLayerChange);

}  // namespace
}  // namespace cc
