def test_affine_conversion(): conversion = UnitConversion('F', 'C', 1.8, 32) assert str(conversion) == 'F ← 1.8*C + 32' result = conversion.convert(0, 'C', 'F') assert str(result) == '32 F' result = conversion.convert(32, to_units='C') assert str(result) == '0 C' result = conversion.convert(32, from_units='F') assert str(result) == '0 C' with pytest.raises(KeyError) as exception: result = conversion.convert(0, from_units='X', to_units='X') assert str(exception.value) == "unable to convert to 'X'." assert isinstance(exception.value, UnknownConversion) assert isinstance(exception.value, QuantiPhyError) assert isinstance(exception.value, KeyError) assert exception.value.args == ('X',) result = conversion.convert(0, to_units='X') assert str(result) == '32 F' with pytest.raises(KeyError) as exception: result = conversion.convert(0, from_units='X') assert str(exception.value) == "unable to convert from 'X'." assert isinstance(exception.value, UnknownConversion) assert isinstance(exception.value, QuantiPhyError) assert isinstance(exception.value, KeyError) assert exception.value.args == ('X',)
def test_func_converters(): Quantity.reset_prefs() def from_dB(value): return 10**(value/20) def to_dB(value): return 20*math.log10(value) vconverter = UnitConversion('V', 'dBV', from_dB, to_dB) assert str(vconverter) == 'V ← from_dB(dBV), dBV ← to_dB(V)' assert str(vconverter.convert(Quantity('100mV'))) == '-20 dBV' assert str(vconverter.convert(Quantity('-20dBV'))) == '100 mV' aconverter = UnitConversion('A', 'dBA', from_dB, to_dB) assert str(aconverter) == 'A ← from_dB(dBA), dBA ← to_dB(A)' assert str(aconverter.convert(Quantity('100mA'))) == '-20 dBA' assert str(aconverter.convert(Quantity('-20dBA'))) == '100 mA' assert '{:pdBV}'.format(Quantity('100mV')) == '-20 dBV' assert '{:pdBV}'.format(Quantity('10V')) == '20 dBV' assert '{:pV}'.format(Quantity('-20 dBV')) == '0.1 V' assert '{:pV}'.format(Quantity('20 dBV')) == '10 V' assert '{:pdBA}'.format(Quantity('100mA')) == '-20 dBA' assert '{:pdBA}'.format(Quantity('10A')) == '20 dBA' assert '{:pA}'.format(Quantity('-20 dBA')) == '0.1 A' assert '{:pA}'.format(Quantity('20 dBA')) == '10 A'
def converter(cls, to, data): try: # SYMBOL is not unique #return UnitConversion(to, (cls.SYMBOL, cls.UNITS), data[cls.UNITS][to[-1]]) return UnitConversion(to, cls.UNITS, data[cls.UNITS][to[-1]]) except KeyError as e: comment(f'missing price in {e}.', culprit=cls.UNITS)
def converter(cls, to, data): # cannot convert this to '$' directly using cryptocompare. # instead, use EOS as intermediary conversion = data[cls.UNITS]['EOS'] * data['EOS'][to[-1]] units = getattr(cls, 'UNITS', None) symbol = getattr(cls, 'SYMBOL', None) return UnitConversion(to, cull([symbol, units]), conversion)
def test_scale(): Quantity.reset_prefs() Quantity.set_prefs(spacer=None, show_label=None, label_fmt=None, label_fmt_full=None) q1 = Quantity('3ns') q2 = Quantity('2') v2 = 2 assert str(q1.scale(q2)) == '6 ns' assert repr(q1.scale(q2)) == "Quantity('6 ns')" assert str(q1.scale(v2)) == '6 ns' assert repr(q1.scale(v2)) == "Quantity('6 ns')" q1.name = 'period' q3 = q1.scale(q2).name == 'period' q1.desc = 'duration of one cycle' assert q1.scale(q2).name == 'period' assert q1.scale(q2).desc == 'duration of one cycle' class Dollars(Quantity): units = '$' prec = 2 form = 'fixed' show_commas = True minus = Quantity.minus_sign strip_zeros = False class Cents(Dollars): units = '¢' prec = 0 print(UnitConversion(Dollars, Cents, 0.01)) total = Dollars(1) assert str(total) == '$1.00' total = total.scale(1000000) assert str(total) == '$1,000,000.00' class WholeDollars(Dollars): prec = 0 total = WholeDollars(20) assert str(total) == '$20' total = total.scale(1000000) assert str(total) == '$20,000,000' total = total.scale(5, Dollars) assert str(total) == '$100,000,000.00' total = total.scale(Cents) assert str(total) == '10,000,000,000 ¢' assert type(total) == Cents
def test_subclass_conversion(): Quantity.reset_prefs() class Bitcoin(Quantity): units = 'BTC' form = 'fixed' prec = 2 show_commas = True class Satoshi(Quantity): units = 'sat' form = 'fixed' prec = 3 show_commas = True conversion = UnitConversion(Bitcoin, Satoshi, 1e-8) assert str(conversion) == 'BTC ← 1e-08*sat' result = conversion.convert(1, 'BTC', 'sat') assert str(result) == '100 Msat' result = conversion.convert(1, 'sat', 'BTC') assert str(result) == '10 nBTC'
def test_linear_conversion(): Quantity.reset_prefs() conversion = UnitConversion('USD', 'BTC', 100000) assert str(conversion) == 'USD ← 100000*BTC' result = conversion.convert(1, 'BTC', 'USD') assert str(result) == '100 kUSD' result = conversion.convert(1, 'USD', 'BTC') assert str(result) == '10 uBTC' result = conversion.convert(from_units='BTC', to_units='USD') assert str(result) == '100 kUSD' result = conversion.convert(from_units='USD', to_units='BTC') assert str(result) == '10 uBTC' result = conversion.convert('BTC') assert str(result) == '100 kUSD' result = conversion.convert('USD') assert str(result) == '10 uBTC' result = conversion.convert(10) assert str(result) == '1 MUSD' dollar = Quantity('200000 USD') bitcoin = conversion.convert(dollar) assert str(bitcoin) == '2 BTC' dollar = conversion.convert(bitcoin) assert str(dollar) == '200 kUSD'
def test_coversion(): conversion = UnitConversion('USD', 'BTC', 100000) assert str(conversion) == 'USD = 100000*BTC' result = conversion.convert(1, 'BTC', 'USD') assert str(result) == '100 kUSD' result = conversion.convert(1, 'USD', 'BTC') assert str(result) == '10 uBTC' result = conversion.convert(from_units='BTC', to_units='USD') assert str(result) == '100 kUSD' result = conversion.convert(from_units='USD', to_units='BTC') assert str(result) == '10 uBTC' result = conversion.convert('BTC') assert str(result) == '100 kUSD' result = conversion.convert('USD') assert str(result) == '10 uBTC' result = conversion.convert(10) assert str(result) == '1 MUSD' dollar = Quantity('200000 USD') bitcoin = conversion.convert(dollar) assert str(bitcoin) == '2 BTC' dollar = conversion.convert(bitcoin) assert str(dollar) == '200 kUSD' conversion = UnitConversion('F', 'C', 1.8, 32) assert str(conversion) == 'F = 1.8*C + 32' result = conversion.convert(0, 'C', 'F') assert str(result) == '32 F' result = conversion.convert(32, to_units='C') assert str(result) == '0 C' result = conversion.convert(32, from_units='F') assert str(result) == '0 C' with pytest.raises(KeyError) as exception: result = conversion.convert(0, from_units='X', to_units='X') assert str(exception.value) == "unable to convert to 'X'." assert isinstance(exception.value, UnknownConversion) assert isinstance(exception.value, QuantiPhyError) assert isinstance(exception.value, KeyError) assert exception.value.args == ('X',) result = conversion.convert(0, to_units='X') assert str(result) == '32 F' with pytest.raises(KeyError) as exception: result = conversion.convert(0, from_units='X') assert str(exception.value) == "unable to convert from 'X'." assert isinstance(exception.value, UnknownConversion) assert isinstance(exception.value, QuantiPhyError) assert isinstance(exception.value, KeyError) assert exception.value.args == ('X',)