number.py 6.6 KB

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