select_test.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. package main
  2. import (
  3. "strings"
  4. "testing"
  5. intdevice "netdome.biz/paul/impact-80/internal/device"
  6. )
  7. func testDevices() []intdevice.Device {
  8. return []intdevice.Device{
  9. {Index: 1, Path: "/dev/hidraw7", VendorID: 0x36b0, ProductID: 0x309f, Name: "Wobkey Impact 80", Known: true},
  10. {Index: 2, Path: "/dev/hidraw9", VendorID: 0x1234, ProductID: 0x5678, Name: "Unknown QMK keyboard", Known: false},
  11. }
  12. }
  13. func TestSelectDeviceByIndex(t *testing.T) {
  14. tests := []struct {
  15. selector string
  16. wantPath string
  17. }{
  18. {"1", "/dev/hidraw7"},
  19. {"2", "/dev/hidraw9"},
  20. }
  21. for _, tt := range tests {
  22. dev, err := selectDevice(testDevices(), tt.selector)
  23. if err != nil {
  24. t.Errorf("selectDevice(%q) returned error: %v", tt.selector, err)
  25. continue
  26. }
  27. if dev.Path != tt.wantPath {
  28. t.Errorf("selectDevice(%q) = %q, want %q", tt.selector, dev.Path, tt.wantPath)
  29. }
  30. }
  31. }
  32. func TestSelectDeviceEmptySelectorRequiresSingle(t *testing.T) {
  33. single := testDevices()[:1]
  34. dev, err := selectDevice(single, "")
  35. if err != nil {
  36. t.Fatalf("selectDevice(single, \"\") returned error: %v", err)
  37. }
  38. if dev.Path != "/dev/hidraw7" {
  39. t.Errorf("selectDevice(single, \"\") = %q, want %q", dev.Path, "/dev/hidraw7")
  40. }
  41. }
  42. func TestSelectDeviceEmptySelectorRejectsMultiple(t *testing.T) {
  43. _, err := selectDevice(testDevices(), "")
  44. if err == nil {
  45. t.Fatal("selectDevice(multiple, \"\") expected error, got nil")
  46. }
  47. if !strings.Contains(err.Error(), "--device") {
  48. t.Errorf("selectDevice(multiple, \"\") error = %q, want it to mention --device", err)
  49. }
  50. if !strings.Contains(err.Error(), "/dev/hidraw7") || !strings.Contains(err.Error(), "/dev/hidraw9") {
  51. t.Errorf("selectDevice(multiple, \"\") error = %q, want it to list both device paths", err)
  52. }
  53. }
  54. func TestSelectDeviceEmptySelectorRejectsNone(t *testing.T) {
  55. _, err := selectDevice(nil, "")
  56. if err == nil {
  57. t.Fatal("selectDevice(nil, \"\") expected error, got nil")
  58. }
  59. if !strings.Contains(err.Error(), "no QMK keyboard") {
  60. t.Errorf("selectDevice(nil, \"\") error = %q, want it to report no QMK keyboard", err)
  61. }
  62. }
  63. func TestSelectDeviceOutOfRange(t *testing.T) {
  64. tests := []string{"0", "3", "-1"}
  65. for _, selector := range tests {
  66. _, err := selectDevice(testDevices(), selector)
  67. if err == nil {
  68. t.Errorf("selectDevice(%q) expected error, got nil", selector)
  69. }
  70. }
  71. }
  72. func TestSelectDeviceRejectsNonNumeric(t *testing.T) {
  73. tests := []string{"/dev/hidraw7", "abc", "1a", " ", "0x1"}
  74. for _, selector := range tests {
  75. _, err := selectDevice(testDevices(), selector)
  76. if err == nil {
  77. t.Errorf("selectDevice(%q) expected error, got nil", selector)
  78. }
  79. }
  80. }
  81. func TestSelectDeviceReportsMissingKeyboardBeforeBadSelector(t *testing.T) {
  82. _, err := selectDevice(nil, "1")
  83. if err == nil {
  84. t.Fatal("selectDevice(nil, \"1\") expected error, got nil")
  85. }
  86. if !strings.Contains(err.Error(), "no QMK keyboard") {
  87. t.Errorf("selectDevice(nil, \"1\") error = %q, want it to report no QMK keyboard", err)
  88. }
  89. }
  90. func TestSelectDeviceErrorListsDevicesOnSeparateLines(t *testing.T) {
  91. _, err := selectDevice(testDevices(), "9")
  92. if err == nil {
  93. t.Fatal("selectDevice(devices, \"9\") expected error, got nil")
  94. }
  95. if !strings.Contains(err.Error(), "\n 1 Wobkey Impact 80") {
  96. t.Errorf("selectDevice() error = %q, want the device list to start on its own indented line", err)
  97. }
  98. }
  99. func TestFormatDeviceList(t *testing.T) {
  100. got := formatDeviceList(testDevices())
  101. for _, want := range []string{"1", "2", "Wobkey Impact 80", "Unknown QMK keyboard", "/dev/hidraw7", "/dev/hidraw9"} {
  102. if !strings.Contains(got, want) {
  103. t.Errorf("formatDeviceList() = %q, want it to contain %q", got, want)
  104. }
  105. }
  106. }