// Copyright (c) 2013 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 "mist/usb_error.h"

#include <gtest/gtest.h>

namespace mist {

TEST(UsbErrorTest, DefaultConstructor) {
  UsbError error;
  EXPECT_TRUE(error.IsSuccess());
  EXPECT_EQ(UsbError::kSuccess, error.type());
}

TEST(UsbErrorTest, ConstructorWithType) {
  UsbError error(UsbError::kErrorInvalidParameter);
  EXPECT_FALSE(error.IsSuccess());
  EXPECT_EQ(UsbError::kErrorInvalidParameter, error.type());
}

TEST(UsbErrorTest, ConstructorWithLibUsbError) {
  UsbError error(LIBUSB_ERROR_INVALID_PARAM);
  EXPECT_FALSE(error.IsSuccess());
  EXPECT_EQ(UsbError::kErrorInvalidParameter, error.type());
}

TEST(UsbErrorTest, IsSuccess) {
  UsbError error;
  EXPECT_TRUE(error.IsSuccess());

  error.set_type(UsbError::kErrorIO);
  EXPECT_FALSE(error.IsSuccess());

  error.set_type(UsbError::kSuccess);
  EXPECT_TRUE(error.IsSuccess());
}

TEST(UsbErrorTest, Clear) {
  UsbError error(UsbError::kErrorIO);
  EXPECT_EQ(UsbError::kErrorIO, error.type());
  EXPECT_FALSE(error.IsSuccess());

  error.Clear();
  EXPECT_EQ(UsbError::kSuccess, error.type());
  EXPECT_TRUE(error.IsSuccess());
}

TEST(UsbError, SetFromLibUsbError) {
  UsbError error;

  EXPECT_TRUE(error.SetFromLibUsbError(LIBUSB_SUCCESS));
  EXPECT_EQ(UsbError::kSuccess, error.type());

  EXPECT_FALSE(error.SetFromLibUsbError(LIBUSB_ERROR_IO));
  EXPECT_EQ(UsbError::kErrorIO, error.type());

  EXPECT_FALSE(error.SetFromLibUsbError(LIBUSB_ERROR_INVALID_PARAM));
  EXPECT_EQ(UsbError::kErrorInvalidParameter, error.type());

  EXPECT_FALSE(error.SetFromLibUsbError(LIBUSB_ERROR_ACCESS));
  EXPECT_EQ(UsbError::kErrorAccess, error.type());

  EXPECT_FALSE(error.SetFromLibUsbError(LIBUSB_ERROR_NO_DEVICE));
  EXPECT_EQ(UsbError::kErrorNoDevice, error.type());

  EXPECT_FALSE(error.SetFromLibUsbError(LIBUSB_ERROR_NOT_FOUND));
  EXPECT_EQ(UsbError::kErrorNotFound, error.type());

  EXPECT_FALSE(error.SetFromLibUsbError(LIBUSB_ERROR_BUSY));
  EXPECT_EQ(UsbError::kErrorBusy, error.type());

  EXPECT_FALSE(error.SetFromLibUsbError(LIBUSB_ERROR_TIMEOUT));
  EXPECT_EQ(UsbError::kErrorTimeout, error.type());

  EXPECT_FALSE(error.SetFromLibUsbError(LIBUSB_ERROR_OVERFLOW));
  EXPECT_EQ(UsbError::kErrorOverflow, error.type());

  EXPECT_FALSE(error.SetFromLibUsbError(LIBUSB_ERROR_PIPE));
  EXPECT_EQ(UsbError::kErrorPipe, error.type());

  EXPECT_FALSE(error.SetFromLibUsbError(LIBUSB_ERROR_INTERRUPTED));
  EXPECT_EQ(UsbError::kErrorInterrupted, error.type());

  EXPECT_FALSE(error.SetFromLibUsbError(LIBUSB_ERROR_NO_MEM));
  EXPECT_EQ(UsbError::kErrorNoMemory, error.type());

  EXPECT_FALSE(error.SetFromLibUsbError(LIBUSB_ERROR_NOT_SUPPORTED));
  EXPECT_EQ(UsbError::kErrorNotSupported, error.type());

  EXPECT_FALSE(error.SetFromLibUsbError(LIBUSB_ERROR_OTHER));
  EXPECT_EQ(UsbError::kErrorOther, error.type());
}

}  // namespace mist
