// Copyright 2019 The Chromium OS 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 <base/logging.h>
#include <gtest/gtest.h>

#include "biod/fp_mode.h"

namespace biod {

using Mode = FpMode::Mode;

TEST(FpModeTest, Constructor) {
  EXPECT_EQ(FpMode().mode(), Mode::kModeInvalid);
  EXPECT_EQ(FpMode(Mode::kResetSensor).mode(), Mode::kResetSensor);
  EXPECT_EQ(FpMode(1).mode(), Mode::kDeepsleep);
  EXPECT_EQ(FpMode(UINT32_MAX).mode(), Mode::kModeInvalid);
}

TEST(FpModeTest, Equality) {
  EXPECT_EQ(FpMode(Mode::kResetSensor), FpMode(Mode::kResetSensor));
  EXPECT_NE(FpMode(Mode::kResetSensor), FpMode(Mode::kMatch));
}

TEST(FpModeTest, Ostream) {
  std::ostringstream stream;
  stream << "mode: " << FpMode(Mode::kResetSensor);
  EXPECT_EQ(stream.str(), "mode: (enum: 10, raw: 0x80)");
}

TEST(FpModeTest, EnumVal) {
  EXPECT_EQ(FpMode(Mode::kNone).EnumVal(), 0);
  EXPECT_EQ(FpMode(Mode::kDeepsleep).EnumVal(), 1);
  EXPECT_EQ(FpMode(Mode::kFingerDown).EnumVal(), 2);
  EXPECT_EQ(FpMode(Mode::kFingerUp).EnumVal(), 3);
  EXPECT_EQ(FpMode(Mode::kCapture).EnumVal(), 4);
  EXPECT_EQ(FpMode(Mode::kEnrollSession).EnumVal(), 5);
  EXPECT_EQ(FpMode(Mode::kEnrollSessionFingerUp).EnumVal(), 6);
  EXPECT_EQ(FpMode(Mode::kEnrollSessionEnrollImage).EnumVal(), 7);
  EXPECT_EQ(FpMode(Mode::kEnrollImage).EnumVal(), 8);
  EXPECT_EQ(FpMode(Mode::kMatch).EnumVal(), 9);
  EXPECT_EQ(FpMode(Mode::kResetSensor).EnumVal(), 10);
  EXPECT_EQ(FpMode(Mode::kDontChange).EnumVal(), 11);
  EXPECT_EQ(FpMode(Mode::kSensorMaintenance).EnumVal(), 12);
  EXPECT_EQ(FpMode(Mode::kModeInvalid).EnumVal(), 13);
}

TEST(FpModeTest, MaxEnumVal) {
  EXPECT_EQ(FpMode().MaxEnumVal(), 13);
}

TEST(FpModeTest, RawVal) {
  EXPECT_EQ(FpMode(Mode::kNone).RawVal(), 0);
  EXPECT_EQ(FpMode(Mode::kModeInvalid).RawVal(), 0);

  EXPECT_EQ(FpMode(Mode::kDeepsleep).RawVal(), 0x1);
  EXPECT_EQ(FpMode(Mode::kFingerDown).RawVal(), 0x2);
  EXPECT_EQ(FpMode(Mode::kFingerUp).RawVal(), 0x4);
  EXPECT_EQ(FpMode(Mode::kCapture).RawVal(), 0x8);
  EXPECT_EQ(FpMode(Mode::kEnrollSession).RawVal(), 0x10);
  EXPECT_EQ(FpMode(Mode::kEnrollImage).RawVal(), 0x20);
  EXPECT_EQ(FpMode(Mode::kMatch).RawVal(), 0x40);
  EXPECT_EQ(FpMode(Mode::kResetSensor).RawVal(), 0x80);
  EXPECT_EQ(FpMode(Mode::kSensorMaintenance).RawVal(), 0x100);
  EXPECT_EQ(FpMode(Mode::kDontChange).RawVal(), 0x80000000);

  EXPECT_EQ(FpMode(Mode::kEnrollSessionFingerUp).RawVal(), 0x14);
  EXPECT_EQ(FpMode(Mode::kEnrollSessionEnrollImage).RawVal(), 0x30);
}

}  // namespace biod
