// Copyright 2019 The Fuchsia 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 "topaz/runtime/flutter_runner/fuchsia_accessibility.h"

#include <gtest/gtest.h>
#include <lib/async-loop/cpp/loop.h>
#include <lib/fidl/cpp/binding_set.h>
#include <lib/fidl/cpp/interface_request.h>
#include <lib/gtest/real_loop_fixture.h>
#include <lib/sys/cpp/testing/service_directory_provider.h>

namespace flutter_runner_a11y_test {
using fuchsia::accessibility::semantics::SemanticsManager;
using FuchsiaAccessibilityTests = gtest::RealLoopFixture;

class MockSemanticsManager : public SemanticsManager {
 public:
  MockSemanticsManager() = default;
  ~MockSemanticsManager() = default;

  // |fuchsia::accessibility::semantics::SemanticsManager|:
  void RegisterView(
      fuchsia::ui::views::ViewRef view_ref,
      fidl::InterfaceHandle<
          fuchsia::accessibility::semantics::SemanticActionListener>
          handle,
      fidl::InterfaceRequest<fuchsia::accessibility::semantics::SemanticTree>
          semantic_tree) override {
    has_view_ref_ = true;
  }

  fidl::InterfaceRequestHandler<SemanticsManager> GetHandler(
      async_dispatcher_t* dispatcher) {
    return bindings_.GetHandler(this, dispatcher);
  }

  bool RegisterViewCalled() { return has_view_ref_; }

 private:
  bool has_view_ref_ = false;
  fidl::BindingSet<SemanticsManager> bindings_;
};

TEST_F(FuchsiaAccessibilityTests, RegisterViewRef) {
  MockSemanticsManager semantics_manager;
  sys::testing::ServiceDirectoryProvider services_provider(dispatcher());
  services_provider.AddService(semantics_manager.GetHandler(dispatcher()),
                               SemanticsManager::Name_);
  zx::eventpair a, b;
  zx::eventpair::create(/* flags */ 0u, &a, &b);
  auto view_ref = fuchsia::ui::views::ViewRef({
      .reference = std::move(a),
  });
  auto fuchsia_accessibility = flutter_runner::FuchsiaAccessibility::Create(
      services_provider.service_directory(), std::move(view_ref));

  RunLoopUntilIdle();
  EXPECT_TRUE(semantics_manager.RegisterViewCalled());
}

}  // namespace flutter_runner_a11y_test
