mirror of
https://github.com/home-assistant/core.git
synced 2025-12-24 12:59:34 +00:00
Add state_as_number() helper
This adds state_as_number(), a helper method that tries to interpret state as a number, for cases we can predict. It's a generalization of what is copy-and-paste-ed into multiple other places.
This commit is contained in:
@@ -13,6 +13,12 @@ import homeassistant.components as core_components
|
||||
from homeassistant.const import SERVICE_TURN_ON
|
||||
from homeassistant.util import dt as dt_util
|
||||
from homeassistant.helpers import state
|
||||
from homeassistant.const import (
|
||||
STATE_OFF, STATE_OPEN, STATE_CLOSED,
|
||||
STATE_LOCKED, STATE_UNLOCKED, STATE_UNKNOWN,
|
||||
STATE_ON, STATE_OFF)
|
||||
from homeassistant.components.sun import (STATE_ABOVE_HORIZON,
|
||||
STATE_BELOW_HORIZON)
|
||||
|
||||
from tests.common import get_test_home_assistant, mock_service
|
||||
|
||||
@@ -146,3 +152,37 @@ class TestStateHelpers(unittest.TestCase):
|
||||
self.assertEqual(['light.test1', 'light.test2'],
|
||||
last_call.data.get('entity_id'))
|
||||
self.assertEqual(95, last_call.data.get('brightness'))
|
||||
|
||||
def test_as_number_states(self):
|
||||
zero_states = (STATE_OFF, STATE_CLOSED, STATE_UNLOCKED,
|
||||
STATE_BELOW_HORIZON)
|
||||
one_states = (STATE_ON, STATE_OPEN, STATE_LOCKED, STATE_ABOVE_HORIZON)
|
||||
for _state in zero_states:
|
||||
self.assertEqual(0, state.state_as_number(
|
||||
ha.State('domain.test', _state, {})))
|
||||
for _state in one_states:
|
||||
self.assertEqual(1, state.state_as_number(
|
||||
ha.State('domain.test', _state, {})))
|
||||
|
||||
def test_as_number_coercion(self):
|
||||
for _state in ('0', '0.0'):
|
||||
self.assertEqual(
|
||||
0.0, float(state.state_as_number(
|
||||
ha.State('domain.test', _state, {}))))
|
||||
for _state in ('1', '1.0'):
|
||||
self.assertEqual(
|
||||
1.0, float(state.state_as_number(
|
||||
ha.State('domain.test', _state, {}))))
|
||||
|
||||
def test_as_number_tries_to_keep_types(self):
|
||||
result = state.state_as_number(ha.State('domain.test', '1', {}))
|
||||
self.assertTrue(isinstance(result, int))
|
||||
result = state.state_as_number(ha.State('domain.test', '1.0', {}))
|
||||
self.assertTrue(isinstance(result, float))
|
||||
|
||||
def test_as_number_invalid_cases(self):
|
||||
for _state in ('', 'foo', 'foo.bar', None, False, True, None,
|
||||
object, object()):
|
||||
self.assertRaises(ValueError,
|
||||
state.state_as_number,
|
||||
ha.State('domain.test', _state, {}))
|
||||
|
||||
Reference in New Issue
Block a user