// 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 "src/ui/lib/key_util/key_util.h"

#include <gtest/gtest.h>

#include "hid-parser/usages.h"
#include "hid/usages.h"

namespace root_presenter {
namespace {

TEST(InputUtil, IntoKeyEvent) {
  fuchsia::ui::input::KeyboardEvent kbd = {};
  kbd.phase = fuchsia::ui::input::KeyboardEventPhase::PRESSED;
  kbd.hid_usage = HID_USAGE_KEY_A;
  kbd.modifiers = fuchsia::ui::input::kModifierLeftShift;

  std::optional<fuchsia::ui::input2::KeyEvent> key = key_util::into_key_event(kbd);

  EXPECT_TRUE(key);
  EXPECT_EQ(key->phase(), fuchsia::ui::input2::KeyEventPhase::PRESSED);
  EXPECT_EQ(key->key(), fuchsia::ui::input2::Key::A);
  EXPECT_EQ(key->modifiers(),
            fuchsia::ui::input2::Modifiers::SHIFT | fuchsia::ui::input2::Modifiers::LEFT_SHIFT);
}

TEST(InputUtil, IntoKeyEventUnknown) {
  fuchsia::ui::input::KeyboardEvent kbd = {};
  kbd.hid_usage = HID_USAGE_KEY_ERROR_ROLLOVER;

  std::optional<fuchsia::ui::input2::KeyEvent> key = key_util::into_key_event(kbd);

  EXPECT_FALSE(key);
}

TEST(InputUtil, FuchsiaKeyToHidKey) {
  std::optional<uint32_t> key =
      key_util::fuchsia_key_to_hid_key(fuchsia::ui::input2::Key::LEFT_SHIFT);
  ASSERT_TRUE(key);
  ASSERT_EQ(*key, HID_USAGE_KEY_LEFT_SHIFT);
}

}  // namespace
}  // namespace root_presenter
