// 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 "garnet/bin/ui/input_reader/sensor.h"

#include <gtest/gtest.h>
#include <hid-parser/parser.h>
#include <hid-parser/usages.h>
#include <src/lib/fxl/time/time_point.h>

#include "garnet/bin/ui/input_reader/tests/sensor_test_data.h"

namespace input {

namespace test {

TEST(SensorTest, LightMeter) {
  ui_input::Sensor sensor;
  hid::DeviceDescriptor *hid_desc = nullptr;

  auto parse_res = hid::ParseReportDescriptor(
      lightmeter_report_desc, sizeof(lightmeter_report_desc), &hid_desc);
  ASSERT_EQ(hid::ParseResult::kParseOk, parse_res);
  ASSERT_NE(0UL, hid_desc->rep_count);
  ASSERT_NE(0UL, hid_desc->report[0].input_count);

  ui_input::Device::Descriptor descriptor = {};
  auto success = sensor.ParseReportDescriptor(hid_desc->report[0], &descriptor);
  ASSERT_EQ(true, success);

  ASSERT_EQ(ui_input::Protocol::Sensor, descriptor.protocol);
  ASSERT_EQ(true, descriptor.has_sensor);
  ASSERT_NE(nullptr, descriptor.sensor_descriptor);
  ASSERT_EQ(fuchsia::ui::input::SensorType::LIGHTMETER,
            descriptor.sensor_descriptor->type);

  uint8_t report_data[] = {
      0x04,        // Report ID
      0x12, 0x24,  // Illuminance
  };

  auto sensor_report = fuchsia::ui::input::InputReport::New();
  sensor_report->sensor = fuchsia::ui::input::SensorReport::New();

  success =
      sensor.ParseReport(report_data, sizeof(report_data), sensor_report.get());
  EXPECT_EQ(true, success);

  EXPECT_EQ(0x2412, sensor_report->sensor->scalar());
}

TEST(SensorTest, Accelerometer) {
  ui_input::Sensor sensor;
  hid::DeviceDescriptor *hid_desc = nullptr;

  auto parse_res = hid::ParseReportDescriptor(
      accelerometer_report_desc, sizeof(accelerometer_report_desc), &hid_desc);
  ASSERT_EQ(hid::ParseResult::kParseOk, parse_res);
  ASSERT_NE(0UL, hid_desc->rep_count);
  ASSERT_NE(0UL, hid_desc->report[0].input_count);

  ui_input::Device::Descriptor descriptor = {};
  auto success = sensor.ParseReportDescriptor(hid_desc->report[0], &descriptor);
  ASSERT_EQ(true, success);

  ASSERT_EQ(ui_input::Protocol::Sensor, descriptor.protocol);
  ASSERT_EQ(true, descriptor.has_sensor);
  ASSERT_NE(nullptr, descriptor.sensor_descriptor);
  ASSERT_EQ(fuchsia::ui::input::SensorType::ACCELEROMETER,
            descriptor.sensor_descriptor->type);

  uint8_t report_data[] = {
      0x01,        // Report ID
      0xFF, 0x00,  // X - Axis
      0xFF, 0xFF,  // Y - Axis
      0x00, 0x80,  // Z - Axis
  };

  auto sensor_report = fuchsia::ui::input::InputReport::New();
  sensor_report->sensor = fuchsia::ui::input::SensorReport::New();

  success =
      sensor.ParseReport(report_data, sizeof(report_data), sensor_report.get());
  EXPECT_EQ(true, success);

  EXPECT_EQ(0xFF, sensor_report->sensor->vector()[0]);
  EXPECT_EQ(-1, sensor_report->sensor->vector()[1]);
  EXPECT_EQ(-32768, sensor_report->sensor->vector()[2]);
}

}  // namespace test
}  // namespace input
