b.liu | e958203 | 2025-04-17 19:18:16 +0800 | [diff] [blame^] | 1 | #!/bin/sh |
| 2 | |
| 3 | [ "$1" = python3-pyasn1 ] || exit 0 |
| 4 | |
| 5 | python3 - << 'EOF' |
| 6 | |
| 7 | from collections import OrderedDict |
| 8 | |
| 9 | from pyasn1.type import namedtype |
| 10 | from pyasn1.type import tag |
| 11 | from pyasn1.type import univ |
| 12 | from pyasn1.codec.der.encoder import encode as derEncode |
| 13 | from pyasn1.codec.der.decoder import decode as derDecode |
| 14 | from pyasn1.codec.native.encoder import encode as nativeEncode |
| 15 | from pyasn1.codec.native.decoder import decode as nativeDecode |
| 16 | |
| 17 | class Record(univ.Sequence): |
| 18 | componentType = namedtype.NamedTypes( |
| 19 | namedtype.NamedType('id', univ.Integer()), |
| 20 | namedtype.OptionalNamedType( |
| 21 | 'room', univ.Integer().subtype( |
| 22 | implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 0) |
| 23 | ) |
| 24 | ), |
| 25 | namedtype.DefaultedNamedType( |
| 26 | 'house', univ.Integer(0).subtype( |
| 27 | implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 1) |
| 28 | ) |
| 29 | ) |
| 30 | ) |
| 31 | |
| 32 | # encoding modifies the object (https://github.com/pyasn1/pyasn1/issues/53) |
| 33 | # so test decoding before encoding |
| 34 | |
| 35 | record = Record() |
| 36 | record['id'] = 123 |
| 37 | record['room'] = 321 |
| 38 | assert str(record) == 'Record:\n id=123\n room=321\n' |
| 39 | |
| 40 | substrate = b'0\x07\x02\x01{\x80\x02\x01A' |
| 41 | |
| 42 | received_record, _ = derDecode(substrate, asn1Spec=Record()) |
| 43 | assert received_record == record |
| 44 | |
| 45 | dict_record = nativeDecode({'id': 123, 'room': 321}, asn1Spec=Record()) |
| 46 | assert dict_record == record |
| 47 | |
| 48 | assert derEncode(record) == substrate |
| 49 | assert nativeEncode(record) == OrderedDict([('id', 123), ('room', 321), ('house', 0)]) |
| 50 | |
| 51 | EOF |