52 lines
1.5 KiB
Bash
52 lines
1.5 KiB
Bash
#!/bin/sh
|
|
|
|
[ "$1" = python3-pyasn1 ] || exit 0
|
|
|
|
python3 - << 'EOF'
|
|
|
|
from collections import OrderedDict
|
|
|
|
from pyasn1.type import namedtype
|
|
from pyasn1.type import tag
|
|
from pyasn1.type import univ
|
|
from pyasn1.codec.der.encoder import encode as derEncode
|
|
from pyasn1.codec.der.decoder import decode as derDecode
|
|
from pyasn1.codec.native.encoder import encode as nativeEncode
|
|
from pyasn1.codec.native.decoder import decode as nativeDecode
|
|
|
|
class Record(univ.Sequence):
|
|
componentType = namedtype.NamedTypes(
|
|
namedtype.NamedType('id', univ.Integer()),
|
|
namedtype.OptionalNamedType(
|
|
'room', univ.Integer().subtype(
|
|
implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 0)
|
|
)
|
|
),
|
|
namedtype.DefaultedNamedType(
|
|
'house', univ.Integer(0).subtype(
|
|
implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 1)
|
|
)
|
|
)
|
|
)
|
|
|
|
# encoding modifies the object (https://github.com/pyasn1/pyasn1/issues/53)
|
|
# so test decoding before encoding
|
|
|
|
record = Record()
|
|
record['id'] = 123
|
|
record['room'] = 321
|
|
assert str(record) == 'Record:\n id=123\n room=321\n'
|
|
|
|
substrate = b'0\x07\x02\x01{\x80\x02\x01A'
|
|
|
|
received_record, _ = derDecode(substrate, asn1Spec=Record())
|
|
assert received_record == record
|
|
|
|
dict_record = nativeDecode({'id': 123, 'room': 321}, asn1Spec=Record())
|
|
assert dict_record == record
|
|
|
|
assert derEncode(record) == substrate
|
|
assert nativeEncode(record) == OrderedDict([('id', 123), ('room', 321), ('house', 0)])
|
|
|
|
EOF
|