%%
%% %CopyrightBegin%
%%
%% Copyright Ericsson AB 1997-2012. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
%% compliance with the License. You should have received a copy of the
%% Erlang Public License along with this software. If not, it can be
%% retrieved online at http://www.erlang.org/.
%%
%% Software distributed under the License is distributed on an "AS IS"
%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
%% the License for the specific language governing rights and limitations
%% under the License.
%%
%% %CopyrightEnd%
%%
%%
-module(testPrim).
-export([bool/1]).
-export([int/1]).
-export([enum/1]).
-export([obj_id/1]).
-export([rel_oid/1]).
-export([null/1]).
-export([real/1]).
-include_lib("test_server/include/test_server.hrl").
bool(Rules) ->
Types = ['Bool','BoolCon','BoolPri','BoolApp',
'BoolExpCon','BoolExpPri','BoolExpApp'],
[roundtrip(T, V) || T <- Types, V <- [true,false]],
case Rules of
ber ->
[begin
{error,{asn1,{encode_boolean,517}}} =
(catch 'Prim':encode(T, 517))
end || T <- Types],
ok;
_ ->
ok
end.
int(Rules) ->
%% OTP-2666: encoding should use minimum number of octets; x.690 8.3.2
Bytes0 = roundtrip('Int', -128),
case Rules of
ber ->
<<_,1,128>> = Bytes0;
_ ->
ok
end,
Values = [0,2,3,4,127,128,254,255,256,257,444,
16383,16384,16385,65534,65535,65536,65537,
123456789,12345678901234567890,
-1,-2,-3,-4,-100,-127,-255,-256,-257,
-1234567890,-2147483648],
[roundtrip(T, V) ||
T <- ['Int','IntCon','IntPri','IntApp',
'IntExpCon','IntExpPri','IntExpApp'],
V <- [1|Values]],
%%==========================================================
%% IntEnum ::= INTEGER {first(1),last(31)}
%%==========================================================
[roundtrip('IntEnum', V) || V <- Values],
roundtrip('IntEnum', first),
roundtrip('IntEnum', last),
roundtrip('ASeq', {'ASeq',true,254,false,255,true,256,true,68789}),
roundtrip('ASeq', {'ASeq',false,250,true,200,true,199,true,77788}),
roundtrip('ASeq', {'ASeq',true,0,false,0,true,0,true,68789}),
ok.
enum(Rules) ->
%%==========================================================
%% Enum ::= ENUMERATED {monday(1),tuesday(2),wednesday(3),thursday(4),
%% friday(5),saturday(6),sunday(7)}
%%==========================================================
roundtrip('Enum', monday),
roundtrip('Enum', thursday),
{error,{asn1,{_,4}}} = (catch 'Prim':encode('Enum', 4)),
case Rules of
Per when Per =:= per; Per =:= uper ->
{ok,<<0>>} = 'Prim':encode('SingleEnumVal', true),
{ok,<<0>>} = 'Prim':encode('SingleEnumValExt', true);
ber ->
ok
end,
ok.
obj_id(_) ->
%%==========================================================
%% ObjId ::= OBJECT IDENTIFIER
%%==========================================================
[roundtrip('ObjId', V) ||
V <- [{0,22,3},{1,39,3},{2,100,3},{2,16303,3},{2,16304,3}]],
ok.
rel_oid(_Rules) ->
%%==========================================================
%% RelOid ::= RELATIVE-OID
%%==========================================================
[roundtrip('RelOid', V) ||
V <- [{0,22,3},{1,39,3},{2,100,3},{2,16303,3},
{2,16304,3},{8,16304,16#ffff}]],
ok.
null(_Rules) ->
%%==========================================================
%% Null ::= NULL
%%==========================================================
{ok,Bytes1} = asn1_wrapper:encode('Prim','Null',monday),
{ok,'NULL'} = asn1_wrapper:decode('Prim','Null',lists:flatten(Bytes1)),
ok.
roundtrip(T, V) ->
{ok,E} = 'Prim':encode(T, V),
{ok,V} = 'Prim':decode(T, E),
E.
real(_Rules) ->
%%==========================================================
%% AngleInRadians ::= REAL
%%==========================================================
%% Base 2
?line {ok,Bytes1} = asn1_wrapper:encode('Real','AngleInRadians',{1,2,1}),
?line {ok,{1,2,1}} = asn1_wrapper:decode('Real','AngleInRadians',Bytes1),
?line {ok,Bytes2} = asn1_wrapper:encode('Real','AngleInRadians',{129,2,1}),
?line {ok,{129,2,1}} = asn1_wrapper:decode('Real','AngleInRadians',Bytes2),
?line {ok,Bytes3} = asn1_wrapper:encode('Real','AngleInRadians',{128,2,1}),
?line {ok,{1,2,8}} = asn1_wrapper:decode('Real','AngleInRadians',Bytes3),
?line {ok,Bytes4} = asn1_wrapper:encode('Real','AngleInRadians',{128,2,-7}),
?line {ok,{1,2,0}} = asn1_wrapper:decode('Real','AngleInRadians',Bytes4),
?line {ok,Bytes5} = asn1_wrapper:encode('Real','AngleInRadians',{16#f1f1f1,2,128}),
?line {ok,{16#f1f1f1,2,128}} = asn1_wrapper:decode('Real','AngleInRadians',Bytes5),
%% Base 10, tuple format
?line {ok,Bytes6} = asn1_wrapper:encode('Real','AngleInRadians',{1,10,1}),
?line {ok,"1.E1"} = asn1_wrapper:decode('Real','AngleInRadians',Bytes6),
?line {ok,Bytes7} = asn1_wrapper:encode('Real','AngleInRadians',{100,10,1}),
?line {ok,"1.E3"} = asn1_wrapper:decode('Real','AngleInRadians',Bytes7),
?line {ok,Bytes8} = asn1_wrapper:encode('Real','AngleInRadians',{-100,10,1}),
?line {ok,"-1.E3"} = asn1_wrapper:decode('Real','AngleInRadians',Bytes8),
?line {ok,Bytes9} = asn1_wrapper:encode('Real','AngleInRadians',{00002,10,1}),
?line {ok,"2.E1"} = asn1_wrapper:decode('Real','AngleInRadians',Bytes9),
?line {ok,Bytes10} = asn1_wrapper:encode('Real','AngleInRadians',{123000,10,0}),
?line {ok,"123.E3"} = asn1_wrapper:decode('Real','AngleInRadians',Bytes10),
?line {ok,Bytes11} = asn1_wrapper:encode('Real','AngleInRadians',{123456789,10,123456789}),
?line {ok,"123456789.E123456789"} = asn1_wrapper:decode('Real','AngleInRadians',Bytes11),
?line {ok,Bytes12} = asn1_wrapper:encode('Real','AngleInRadians',{-12345,10,-12345}),
?line {ok,"-12345.E-12345"} = asn1_wrapper:decode('Real','AngleInRadians',Bytes12),
%% Base 10, string format NR3
?line {ok,Bytes13} = asn1_wrapper:encode('Real','AngleInRadians',"123.123E123"),
?line {ok,"123123.E120"} = asn1_wrapper:decode('Real','AngleInRadians',Bytes13),
?line {ok,Bytes14} = asn1_wrapper:encode('Real','AngleInRadians',"0.0E0"),
?line {ok,"0.E+0"} = asn1_wrapper:decode('Real','AngleInRadians',Bytes14),
?line {ok,Bytes15} = asn1_wrapper:encode('Real','AngleInRadians',"0.0123"),
?line {ok,"123.E-4"} = asn1_wrapper:decode('Real','AngleInRadians',Bytes15),
?line {ok,Bytes16} = asn1_wrapper:encode('Real','AngleInRadians',"0"),
?line {ok,"0.E+0"} = asn1_wrapper:decode('Real','AngleInRadians',Bytes16),
?line {ok,Bytes17} = asn1_wrapper:encode('Real','AngleInRadians',"-123.45"),
?line {ok,"-12345.E-2"} = asn1_wrapper:decode('Real','AngleInRadians',Bytes17),
?line {ok,Bytes18} =
asn1_wrapper:encode('Real','AngleInRadians',"123456789E123456789"),
?line {ok,"123456789.E123456789"} =
asn1_wrapper:decode('Real','AngleInRadians',Bytes18),
?line {ok,Bytes19} = asn1_wrapper:encode('Real','AngleInRadians',"01.000E1"),
?line {ok,"1.E1"} = asn1_wrapper:decode('Real','AngleInRadians',Bytes19),
?line {ok,Bytes20} = asn1_wrapper:encode('Real','AngleInRadians',"120.0001"),
?line {ok,"1200001.E-4"} = asn1_wrapper:decode('Real','AngleInRadians',Bytes20).