1#!/usr/local/bin/perl 2 3# 4# Test the use of choices 5# 6 7use Convert::ASN1; 8BEGIN { require './t/funcs.pl' } 9 10print "1..10\n"; 11 12btest 1, $asn = Convert::ASN1->new; 13btest 2, $asn->prepare( <<'[TheEnd]' ) or warn $asn->error; 14 Natural ::= CHOICE { 15 prime Prime, 16 product Product 17 } 18 Prime ::= [1] INTEGER 19 Product ::= CHOICE { 20 perfect Perfect, 21 plain Plain 22 } 23 Perfect ::= [2] INTEGER 24 Plain ::= [3] INTEGER 25 Naturals ::= [4] SEQUENCE OF Natural 26 List ::= [5] SEQUENCE { list Naturals } 27[TheEnd] 28 29my $nl = $asn->find( 'List' ); 30my $buf = $nl->encode( list => [ 31 { prime => 13 }, 32 { product => { perfect => 28 } }, 33 { product => { plain => 42 } }, ] ); 34$result = pack( 'C*', 0xa5, 0x0b, 0xa4, 0x09, 35 0x81, 0x01, 0x0d, 36 0x82, 0x01, 0x1c, 37 0x83, 0x01, 0x2a, ); 38stest 3, $result, $buf; 39 40my $seq = $nl->decode( $buf ) or warn $asn->error; 41btest 4, defined( $seq ) && exists( $seq->{list} ); 42ntest 5, 13, $seq->{list}->[0]->{prime}; 43ntest 6, 28, $seq->{list}->[1]->{product}->{perfect}; 44ntest 7, 42, $seq->{list}->[2]->{product}->{plain}; 45 46 47btest 8, $asn->prepare( 'Foo ::= [1] EXPLICIT CHOICE { a NULL }' ) or warn $asn->error; 48$nl = $asn->find('Foo'); 49$buf = $nl->encode( a => 1 ); 50$result = pack 'C*', map hex, qw(A1 02 05 00); 51stest 9, $result, $buf; 52$seq = $nl->decode( $result ) or warn $asn->error; 53btest 10, $seq->{a}; 54