info_test.go 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. package rgb
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "reflect"
  6. "testing"
  7. intrgb "github.com/wobkey/rgb/internal/rgb"
  8. "github.com/wobkey/rgb/internal/via"
  9. )
  10. type infoKey struct {
  11. channel via.LEDType
  12. param uint8
  13. }
  14. type fakeInfoProtocol struct {
  15. values map[infoKey][]byte
  16. errors map[infoKey]error
  17. calls []infoKey
  18. }
  19. func (f *fakeInfoProtocol) GetValue(channel via.LEDType, param uint8) ([]byte, error) {
  20. key := infoKey{channel: channel, param: param}
  21. f.calls = append(f.calls, key)
  22. if err := f.errors[key]; err != nil {
  23. return nil, err
  24. }
  25. return append([]byte(nil), f.values[key]...), nil
  26. }
  27. func TestInfoSuccessfulRecord(t *testing.T) {
  28. protocol := &fakeInfoProtocol{
  29. values: map[infoKey][]byte{
  30. {channel: 3, param: 1}: {160},
  31. {channel: 3, param: 2}: {17},
  32. {channel: 3, param: 3}: {2},
  33. {channel: 3, param: 4}: {85, 255},
  34. {channel: 2, param: 1}: {80},
  35. {channel: 2, param: 2}: {4},
  36. {channel: 2, param: 3}: {1},
  37. {channel: 2, param: 4}: {0, 128},
  38. },
  39. errors: make(map[infoKey]error),
  40. }
  41. zones := []intrgb.Zone{intrgb.ZoneBacklight, intrgb.ZoneLogo}
  42. got, err := readInfo(protocol, zones)
  43. if err != nil {
  44. t.Fatalf("readInfo() unexpected error: %v", err)
  45. }
  46. want := infoOutput{
  47. Enabled: true,
  48. Mode: "rainbow_moving_chevron",
  49. Brightness: 160,
  50. Speed: 2,
  51. Zones: []zoneInfo{
  52. {
  53. Zone: intrgb.ZoneBacklight,
  54. Channel: 3,
  55. Enabled: true,
  56. Effect: "rainbow_moving_chevron",
  57. EffectID: 17,
  58. Brightness: 160,
  59. Speed: 2,
  60. Color: infoColor{Hue: 85, Saturation: 255},
  61. },
  62. {
  63. Zone: intrgb.ZoneLogo,
  64. Channel: 2,
  65. Enabled: true,
  66. Effect: "breathing",
  67. EffectID: 4,
  68. Brightness: 80,
  69. Speed: 1,
  70. Color: infoColor{Hue: 0, Saturation: 128},
  71. },
  72. },
  73. }
  74. if !reflect.DeepEqual(got, want) {
  75. t.Fatalf("readInfo() = %+v, want %+v", got, want)
  76. }
  77. data, err := json.Marshal(got)
  78. if err != nil {
  79. t.Fatalf("json.Marshal() error = %v", err)
  80. }
  81. wantJSON := `{"enabled":true,"mode":"rainbow_moving_chevron","brightness":160,"speed":2,"zones":[{"zone":"backlight","channel":3,"enabled":true,"effect":"rainbow_moving_chevron","effectId":17,"brightness":160,"speed":2,"color":{"hue":85,"saturation":255}},{"zone":"logo","channel":2,"enabled":true,"effect":"breathing","effectId":4,"brightness":80,"speed":1,"color":{"hue":0,"saturation":128}}]}`
  82. if string(data) != wantJSON {
  83. t.Errorf("JSON = %s, want %s", data, wantJSON)
  84. }
  85. }
  86. func TestInfoErrorRecord(t *testing.T) {
  87. protocol := &fakeInfoProtocol{
  88. values: map[infoKey][]byte{
  89. {channel: 2, param: 1}: {120},
  90. {channel: 2, param: 2}: {4},
  91. {channel: 2, param: 3}: {3},
  92. {channel: 2, param: 4}: {10, 20},
  93. {channel: 3, param: 1}: {90},
  94. {channel: 3, param: 2}: {5},
  95. {channel: 3, param: 3}: {4},
  96. {channel: 3, param: 4}: {30, 40},
  97. },
  98. errors: map[infoKey]error{
  99. {channel: 4, param: 1}: errors.New("side unavailable"),
  100. },
  101. }
  102. zones := []intrgb.Zone{intrgb.ZoneLogo, intrgb.ZoneSide, intrgb.ZoneBacklight}
  103. got, err := readInfo(protocol, zones)
  104. if err == nil {
  105. t.Fatal("readInfo() expected error, got nil")
  106. }
  107. want := infoOutput{
  108. Enabled: true,
  109. Mode: "breathing",
  110. Brightness: 120,
  111. Speed: 3,
  112. Zones: []zoneInfo{
  113. {
  114. Zone: intrgb.ZoneLogo,
  115. Channel: 2,
  116. Enabled: true,
  117. Effect: "breathing",
  118. EffectID: 4,
  119. Brightness: 120,
  120. Speed: 3,
  121. Color: infoColor{Hue: 10, Saturation: 20},
  122. },
  123. {
  124. Zone: intrgb.ZoneSide,
  125. Channel: 4,
  126. Error: "side unavailable",
  127. },
  128. {
  129. Zone: intrgb.ZoneBacklight,
  130. Channel: 3,
  131. Enabled: true,
  132. Effect: "breathing",
  133. EffectID: 5,
  134. Brightness: 90,
  135. Speed: 4,
  136. Color: infoColor{Hue: 30, Saturation: 40},
  137. },
  138. },
  139. }
  140. if !reflect.DeepEqual(got, want) {
  141. t.Fatalf("readInfo() = %+v, want %+v", got, want)
  142. }
  143. data, err := json.Marshal(got)
  144. if err != nil {
  145. t.Fatalf("json.Marshal() error = %v", err)
  146. }
  147. var envelope struct {
  148. Zones []map[string]json.RawMessage `json:"zones"`
  149. }
  150. if err := json.Unmarshal(data, &envelope); err != nil {
  151. t.Fatalf("json.Unmarshal() error = %v", err)
  152. }
  153. if len(envelope.Zones) != 3 {
  154. t.Fatalf("zones = %d, want 3", len(envelope.Zones))
  155. }
  156. if _, ok := envelope.Zones[1]["error"]; !ok {
  157. t.Errorf("error zone JSON = %v, want error key", envelope.Zones[1])
  158. }
  159. }