def refine_input(status_line: str) -> Dict[str, Any]: re_battery_line = re.compile( r'^Battery (?P<id>[0-9]+): ' r'((?P<state>[a-zA-Z]+), (?P<percentage>[0-9]{1,3})%' r'(, (?P<time>[0-9:]+)[a-zA-Z ]*$|' r', (?P<unavailable>rate information unavailable)$|' r', [a-zA-Z \-.]+$|' r'$)|' # end of group state information line 1 r'design capacity (?P<design_capacity>[0-9]+) mAh, ' r'last full capacity (?P<full_capacity>[0-9]+) mAh = [0-9]{1,3}%$' ')') # end of group capacity information line 2 group = re.match(re_battery_line, status_line).groupdict() def none_or_convert_to_int(x): return None if not x else int(x) functions = { 'id': int, 'state': lambda x: None if not x else State.get_state_according_to_value(x), 'percentage': none_or_convert_to_int, 'time': lambda x: None if not x else parse_time(x), 'unavailable': lambda x: x == "rate information unavailable", 'design_capacity': none_or_convert_to_int, 'full_capacity': none_or_convert_to_int } batteries = {} for key, value in group.items(): batteries[key] = functions[key](value) return batteries
def test_refine_input_discharge(): status_line = 'Battery 1: Discharging, 88%, 00:50:14 remaining' expected = { 'id': 1, 'state': State.DISCHARGING, 'percentage': 88, 'time': parse_time('00:50:14'), 'unavailable': False, 'design_capacity': None, 'full_capacity': None } assert refine_input(status_line) == expected, "re matching is broken"
def test_refine_input_charge(): status_line = 'Battery 2: Charging, 88%, 00:09:24 until charged' expected = { 'id': 2, 'state': State.CHARGING, 'percentage': 88, 'time': parse_time('00:09:24'), 'unavailable': False, 'design_capacity': None, 'full_capacity': None } assert refine_input(status_line) == expected, "re matching is broken"
def test_prepare_output_charging_small_any_order(): sut = [ {"state": State.UNKNOWN, 'percentage': 0, 'time': None, 'unavailable': False, 'design_capacity': 2010, 'full_capacity': 1658}, {"state": State.CHARGING, 'percentage': 70, 'time': parse_time("01:33:02"), 'unavailable': False, 'design_capacity': 2010, 'full_capacity': 1658}, ] expected = [wrap_span_fa(FA_PLUG, "yellow"), wrap_span_fa(FA_BATTERY_LIST[1], col=color(35)), wrap_span("(01:33)") ] input_list = [] prepare_output(sut, [], input_list) assert input_list == expected, "output is not according to specifications"
def test_prepare_output_discharging_small_other_order(): sut = [ {"state": State.FULL, 'percentage': 100, 'time': None, 'unavailable': False, 'design_capacity': 2010, 'full_capacity': 1658}, {"state": State.UNKNOWN, 'percentage': 0, 'time': None, 'unavailable': False, 'design_capacity': None, 'full_capacity': None}, {"state": State.DISCHARGING, 'percentage': 70, 'time': parse_time("01:33:02"), 'unavailable': False, 'design_capacity': 2010, 'full_capacity': 1658}, ] expected = [wrap_span_fa(FA_LAPTOP), wrap_span_fa(FA_BATTERY_LIST[4], col=color(85)), wrap_span("(03:45)"), ] input_list = [] prepare_output(sut, [], input_list) assert input_list == expected, "output is not according to specifications"
def test_prepare_output_discharging(): # first battery discharging with 70% and second battery unknown with 0% sut = [ {"state": State.DISCHARGING, 'percentage': 70, 'time': parse_time("01:33:02"), 'unavailable': False, 'design_capacity': 2010, 'full_capacity': 1658}, {"state": State.UNKNOWN, 'percentage': 0, 'time': None, 'unavailable': False, 'design_capacity': 2010, 'full_capacity': 1658}, ] expected = [wrap_span_battery_header(1) + wrap_span_fa(FA_LAPTOP) + ' ' + wrap_span_fa(FA_BATTERY_LIST[3]) + ' ', wrap_span_battery_header(2) + wrap_span_fa(FA_QUESTION) + ' ' + wrap_span_fa(FA_BATTERY_LIST[0]) + ' ', wrap_span("35%", color(35)), wrap_span("(01:33)"), ] input_list = [] prepare_output(sut, input_list, []) assert input_list == expected, "output is not according to specifications"
def test_for_remove_of_battery_bug_second_variant(): # first battery discharging with 70% and second battery unknown with 0% sut = [ {"state": State.UNKNOWN, 'percentage': 6, 'time': None, 'unavailable': False, 'design_capacity': 1960, 'full_capacity': 1898}, {"state": State.DISCHARGING, 'percentage': 0, 'time': None, 'unavailable': True, 'design_capacity': None, 'full_capacity': None}, {"state": State.CHARGING, 'percentage': 89, 'time': parse_time('00:54:00'), 'unavailable': False, 'design_capacity': 2010, 'full_capacity': 1658}, ] expected = [wrap_span_battery_header(1) + wrap_span_fa(FA_QUESTION) + ' ' + wrap_span_fa(FA_BATTERY_LIST[0]) + ' ', wrap_span_battery_header(2) + wrap_span_fa(FA_PLUG, col='yellow') + ' ' + wrap_span_fa(FA_BATTERY_LIST[4]) + ' ', wrap_span("47%", color(47)), wrap_span("(00:58)") ] input_list = [] prepare_output(sut, input_list, []) assert input_list == expected, "output is not according to specifications"
def test_time_parsing(time_input: str, expected: time): assert parse_time(time_input) == expected, "time parsing has gone wrong"
'design_capacity': None, 'full_capacity': None }, { 'id': 2, 'state': State.CHARGING, 'percentage': 100, 'time': None, 'unavailable': False, 'design_capacity': 1860, 'full_capacity': 1512 }]), ('charging_from_low_state_with_bug.txt', [{ 'id': 0, 'state': State.CHARGING, 'percentage': 76, 'time': parse_time('00:18:24'), 'unavailable': False, 'design_capacity': 1873, 'full_capacity': 1708 }, { 'id': 1, 'state': State.UNKNOWN, 'percentage': 0, 'time': None, 'unavailable': True, 'design_capacity': None, 'full_capacity': None }, { 'id': 2, 'state': State.UNKNOWN, 'percentage': 4,