Get a basic USB device working

It enumerates, takes its address, gets configured, and then Linux kind
of gives up because it has no endpoints.

Change-Id: I01f75acee419b585e455f428ee45bcd37f0ce189
diff --git a/motors/usb/constants_test.cc b/motors/usb/constants_test.cc
new file mode 100644
index 0000000..4d11349
--- /dev/null
+++ b/motors/usb/constants_test.cc
@@ -0,0 +1,66 @@
+#include "motors/usb/constants.h"
+
+#include "gtest/gtest.h"
+
+namespace frc971 {
+namespace teensy {
+namespace testing {
+
+TEST(EndpointBufferStateTest, Filling) {
+  EXPECT_TRUE(BufferStateHasEmpty(EndpointBufferState::kBothEmptyEvenFirst));
+  EXPECT_EQ(EvenOdd::kEven,
+            BufferStateToFill(EndpointBufferState::kBothEmptyEvenFirst));
+
+  EXPECT_TRUE(BufferStateHasEmpty(EndpointBufferState::kBothEmptyOddFirst));
+  EXPECT_EQ(EvenOdd::kOdd,
+            BufferStateToFill(EndpointBufferState::kBothEmptyOddFirst));
+
+  EXPECT_TRUE(BufferStateHasEmpty(EndpointBufferState::kEvenFull));
+  EXPECT_EQ(EvenOdd::kOdd, BufferStateToFill(EndpointBufferState::kEvenFull));
+
+  EXPECT_TRUE(BufferStateHasEmpty(EndpointBufferState::kOddFull));
+  EXPECT_EQ(EvenOdd::kEven, BufferStateToFill(EndpointBufferState::kOddFull));
+
+  EXPECT_FALSE(BufferStateHasEmpty(EndpointBufferState::kBothFullEvenFirst));
+}
+
+TEST(EndpointBufferStateTest, Emptying) {
+  EXPECT_FALSE(BufferStateHasFull(EndpointBufferState::kBothEmptyEvenFirst));
+
+  EXPECT_FALSE(BufferStateHasFull(EndpointBufferState::kBothEmptyOddFirst));
+
+  EXPECT_TRUE(BufferStateHasFull(EndpointBufferState::kEvenFull));
+  EXPECT_EQ(EvenOdd::kEven, BufferStateToEmpty(EndpointBufferState::kEvenFull));
+
+  EXPECT_TRUE(BufferStateHasFull(EndpointBufferState::kOddFull));
+  EXPECT_EQ(EvenOdd::kOdd, BufferStateToEmpty(EndpointBufferState::kOddFull));
+
+  EXPECT_TRUE(BufferStateHasFull(EndpointBufferState::kBothFullEvenFirst));
+  EXPECT_EQ(EvenOdd::kEven,
+            BufferStateToEmpty(EndpointBufferState::kBothFullEvenFirst));
+}
+
+TEST(EndpointBufferStateTest, Transitions) {
+  EXPECT_EQ(EndpointBufferState::kEvenFull,
+            BufferStateAfterFill(EndpointBufferState::kBothEmptyEvenFirst));
+
+  EXPECT_EQ(EndpointBufferState::kOddFull,
+            BufferStateAfterFill(EndpointBufferState::kBothEmptyOddFirst));
+
+  EXPECT_EQ(EndpointBufferState::kBothFullEvenFirst,
+            BufferStateAfterFill(EndpointBufferState::kEvenFull));
+  EXPECT_EQ(EndpointBufferState::kBothEmptyOddFirst,
+            BufferStateAfterEmpty(EndpointBufferState::kEvenFull));
+
+  EXPECT_EQ(EndpointBufferState::kBothFullOddFirst,
+            BufferStateAfterFill(EndpointBufferState::kOddFull));
+  EXPECT_EQ(EndpointBufferState::kBothEmptyEvenFirst,
+            BufferStateAfterEmpty(EndpointBufferState::kOddFull));
+
+  EXPECT_EQ(EndpointBufferState::kOddFull,
+            BufferStateAfterEmpty(EndpointBufferState::kBothFullEvenFirst));
+}
+
+}  // namespace testing
+}  // namespace teensy
+}  // namespace frc971