// Copyright 2020 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 "ui/accessibility/test_ax_tree_manager.h"

#include "ui/accessibility/ax_node.h"
#include "ui/accessibility/ax_tree_data.h"
#include "ui/accessibility/ax_tree_manager_map.h"

namespace ui {

TestAXTreeManager::TestAXTreeManager() = default;

TestAXTreeManager::TestAXTreeManager(std::unique_ptr<AXTree> tree)
    : tree_(std::move(tree)) {
  AXTreeManagerMap::GetInstance().AddTreeManager(GetTreeID(), this);
}

TestAXTreeManager::~TestAXTreeManager() {
  if (tree_)
    AXTreeManagerMap::GetInstance().RemoveTreeManager(GetTreeID());
}

void TestAXTreeManager::DestroyTree() {
  if (!tree_)
    return;

  AXTreeManagerMap::GetInstance().RemoveTreeManager(GetTreeID());
  tree_.reset();
}

AXTree* TestAXTreeManager::GetTree() const {
  DCHECK(tree_) << "Did you forget to call SetTree?";
  return tree_.get();
}

void TestAXTreeManager::SetTree(std::unique_ptr<AXTree> tree) {
  if (tree_)
    AXTreeManagerMap::GetInstance().RemoveTreeManager(GetTreeID());

  tree_ = std::move(tree);
  AXTreeManagerMap::GetInstance().AddTreeManager(GetTreeID(), this);
}

AXNode* TestAXTreeManager::GetNodeFromTree(const AXTreeID tree_id,
                                           const AXNode::AXID node_id) const {
  return (tree_ && GetTreeID() == tree_id) ? tree_->GetFromId(node_id)
                                           : nullptr;
}

AXNode* TestAXTreeManager::GetNodeFromTree(const AXNode::AXID node_id) const {
  return tree_ ? tree_->GetFromId(node_id) : nullptr;
}

AXTreeID TestAXTreeManager::GetTreeID() const {
  return tree_ ? tree_->data().tree_id : AXTreeIDUnknown();
}

AXTreeID TestAXTreeManager::GetParentTreeID() const {
  return AXTreeIDUnknown();
}

AXNode* TestAXTreeManager::GetRootAsAXNode() const {
  return tree_ ? tree_->root() : nullptr;
}

AXNode* TestAXTreeManager::GetParentNodeFromParentTreeAsAXNode() const {
  return nullptr;
}

}  // namespace ui
