Skip to content

Commit 480f2c9

Browse files
committed
Add more tests for REAL
1 parent b985862 commit 480f2c9

2 files changed

Lines changed: 126 additions & 1 deletion

File tree

src/asn1.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1008,7 +1008,7 @@ def _decode_real_binary(content): # type: (bytes) -> float
10081008
raise Error('ASN1 decoding error: Exponent ({}), mantissa ({}) or factor ({}) too big.'.format(exponent, mantissa, scaling))
10091009
if value == 0:
10101010
raise Error('ASN1 decoding error: invalid encoding for +0.')
1011-
return value
1011+
return float(value) # Always as a float
10121012

10131013
@staticmethod
10141014
def _decode_real_binary_exponent(values): # type: (bytes) -> Tuple[int, int]

tests/test_asn1.py

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import base64
1616
from builtins import int
1717

18+
import math
1819
import pytest
1920

2021
import asn1
@@ -422,6 +423,34 @@ def test_real(self):
422423
enc.write(0.15625)
423424
res = enc.output()
424425
assert res == b'\x09\x03\x80\xFB\x05'
426+
enc.start()
427+
enc.write(1.0)
428+
res = enc.output()
429+
assert res == b'\x09\x03\x80\x00\x01'
430+
enc.start()
431+
enc.write(-1.0)
432+
res = enc.output()
433+
assert res == b'\x09\x03\xC0\x00\x01'
434+
enc.start()
435+
enc.write(2.0)
436+
res = enc.output()
437+
assert res == b'\x09\x03\x80\x01\x01'
438+
enc.start()
439+
enc.write(0.5)
440+
res = enc.output()
441+
assert res == b'\x09\x03\x80\xFF\x01'
442+
enc.start()
443+
enc.write(10.5)
444+
res = enc.output()
445+
assert res == b'\x09\x03\x80\xFF\x15'
446+
enc.start()
447+
enc.write(-3.25)
448+
res = enc.output()
449+
assert res == b'\x09\x03\xC0\xFE\x0D'
450+
enc.start()
451+
enc.write(1024.0)
452+
res = enc.output()
453+
assert res == b'\x09\x03\x80\x0A\x01'
425454

426455
class TestDecoder(object):
427456
"""Test suite for ASN1 Decoder."""
@@ -1156,6 +1185,102 @@ def test_mix_context_universal(self):
11561185

11571186
assert dec.peek() is None
11581187

1188+
def test_real_zero(self):
1189+
buf = b'\x09\x00'
1190+
enc = asn1.Decoder()
1191+
enc.start(buf)
1192+
tag, value = enc.read()
1193+
assert tag == (asn1.Numbers.Real, asn1.Types.Primitive, asn1.Classes.Universal)
1194+
assert isinstance(value, float)
1195+
assert value == 0.0
1196+
1197+
def test_real_negative_zero(self):
1198+
buf = b'\x09\x01\x43'
1199+
enc = asn1.Decoder()
1200+
enc.start(buf)
1201+
tag, value = enc.read()
1202+
assert tag == (asn1.Numbers.Real, asn1.Types.Primitive, asn1.Classes.Universal)
1203+
assert isinstance(value, float)
1204+
assert value == 0.0 and math.copysign(1, value) == -1.0
1205+
1206+
def test_real_negative_infinite(self):
1207+
buf = b'\x09\x01\x41'
1208+
enc = asn1.Decoder()
1209+
enc.start(buf)
1210+
tag, value = enc.read()
1211+
assert tag == (asn1.Numbers.Real, asn1.Types.Primitive, asn1.Classes.Universal)
1212+
assert isinstance(value, float)
1213+
assert value == float('-inf')
1214+
1215+
def test_real_positive_infinite(self):
1216+
buf = b'\x09\x01\x40'
1217+
enc = asn1.Decoder()
1218+
enc.start(buf)
1219+
tag, value = enc.read()
1220+
assert tag == (asn1.Numbers.Real, asn1.Types.Primitive, asn1.Classes.Universal)
1221+
assert isinstance(value, float)
1222+
assert value == float('inf')
1223+
1224+
def test_real_positive_nan(self):
1225+
buf = b'\x09\x01\x42'
1226+
enc = asn1.Decoder()
1227+
enc.start(buf)
1228+
tag, value = enc.read()
1229+
assert tag == (asn1.Numbers.Real, asn1.Types.Primitive, asn1.Classes.Universal)
1230+
assert isinstance(value, float)
1231+
assert value != value
1232+
1233+
def test_real(self):
1234+
buf = b'\x09\x03\x80\xFB\x05'
1235+
enc = asn1.Decoder()
1236+
enc.start(buf)
1237+
tag, value = enc.read()
1238+
assert tag == (asn1.Numbers.Real, asn1.Types.Primitive, asn1.Classes.Universal)
1239+
assert isinstance(value, float)
1240+
assert value == 0.15625
1241+
buf = b'\x09\x03\x80\x00\x01'
1242+
enc.start(buf)
1243+
tag, value = enc.read()
1244+
assert tag == (asn1.Numbers.Real, asn1.Types.Primitive, asn1.Classes.Universal)
1245+
assert isinstance(value, float)
1246+
assert value == 1.0
1247+
buf = b'\x09\x03\xC0\x00\x01'
1248+
enc.start(buf)
1249+
tag, value = enc.read()
1250+
assert tag == (asn1.Numbers.Real, asn1.Types.Primitive, asn1.Classes.Universal)
1251+
assert isinstance(value, float)
1252+
assert value == -1.0
1253+
buf = b'\x09\x03\x80\x01\x01'
1254+
enc.start(buf)
1255+
tag, value = enc.read()
1256+
assert tag == (asn1.Numbers.Real, asn1.Types.Primitive, asn1.Classes.Universal)
1257+
assert isinstance(value, float)
1258+
assert value == 2.0
1259+
buf = b'\x09\x03\x80\xFF\x01'
1260+
enc.start(buf)
1261+
tag, value = enc.read()
1262+
assert tag == (asn1.Numbers.Real, asn1.Types.Primitive, asn1.Classes.Universal)
1263+
assert isinstance(value, float)
1264+
assert value == 0.5
1265+
buf = b'\x09\x03\x80\xFF\x15'
1266+
enc.start(buf)
1267+
tag, value = enc.read()
1268+
assert tag == (asn1.Numbers.Real, asn1.Types.Primitive, asn1.Classes.Universal)
1269+
assert isinstance(value, float)
1270+
assert value == 10.5
1271+
buf = b'\x09\x03\xC0\xFE\x0D'
1272+
enc.start(buf)
1273+
tag, value = enc.read()
1274+
assert tag == (asn1.Numbers.Real, asn1.Types.Primitive, asn1.Classes.Universal)
1275+
assert isinstance(value, float)
1276+
assert value == -3.25
1277+
buf = b'\x09\x03\x80\x0A\x01'
1278+
enc.start(buf)
1279+
tag, value = enc.read()
1280+
assert tag == (asn1.Numbers.Real, asn1.Types.Primitive, asn1.Classes.Universal)
1281+
assert isinstance(value, float)
1282+
assert value == 1024.0
1283+
11591284

11601285
class TestEncoderDecoder(object):
11611286
"""Test suite for ASN1 Encoder and Decoder."""

0 commit comments

Comments
 (0)