mirror of https://github.com/stijndcl/didier
Re-create & test number converter
parent
fd72bb1774
commit
96916d2abd
|
@ -0,0 +1,42 @@
|
||||||
|
import math
|
||||||
|
from typing import Optional
|
||||||
|
|
||||||
|
|
||||||
|
def abbreviated_number(argument: str) -> int:
|
||||||
|
"""Custom converter to allow numbers to be abbreviated
|
||||||
|
Examples:
|
||||||
|
515k
|
||||||
|
4m
|
||||||
|
"""
|
||||||
|
if not argument:
|
||||||
|
raise ValueError
|
||||||
|
|
||||||
|
if argument.isdecimal():
|
||||||
|
return int(argument)
|
||||||
|
|
||||||
|
units = {"k": 3, "m": 6, "b": 9, "t": 12}
|
||||||
|
|
||||||
|
# Get the unit if there is one, then chop it off
|
||||||
|
unit: Optional[str] = None
|
||||||
|
if not argument[-1].isdigit():
|
||||||
|
if argument[-1].lower() not in units:
|
||||||
|
raise ValueError
|
||||||
|
|
||||||
|
unit = argument[-1].lower()
|
||||||
|
argument = argument[:-1]
|
||||||
|
|
||||||
|
# [int][unit]
|
||||||
|
if "." not in argument and unit is not None:
|
||||||
|
return int(argument) * (10 ** units.get(unit))
|
||||||
|
|
||||||
|
# [float][unit]
|
||||||
|
if "." in argument:
|
||||||
|
# Floats themselves are not supported
|
||||||
|
if unit is None:
|
||||||
|
raise ValueError
|
||||||
|
|
||||||
|
as_float = float(argument)
|
||||||
|
return math.floor(as_float * (10 ** units.get(unit)))
|
||||||
|
|
||||||
|
# Unparseable
|
||||||
|
raise ValueError
|
|
@ -0,0 +1,50 @@
|
||||||
|
import pytest
|
||||||
|
|
||||||
|
from didier.utils.discord.converters import numbers
|
||||||
|
|
||||||
|
|
||||||
|
def test_abbreviated_int():
|
||||||
|
"""Test abbreviated_number for a regular int"""
|
||||||
|
assert numbers.abbreviated_number("500") == 500
|
||||||
|
|
||||||
|
|
||||||
|
def test_abbreviated_float_errors():
|
||||||
|
"""Test abbreviated_number for a float"""
|
||||||
|
with pytest.raises(ValueError):
|
||||||
|
numbers.abbreviated_number("5.4")
|
||||||
|
|
||||||
|
|
||||||
|
def test_abbreviated_int_unit():
|
||||||
|
"""Test abbreviated_number for an int combined with a unit"""
|
||||||
|
assert numbers.abbreviated_number("20k") == 20000
|
||||||
|
|
||||||
|
|
||||||
|
def test_abbreviated_int_unknown_unit():
|
||||||
|
"""Test abbreviated_number for an int combined with an unknown unit"""
|
||||||
|
with pytest.raises(ValueError):
|
||||||
|
numbers.abbreviated_number("20p")
|
||||||
|
|
||||||
|
|
||||||
|
def test_abbreviated_float_unit():
|
||||||
|
"""Test abbreviated_number for a float combined with a unit"""
|
||||||
|
assert numbers.abbreviated_number("20.5k") == 20500
|
||||||
|
|
||||||
|
|
||||||
|
def test_abbreviated_float_unknown_unit():
|
||||||
|
"""Test abbreviated_number for a float combined with an unknown unit"""
|
||||||
|
with pytest.raises(ValueError):
|
||||||
|
numbers.abbreviated_number("20.5p")
|
||||||
|
|
||||||
|
|
||||||
|
def test_abbreviated_no_number():
|
||||||
|
"""Test abbreviated_number for unparseable content"""
|
||||||
|
with pytest.raises(ValueError):
|
||||||
|
numbers.abbreviated_number("didier")
|
||||||
|
|
||||||
|
|
||||||
|
def test_abbreviated_float_floors():
|
||||||
|
"""Test abbreviated_number for a float that is longer than the unit
|
||||||
|
Example:
|
||||||
|
5.3k is 5300, but 5.3001k is 5300.1
|
||||||
|
"""
|
||||||
|
assert numbers.abbreviated_number("5.3001k") == 5300
|
Loading…
Reference in New Issue