number.py 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. # Mixins for testing number entities
  2. from ..helpers import assert_device_properties_set
  3. class BasicNumberTests:
  4. def setUpBasicNumber(
  5. self,
  6. dps,
  7. subject,
  8. max,
  9. min=0,
  10. step=1,
  11. mode="auto",
  12. scale=1,
  13. unit=None,
  14. testdata=None,
  15. device_class=None,
  16. ):
  17. self.basicNumber = subject
  18. self.basicNumberDps = dps
  19. self.basicNumberMin = min
  20. self.basicNumberMax = max
  21. self.basicNumberStep = step
  22. self.basicNumberMode = mode
  23. self.basicNumberScale = scale
  24. self.basicNumberUnit = unit
  25. self.basicNumberTestData = testdata
  26. self.basicNumberDevClass = device_class
  27. def test_number_min_value(self):
  28. self.assertEqual(self.basicNumber.native_min_value, self.basicNumberMin)
  29. def test_number_max_value(self):
  30. self.assertEqual(self.basicNumber.native_max_value, self.basicNumberMax)
  31. def test_number_step(self):
  32. self.assertEqual(self.basicNumber.native_step, self.basicNumberStep)
  33. def test_number_mode(self):
  34. self.assertEqual(self.basicNumber.mode, self.basicNumberMode)
  35. def test_number_unit_of_measurement(self):
  36. self.assertEqual(
  37. self.basicNumber.native_unit_of_measurement, self.basicNumberUnit
  38. )
  39. def test_number_device_class(self):
  40. self.assertEqual(
  41. self.basicNumber.device_class,
  42. self.basicNumberDevClass,
  43. )
  44. def test_number_value(self):
  45. if self.basicNumberTestData:
  46. val = self.basicNumberTestData[0]
  47. expected = self.basicNumberTestData[1]
  48. else:
  49. expected = min(
  50. max(self.basicNumberMin, self.basicNumberStep), self.basicNumberMax
  51. )
  52. val = expected * self.basicNumberScale
  53. self.dps[self.basicNumberDps] = val
  54. self.assertEqual(self.basicNumber.native_value, expected)
  55. async def test_number_set_value(self):
  56. if self.basicNumberTestData:
  57. dps_val = self.basicNumberTestData[0]
  58. val = self.basicNumberTestData[1]
  59. else:
  60. val = min(
  61. max(self.basicNumberMin, self.basicNumberStep),
  62. self.basicNumberMax,
  63. )
  64. dps_val = val * self.basicNumberScale
  65. async with assert_device_properties_set(
  66. self.basicNumber._device, {self.basicNumberDps: dps_val}
  67. ):
  68. await self.basicNumber.async_set_native_value(val)
  69. def test_number_extra_state_attributes(self):
  70. self.assertEqual(self.basicNumber.extra_state_attributes, {})
  71. class MultiNumberTests:
  72. def setUpMultiNumber(self, numbers):
  73. self.multiNumber = {}
  74. self.multiNumberDps = {}
  75. self.multiNumberMin = {}
  76. self.multiNumberMax = {}
  77. self.multiNumberStep = {}
  78. self.multiNumberMode = {}
  79. self.multiNumberScale = {}
  80. self.multiNumberUnit = {}
  81. self.multiNumberTestData = {}
  82. self.multiNumberDevClass = {}
  83. for n in numbers:
  84. name = n.get("name")
  85. subject = self.entities.get(name)
  86. if subject is None:
  87. raise AttributeError(f"No number for {name} found.")
  88. self.multiNumber[name] = subject
  89. self.multiNumberDps[name] = n.get("dps")
  90. self.multiNumberMin[name] = n.get("min", 0)
  91. self.multiNumberMax[name] = n.get("max")
  92. self.multiNumberStep[name] = n.get("step", 1)
  93. self.multiNumberMode[name] = n.get("mode", "auto")
  94. self.multiNumberScale[name] = n.get("scale", 1)
  95. self.multiNumberUnit[name] = n.get("unit", None)
  96. self.multiNumberTestData[name] = n.get("testdata", None)
  97. self.multiNumberDevClass[name] = n.get("device_class", None)
  98. def test_multi_number_min_value(self):
  99. for key, subject in self.multiNumber.items():
  100. self.assertEqual(
  101. subject.native_min_value,
  102. self.multiNumberMin[key],
  103. f"{key} min value mismatch",
  104. )
  105. def test_multi_number_max_value(self):
  106. for key, subject in self.multiNumber.items():
  107. self.assertEqual(
  108. subject.native_max_value,
  109. self.multiNumberMax[key],
  110. f"{key} max value mismatch",
  111. )
  112. def test_multi_number_step(self):
  113. for key, subject in self.multiNumber.items():
  114. self.assertEqual(
  115. subject.native_step,
  116. self.multiNumberStep[key],
  117. f"{key} step mismatch",
  118. )
  119. def test_multi_number_mode(self):
  120. for key, subject in self.multiNumber.items():
  121. self.assertEqual(
  122. subject.mode,
  123. self.multiNumberMode[key],
  124. f"{key} mode mismatch",
  125. )
  126. def test_multi_number_unit_of_measurement(self):
  127. for key, subject in self.multiNumber.items():
  128. self.assertEqual(
  129. subject.native_unit_of_measurement,
  130. self.multiNumberUnit[key],
  131. f"{key} unit mismatch",
  132. )
  133. def test_multi_number_device_class(self):
  134. for key, subject in self.multiNumber.items():
  135. self.assertEqual(
  136. subject.device_class,
  137. self.multiNumberDevClass[key],
  138. f"{key} device class mismatch",
  139. )
  140. def test_multi_number_value(self):
  141. for key, subject in self.multiNumber.items():
  142. if self.multiNumberTestData[key]:
  143. val = self.multiNumberTestData[key][1]
  144. dps_val = self.multiNumberTestData[key][0]
  145. else:
  146. val = min(
  147. max(self.multiNumberMin[key], self.multiNumberStep[key]),
  148. self.multiNumberMax[key],
  149. )
  150. dps_val = val * self.multiNumberScale[key]
  151. self.dps[self.multiNumberDps[key]] = dps_val
  152. self.assertEqual(subject.native_value, val, f"{key} value mismatch")
  153. async def test_multi_number_set_value(self):
  154. for key, subject in self.multiNumber.items():
  155. if self.multiNumberTestData[key]:
  156. val = self.multiNumberTestData[key][1]
  157. dps_val = self.multiNumberTestData[key][0]
  158. else:
  159. val = min(
  160. max(self.multiNumberMin[key], self.multiNumberStep[key]),
  161. self.multiNumberMax[key],
  162. )
  163. dps_val = val * self.multiNumberScale[key]
  164. async with assert_device_properties_set(
  165. subject._device,
  166. {self.multiNumberDps[key]: dps_val},
  167. f"{key} failed to set correct value",
  168. ):
  169. await subject.async_set_native_value(val)
  170. def test_multi_number_extra_state_attributes(self):
  171. for key, subject in self.multiNumber.items():
  172. self.assertEqual(
  173. subject.extra_state_attributes,
  174. {},
  175. f"{key} extra_state_attributes mismatch",
  176. )