// 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_constants.h"

#include <libusb.h>

#include <gtest/gtest.h>

namespace mist {

TEST(UsbConstantsTest, UsbDirection) {
  EXPECT_EQ(kUsbDirectionIn, static_cast<UsbDirection>(LIBUSB_ENDPOINT_IN));
  EXPECT_EQ(kUsbDirectionOut, static_cast<UsbDirection>(LIBUSB_ENDPOINT_OUT));
}

TEST(UsbConstantsTest, UsbSpeed) {
  EXPECT_EQ(kUsbSpeedUnknown, static_cast<UsbSpeed>(LIBUSB_SPEED_UNKNOWN));
  EXPECT_EQ(kUsbSpeedLow, static_cast<UsbSpeed>(LIBUSB_SPEED_LOW));
  EXPECT_EQ(kUsbSpeedFull, static_cast<UsbSpeed>(LIBUSB_SPEED_FULL));
  EXPECT_EQ(kUsbSpeedHigh, static_cast<UsbSpeed>(LIBUSB_SPEED_HIGH));
  EXPECT_EQ(kUsbSpeedSuper, static_cast<UsbSpeed>(LIBUSB_SPEED_SUPER));
}

TEST(UsbConstantsTest, UsbTransferType) {
  EXPECT_EQ(kUsbTransferTypeControl,
            static_cast<UsbTransferType>(LIBUSB_TRANSFER_TYPE_CONTROL));
  EXPECT_EQ(kUsbTransferTypeIsochronous,
            static_cast<UsbTransferType>(LIBUSB_TRANSFER_TYPE_ISOCHRONOUS));
  EXPECT_EQ(kUsbTransferTypeBulk,
            static_cast<UsbTransferType>(LIBUSB_TRANSFER_TYPE_BULK));
  EXPECT_EQ(kUsbTransferTypeInterrupt,
            static_cast<UsbTransferType>(LIBUSB_TRANSFER_TYPE_INTERRUPT));
}

TEST(UsbConstantsTest, UsbTransferStatus) {
  EXPECT_EQ(kUsbTransferStatusCompleted,
            static_cast<UsbTransferStatus>(LIBUSB_TRANSFER_COMPLETED));
  EXPECT_EQ(kUsbTransferStatusError,
            static_cast<UsbTransferStatus>(LIBUSB_TRANSFER_ERROR));
  EXPECT_EQ(kUsbTransferStatusTimedOut,
            static_cast<UsbTransferStatus>(LIBUSB_TRANSFER_TIMED_OUT));
  EXPECT_EQ(kUsbTransferStatusCancelled,
            static_cast<UsbTransferStatus>(LIBUSB_TRANSFER_CANCELLED));
  EXPECT_EQ(kUsbTransferStatusStall,
            static_cast<UsbTransferStatus>(LIBUSB_TRANSFER_STALL));
  EXPECT_EQ(kUsbTransferStatusNoDevice,
            static_cast<UsbTransferStatus>(LIBUSB_TRANSFER_NO_DEVICE));
  EXPECT_EQ(kUsbTransferStatusOverflow,
            static_cast<UsbTransferStatus>(LIBUSB_TRANSFER_OVERFLOW));
}

TEST(UsbConstantsTest, GetUsbDirectionOfEndpointAddress) {
  EXPECT_EQ(kUsbDirectionIn,
            GetUsbDirectionOfEndpointAddress(kUsbDirectionIn | 0x1));
  EXPECT_EQ(kUsbDirectionOut, GetUsbDirectionOfEndpointAddress(0x1));
}

}  // namespace mist
