|
|
@@ -250,3 +250,65 @@ func TestLoadKeyboardsEmptyFile(t *testing.T) {
|
|
|
t.Errorf("LoadKeyboards() returned %d keyboards, want 0", len(keyboards))
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+func writeTempKeyboards(t *testing.T, content string) string {
|
|
|
+ t.Helper()
|
|
|
+ path := filepath.Join(t.TempDir(), "keyboards.json")
|
|
|
+ if err := os.WriteFile(path, []byte(content), 0o600); err != nil {
|
|
|
+ t.Fatalf("write keyboards.json: %v", err)
|
|
|
+ }
|
|
|
+ return path
|
|
|
+}
|
|
|
+
|
|
|
+func TestLoadKeyboardsReadsChannelDisplayNames(t *testing.T) {
|
|
|
+ original := findKeyboardsJSON
|
|
|
+ t.Cleanup(func() { findKeyboardsJSON = original })
|
|
|
+ findKeyboardsJSON = func() (string, error) {
|
|
|
+ return writeTempKeyboards(t, `[
|
|
|
+ {"name": "Wobkey Impact 80", "vendorId": 14000, "productId": 12447,
|
|
|
+ "channels": {"2": "logo", "3": "backlight", "4": "side"}}
|
|
|
+ ]`), nil
|
|
|
+ }
|
|
|
+
|
|
|
+ keyboards, err := LoadKeyboards()
|
|
|
+ if err != nil {
|
|
|
+ t.Fatalf("LoadKeyboards() error = %v", err)
|
|
|
+ }
|
|
|
+ if len(keyboards) != 1 {
|
|
|
+ t.Fatalf("keyboards = %d, want 1", len(keyboards))
|
|
|
+ }
|
|
|
+ got := keyboards[0].Channels
|
|
|
+ if got[2] != "logo" || got[3] != "backlight" || got[4] != "side" {
|
|
|
+ t.Errorf("Channels = %v, want 2:logo 3:backlight 4:side", got)
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func TestLoadKeyboardsAcceptsAnEntryWithoutChannels(t *testing.T) {
|
|
|
+ original := findKeyboardsJSON
|
|
|
+ t.Cleanup(func() { findKeyboardsJSON = original })
|
|
|
+ findKeyboardsJSON = func() (string, error) {
|
|
|
+ return writeTempKeyboards(t, `[{"name": "Wobkey Rainy 75", "vendorId": 26214, "productId": 1}]`), nil
|
|
|
+ }
|
|
|
+
|
|
|
+ keyboards, err := LoadKeyboards()
|
|
|
+ if err != nil {
|
|
|
+ t.Fatalf("LoadKeyboards() error = %v", err)
|
|
|
+ }
|
|
|
+ if len(keyboards[0].Channels) != 0 {
|
|
|
+ t.Errorf("Channels = %v, want empty", keyboards[0].Channels)
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+// README.md promises that a missing or broken keyboards.json costs names, not
|
|
|
+// the ability to drive the keyboard.
|
|
|
+func TestKeyboardForReportsAbsentRatherThanFailing(t *testing.T) {
|
|
|
+ original := findKeyboardsJSON
|
|
|
+ t.Cleanup(func() { findKeyboardsJSON = original })
|
|
|
+ findKeyboardsJSON = func() (string, error) { return "does-not-exist.json", nil }
|
|
|
+
|
|
|
+ if _, known, err := KeyboardFor(0x6666, 0x0001); err != nil {
|
|
|
+ t.Errorf("KeyboardFor() error = %v, want nil for a missing file", err)
|
|
|
+ } else if known {
|
|
|
+ t.Error("KeyboardFor() = known, want unknown for a missing file")
|
|
|
+ }
|
|
|
+}
|