aboutsummaryrefslogblamecommitdiffstats
path: root/lib/asn1/test/asn1_SUITE.erl.src
blob: d05b7cac90563efe7dcc60a5c6ddee6505ac5e10 (plain) (tree)
1
2
3
4


                   
                                                        

















                                                                         

                      
                             



                           
                            



                                
                              



                               
                           



                        



                                 
                                                    

                                    














                                                         
                                  





                                              
                   




























































































































                                                                   

      






                                                
                         



                         
 
                                     
           
 
                                    
           
 


                                        
 


                                                                  
 




                                                              
 

                                    
                               
                                     



                      




                                                     

                                                                          











                                                                             

                        






                            


                                  


                                                                     
 

                                                                                          
 


                                                                     
 



                                                                                             
 


                                                                                    
 


                                                                               
 
                                        




                             


                                                                               


                                                                 
 

                                              
 

                                                                    
 

                                                             
 

                                                      

                               









                                              



                              


                                                          
 


                                                                               
 


                                                          
 


                                                                                  
 


                                                                         
 


                                                                    



                         

                                                     
 

                                                                          
 

                                                     
 

                                                                             
 

                                                                    
 

                                                               

                           

                            




                              

                                                          
 

                                                                               
 

                                                          
 

                                                                                  
 

                                                                         
 

                                                                    

                                
                                      




                             


                                                         
 


                                                                              
 


                                                         
 


                                                                                 
 


                                                                        
 


                                                                   




                             

                                              
 

                                                                 
 

                                              
 

                                                                    
 

                                                             
 

                                                      

                               
                                    



                                        

                                                     




                              

                                               
 

                                                                  
 

                                               
 

                                                                     
 

                                                              
 

                                                       

                                
                                      





                               

                                                
 

                                                                   
 

                                                
 

                                                                      
 

                                                               
 

                                                        

                                 
                                    





                                

                                                 
 

                                                                    
 

                                                 
 

                                                                       
 

                                                                
 

                                                         

                                  
                                   





                               

                                                
 

                                                                   
 

                                                
 

                                                                      
 

                                                               
 

                                                        

                                 
                                 





                               

                                                
 

                                                                   
 

                                                
 

                                                                      
 

                                                               
 

                                                        

                                 
                                 





                     

                                      
 

                                                         
 

                                      
 

                                                            
 

                                                     
 

                                              

                       
                        





                     

                                  
 

                                  

                       
                        




                         

                                                     
 

                                                                          
 

                                                     
 

                                                                             
 

                                                                    
 

                                                               



                                                                           

                                                        
 

                                                                             
 

                                                        
 

                                                                                
 

                                                                       
 

                                                                  

                              
                               




                              


                                                          
 


                                                                               

                                
                                 




                             


                                                         
 


                                                                              

                               
                                




                             

                                              
 

                                                                 
 

                                              
 

                                                                    
 

                                                             
 

                                                      

                               
                                





                         

                                          
 

                                                             
 

                                          
 

                                                                
 

                                                         
 

                                                  

                           
                            




                                                                            

                                                     
 

                                                                          
 

                                                     
 

                                                                             
 

                                                                    
 

                                                               

                           
                            



                        

                                                                      
 

                                                                                           
 

                                                                      
 

                                                                                              
 

                                                                                     
 

                                                                                

                          
                           






                               

                                                
 

                                                                   
 

                                                
 

                                                                      
 

                                                               
 

                                                        

                                 
                                  




                                

                                                            
 

                                                                                 
 

                                                            
 

                                                                                    
 

                                                                           
 

                                                                      

                                  
                                   




                               

                                                           
 

                                                                                
 

                                                           
 

                                                                                   
 

                                                                          
 

                                                                     

                                 
                                  




                               

                                                           
 

                                                                                
 

                                                           
 

                                                                                   
 

                                                                          
 

                                                                     

                                 
                                  





                       

                                        
 

                                                           
 

                                        
 

                                                              
 

                                                       
 

                                                

                         
                          





                          

                                           
 

                                                              
 

                                           
 

                                                                 
 

                                                          
 

                                                   


                                 


                                                  
 

                                                                     

                            
                             



                               


                                                      
 


                                                                           
 


                                                      
 


                                                                              
 


                                                                     
 


                                                                

                                 
                                  




                          


                                                      
 


                                                                           
 


                                                      
 


                                                                              
 


                                                                     
 


                                                                

                            
                             





                            

                                                        
 

                                                                             
 

                                                        
 

                                                                                
 

                                                                       
 

                                                                  

                              
                               



                            

                                             
 

                                                                
 

                                             
 

                                                                   
 

                                                            
 

                                                     


                              
                               


                              


                                                          
 


                                                                               

                                
                                 

 

                             


                                                      
 


                                                                           

                               
                                



                             

                                              
 

                                                                 
 

                                              
 

                                                                    
 

                                                             
 

                                                      

                               

                                            





                         

                                          
 

                                                             
 

                                          
 

                                                                
 

                                                         
 

                                                  

                           
                            




                        


                                                      
 


                                                                           
 


                                                      
 


                                                                              
 


                                                                     
 


                                                                

                          
                           




                               

                                                           
 

                                                                                
 

                                                           
 

                                                                                   
 

                                                                          
 

                                                                     

                                 
                                  




                                

                                                            
 

                                                                                 
 

                                                            
 

                                                                                    
 

                                                                           
 

                                                                      

                                  
                                   




                               

                                                           
 

                                                                                
 

                                                           
 

                                                                                   
 

                                                                          
 

                                                                     

                                 
                                  




                               

                                                           
 

                                                                                
 

                                                           
 

                                                                                   
 

                                                                          
 

                                                                     

                                 
                                  




                       

                                                   
 

                                                                        
 

                                                   
 

                                                                           
 

                                                                  
 

                                                             

                         
                          




                          

                                                      
 

                                                                           
 

                                                      
 

                                                                              
 

                                                                     
 

                                                                

                            
                             



                               


                                                           
 


                                                                                
 


                                                           
 


                                                                                   
 


                                                                          
 


                                                                     

                                 
                                  





                          


                                                      
 


                                                                           
 


                                                      
 


                                                                              
 


                                                                     
 


                                                                

                            
                             

 
                                     
 

                      









                                                                           
                                                                            



















                                                         



                          
                                                    


                          
                                                    



                                      



                                                                     


                   
                        
                            
 



                                            



                 


                                                               
 





                                                      

       




                                                       

       

                            
                                                         


                         








                                                              



                                    













                                                                             

        

                      

                                              

 




                                                      



                        
                             


                             

                                                     


                        





















                                                                              

                       




                                                                                                





                      






                                                                       
       
 

                              

                                                         
 

                                                                              
       
 
                  

                   










                                                                             




                            



                                                                         



                        
















                                                                              

                         
       
                          

                                                         
 

                                                                              
 


                                                         
 


                                                                                 
 


                                                                        
 


                                                                   


                               

                                                              
 

                                                                                   


                               

                                                              
 

                                                                                   


                                  

                                                   
 

                                                                      



                             









                                                                        
 



                                                                          
 



                                                                     
 



                                                           
 



                                                                                
 
                                                          
 
                                                                         
 
                                                                    
 
                                                          



                                  

                                                   
 


                                                                           
 

                                                                  
 

                                                             
 

                                                   
 

                                                                        



                           




                                                                  
 


                                                                             
 


                                                                    
 


                                                     
 


                                                                          



                  



















                                                                   


                                                           




                          


                                                           
 


                                                                                   
 


                                                                          
 


                                                                     
 


                                                           
 


                                                                                



                        



                                                               



                     




                                                               



                     



                                                                      



                     


                                                                          

                
                     
                                                                                     



                                                      

        


                                                                          
 


                                                                                                
 


                                                                                         
 


                                                                                  



                         






                                                         


                                       

                                                                   
 

                                                                                        
 

                                                                   
 

                                                                                           
 

                                                                                  
 

                                                                             


                                   

                                     
                




                                                             

        

                                                                          

                




                                                         

        

                                                                             
 

                                                                    
                




                                                                   



                                     

                                                                 
 

                                                                                      
 

                                                                 
 

                                                                                         
 

                                                                                
 

                                                                           


                            




                                                                                                 

                  




                                                  

                      





                                                                                                       


                             

                                                             
 

                                                                                  
 

                                                             
 

                                                                                     
 

                                                                            
 

                                                                       


                      

                                     
 

                                                          
 

                                                                            


                    

                                                          
 

                                                                               
 

                                                             
 

                                                          

                                   
                                    



                                 













                                                                             


                                       
                                                       
                                                           
                                                                               
                                                            



                              






                                                                        


                                  
                                                                  


                                
                                                                     


                                         
                                                                  


                               



                                                           


                          


                                                                         


                              
              
           

                                                          



                        

                                                              
                                                                   




                                                                            

                                 
 

                                                      
 

                                                                  
 

                                                      
 

                                                                                          
 

                                                                                 
 

                                                                  




                              
                                                     
            



                                                



                              
                                     


                            
                                           


                            

                                                                  




                                  
                                                     
            





                                                           
        
 

                                 

                                                            

                                                                                 





                                                                                    


                                

                                       


                      


                                           



                       









                                                                         
        


                         
                                                  
 

                                        













                                                                                                                                         

 

                    
                    

                
                               
                





                                                                     

                 

































                                                                                   

                                                 








                                                       
               


               
 
                        
                              


                                              









                                                                               

                                          

                                                                             
                                                   
%%
%% %CopyrightBegin%
%%
%% Copyright Ericsson AB 2001-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%
%%
%%
%%% Purpose : Test suite for the ASN.1 application

-module(asn1_%BIN%SUITE).
-define(PER, '%PER%').
-define(BER, '%BER%').
-define(ber_nif(Erule, Func),
    case Erule of
        ber_bin_v2 -> Func;
        _          -> ok
    end).
-define(per_optimize(Erule),
    case Erule of
       ber_bin_v2 -> [optimize];
       _          -> []
    end).
-define(per_bit_opt(FuncCall),
    case ?BER of
        ber_bin_v2 -> FuncCall;
        _          -> ok
    end).
-define(uper_bin(FuncCall),
    case ?PER of
        per -> FuncCall;
        _   -> ok
    end).

-compile(export_all).
%%-export([Function/Arity, ...]).

-include_lib("test_server/include/test_server.hrl").

%% records used by test-case default
-record('Def1', {bool0,
                 bool1 = asn1_DEFAULT,
                 bool2 = asn1_DEFAULT,
                 bool3 = asn1_DEFAULT}).

suite() -> [{ct_hooks, [ts_install_cth]}].

all() -> [{group, parallel}] ++ common() ++ particular().

groups() ->
    [{compile, parallel([]),
      [c_syntax,
       % Uses 'String'
       {group, [], [c_string_per,
                    c_string_ber]},
       c_implicit_before_choice]},

     {ber, parallel([]),
      [ber_choiceinseq,
       % Uses 'SOpttest'
       {group, [], [ber_optional,
                    ber_optional_keyed_list]},
       ber_other]},

     {app_test, [],
      [{asn1_app_test, all}]},

     {appup_test, [],
      [{asn1_appup_test, all}]},

     {parallel, parallel([]),
      [{group, compile},
       {group, ber},
       % Uses 'Prim'
       {group, [], [testPrim,
                    rtUI]},
       % Uses 'P-Record', 'Constraints', 'MEDIA-GATEWAY-CONTROL'...
       {group, [], [parse,
                    test_driver_load,
                    test_undecoded_rest,
                    test_inline,
                    specialized_decodes,
                    special_decode_performance,
                    testMegaco,
                    testConstraints,
                    testCompactBitString]},
       % Uses 'Def'
       {group, [], [default_ber,
                    default_per,
                    default_per_opt]},
       per,
       {group, [], [testPrimStrings,
                    testInvokeMod]},
       testChoPrim,
       testChoExtension,
       testChoOptional,
       testChoOptionalImplicitTag,
       testChoRecursive,
       testChoTypeRefCho,
       testChoTypeRefPrim,
       testChoTypeRefSeq,
       testChoTypeRefSet,
       testDef,
       testOpt,
       testSeqDefault,
       % Uses 'External'
       {group, [], [testChoExternal,
                    testPrimExternal,
                    testSeqExtension,
                    testSeqExternal,
                    testSeqOfExternal,
                    testSeqTag,
                    testSetExternal,
                    testSetOfExternal,
                    testSetOfTag,
                    testSetTag]},
       testSeqOptional,
       testSeqPrim,
       testSeqTypeRefCho,
       % Uses 'SeqTypeRefPrim'
       {group, [], [testSeqTypeRefPrim,
                    testTypeValueNotation]},
       testSeqTypeRefSeq,
       testSeqTypeRefSet,
       % Uses 'SeqOf'
       {group, [], [testSeqOf,
                    testSeqOfIndefinite]}, % Uses 'Mvrasn*'
       testSeqOfCho,
       testSetDefault,
       testSetExtension,
       testExtensionAdditionGroup,
       testSeqOfTag,
       testSetOptional,
       testSetPrim,
       testSetTypeRefCho,
       testSetTypeRefPrim,
       testSetTypeRefSeq,
       testSetTypeRefSet,
       testSetOf,
       testSetOfCho,
       testEnumExt,
       value_test,
       testSeq2738,
       % Uses 'Constructed'
       {group, [], [constructed,
                    ber_decode_error]},
       % Uses 'MULTIMEDIA-SYSTEM-CONTROL'
       {group, [], [h323test,
                    per_GeneralString]},
       % Uses 'SeqSetIndefinite'
       {group, [], [testSeqIndefinite,
                    testSetIndefinite]},
       testChoiceIndefinite,
       per_open_type,
       testInfObjectClass,
       testParameterizedInfObj,
       testMergeCompile,
       testobj,
       testDeepTConstr,
       testExport,
       testImport,
       % Uses 'ParamBasic'
       {group, [], [testParamBasic,
                    testDER]},
       testMvrasn6,
       testContextSwitchingTypes,
       testOpenTypeImplicitTag,
       duplicate_tags,
       testROSE,
       testINSTANCE_OF,
       testTCAP,
       test_ParamTypeInfObj,
       test_WS_ParamClass,
       test_Defed_ObjectIdentifier,
       testSelectionType,
       testSSLspecs,
       testNortel,
       % Uses 'PKCS7'
       {group, [], [test_modified_x420,
                    testX420]},
       testTcapsystem,
       testNBAPsystem,
       test_compile_options,
       testDoubleEllipses,
       test_x691,
       ticket_6143,
       testExtensionAdditionGroup,
       test_OTP_9688]}
    ].

parallel(Options) ->
    case erlang:system_info(smp_support) andalso
         erlang:system_info(schedulers) > 1 of
        true  -> [parallel|Options];
        false -> Options
    end.

init_per_suite(Config) ->
    Config.

end_per_suite(_Config) ->
    ok.

init_per_group(_GroupName, Config) ->
    Config.

end_per_group(_GroupName, Config) ->
    Config.

init_per_testcase(Func, Config) ->
    PrivDir = ?config(priv_dir, Config),
    true = code:add_patha(PrivDir),

    CaseDir = filename:join([PrivDir, ?MODULE, Func]),
    ok = filelib:ensure_dir(filename:join([CaseDir, dummy_file])),
    true = code:add_patha(CaseDir),

    Dog = case Func of
              testX420 -> test_server:timetrap({minutes, 60});
              _        -> test_server:timetrap({minutes, 30})
          end,
    [{case_dir, CaseDir}, {watchdog, Dog}|Config].

end_per_testcase(_Func, Config) ->
    Dog = ?config(watchdog, Config),
    % TODO: Clean up code path?
    test_server:timetrap_cancel(Dog).


testPrim(suite) -> [];
testPrim(Config) ->
    Files = ["Prim", "Real"],

    asn1_test_lib:compile_all(Files, Config, [?BER]),
    testPrim_cases(?BER),

    ?ber_nif(?BER, asn1_test_lib:compile_all(Files, Config, [?BER, nif])),
    ?ber_nif(?BER, testPrim_cases(?BER)),

    asn1_test_lib:compile_all(Files, Config, [?PER]),
    testPrim_cases(?PER),

    ?per_bit_opt(asn1_test_lib:compile_all(Files, Config, [?PER, optimize])),
    ?per_bit_opt(testPrim_cases(?PER)),

    ?uper_bin(asn1_test_lib:compile_all(Files, Config, [uper_bin])),
    ?uper_bin(testPrim_cases(uper_bin)),

    asn1_test_lib:compile_all(Files, Config, [?PER, optimize]),
    testPrim_cases(?PER).

testPrim_cases(Rules) ->
    testPrim:bool(Rules),
    testPrim:int(Rules),
    testPrim:enum(Rules),
    testPrim:obj_id(Rules),
    testPrim:rel_oid(Rules),
    testPrim:null(Rules),
    testPrim:real(Rules).


testCompactBitString(suite) -> [];
testCompactBitString(Config) ->
    testCompactBitString:compile(Config, [?BER, compact_bit_string]),
    testCompactBitString:compact_bit_string(?BER),

    ?ber_nif(?BER, testCompactBitString:compile(Config, [?BER, compact_bit_string, nif])),
    ?ber_nif(?BER, testCompactBitString:compact_bit_string(?BER)),

    testCompactBitString:compile(Config, [?PER, compact_bit_string]),
    testCompactBitString:compact_bit_string(?PER),
    testCompactBitString:bit_string_unnamed(?PER),

    ?per_bit_opt(testCompactBitString:compile(Config, [?PER, compact_bit_string, optimize])),
    ?per_bit_opt(testCompactBitString:compact_bit_string(?PER)),
    ?per_bit_opt(testCompactBitString:bit_string_unnamed(?PER)),
    ?per_bit_opt(testCompactBitString:ticket_7734(?PER)),

    ?uper_bin(testCompactBitString:compile(Config, [uper_bin, compact_bit_string])),
    ?uper_bin(testCompactBitString:compact_bit_string(uper_bin)),
    ?uper_bin(testCompactBitString:bit_string_unnamed(uper_bin)),

    testCompactBitString:compile(Config, [?PER, optimize, compact_bit_string]),
    testCompactBitString:compact_bit_string(?PER),
    testCompactBitString:bit_string_unnamed(?PER),

    testCompactBitString:otp_4869(?PER).


testPrimStrings(suite) -> [];
testPrimStrings(Config) ->

    testPrimStrings:compile(Config, ?BER, []),
    testPrimStrings_cases(?BER),
    testPrimStrings:more_strings(?BER), %% these are not implemented in per yet
    ?ber_nif(?BER, testPrimStrings:compile(Config, ?BER, [nif])),
    ?ber_nif(?BER, testPrimStrings_cases(?BER)),
    ?ber_nif(?BER, testPrimStrings:more_strings(?BER)),

    testPrimStrings:compile(Config, ?PER, []),
    testPrimStrings_cases(?PER),

    ?per_bit_opt(testPrimStrings:compile(Config, ?PER, [optimize])),
    ?per_bit_opt(testPrimStrings_cases(?PER)),

    ?uper_bin(testPrimStrings:compile(Config, uper_bin, [])),
    ?uper_bin(testPrimStrings_cases(uper_bin)),

    testPrimStrings:compile(Config, ?PER, [optimize]),
    testPrimStrings_cases(?PER).

testPrimStrings_cases(Rules) ->
    testPrimStrings:bit_string(Rules),
    testPrimStrings:bit_string_unnamed(Rules),
    testPrimStrings:octet_string(Rules),
    testPrimStrings:numeric_string(Rules),
    testPrimStrings:other_strings(Rules),
    testPrimStrings:universal_string(Rules),
    testPrimStrings:bmp_string(Rules),
    testPrimStrings:times(Rules),
    testPrimStrings:utf8_string(Rules).



testPrimExternal(suite) -> [];
testPrimExternal(Config) ->
    asn1_test_lib:compile("External", Config, [?BER]),
    asn1_test_lib:compile("PrimExternal", Config, [?BER]),
    testPrimExternal:external(?BER),

    ?ber_nif(?BER, asn1_test_lib:compile("External", Config, [?BER, nif])),
    ?ber_nif(?BER, asn1_test_lib:compile("PrimExternal", Config, [?BER, nif])),
    ?ber_nif(?BER, testPrimExternal:external(?BER)),

    asn1_test_lib:compile("External", Config, [?PER]),
    asn1_test_lib:compile("PrimExternal", Config, [?PER]),
    testPrimExternal:external(?PER),

    ?per_bit_opt(asn1_test_lib:compile("External", Config, [?PER, optimize])),
    ?per_bit_opt(asn1_test_lib:compile("PrimExternal", Config, [?PER, optimize])),
    ?per_bit_opt(testPrimExternal:external(?PER)),

    ?uper_bin(asn1_test_lib:compile("External", Config, [uper_bin])),
    ?uper_bin(asn1_test_lib:compile("PrimExternal", Config, [uper_bin])),
    ?uper_bin(testPrimExternal:external(uper_bin)),

    asn1_test_lib:compile("External", Config,     [?PER, optimize]),
    asn1_test_lib:compile("PrimExternal", Config, [?PER, optimize]),
    testPrimExternal:external(?PER).


testChoPrim(suite) -> [];
testChoPrim(Config) ->
    asn1_test_lib:compile("ChoPrim", Config, [?BER]),
    testChoPrim_cases(?BER),

    ?ber_nif(?BER, asn1_test_lib:compile("ChoPrim", Config, [?BER, nif])),
    ?ber_nif(?BER, testChoPrim_cases(?BER)),

    asn1_test_lib:compile("ChoPrim", Config, [?PER]),
    testChoPrim_cases(?PER),

    ?per_bit_opt(asn1_test_lib:compile("ChoPrim", Config, [?PER, optimize])),
    ?per_bit_opt(testChoPrim_cases(?PER)),

    ?uper_bin(asn1_test_lib:compile("ChoPrim", Config, [uper_bin])),
    ?uper_bin(testChoPrim_cases(uper_bin)),

    asn1_test_lib:compile("ChoPrim", Config, [?PER, optimize]),
    testChoPrim_cases(?PER).

testChoPrim_cases(Rules) ->
    testChoPrim:bool(Rules),
    testChoPrim:int(Rules).



testChoExtension(suite) -> [];
testChoExtension(Config) ->
    asn1_test_lib:compile("ChoExtension", Config, [?BER]),
    testChoExtension_cases(?BER),

    ?ber_nif(?BER, asn1_test_lib:compile("ChoExtension", Config, [?BER, nif])),
    ?ber_nif(?BER, testChoExtension_cases(?BER)),

    asn1_test_lib:compile("ChoExtension", Config, [?PER]),
    testChoExtension_cases(?PER),

    ?per_bit_opt(asn1_test_lib:compile("ChoExtension", Config, [?PER, optimize])),
    ?per_bit_opt(testChoExtension_cases(?PER)),

    ?uper_bin(asn1_test_lib:compile("ChoExtension", Config, [uper_bin])),
    ?uper_bin(testChoExtension_cases(uper_bin)),

    asn1_test_lib:compile("ChoExtension", Config, [?PER, optimize]),
    testChoExtension_cases(?PER).

testChoExtension_cases(Rules) ->
    testChoExtension:extension(Rules).



testChoExternal(suite) -> [];
testChoExternal(Config) ->
    asn1_test_lib:compile("External", Config, [?BER]),
    asn1_test_lib:compile("ChoExternal", Config, [?BER]),
    testChoExternal:external(?BER),

    ?ber_nif(?BER, asn1_test_lib:compile("External", Config, [?BER, nif])),
    ?ber_nif(?BER, asn1_test_lib:compile("ChoExternal", Config, [?BER, nif])),
    ?ber_nif(?BER, testChoExternal:external(?BER)),

    asn1_test_lib:compile("External", Config, [?PER]),
    asn1_test_lib:compile("ChoExternal", Config, [?PER]),
    testChoExternal:external(?PER),

    ?per_bit_opt(asn1_test_lib:compile("External", Config, [?PER, optimize])),
    ?per_bit_opt(asn1_test_lib:compile("ChoExternal", Config, [?PER, optimize])),
    ?per_bit_opt(testChoExternal:external(?PER)),

    ?uper_bin(asn1_test_lib:compile("External", Config,    [uper_bin])),
    ?uper_bin(asn1_test_lib:compile("ChoExternal", Config, [uper_bin])),
    ?uper_bin(testChoExternal:external(uper_bin)),

    asn1_test_lib:compile("External", Config,    [?PER, optimize]),
    asn1_test_lib:compile("ChoExternal", Config, [?PER, optimize]),
    testChoExternal:external(?PER).


testChoOptional(suite) -> [];
testChoOptional(Config) ->

    testChoOptional:compile(Config, ?BER, []),
    testChoOptional_cases(?BER),

    ?ber_nif(?BER, testChoOptional:compile(Config, ?BER, [nif])),
    ?ber_nif(?BER, testChoOptional_cases(?BER)),

    testChoOptional:compile(Config, ?PER, []),
    testChoOptional_cases(?PER),

    ?per_bit_opt(testChoOptional:compile(Config, ?PER, [optimize])),
    ?per_bit_opt(testChoOptional_cases(?PER)),

    ?uper_bin(testChoOptional:compile(Config, uper_bin, [])),
    ?uper_bin(testChoOptional_cases(uper_bin)),

    testChoOptional:compile(Config, ?PER, [optimize]),
    testChoOptional_cases(?PER).

testChoOptional_cases(Rules) ->
    testChoOptional:optional(Rules).

testChoOptionalImplicitTag(suite) -> [];
testChoOptionalImplicitTag(Config) ->
    %% Only meaningful for ?BER
    testChoOptionalImplicitTag:compile(Config, ?BER),
    testChoOptionalImplicitTag:optional(?BER).


testChoRecursive(suite) -> [];
testChoRecursive(Config) ->

    testChoRecursive:compile(Config, ?BER, []),
    testChoRecursive_cases(?BER),

    ?ber_nif(?BER, testChoRecursive:compile(Config, ?BER, [nif])),
    ?ber_nif(?BER, testChoRecursive_cases(?BER)),

    testChoRecursive:compile(Config, ?PER, []),
    testChoRecursive_cases(?PER),

    ?per_bit_opt(testChoRecursive:compile(Config, ?PER, [optimize])),
    ?per_bit_opt(testChoRecursive_cases(?PER)),

    ?uper_bin(testChoRecursive:compile(Config, uper_bin, [])),
    ?uper_bin(testChoRecursive_cases(uper_bin)),

    testChoRecursive:compile(Config, ?PER, [optimize]),
    testChoRecursive_cases(?PER).

testChoRecursive_cases(Rules) ->
    testChoRecursive:recursive(Rules).



testChoTypeRefCho(suite) -> [];
testChoTypeRefCho(Config) ->

    testChoTypeRefCho:compile(Config, ?BER, []),
    testChoTypeRefCho_cases(?BER),

    ?ber_nif(?BER, testChoTypeRefCho:compile(Config, ?BER, [nif])),
    ?ber_nif(?BER, testChoTypeRefCho_cases(?BER)),

    testChoTypeRefCho:compile(Config, ?PER, []),
    testChoTypeRefCho_cases(?PER),

    ?per_bit_opt(testChoTypeRefCho:compile(Config, ?PER, [optimize])),
    ?per_bit_opt(testChoTypeRefCho_cases(?PER)),

    ?uper_bin(testChoTypeRefCho:compile(Config, uper_bin, [])),
    ?uper_bin(testChoTypeRefCho_cases(uper_bin)),

    testChoTypeRefCho:compile(Config, ?PER, [optimize]),
    testChoTypeRefCho_cases(?PER).

testChoTypeRefCho_cases(Rules) ->
    testChoTypeRefCho:choice(Rules).



testChoTypeRefPrim(suite) -> [];
testChoTypeRefPrim(Config) ->

    testChoTypeRefPrim:compile(Config, ?BER, []),
    testChoTypeRefPrim_cases(?BER),

    ?ber_nif(?BER, testChoTypeRefPrim:compile(Config, ?BER, [nif])),
    ?ber_nif(?BER, testChoTypeRefPrim_cases(?BER)),

    testChoTypeRefPrim:compile(Config, ?PER, []),
    testChoTypeRefPrim_cases(?PER),

    ?per_bit_opt(testChoTypeRefPrim:compile(Config, ?PER, [optimize])),
    ?per_bit_opt(testChoTypeRefPrim_cases(?PER)),

    ?uper_bin(testChoTypeRefPrim:compile(Config, uper_bin, [])),
    ?uper_bin(testChoTypeRefPrim_cases(uper_bin)),

    testChoTypeRefPrim:compile(Config, ?PER, [optimize]),
    testChoTypeRefPrim_cases(?PER).

testChoTypeRefPrim_cases(Rules) ->
    testChoTypeRefPrim:prim(Rules).



testChoTypeRefSeq(suite) -> [];
testChoTypeRefSeq(Config) ->

    testChoTypeRefSeq:compile(Config, ?BER, []),
    testChoTypeRefSeq_cases(?BER),

    ?ber_nif(?BER, testChoTypeRefSeq:compile(Config, ?BER, [nif])),
    ?ber_nif(?BER, testChoTypeRefSeq_cases(?BER)),

    testChoTypeRefSeq:compile(Config, ?PER, []),
    testChoTypeRefSeq_cases(?PER),

    ?per_bit_opt(testChoTypeRefSeq:compile(Config, ?PER, [optimize])),
    ?per_bit_opt(testChoTypeRefSeq_cases(?PER)),

    ?uper_bin(testChoTypeRefSeq:compile(Config, uper_bin, [])),
    ?uper_bin(testChoTypeRefSeq_cases(uper_bin)),

    testChoTypeRefSeq:compile(Config, ?PER, [optimize]),
    testChoTypeRefSeq_cases(?PER).

testChoTypeRefSeq_cases(Rules) ->
    testChoTypeRefSeq:seq(Rules).



testChoTypeRefSet(suite) -> [];
testChoTypeRefSet(Config) ->

    testChoTypeRefSet:compile(Config, ?BER, []),
    testChoTypeRefSet_cases(?BER),

    ?ber_nif(?BER, testChoTypeRefSet:compile(Config, ?BER, [nif])),
    ?ber_nif(?BER, testChoTypeRefSet_cases(?BER)),

    testChoTypeRefSet:compile(Config, ?PER, []),
    testChoTypeRefSet_cases(?PER),

    ?per_bit_opt(testChoTypeRefSet:compile(Config, ?PER, [optimize])),
    ?per_bit_opt(testChoTypeRefSet_cases(?PER)),

    ?uper_bin(testChoTypeRefSet:compile(Config, uper_bin, [])),
    ?uper_bin(testChoTypeRefSet_cases(uper_bin)),

    testChoTypeRefSet:compile(Config, ?PER, [optimize]),
    testChoTypeRefSet_cases(?PER).

testChoTypeRefSet_cases(Rules) ->
    testChoTypeRefSet:set(Rules).



testDef(suite) -> [];
testDef(Config) ->

    testDef:compile(Config, ?BER, []),
    testDef_cases(?BER),

    ?ber_nif(?BER, testDef:compile(Config, ?BER, [nif])),
    ?ber_nif(?BER, testDef_cases(?BER)),

    testDef:compile(Config, ?PER, []),
    testDef_cases(?PER),

    ?per_bit_opt(testDef:compile(Config, ?PER, [optimize])),
    ?per_bit_opt(testDef_cases(?PER)),

    ?uper_bin(testDef:compile(Config, uper_bin, [])),
    ?uper_bin(testDef_cases(uper_bin)),

    testDef:compile(Config, ?PER, [optimize]),
    testDef_cases(?PER).

testDef_cases(Rules) ->
    testDef:main(Rules).



testOpt(suite) -> [];
testOpt(Config) ->

    testOpt:compile(Config, ?BER),
    testOpt_cases(?BER),

    testOpt:compile(Config, ?PER),
    testOpt_cases(?PER).

testOpt_cases(Rules) ->
    testOpt:main(Rules).


testEnumExt(suite) -> [];
testEnumExt(Config) ->

    asn1_test_lib:compile("EnumExt", Config, [?BER]),
    testEnumExt:main(?BER),

    ?ber_nif(?BER, asn1_test_lib:compile("EnumExt", Config, [?BER, nif])),
    ?ber_nif(?BER, testEnumExt:main(?BER)),

    asn1_test_lib:compile("EnumExt", Config, [?PER]),
    testEnumExt:main(?PER),

    ?per_bit_opt(asn1_test_lib:compile("EnumExt", Config, [?PER, optimize])),
    ?per_bit_opt(testEnumExt:main(?PER)),

    ?uper_bin(asn1_test_lib:compile("EnumExt", Config, [uper_bin])),
    ?uper_bin(testEnumExt:main(uper_bin)),

    asn1_test_lib:compile("EnumExt", Config, [?PER, optimize]),
    testEnumExt:main(?PER).

testSeqDefault(doc) -> ["Test of OTP-2523 ENUMERATED with extensionmark."];
testSeqDefault(suite) -> [];
testSeqDefault(Config) ->
    asn1_test_lib:compile("SeqDefault", Config, [?BER]),
    testSeqDefault_cases(?BER),

    ?ber_nif(?BER, asn1_test_lib:compile("SeqDefault", Config, [?BER, nif])),
    ?ber_nif(?BER, testSeqDefault_cases(?BER)),

    asn1_test_lib:compile("SeqDefault", Config, [?PER]),
    testSeqDefault_cases(?PER),

    ?per_bit_opt(asn1_test_lib:compile("SeqDefault", Config, [?PER, optimize])),
    ?per_bit_opt(testSeqDefault_cases(?PER)),

    ?uper_bin(asn1_test_lib:compile("SeqDefault", Config, [uper_bin])),
    ?uper_bin(testSeqDefault_cases(uper_bin)),

    asn1_test_lib:compile("SeqDefault", Config, [?PER, optimize]),
    testSeqDefault_cases(?PER).

testSeqDefault_cases(Rules) ->
    testSeqDefault:main(Rules).



testSeqExtension(suite) -> [];
testSeqExtension(Config) ->
    asn1_test_lib:compile("External", Config, [?BER]),
    asn1_test_lib:compile("SeqExtension", Config, [?BER]),
    testSeqExtension_cases(?BER),

    ?ber_nif(?BER, asn1_test_lib:compile("External", Config, [?BER, nif])),
    ?ber_nif(?BER, asn1_test_lib:compile("SeqExtension", Config, [?BER, nif])),
    ?ber_nif(?BER, testSeqExtension_cases(?BER)).

testSeqExtension_cases(Rules) ->
    testSeqExtension:main(Rules).



testSeqExternal(suite) -> [];
testSeqExternal(Config) ->
    asn1_test_lib:compile("External", Config, [?BER]),
    asn1_test_lib:compile("SeqExternal", Config, [?BER]),
    testSeqExternal_cases(?BER),

    ?ber_nif(?BER, asn1_test_lib:compile("External", Config, [?BER, nif])),
    ?ber_nif(?BER, asn1_test_lib:compile("SeqExternal", Config, [?BER, nif])),
    ?ber_nif(?BER, testSeqExternal_cases(?BER)).

testSeqExternal_cases(Rules) ->
    testSeqExternal:main(Rules).


testSeqOptional(suite) -> [];
testSeqOptional(Config) ->

    testSeqOptional:compile(Config, ?BER, []),
    testSeqOptional_cases(?BER),

    ?ber_nif(?BER, testSeqOptional:compile(Config, ?BER, [nif])),
    ?ber_nif(?BER, testSeqOptional_cases(?BER)),

    testSeqOptional:compile(Config, ?PER, []),
    testSeqOptional_cases(?PER),

    ?per_bit_opt(testSeqOptional:compile(Config, ?PER, [optimize])),
    ?per_bit_opt(testSeqOptional_cases(?PER)),

    ?uper_bin(testSeqOptional:compile(Config, uper_bin, [])),
    ?uper_bin(testSeqOptional_cases(uper_bin)),

    testSeqOptional:compile(Config, ?PER, [optimize]),
    testSeqOptional_cases(?PER).

testSeqOptional_cases(Rules) ->
    testSeqOptional:main(Rules).



testSeqPrim(suite) -> [];
testSeqPrim(Config) ->

    testSeqPrim:compile(Config, ?BER, []),
    testSeqPrim_cases(?BER),

    ?ber_nif(?BER, testSeqPrim:compile(Config, ?BER, [nif])),
    ?ber_nif(?BER, testSeqPrim_cases(?BER)),

    testSeqPrim:compile(Config, ?PER, []),
    testSeqPrim_cases(?PER),

    ?per_bit_opt(testSeqPrim:compile(Config, ?PER, [optimize])),
    ?per_bit_opt(testSeqPrim_cases(?PER)),

    ?uper_bin(testSeqPrim:compile(Config, uper_bin, [])),
    ?uper_bin(testSeqPrim_cases(uper_bin)),

    testSeqPrim:compile(Config, ?PER, [optimize]),
    testSeqPrim_cases(?PER).

testSeqPrim_cases(Rules) ->
    testSeqPrim:main(Rules).


testSeq2738(doc) -> ["Test of OTP-2738 Detect corrupt optional component."];
testSeq2738(suite) -> [];
testSeq2738(Config) ->
    asn1_test_lib:compile("Seq2738", Config, [?BER]),
    testSeq2738_cases(?BER),

    ?ber_nif(?BER, asn1_test_lib:compile("Seq2738", Config, [?BER, nif])),
    ?ber_nif(?BER, testSeq2738_cases(?BER)),

    asn1_test_lib:compile("Seq2738", Config, [?PER]),
    testSeq2738_cases(?PER),

    ?per_bit_opt(asn1_test_lib:compile("Seq2738", Config, [?PER, optimize])),
    ?per_bit_opt(testSeq2738_cases(?PER)),

    ?uper_bin(asn1_test_lib:compile("Seq2738", Config, [uper_bin])),
    ?uper_bin(testSeq2738_cases(uper_bin)),

    asn1_test_lib:compile("Seq2738", Config, [?PER, optimize]),
    testSeq2738_cases(?PER).

testSeq2738_cases(Rules) ->
    testSeq2738:main(Rules).


testSeqTag(suite) -> [];
testSeqTag(Config) ->
    asn1_test_lib:compile_all(["External", "SeqTag"], Config, [?BER]),
    testSeqTag_cases(?BER),

    ?ber_nif(?BER, asn1_test_lib:compile_all(["External", "SeqTag"], Config, [?BER, nif])),
    ?ber_nif(?BER, testSeqTag_cases(?BER)),

    asn1_test_lib:compile_all(["External", "SeqTag"], Config, [?PER]),
    testSeqTag_cases(?PER),

    ?per_bit_opt(asn1_test_lib:compile_all(["External", "SeqTag"], Config, [?PER, optimize])),
    ?per_bit_opt(testSeqTag_cases(?PER)),

    ?uper_bin(asn1_test_lib:compile_all(["External", "SeqTag"], Config, [uper_bin])),
    ?uper_bin(testSeqTag_cases(uper_bin)),

    asn1_test_lib:compile_all(["External", "SeqTag"], Config, [?PER, optimize]),
    testSeqTag_cases(?PER).

testSeqTag_cases(Rules) ->
    testSeqTag:main(Rules).




testSeqTypeRefCho(suite) -> [];
testSeqTypeRefCho(Config) ->

    testSeqTypeRefCho:compile(Config, ?BER, []),
    testSeqTypeRefCho_cases(?BER),

    ?ber_nif(?BER, testSeqTypeRefCho:compile(Config, ?BER, [nif])),
    ?ber_nif(?BER, testSeqTypeRefCho_cases(?BER)),

    testSeqTypeRefCho:compile(Config, ?PER, []),
    testSeqTypeRefCho_cases(?PER),

    ?per_bit_opt(testSeqTypeRefCho:compile(Config, ?PER, [optimize])),
    ?per_bit_opt(testSeqTypeRefCho_cases(?PER)),

    ?uper_bin(testSeqTypeRefCho:compile(Config, uper_bin, [])),
    ?uper_bin(testSeqTypeRefCho_cases(uper_bin)),

    testSeqTypeRefCho:compile(Config, ?PER, [optimize]),
    testSeqTypeRefCho_cases(?PER).

testSeqTypeRefCho_cases(Rules) ->
    testSeqTypeRefCho:main(Rules).



testSeqTypeRefPrim(suite) -> [];
testSeqTypeRefPrim(Config) ->
    asn1_test_lib:compile("SeqTypeRefPrim", Config, [?BER]),
    testSeqTypeRefPrim_cases(?BER),

    ?ber_nif(?BER, asn1_test_lib:compile("SeqTypeRefPrim", Config, [?BER, nif])),
    ?ber_nif(?BER, testSeqTypeRefPrim_cases(?BER)),

    asn1_test_lib:compile("SeqTypeRefPrim", Config, [?PER]),
    testSeqTypeRefPrim_cases(?PER),

    ?per_bit_opt(asn1_test_lib:compile("SeqTypeRefPrim", Config, [?PER, optimize])),
    ?per_bit_opt(testSeqTypeRefPrim_cases(?PER)),

    ?uper_bin(asn1_test_lib:compile("SeqTypeRefPrim", Config, [uper_bin])),
    ?uper_bin(testSeqTypeRefPrim_cases(uper_bin)),

    asn1_test_lib:compile("SeqTypeRefPrim", Config, [?PER, optimize]),
    testSeqTypeRefPrim_cases(?PER).

testSeqTypeRefPrim_cases(Rules) ->
    testSeqTypeRefPrim:main(Rules).



testSeqTypeRefSeq(suite) -> [];
testSeqTypeRefSeq(Config) ->
    asn1_test_lib:compile("SeqTypeRefSeq", Config, [?BER]),
    testSeqTypeRefSeq_cases(?BER),

    ?ber_nif(?BER, asn1_test_lib:compile("SeqTypeRefSeq", Config, [?BER, nif])),
    ?ber_nif(?BER, testSeqTypeRefSeq_cases(?BER)),

    asn1_test_lib:compile("SeqTypeRefSeq", Config, [?PER]),
    testSeqTypeRefSeq_cases(?PER),

    ?per_bit_opt(asn1_test_lib:compile("SeqTypeRefSeq", Config, [?PER, optimize])),
    ?per_bit_opt(testSeqTypeRefSeq_cases(?PER)),

    ?uper_bin(asn1_test_lib:compile("SeqTypeRefSeq", Config, [uper_bin])),
    ?uper_bin(testSeqTypeRefSeq_cases(uper_bin)),

    asn1_test_lib:compile("SeqTypeRefSeq", Config, [?PER, optimize]),
    testSeqTypeRefSeq_cases(?PER).

testSeqTypeRefSeq_cases(Rules) ->
    testSeqTypeRefSeq:main(Rules).



testSeqTypeRefSet(suite) -> [];
testSeqTypeRefSet(Config) ->
    asn1_test_lib:compile("SeqTypeRefSet", Config, [?BER]),
    testSeqTypeRefSet_cases(?BER),

    ?ber_nif(?BER, asn1_test_lib:compile("SeqTypeRefSet", Config, [?BER, nif])),
    ?ber_nif(?BER, testSeqTypeRefSet_cases(?BER)),

    asn1_test_lib:compile("SeqTypeRefSet", Config, [?PER]),
    testSeqTypeRefSet_cases(?PER),

    ?per_bit_opt(asn1_test_lib:compile("SeqTypeRefSet", Config, [?PER, optimize])),
    ?per_bit_opt(testSeqTypeRefSet_cases(?PER)),

    ?uper_bin(asn1_test_lib:compile("SeqTypeRefSet", Config, [uper_bin])),
    ?uper_bin(testSeqTypeRefSet_cases(uper_bin)),

    asn1_test_lib:compile("SeqTypeRefSet", Config, [?PER, optimize]),
    testSeqTypeRefSet_cases(?PER).

testSeqTypeRefSet_cases(Rules) ->
    testSeqTypeRefSet:main(Rules).




testSeqOf(suite) -> [];
testSeqOf(Config) ->
    testSeqOf:compile(Config, ?BER, []),
    testSeqOf_cases(?BER),

    ?ber_nif(?BER, testSeqOf:compile(Config, ?BER, [nif])),
    ?ber_nif(?BER, testSeqOf_cases(?BER)),

    testSeqOf:compile(Config, ?PER, []),
    testSeqOf_cases(?PER),

    ?per_bit_opt(testSeqOf:compile(Config, ?PER, [optimize])),
    ?per_bit_opt(testSeqOf_cases(?PER)),

    ?uper_bin(testSeqOf:compile(Config, uper_bin, [])),
    ?uper_bin(testSeqOf_cases(uper_bin)),

    testSeqOf:compile(Config, ?PER, [optimize]),
    testSeqOf_cases(?PER).

testSeqOf_cases(Rules) ->
    testSeqOf:main(Rules).




testSeqOfCho(suite) -> [];
testSeqOfCho(Config) ->
    testSeqOfCho:compile(Config, ?BER, []),
    testSeqOfCho_cases(?BER),

    ?ber_nif(?BER, testSeqOfCho:compile(Config, ?BER, [nif])),
    ?ber_nif(?BER, testSeqOfCho_cases(?BER)),

    testSeqOfCho:compile(Config, ?PER, []),
    testSeqOfCho_cases(?PER),

    ?per_bit_opt(testSeqOfCho:compile(Config, ?PER, [optimize])),
    ?per_bit_opt(testSeqOfCho_cases(?PER)),

    ?uper_bin(testSeqOfCho:compile(Config, uper_bin, [])),
    ?uper_bin(testSeqOfCho_cases(uper_bin)),

    testSeqOfCho:compile(Config, ?PER, [optimize]),
    testSeqOfCho_cases(?PER).

testSeqOfIndefinite(suite) -> [];
testSeqOfIndefinite(Config) ->
    %% Mvrasn (11-21)-4
    testSeqOfIndefinite:compile(Config, ?BER, []),
    testSeqOfIndefinite:main(),

    ?ber_nif(?BER, testSeqOfIndefinite:compile(Config, ?BER, [nif])),
    ?ber_nif(?BER, testSeqOfIndefinite:main()).

testSeqOfCho_cases(Rules) ->
    testSeqOfCho:main(Rules).


testSeqOfExternal(suite) -> [];
testSeqOfExternal(Config) ->
    asn1_test_lib:compile("External", Config, [?BER]),
    testSeqOfExternal:compile(Config, ?BER, []),
    testSeqOfExternal_cases(?BER),

    ?ber_nif(?BER, asn1_test_lib:compile("External", Config, [?BER, nif])),
    ?ber_nif(?BER, testSeqOfExternal:compile(Config, ?BER, [nif])),
    ?ber_nif(?BER, testSeqOfExternal_cases(?BER)),

    asn1_test_lib:compile("External", Config, [?PER]),
    testSeqOfExternal:compile(Config, ?PER, []),
    testSeqOfExternal_cases(?PER),

    ?per_bit_opt(asn1_test_lib:compile("External", Config, [?PER, optimize])),
    ?per_bit_opt(testSeqOfExternal:compile(Config, ?PER, [optimize])),
    ?per_bit_opt(testSeqOfExternal_cases(?PER)),

    ?uper_bin(asn1_test_lib:compile("External", Config, [uper_bin])),
    ?uper_bin(testSeqOfExternal:compile(Config, uper_bin, [])),
    ?uper_bin(testSeqOfExternal_cases(uper_bin)),

    asn1_test_lib:compile("External", Config, [?PER, optimize]),
    testSeqOfExternal:compile(Config, ?PER, [optimize]),
    testSeqOfExternal_cases(?PER).

testSeqOfExternal_cases(Rules) ->
    testSeqOfExternal:main(Rules).



testSeqOfTag(suite) -> [];
testSeqOfTag(Config) ->
    asn1_test_lib:compile("External", Config, [?BER]),
    testSeqOfTag:compile(Config, ?BER, []),
    testSeqOfTag_cases(?BER),

    ?ber_nif(?BER, asn1_test_lib:compile("External", Config, [?BER, nif])),
    ?ber_nif(?BER, testSeqOfTag:compile(Config, ?BER, [nif])),
    ?ber_nif(?BER, testSeqOfTag_cases(?BER)),

    asn1_test_lib:compile("External", Config, [?PER]),
    testSeqOfTag:compile(Config, ?PER, []),
    testSeqOfTag_cases(?PER),

    ?per_bit_opt(asn1_test_lib:compile("External", Config, [?PER, optimize])),
    ?per_bit_opt(testSeqOfTag:compile(Config, ?PER, [optimize])),
    ?per_bit_opt(testSeqOfTag_cases(?PER)),

    ?uper_bin(asn1_test_lib:compile("External", Config, [uper_bin])),
    ?uper_bin(testSeqOfTag:compile(Config, uper_bin, [])),
    ?uper_bin(testSeqOfTag_cases(uper_bin)),

    asn1_test_lib:compile("External", Config, [?PER, optimize]),
    testSeqOfTag:compile(Config, ?PER, [optimize]),
    testSeqOfTag_cases(?PER).

testSeqOfTag_cases(Rules) ->
    testSeqOfTag:main(Rules).




testSetDefault(suite) -> [];
testSetDefault(Config) ->
    asn1_test_lib:compile("SetDefault", Config, [?BER]),
    testSetDefault_cases(?BER),

    ?ber_nif(?BER, asn1_test_lib:compile("SetDefault", Config, [?BER, nif])),
    ?ber_nif(?BER, testSetDefault_cases(?BER)),

    asn1_test_lib:compile("SetDefault", Config, [?PER]),
    testSetDefault_cases(?PER),

    ?per_bit_opt(asn1_test_lib:compile("SetDefault", Config, [?PER, optimize])),
    ?per_bit_opt(testSetDefault_cases(?PER)),

    ?uper_bin(asn1_test_lib:compile("SetDefault", Config, [uper_bin])),
    ?uper_bin(testSetDefault_cases(uper_bin)),

    asn1_test_lib:compile("SetDefault", Config, [?PER, optimize]),
    testSetDefault_cases(?PER).

testSetDefault_cases(Rules) ->
    testSetDefault:main(Rules).


testParamBasic(suite) -> [];
testParamBasic(Config) ->
    testParamBasic:compile(Config, ?BER, []),
    testParamBasic_cases(?BER),

    ?ber_nif(?BER, testParamBasic:compile(Config, ?BER, [nif])),
    ?ber_nif(?BER, testParamBasic_cases(?BER)),

    testParamBasic:compile(Config, ?PER, []),
    testParamBasic_cases(?PER),

    ?per_bit_opt(testParamBasic:compile(Config, ?PER, [optimize])),
    ?per_bit_opt(testParamBasic_cases(?PER)),

    ?uper_bin(testParamBasic:compile(Config, uper_bin, [])),
    ?uper_bin(testParamBasic_cases(uper_bin)),

    testParamBasic:compile(Config, ?PER, [optimize]),
    testParamBasic_cases(?PER).


testParamBasic_cases(Rules) ->
    testParamBasic:main(Rules).

testSetExtension(suite) -> [];
testSetExtension(Config) ->
    asn1_test_lib:compile("External", Config, [?BER]),
    asn1_test_lib:compile("SetExtension", Config, [?BER]),
    testSetExtension_cases(?BER),

    ?ber_nif(?BER, asn1_test_lib:compile("External", Config, [?BER, nif])),
    ?ber_nif(?BER, asn1_test_lib:compile("SetExtension", Config, [?BER, nif])),
    ?ber_nif(?BER, testSetExtension_cases(?BER)).

testSetExtension_cases(Rules) ->
    testSetExtension:main(Rules).


testSetExternal(suite) -> [];
testSetExternal(Config) ->
    asn1_test_lib:compile("External", Config, [?BER]),
    testSetExternal:compile(Config, ?BER, []),
    testSetExternal_cases(?BER),

    ?ber_nif(?BER, asn1_test_lib:compile("External", Config, [?BER, nif])),
    ?ber_nif(?BER, testSetExternal:compile(Config, ?BER, [nif])),
    ?ber_nif(?BER, testSetExternal_cases(?BER)).

testSetExternal_cases(Rules) ->
    testSetExternal:main(Rules).


testSetOptional(suite) -> [];
testSetOptional(Config) ->
    testSetOptional:compile(Config, ?BER, []),
    testSetOptional_cases(?BER),

    ?ber_nif(?BER, testSetOptional:compile(Config, ?BER, [nif])),
    ?ber_nif(?BER, testSetOptional_cases(?BER)),

    testSetOptional:compile(Config, ?PER, []),
    testSetOptional_cases(?PER),

    ?per_bit_opt(testSetOptional:compile(Config, ?PER, [optimize])),
    ?per_bit_opt(testSetOptional_cases(?PER)),

    ?uper_bin(testSetOptional:compile(Config, uper_bin, [])),
    ?uper_bin(testSetOptional_cases(uper_bin)),

    testSetOptional:compile(Config, ?PER, [optimize]),
    testSetOptional_cases(?PER).

testSetOptional_cases(Rules) ->
    ok = testSetOptional:ticket_7533(Rules),
    ok = testSetOptional:main(Rules).




testSetPrim(suite) -> [];
testSetPrim(Config) ->
    testSetPrim:compile(Config, ?BER, []),
    testSetPrim_cases(?BER),

    ?ber_nif(?BER, testSetPrim:compile(Config, ?BER, [nif])),
    ?ber_nif(?BER, testSetPrim_cases(?BER)),

    testSetPrim:compile(Config, ?PER, []),
    testSetPrim_cases(?PER),

    ?per_bit_opt(testSetPrim:compile(Config, ?PER, [optimize])),
    ?per_bit_opt(testSetPrim_cases(?PER)),

    ?uper_bin(testSetPrim:compile(Config, uper_bin, [])),
    ?uper_bin(testSetPrim_cases(uper_bin)),

    testSetPrim:compile(Config, ?PER, [optimize]),
    testSetPrim_cases(?PER).

testSetPrim_cases(Rules) ->
    testSetPrim:main(Rules).



testSetTag(suite) -> [];
testSetTag(Config) ->
    asn1_test_lib:compile("External", Config, [?BER]),
    testSetTag:compile(Config, ?BER, []),
    testSetTag_cases(?BER),

    ?ber_nif(?BER, asn1_test_lib:compile("External", Config, [?BER, nif])),
    ?ber_nif(?BER, testSetTag:compile(Config, ?BER, [nif])),
    ?ber_nif(?BER, testSetTag_cases(?BER)),

    asn1_test_lib:compile("External", Config, [?PER]),
    testSetTag:compile(Config, ?PER, []),
    testSetTag_cases(?PER),

    ?per_bit_opt(asn1_test_lib:compile("External", Config, [?PER, optimize])),
    ?per_bit_opt(testSetTag:compile(Config, ?PER, [optimize])),
    ?per_bit_opt(testSetTag_cases(?PER)),

    ?uper_bin(asn1_test_lib:compile("External", Config, [uper_bin])),
    ?uper_bin(testSetTag:compile(Config, uper_bin, [])),
    ?uper_bin(testSetTag_cases(uper_bin)),

    asn1_test_lib:compile("External", Config, [?PER, optimize]),
    testSetTag:compile(Config, ?PER, [optimize]),
    testSetTag_cases(?PER).

testSetTag_cases(Rules) ->
    testSetTag:main(Rules).



testSetTypeRefCho(suite) -> [];
testSetTypeRefCho(Config) ->
    asn1_test_lib:compile("SetTypeRefCho", Config, [?BER]),
    testSetTypeRefCho_cases(?BER),

    ?ber_nif(?BER, asn1_test_lib:compile("SetTypeRefCho", Config, [?BER, nif])),
    ?ber_nif(?BER, testSetTypeRefCho_cases(?BER)),

    asn1_test_lib:compile("SetTypeRefCho", Config, [?PER]),
    testSetTypeRefCho_cases(?PER),

    ?per_bit_opt(asn1_test_lib:compile("SetTypeRefCho", Config, [?PER, optimize])),
    ?per_bit_opt(testSetTypeRefCho_cases(?PER)),

    ?uper_bin(asn1_test_lib:compile("SetTypeRefCho", Config, [uper_bin])),
    ?uper_bin(testSetTypeRefCho_cases(uper_bin)),

    asn1_test_lib:compile("SetTypeRefCho", Config, [?PER, optimize]),
    testSetTypeRefCho_cases(?PER).

testSetTypeRefCho_cases(Rules) ->
    testSetTypeRefCho:main(Rules).



testSetTypeRefPrim(suite) -> [];
testSetTypeRefPrim(Config) ->
    asn1_test_lib:compile("SetTypeRefPrim", Config, [?BER]),
    testSetTypeRefPrim_cases(?BER),

    ?ber_nif(?BER, asn1_test_lib:compile("SetTypeRefPrim", Config, [?BER, nif])),
    ?ber_nif(?BER, testSetTypeRefPrim_cases(?BER)),

    asn1_test_lib:compile("SetTypeRefPrim", Config, [?PER]),
    testSetTypeRefPrim_cases(?PER),

    ?per_bit_opt(asn1_test_lib:compile("SetTypeRefPrim", Config, [?PER, optimize])),
    ?per_bit_opt(testSetTypeRefPrim_cases(?PER)),

    ?uper_bin(asn1_test_lib:compile("SetTypeRefPrim", Config, [uper_bin])),
    ?uper_bin(testSetTypeRefPrim_cases(uper_bin)),

    asn1_test_lib:compile("SetTypeRefPrim", Config, [?PER, optimize]),
    testSetTypeRefPrim_cases(?PER).

testSetTypeRefPrim_cases(Rules) ->
    testSetTypeRefPrim:main(Rules).



testSetTypeRefSeq(suite) -> [];
testSetTypeRefSeq(Config) ->
    asn1_test_lib:compile("SetTypeRefSeq", Config, [?BER]),
    testSetTypeRefSeq_cases(?BER),

    ?ber_nif(?BER, asn1_test_lib:compile("SetTypeRefSeq", Config, [?BER, nif])),
    ?ber_nif(?BER, testSetTypeRefSeq_cases(?BER)),

    asn1_test_lib:compile("SetTypeRefSeq", Config, [?PER]),
    testSetTypeRefSeq_cases(?PER),

    ?per_bit_opt(asn1_test_lib:compile("SetTypeRefSeq", Config, [?PER, optimize])),
    ?per_bit_opt(testSetTypeRefSeq_cases(?PER)),

    ?uper_bin(asn1_test_lib:compile("SetTypeRefSeq", Config, [uper_bin])),
    ?uper_bin(testSetTypeRefSeq_cases(uper_bin)),

    asn1_test_lib:compile("SetTypeRefSeq", Config, [?PER, optimize]),
    testSetTypeRefSeq_cases(?PER).

testSetTypeRefSeq_cases(Rules) ->
    testSetTypeRefSeq:main(Rules).



testSetTypeRefSet(suite) -> [];
testSetTypeRefSet(Config) ->
    asn1_test_lib:compile("SetTypeRefSet", Config, [?BER]),
    testSetTypeRefSet_cases(?BER),

    ?ber_nif(?BER, asn1_test_lib:compile("SetTypeRefSet", Config, [?BER, nif])),
    ?ber_nif(?BER, testSetTypeRefSet_cases(?BER)),

    asn1_test_lib:compile("SetTypeRefSet", Config, [?PER]),
    testSetTypeRefSet_cases(?PER),

    ?per_bit_opt(asn1_test_lib:compile("SetTypeRefSet", Config, [?PER, optimize])),
    ?per_bit_opt(testSetTypeRefSet_cases(?PER)),

    ?uper_bin(asn1_test_lib:compile("SetTypeRefSet", Config, [uper_bin])),
    ?uper_bin(testSetTypeRefSet_cases(uper_bin)),

    asn1_test_lib:compile("SetTypeRefSet", Config, [?PER, optimize]),
    testSetTypeRefSet_cases(?PER).

testSetTypeRefSet_cases(Rules) ->
    testSetTypeRefSet:main(Rules).



testSetOf(suite) -> [];
testSetOf(Config) ->
    asn1_test_lib:compile("SetOf", Config, [?BER]),
    testSetOf_cases(?BER),

    ?ber_nif(?BER, asn1_test_lib:compile("SetOf", Config, [?BER, nif])),
    ?ber_nif(?BER, testSetOf_cases(?BER)),

    asn1_test_lib:compile("SetOf", Config, [?PER]),
    testSetOf_cases(?PER),

    ?per_bit_opt(asn1_test_lib:compile("SetOf", Config, [?PER, optimize])),
    ?per_bit_opt(testSetOf_cases(?PER)),

    ?uper_bin(asn1_test_lib:compile("SetOf", Config, [uper_bin])),
    ?uper_bin(testSetOf_cases(uper_bin)),

    asn1_test_lib:compile("SetOf", Config, [?PER, optimize]),
    testSetOf_cases(?PER).

testSetOf_cases(Rules) ->
    testSetOf:main(Rules).



testSetOfCho(suite) -> [];
testSetOfCho(Config) ->
    asn1_test_lib:compile("SetOfCho", Config, [?BER]),
    testSetOfCho_cases(?BER),

    ?ber_nif(?BER, asn1_test_lib:compile("SetOfCho", Config, [?BER, nif])),
    ?ber_nif(?BER, testSetOfCho_cases(?BER)),

    asn1_test_lib:compile("SetOfCho", Config, [?PER]),
    testSetOfCho_cases(?PER),

    ?per_bit_opt(asn1_test_lib:compile("SetOfCho", Config, [?PER, optimize])),
    ?per_bit_opt(testSetOfCho_cases(?PER)),

    ?uper_bin(asn1_test_lib:compile("SetOfCho", Config, [uper_bin])),
    ?uper_bin(testSetOfCho_cases(uper_bin)),

    asn1_test_lib:compile("SetOfCho", Config, [?PER, optimize]),
    testSetOfCho_cases(?PER).

testSetOfCho_cases(Rules) ->
    testSetOfCho:main(Rules).


testSetOfExternal(suite) -> [];
testSetOfExternal(Config) ->
    asn1_test_lib:compile("External", Config, [?BER]),
    asn1_test_lib:compile("SetOfExternal", Config, [?BER]),
    testSetOfExternal_cases(?BER),

    ?ber_nif(?BER, asn1_test_lib:compile("External", Config, [?BER, nif])),
    ?ber_nif(?BER, asn1_test_lib:compile("SetOfExternal", Config, [?BER, nif])),
    ?ber_nif(?BER, testSetOfExternal_cases(?BER)),

    asn1_test_lib:compile("External", Config, [?PER]),
    asn1_test_lib:compile("SetOfExternal", Config, [?PER]),
    testSetOfExternal_cases(?PER),

    ?per_bit_opt(asn1_test_lib:compile("External", Config, [?PER, optimize])),
    ?per_bit_opt(asn1_test_lib:compile("SetOfExternal", Config, [?PER, optimize])),
    ?per_bit_opt(testSetOfExternal_cases(?PER)),

    ?uper_bin(asn1_test_lib:compile("External", Config, [uper_bin])),
    ?uper_bin(asn1_test_lib:compile("SetOfExternal", Config, [uper_bin])),
    ?uper_bin(testSetOfExternal_cases(uper_bin)),

    asn1_test_lib:compile("External", Config, [?PER, optimize]),
    asn1_test_lib:compile("SetOfExternal", Config, [?PER, optimize]),
    testSetOfExternal_cases(?PER).

testSetOfExternal_cases(Rules) ->
    testSetOfExternal:main(Rules).




testSetOfTag(suite) -> [];
testSetOfTag(Config) ->
    asn1_test_lib:compile("External", Config, [?BER]),
    asn1_test_lib:compile("SetOfTag", Config, [?BER]),
    testSetOfTag_cases(?BER),

    ?ber_nif(?BER, asn1_test_lib:compile("External", Config, [?BER, nif])),
    ?ber_nif(?BER, asn1_test_lib:compile("SetOfTag", Config, [?BER, nif])),
    ?ber_nif(?BER, testSetOfTag_cases(?BER)),

    asn1_test_lib:compile("External", Config, [?PER]),
    asn1_test_lib:compile("SetOfTag", Config, [?PER]),
    testSetOfTag_cases(?PER),

    ?per_bit_opt(asn1_test_lib:compile("External", Config, [?PER, optimize])),
    ?per_bit_opt(asn1_test_lib:compile("SetOfTag", Config, [?PER, optimize])),
    ?per_bit_opt(testSetOfTag_cases(?PER)),

    ?uper_bin(asn1_test_lib:compile("External", Config, [uper_bin])),
    ?uper_bin(asn1_test_lib:compile("SetOfTag", Config, [uper_bin])),
    ?uper_bin(testSetOfTag_cases(uper_bin)),

    asn1_test_lib:compile("External", Config, [?PER, optimize]),
    asn1_test_lib:compile("SetOfTag", Config, [?PER, optimize]),
    testSetOfTag_cases(?PER).

testSetOfTag_cases(Rules) ->
    testSetOfTag:main(Rules).


sequence(suite) -> [{sequence, all}].

c_syntax(suite) -> [];
c_syntax(Config) ->
    DataDir%    asn1_test_lib:compile("External", Config, ?PER),
%    testPrimExternal:compile(Config, ?PER),
%    testPrimExternal_cases(?PER).
 = ?config(data_dir, Config),
    _TempDir = ?config(priv_dir, Config),
    {error, _R1} = asn1ct:compile(filename:join(DataDir, "Syntax")),
    {error, _R2} = asn1ct:compile(filename:join(DataDir, "BadTypeEnding")),
    {error, _R3} = asn1ct:compile(filename:join(DataDir,
                            "BadValueAssignment1")),
    {error, _R4} = asn1ct:compile(filename:join(DataDir,
                                                    "BadValueAssignment2")),
    {error, _R5} = asn1ct:compile(filename:join(DataDir,
                            "BadValueSet")),
    {error, _R6} = asn1ct:compile(filename:join(DataDir,
                            "ChoiceBadExtension")),
    {error, _R7} = asn1ct:compile(filename:join(DataDir,
                        "EnumerationBadExtension")),
    {error, _R8} = asn1ct:compile(filename:join(DataDir,
                            "Example")),
    {error, _R9} = asn1ct:compile(filename:join(DataDir,
                            "Export1")),
    {error, _R10} = asn1ct:compile(filename:join(DataDir,
                             "MissingEnd")),
    {error, _R11} = asn1ct:compile(filename:join(DataDir,
                             "SequenceBadComma")),
    {error, _R12} = asn1ct:compile(filename:join(DataDir,
                        "SequenceBadComponentName")),
    {error, _R13} = asn1ct:compile(filename:join(DataDir,
                        "SequenceBadComponentType")),
    {error, _R14} = asn1ct:compile(filename:join(DataDir,
                        "SeqBadComma")).


c_string_per(suite) -> [];
c_string_per(Config) ->
    asn1_test_lib:compile("String", Config, [?PER]).

c_string_ber(suite) -> [];
c_string_ber(Config) ->
    asn1_test_lib:compile("String", Config, [?BER]).


c_implicit_before_choice(suite) -> [];
c_implicit_before_choice(Config) ->
    DataDir = ?config(data_dir, Config),
    TempDir = ?config(priv_dir, Config),
    {error, _R2} = asn1ct:compile(filename:join(DataDir, "CCSNARG3"),
                                  [?BER, {outdir, TempDir}]).

parse(suite) -> [];
parse(Config) ->
    M1 = test_modules(),
    ok = parse1(M1, Config).

parse1([M|T], Config) ->
    asn1_test_lib:compile(M, Config, [abs]),
    parse1(T, Config);
parse1([], _) ->
    ok.

per(suite) -> [];
per(Config) ->
    CaseDir = ?config(case_dir, Config),
    ok = per1(per_modules(), Config, CaseDir),
    ?per_bit_opt(per1_bit_opt(per_modules(), Config, CaseDir)).


per1([M|T], Config, CaseDir) ->
    asn1_test_lib:compile(M, Config, [?PER]),
    ok = asn1ct:test(list_to_atom(M), [{i, CaseDir}]),
    per1(T, Config, CaseDir);
per1([], _, _) ->
    ok.

per1_bit_opt([M|T], Config, CaseDir) ->
    asn1_test_lib:compile(M, Config, [?PER, optimize]),
    ok = asn1ct:test(list_to_atom(M), [{i, CaseDir}]),
    per1_bit_opt(T, Config, CaseDir);
per1_bit_opt([], _, _) ->
    ok.

ber_choiceinseq(suite) ->[];
ber_choiceinseq(Config) ->
    asn1_test_lib:compile("ChoiceInSeq", Config, [?BER]).

ber_optional(suite) ->[];
ber_optional(Config) ->
    asn1_test_lib:compile("SOpttest", Config, [?BER]),

    V = {'S', {'A', 10, asn1_NOVALUE, asn1_NOVALUE},
              {'B', asn1_NOVALUE, asn1_NOVALUE, asn1_NOVALUE},
              {'C', asn1_NOVALUE, 111, asn1_NOVALUE}},
    {ok, B} = asn1_wrapper:encode('SOpttest', 'S', V),
    Bytes = lists:flatten(B),
    V2 = asn1_wrapper:decode('SOpttest', 'S', Bytes),
    V = element(2, V2).

ber_optional_keyed_list(suite) ->[];
ber_optional_keyed_list(Config) ->
    case ?BER of
        ber_bin_v2 ->
            ok;
        _ ->
            asn1_test_lib:compile("SOpttest", Config, [?BER, keyed_list]),
            Vrecord = {'S', {'A', 10,           asn1_NOVALUE, asn1_NOVALUE},
                            {'B', asn1_NOVALUE, asn1_NOVALUE, asn1_NOVALUE},
                            {'C', asn1_NOVALUE, 111,          asn1_NOVALUE}},
            V = [{a, [{scriptKey, 10}]},
                 {b, []},
                 {c, [{callingPartysCategory, 111}]}],
            {ok, B} = asn1_wrapper:encode('SOpttest', 'S', V),
            Bytes = lists:flatten(B),
            V2 = asn1_wrapper:decode('SOpttest', 'S', Bytes),
            Vrecord = element(2, V2)
    end.

ber_other(suite) ->[];
ber_other(Config) ->
    CaseDir = ?config(case_dir, Config),
    ok = ber1(ber_modules(), Config, CaseDir).


ber1([M|T], Config, CaseDir) ->
    asn1_test_lib:compile(M, Config, [?BER]),
    ok = asn1ct:test(list_to_atom(M), [{i, CaseDir}]),
    ber1(T, Config, CaseDir);
ber1([], _, _) ->
    ok.

default_per(suite) ->[];
default_per(Config) ->
    default1(Config, [?PER]).

default_per_opt(suite) -> [];
default_per_opt(Config) ->
    ?per_bit_opt(default1(Config, [?PER, optimize])),
    default1(Config, [?PER, optimize]).

default_ber(suite) ->[];
default_ber(Config) ->
    default1(Config, [?BER]).

default1(Config, Options) ->
    asn1_test_lib:compile("Def", Config, Options),

    {ok, Bytes1} = asn1_wrapper:encode('Def', 'Def1', #'Def1'{bool0 = true,
                                                              bool1 = true,
                                                              bool2 = true,
                                                              bool3 = true}),
    {ok, {'Def1', true, true, true, true}} =
        asn1_wrapper:decode('Def', 'Def1', lists:flatten(Bytes1)),

    {ok, Bytes2} = asn1_wrapper:encode('Def', 'Def1', #'Def1'{bool0 = true}),
    {ok, {'Def1', true, false, false, false}} =
        asn1_wrapper:decode('Def', 'Def1', lists:flatten(Bytes2)),

    {ok, Bytes3} = asn1_wrapper:encode('Def', 'Def1', #'Def1'{bool0 = true,
                                                              bool2 = false}),
    {ok, {'Def1', true, false, false, false}} =
        asn1_wrapper:decode('Def', 'Def1', lists:flatten(Bytes3)).


value_test(suite) ->[];
value_test(Config) ->
    asn1_test_lib:compile("ObjIdValues", Config, [?BER]),
    {ok, _} = asn1_wrapper:encode('ObjIdValues', 'ObjIdType', 'ObjIdValues':'mobileDomainId'()),
    asn1_test_lib:compile("ObjIdValues", Config, [?PER]),
    {ok, _} = asn1_wrapper:encode('ObjIdValues', 'ObjIdType', 'ObjIdValues':'mobileDomainId'()),
    ok = test_bad_values:tests(Config),
    ok.


constructed(suite) ->
     [];
constructed(Config) ->
    asn1_test_lib:compile("Constructed", Config, [?BER]),
    {ok, B} = asn1_wrapper:encode('Constructed', 'S', {'S', false}),
    [40, 3, 1, 1, 0] = lists:flatten(B),
    {ok, B1} = asn1_wrapper:encode('Constructed', 'S2', {'S2', false}),
    [40, 5, 48, 3, 1, 1, 0] = lists:flatten(B1),
    {ok, B2} = asn1_wrapper:encode('Constructed', 'I', 10),
    [136, 1, 10] = lists:flatten(B2),
    ok.

ber_decode_error(suite) -> [];
ber_decode_error(Config) ->
    asn1_test_lib:compile("Constructed", Config, [?BER]),
    ok = ber_decode_error:run([]),

    ?ber_nif(?BER, asn1_test_lib:compile("Constructed", Config, [?BER, nif])),
    ok = ?ber_nif(?BER, ber_decode_error:run([nif])),
    ok.

h323test(suite) ->
    [];
h323test(Config) ->
    Files = ["H235-SECURITY-MESSAGES",
             "H323-MESSAGES",
             "MULTIMEDIA-SYSTEM-CONTROL"],
    asn1_test_lib:compile_all(Files, Config, [?PER]),
    ok = h323test:run(?PER),
    ?per_bit_opt(asn1_test_lib:compile_all(Files, Config, [?PER, optimize])),
    ?per_bit_opt(h323test:run(?PER)),
    ?uper_bin(asn1_test_lib:compile_all(Files, Config, [uper_bin])),
    ?uper_bin(h323test:run(uper_bin)),
    ok = asn1_test_lib:compile_all(Files, Config, [?PER, optimize]),
    ok = h323test:run(?PER),
    ok.

per_GeneralString(suite) ->
     [];
per_GeneralString(Config) ->
    asn1_test_lib:compile("MULTIMEDIA-SYSTEM-CONTROL", Config, [?PER]),
    UI = [109, 64, 1, 57],
    {ok, _V} = asn1_wrapper:decode('MULTIMEDIA-SYSTEM-CONTROL',
                                   'MultimediaSystemControlMessage', UI).

per_open_type(suite) ->
    [];
per_open_type(Config) ->
    asn1_test_lib:compile("OpenType", Config, [?PER]),

    Stype = {'Stype', 10, true},
    {ok, Bytes} = asn1_wrapper:encode('OpenType', 'Ot', Stype),
    {ok, Stype} = asn1_wrapper:decode('OpenType', 'Ot', Bytes),

    ?per_bit_opt(asn1_test_lib:compile("OpenType", Config, [?PER, optimize])),
    ?per_bit_opt({ok, Bytes}=asn1_wrapper:encode('OpenType', 'Ot', Stype)),
    ?per_bit_opt({ok, Stype}=asn1_wrapper:decode('OpenType', 'Ot', Bytes)),

    ?uper_bin(asn1_test_lib:compile("OpenType", Config, [uper_bin])),
    ?uper_bin({ok, Bytes}=asn1_wrapper:encode('OpenType', 'Ot', Stype)),
    ?uper_bin({ok, Stype}=asn1_wrapper:decode('OpenType', 'Ot', Bytes)),

    asn1_test_lib:compile("OpenType", Config, [?PER, optimize]),
    {ok, Bytes} = asn1_wrapper:encode('OpenType', 'Ot', Stype),
    {ok, Stype} = asn1_wrapper:decode('OpenType', 'Ot', Bytes).

testConstraints(suite) ->
    [];
testConstraints(Config) ->
    asn1_test_lib:compile("Constraints", Config, [?BER]),
    testConstraints:int_constraints(?BER),

    ?ber_nif(?BER, asn1_test_lib:compile("Constraints", Config, [?BER, nif])),
    ?ber_nif(?BER, testConstraints:int_constraints(?BER)),

    asn1_test_lib:compile("Constraints", Config, [?PER]),
    testConstraints:int_constraints(?PER),
    testConstraints:refed_NNL_name(?PER),

    ?per_bit_opt(asn1_test_lib:compile("Constraints", Config, [?PER, optimize])),
    ?per_bit_opt(testConstraints:int_constraints(?PER)),
    ?per_bit_opt(testConstraints:refed_NNL_name(?PER)),

    ?uper_bin(asn1_test_lib:compile("Constraints", Config, [uper_bin])),
    ?uper_bin(testConstraints:int_constraints(uper_bin)),
    ?uper_bin(testConstraints:refed_NNL_name(uper_bin)),

    asn1_test_lib:compile("Constraints", Config, [?PER, optimize]),
    testConstraints:int_constraints(?PER),
    testConstraints:refed_NNL_name(?PER).

testSeqIndefinite(suite) -> [];
testSeqIndefinite(Config) ->
    asn1_test_lib:compile("SeqSetIndefinite", Config, [?BER]),
    testSeqIndefinite:main(?BER),

    ?ber_nif(?BER, asn1_test_lib:compile("SeqSetIndefinite", Config, [?BER, nif])),
    ?ber_nif(?BER, testSeqIndefinite:main(?BER)).

testSetIndefinite(suite) -> [];
testSetIndefinite(Config) ->
    asn1_test_lib:compile("SeqSetIndefinite", Config, [?BER]),
    testSetIndefinite:main(?BER),

    ?ber_nif(?BER, asn1_test_lib:compile("SeqSetIndefinite", Config, [?BER, nif])),
    ?ber_nif(?BER, testSetIndefinite:main(?BER)).

testChoiceIndefinite(suite) -> [];
testChoiceIndefinite(Config) ->
    testChoiceIndefinite:compile(Config, ?BER, []),
    testChoiceIndefinite:main(?BER),

    ?ber_nif(?BER, testChoiceIndefinite:compile(Config, ?BER, [nif])),
    ?ber_nif(?BER, testChoiceIndefinite:main(?BER)).

testInfObjectClass(suite) ->
    [];
testInfObjectClass(Config) ->
    Files = ["ErrorClass", "InfClass"],
    InfObjFiles = ["RANAPextract1", "InfObj", "MAP-ExtensionDataTypes",
                   "Objects", "INAPv2extract"],
    RANAPFiles = ["RANAP-CommonDataTypes", "RANAP-Constants",
                  "RANAP-Containers", "RANAP-IEs", "RANAP-PDU-Contents",
                  "RANAP-PDU-Descriptions"],
    asn1_test_lib:compile_all(Files, Config, [?PER]),
    testInfObjectClass:main(?PER),
    asn1_test_lib:compile_all(InfObjFiles, Config, [?PER]),
    testInfObj:main(?PER),

    ?uper_bin(asn1_test_lib:compile_all(Files, Config, [uper_bin])),
    ?uper_bin(testInfObjectClass:main(uper_bin)),
    ?uper_bin(asn1_test_lib:compile_all(InfObjFiles, Config, [uper_bin])),
    ?uper_bin(testInfObj:main(uper_bin)),

    asn1_test_lib:compile_all(Files, Config, [?PER, optimize]),
    testInfObjectClass:main(?PER),
    asn1_test_lib:compile_all(InfObjFiles, Config, [?PER, optimize]),
    testInfObj:main(?PER),

    asn1_test_lib:compile_all(Files, Config, [?BER]),
    testInfObjectClass:main(?BER),
    asn1_test_lib:compile_all(InfObjFiles, Config, [?BER]),
    testInfObj:main(?BER),

    ?ber_nif(?BER, asn1_test_lib:compile_all(Files, Config, [?BER, nif])),
    ?ber_nif(?BER, testInfObjectClass:main(?BER)),
    ?ber_nif(?BER, asn1_test_lib:compile_all(InfObjFiles, Config, [?BER, nif])),
    ?ber_nif(?BER, testInfObj:main(?BER)),

    asn1_test_lib:compile_all(RANAPFiles, Config, [?PER]),

    ?uper_bin(asn1_test_lib:compile_all(RANAPFiles, Config, [uper_bin])),

    asn1_test_lib:compile_all(RANAPFiles, Config, [?PER, optimize]),

    asn1_test_lib:compile_all(RANAPFiles, Config, [?BER]).

testParameterizedInfObj(suite) ->
    [];
testParameterizedInfObj(Config) ->
    asn1_test_lib:compile("Param", Config, [?PER]),
    testParameterizedInfObj:main(?PER),

    % TODO: Remove all ?per_bit_opt(...) which has an equiv without macro
    ?per_bit_opt(asn1_test_lib:compile("Param", Config, [?PER, optimize])),
    ?per_bit_opt(testParameterizedInfObj:main(?PER)),

    ?uper_bin(asn1_test_lib:compile("Param", Config, [uper_bin])),
    ?uper_bin(testParameterizedInfObj:main(uper_bin)),

    asn1_test_lib:compile("Param", Config, [?PER, optimize]),
    testParameterizedInfObj:main(?PER),

    asn1_test_lib:compile("Param", Config, [?BER]),
    testParameterizedInfObj:main(?BER),

    ?ber_nif(?BER, asn1_test_lib:compile("Param", Config, [?BER, nif])),
    ?ber_nif(?BER, testParameterizedInfObj:main(?BER)).

testMergeCompile(suite) ->
    [];
testMergeCompile(Config) ->
    Files = ["MS.set.asn", "RANAPSET.set.asn1", "Mvrasn4.set.asn",
             "Mvrasn6.set.asn"],
    asn1_test_lib:compile_all(Files, Config, [?PER]),
    testMergeCompile:main(?PER),
    testMergeCompile:mvrasn(?PER),

    ?per_bit_opt(asn1_test_lib:compile_all(Files, Config, [?PER, optimize])),
    ?per_bit_opt(testMergeCompile:main(?PER)),
    ?per_bit_opt(testMergeCompile:mvrasn(?PER)),

    ?uper_bin(asn1_test_lib:compile_all(Files, Config, [uper_bin])),
    ?uper_bin(testMergeCompile:main(uper_bin)),
    ?uper_bin(testMergeCompile:mvrasn(uper_bin)),

    asn1_test_lib:compile_all(Files, Config, [?BER]),
    testMergeCompile:main(?BER),
    testMergeCompile:mvrasn(?BER),

    ?ber_nif(?BER, asn1_test_lib:compile_all(Files, Config, [?BER, nif])),
    ?ber_nif(?BER, testMergeCompile:main(?BER)),
    ?ber_nif(?BER, testMergeCompile:mvrasn(?BER)).

testobj(suite) ->
    [];
testobj(Config) ->
    ok = testRANAP:compile(Config, [?PER]),
    ok = testRANAP:testobj(?PER),
    ok = testParameterizedInfObj:ranap(?PER),

    ?per_bit_opt(ok = testRANAP:compile(Config, [?PER, optimize])),
    ?per_bit_opt(ok = testRANAP:testobj(?PER)),
    ?per_bit_opt(ok = testParameterizedInfObj:ranap(?PER)),

    ?uper_bin(ok = testRANAP:compile(Config, [uper_bin])),
    ?uper_bin(ok = testRANAP:testobj(uper_bin)),
    ?uper_bin(ok = testParameterizedInfObj:ranap(uper_bin)),

    ok = testRANAP:compile(Config, [?PER, optimize]),
    ok = testRANAP:testobj(?PER),
    ok = testParameterizedInfObj:ranap(?PER),

    ok = testRANAP:compile(Config, [?BER]),
    ok = testRANAP:testobj(?BER),
    ok = testParameterizedInfObj:ranap(?BER),

    ?ber_nif(?BER, testRANAP:compile(Config, [?BER, nif])),
    ?ber_nif(?BER, testRANAP:testobj(?BER)),
    ?ber_nif(?BER, testParameterizedInfObj:ranap(?BER)).


testDeepTConstr(suite) ->
    [];
testDeepTConstr(Config) ->
    asn1_test_lib:compile("TConstrChoice", Config, [?PER]),
    asn1_test_lib:compile("TConstr", Config, [?PER]),
    testDeepTConstr:main(?PER),

    ?per_bit_opt(asn1_test_lib:compile("TConstrChoice", Config, [?PER, optimize])),
    ?per_bit_opt(asn1_test_lib:compile("TConstr", Config, [?PER, optimize])),
    ?per_bit_opt(testDeepTConstr:main(?PER)),

    ?uper_bin(asn1_test_lib:compile("TConstrChoice", Config, [uper_bin])),
    ?uper_bin(asn1_test_lib:compile("TConstr", Config, [uper_bin])),
    ?uper_bin(testDeepTConstr:main(uper_bin)),

    asn1_test_lib:compile("TConstrChoice", Config, [?PER, optimize]),
    asn1_test_lib:compile("TConstr", Config, [?PER, optimize]),
    testDeepTConstr:main(?PER),

    asn1_test_lib:compile("TConstrChoice", Config, [?BER]),
    asn1_test_lib:compile("TConstr", Config, [?BER]),
    testDeepTConstr:main(?BER),

    ?ber_nif(?BER, asn1_test_lib:compile("TConstrChoice", Config, [?BER, nif])),
    ?ber_nif(?BER, asn1_test_lib:compile("TConstr", Config, [?BER, nif])),
    ?ber_nif(?BER, testDeepTConstr:main(?BER)).

testInvokeMod(suite) ->
    [];
testInvokeMod(Config) ->
    asn1_test_lib:compile("PrimStrings", Config, []),
    {ok, _Result1} = 'PrimStrings':encode('Bs1', [1, 0, 1, 0]),
    asn1_test_lib:compile("PrimStrings", Config, [?PER]),
    {ok, _Result2} = 'PrimStrings':encode('Bs1', [1, 0, 1, 0]).

testExport(suite) ->
    [];
testExport(Config) ->
    DataDir = ?config(data_dir, Config),
    CaseDir = ?config(case_dir, Config),
    {error, {asn1, _Reason}} =
        asn1ct:compile(filename:join(DataDir, "IllegalExport"),
                       [{outdir, CaseDir}]).

testImport(suite) ->
    [];
testImport(Config) ->
    DataDir = ?config(data_dir, Config),
    CaseDir = ?config(priv_dir, Config),
    {error, _} = asn1ct:compile(filename:join(DataDir, "ImportsFrom"),
                                [?BER, {outdir, CaseDir}]).

testMegaco(suite) ->
    [];
testMegaco(Config) ->
    {ok, ModuleName1, ModuleName2} = testMegaco:compile(Config, ?BER, []),
    ok = testMegaco:main(ModuleName1, Config),
    ok = testMegaco:main(ModuleName2, Config),

    case ?BER of
        ber_bin_v2 ->
            {ok, ModuleName3, ModuleName4} = testMegaco:compile(Config, ?BER, [nif]),
            ok = testMegaco:main(ModuleName3, Config),
            ok = testMegaco:main(ModuleName4, Config);
        _->
            ok
    end,

    {ok, ModuleName5, ModuleName6} = testMegaco:compile(Config, ?PER, []),
    ok = testMegaco:main(ModuleName5, Config),
    ok = testMegaco:main(ModuleName6, Config),

    ?per_bit_opt({ok, ModuleName5, ModuleName6} = testMegaco:compile(Config, ?PER, [optimize])),
    ?per_bit_opt(ok = testMegaco:main(ModuleName5, Config)),
    ?per_bit_opt(ok = testMegaco:main(ModuleName6, Config)),

    ?uper_bin({ok, ModuleName5, ModuleName6} = testMegaco:compile(Config, uper_bin, [])),
    ?uper_bin(ok = testMegaco:main(ModuleName5, Config)),
    ?uper_bin(ok = testMegaco:main(ModuleName6, Config)),

    {ok, ModuleName7, ModuleName8} = testMegaco:compile(Config, ?PER, [optimize]),
    ok = testMegaco:main(ModuleName7, Config),
    ok = testMegaco:main(ModuleName8, Config).


testMvrasn6(suite) -> [];
testMvrasn6(Config) ->
    asn1_test_lib:compile("Mvrasn-21-4", Config, [?BER]),
    asn1_test_lib:compile("Mvrasn-20-6", Config, [?BER]),
    asn1_test_lib:compile("Mvrasn-19-6", Config, [?BER]),
    asn1_test_lib:compile("Mvrasn-15-6", Config, [?BER]),
    asn1_test_lib:compile("Mvrasn-18-6", Config, [?BER]),
    asn1_test_lib:compile("Mvrasn-14-6", Config, [?BER]),
    asn1_test_lib:compile("Mvrasn-11-6", Config, [?BER]).

testContextSwitchingTypes(suite) -> [];
testContextSwitchingTypes(Config) ->
    asn1_test_lib:compile("ContextSwitchingTypes", Config, [?BER]),
    testContextSwitchingTypes:test(Config),

    ?ber_nif(?BER, asn1_test_lib:compile("ContextSwitchingTypes", Config, [?BER, nif])),
    ?ber_nif(?BER, testContextSwitchingTypes:test(Config)),

    asn1_test_lib:compile("ContextSwitchingTypes", Config, [?PER]),
    testContextSwitchingTypes:test(Config),

    ?per_bit_opt(asn1_test_lib:compile("ContextSwitchingTypes", Config, [?PER, optimize])),
    ?per_bit_opt(testContextSwitchingTypes:test(Config)),

    ?uper_bin(asn1_test_lib:compile("ContextSwitchingTypes", Config, [uper_bin])),
    ?uper_bin(testContextSwitchingTypes:test(Config)),

    asn1_test_lib:compile("ContextSwitchingTypes", Config, [?PER, optimize]),
    testContextSwitchingTypes:test(Config).

testTypeValueNotation(suite) -> [];
testTypeValueNotation(Config) ->
    Files = ["SeqTypeRefPrim",
             "ValueTest"], % OTP-6695
    case ?BER of
        Ber when Ber == ber; Ber == ber_bin ->
            asn1_test_lib:compile_all(Files, Config, [?BER]),
            testTypeValueNotation:main(?BER, dummy);
        _ ->
            ok
    end,

    ?ber_nif(?BER, asn1_test_lib:compile_all(Files, Config, [?BER, nif])),
    ?ber_nif(?BER, testTypeValueNotation:main(?BER, optimize)),

    case ?BER of
    Ber2 when Ber2 == ber; Ber2 == ber_bin ->
        asn1_test_lib:compile_all(Files, Config, [?PER]),
        testTypeValueNotation:main(?PER, dummy);
    _ ->
        ok
    end,

    ?per_bit_opt(asn1_test_lib:compile_all(Files, Config, [?PER, optimize])),
    ?per_bit_opt(testTypeValueNotation:main(?PER, optimize)),

    ?uper_bin(asn1_test_lib:compile_all(Files, Config, [uper_bin])),
    ?uper_bin(testTypeValueNotation:main(uper_bin, optimize)),
    case ?BER of
    Ber3 when Ber3 == ber; Ber3 == ber_bin ->
        asn1_test_lib:compile_all(Files, Config, [?PER, optimize]),
        testTypeValueNotation:main(?PER, optimize);
    _ ->
        ok
     end.

testOpenTypeImplicitTag(suite) -> [];
testOpenTypeImplicitTag(Config) ->
    asn1_test_lib:compile("OpenTypeImplicitTag", Config, [?BER]),
    testOpenTypeImplicitTag:main(?BER),

    ?ber_nif(?BER, asn1_test_lib:compile("OpenTypeImplicitTag", Config, [?BER, nif])),
    ?ber_nif(?BER, testOpenTypeImplicitTag:main(?BER)),

    asn1_test_lib:compile("OpenTypeImplicitTag", Config, [?PER]),
    testOpenTypeImplicitTag:main(?PER),

    ?per_bit_opt(asn1_test_lib:compile("OpenTypeImplicitTag", Config, [?PER, optimize])),
    ?per_bit_opt(testOpenTypeImplicitTag:main(?PER)),

    ?uper_bin(asn1_test_lib:compile("OpenTypeImplicitTag", Config, [uper_bin])),
    ?uper_bin(testOpenTypeImplicitTag:main(uper_bin)),

    asn1_test_lib:compile("OpenTypeImplicitTag", Config, [?PER, optimize]),
    testOpenTypeImplicitTag:main(?PER).

duplicate_tags(suite) -> [];
duplicate_tags(Config) ->
    DataDir = ?config(data_dir, Config),
    CaseDir = ?config(case_dir, Config),
    {error, {asn1, [{error, {type, _, _, 'SeqOpt1Imp', {asn1, {duplicates_of_the_tags, _}}}}]}} =
    asn1ct:compile(filename:join(DataDir, "SeqOptional2"),
                   [abs, {outdir, CaseDir}]).

rtUI(suite) -> [];
rtUI(Config) ->
    asn1_test_lib:compile("Prim", Config, [?BER]),
    {ok, _} = asn1rt:info('Prim'),
    asn1_test_lib:compile("Prim", Config, [?PER]),
    {ok, _} = asn1rt:info('Prim').

testROSE(suite) -> [];
testROSE(Config) ->
    asn1_test_lib:compile("Remote-Operations-Merged.set.asn1", Config, [?BER]),
    asn1_test_lib:compile("Remote-Operations-Merged.set.asn1", Config, [?PER]),
    ?per_bit_opt(asn1_test_lib:compile("Remote-Operations-Merged.set.asn1", Config, [?PER, optimize])),
    ?uper_bin(asn1_test_lib:compile("Remote-Operations-Merged.set.asn1", Config, [uper_bin])),
    asn1_test_lib:compile("Remote-Operations-Merged.set.asn1", Config, [?PER, optimize]).

testINSTANCE_OF(suite) -> [];
testINSTANCE_OF(Config) ->
    asn1_test_lib:compile("INSTANCEOF.asn1", Config, [?BER]),
    testINSTANCE_OF:main(?BER),

    ?ber_nif(?BER, asn1_test_lib:compile("INSTANCEOF.asn1", Config, [?BER, nif])),
    ?ber_nif(?BER, testINSTANCE_OF:main(?BER)),

    asn1_test_lib:compile("INSTANCEOF.asn1", Config, [?PER]),
    testINSTANCE_OF:main(?PER),

    ?per_bit_opt(asn1_test_lib:compile("INSTANCEOF.asn1", Config, [?PER, optimize])),
    ?per_bit_opt(testINSTANCE_OF:main(?PER)),

    ?uper_bin(asn1_test_lib:compile("INSTANCEOF.asn1", Config, [uper_bin])),
    ?uper_bin(testINSTANCE_OF:main(uper_bin)),

    asn1_test_lib:compile("INSTANCEOF.asn1", Config, [?PER, optimize]),
    testINSTANCE_OF:main(?PER).

testTCAP(suite) -> [];
testTCAP(Config) ->
    testTCAP:compile(Config, [?BER]),
    testTCAP:test(?BER, Config),

    ?ber_nif(?BER, testTCAP:compile(Config, [?BER, nif])),
    ?ber_nif(?BER, testTCAP:test(?BER, Config)),

    ?ber_nif(?BER, testTCAP:compile_asn1config(Config, [?BER, asn1config])),
    ?ber_nif(?BER, testTCAP:test_asn1config()).

testDER(suite) ->[];
testDER(Config) ->
    asn1_test_lib:compile("DERSpec", Config, [?BER, der]),
    testDER:test(),

    ?ber_nif(?BER, asn1_test_lib:compile("DERSpec", Config, [?BER, der, nif])),
    ?ber_nif(?BER, testDER:test()),

    asn1_test_lib:compile("ParamBasic", Config, [?BER, der]),
    testParamBasic_cases(der),

    asn1_test_lib:compile("Default", Config, [?BER, der]),
    testSeqSetDefaultVal_cases(?BER).

testSeqSetDefaultVal_cases(?BER) ->
    testSeqSetDefaultVal:main(?BER).


specialized_decodes(suite) -> [];
specialized_decodes(Config) ->
    case ?BER of
        ber_bin_v2 ->
            asn1_test_lib:compile_all(["PartialDecSeq.asn",
                                       "PartialDecSeq2.asn",
                                       "PartialDecSeq3.asn",
                                       "PartialDecMyHTTP.asn",
                                       "MEDIA-GATEWAY-CONTROL.asn",
                                       "P-Record"],
                                      Config, [?BER, optimize, asn1config]),
            test_partial_incomplete_decode:test(Config),
            test_selective_decode:test();
        Rule ->
            {skip, lists:concat(["not implemented yet for version: ", Rule])}
    end.

special_decode_performance(suite) ->[];
special_decode_performance(Config) ->
    Files = ["MEDIA-GATEWAY-CONTROL", "PartialDecSeq"],
    ?ber_nif(?BER, asn1_test_lib:compile_all(Files, Config,
                                                [?BER, optimize, asn1config])),
    ?ber_nif(?BER, test_special_decode_performance:go(all)).


test_driver_load(suite) -> [];
test_driver_load(Config) ->
    case ?PER of
        per_bin ->
            asn1_test_lib:compile("P-Record", Config, [?PER, optimize]),
            test_driver_load:test(5);
        _ ->
            ok
    end.

test_ParamTypeInfObj(suite) -> [];
test_ParamTypeInfObj(Config) ->
    asn1_test_lib:compile("IN-CS-1-Datatypes", Config, [ber_bin]).

test_WS_ParamClass(suite) -> [];
test_WS_ParamClass(Config) ->
    asn1_test_lib:compile("InformationFramework", Config, [ber_bin]).

test_Defed_ObjectIdentifier(suite) -> [];
test_Defed_ObjectIdentifier(Config) ->
    asn1_test_lib:compile("UsefulDefinitions", Config, [ber_bin]).

testSelectionType(suite) -> [];
testSelectionType(Config) ->
    asn1_test_lib:compile("SelectionType", Config, [?BER]),
    {ok, _}  = testSelectionTypes:test(),
    asn1_test_lib:compile("SelectionType", Config, [?PER]),
    {ok, _}  = testSelectionTypes:test().

testSSLspecs(suite) -> [];
testSSLspecs(Config) ->
    ok = testSSLspecs:compile(Config,
                              [?BER, optimize, compact_bit_string, der]),
    testSSLspecs:run(?BER),

    case code:which(asn1ct) of
       cover_compiled ->
           ok;
       _ ->
           ok = testSSLspecs:compile_inline(Config, ?BER),
           ok = testSSLspecs:run_inline(?BER)
    end.

testNortel(suite) -> [];
testNortel(Config) ->
    asn1_test_lib:compile("Nortel", Config, [?BER]),
    asn1_test_lib:compile("Nortel", Config, [?BER, optimize]),
    asn1_test_lib:compile("Nortel", Config, [?BER, optimize, nif]),
    asn1_test_lib:compile("Nortel", Config, [?PER]),
    ?per_bit_opt(asn1_test_lib:compile("Nortel", Config, [?PER, optimize])),
    ?uper_bin(asn1_test_lib:compile("Nortel", Config, [uper_bin])),
    asn1_test_lib:compile("Nortel", Config, [?PER, optimize]).

test_undecoded_rest(suite) -> [];
test_undecoded_rest(Config) ->

    asn1_test_lib:compile("P-Record", Config, [?BER]),
    ok = test_undecoded_rest:test([], Config),

    asn1_test_lib:compile("P-Record", Config, [?BER, undec_rest]),
    ok = test_undecoded_rest:test(undec_rest, Config),

    asn1_test_lib:compile("P-Record", Config, [?PER]),
    ok = test_undecoded_rest:test([], Config),

    ?per_bit_opt(asn1_test_lib:compile("P-Record", Config, [?PER, optimize, undec_rest])),
    ?per_bit_opt(ok = test_undecoded_rest:test(undec_rest, Config)),

    ?uper_bin(asn1_test_lib:compile("P-Record", Config, [uper_bin, undec_rest])),
    ?uper_bin(ok = test_undecoded_rest:test(undec_rest, Config)),

    asn1_test_lib:compile("P-Record", Config, [?PER, undec_rest]),
    ok = test_undecoded_rest:test(undec_rest, Config).

test_inline(suite) -> [];
test_inline(Config) ->
    case code:which(asn1ct) of
       cover_compiled ->
          {skip, "Not runnable when cover compiled"};
       _  ->
          ok=test_inline:compile(Config, []),
          test_inline:main(Config, ?BER),
          test_inline:inline1(Config, ?BER, []),
          test_inline:performance2()
    end.

%test_inline_prf(suite) -> [];
%test_inline_prf(Config) ->
%    test_inline:performance(Config).

testTcapsystem(suite) -> [];
testTcapsystem(Config) ->
    testTcapsystem:compile(Config, [?BER]).

testNBAPsystem(suite) -> [];
testNBAPsystem(Config) ->
    ok=testNBAPsystem:compile(Config, [?PER|?per_optimize(?BER)]),
    ok=testNBAPsystem:test(?PER, Config).

test_compile_options(suite) -> [];
test_compile_options(Config) ->
    case code:which(asn1ct) of
       cover_compiled ->
          {skip, "Not runnable when cover compiled"};
       _  ->
          ok = test_compile_options:wrong_path(Config),
          ok = test_compile_options:path(Config),
          ok = test_compile_options:noobj(Config),
      ok = test_compile_options:record_name_prefix(Config),
      ok = test_compile_options:verbose(Config),
      ok = test_compile_options:warnings_as_errors(Config)
    end.

testDoubleEllipses(suite) ->  [];
testDoubleEllipses(Config) ->
    asn1_test_lib:compile("DoubleEllipses", Config, [?BER]),
    testDoubleEllipses:main(?BER),
    ?ber_nif(?BER, asn1_test_lib:compile("DoubleEllipses", Config, [?BER, nif])),
    ?ber_nif(?BER, testDoubleEllipses:main(?BER)),
    ?per_bit_opt(asn1_test_lib:compile("DoubleEllipses", Config, [?PER, optimize])),
    ?per_bit_opt(testDoubleEllipses:main(?PER)),
    ?uper_bin(asn1_test_lib:compile("DoubleEllipses", Config, [uper_bin])),
    ?uper_bin(testDoubleEllipses:main(uper_bin)),
    asn1_test_lib:compile("DoubleEllipses", Config, [?PER|?per_optimize(?BER)]),
    testDoubleEllipses:main(?PER).

test_modified_x420(suite) -> [];
test_modified_x420(Config) ->
    test_modified_x420:compile(Config),
    test_modified_x420:test_io(Config).

testX420(suite) -> [];
testX420(Config) ->
    testX420:compile(?BER, [der], Config),
    ok = testX420:ticket7759(?BER, Config),
    testX420:compile(?PER, [], Config).

test_x691(suite) -> [];
test_x691(Config) ->
    case ?PER of
        per ->
            ok   = test_x691:compile(Config, [uper_bin]),
            true = test_x691:cases(uper_bin, unaligned),
            ok   = test_x691:compile(Config, [?PER]),
            true = test_x691:cases(?PER, aligned),
            ok   = asn1_test_lib:ticket_7708(Config, []),
            ok   = asn1_test_lib:ticket_7763(Config);
        _ ->
            ok   = test_x691:compile(Config, [?PER|?per_optimize(?BER)]),
            true = test_x691:cases(?PER, aligned)
    end.

ticket_6143(suite) -> [];
ticket_6143(Config) ->
    ok = test_compile_options:ticket_6143(Config).

testExtensionAdditionGroup(suite) -> [];
testExtensionAdditionGroup(Config) ->
    DataDir = ?config(data_dir, Config),
    PrivDir = ?config(priv_dir, Config),
    Path = code:get_path(),
    DoIt = fun(Erule) ->
        ok = asn1ct:compile(filename:join(DataDir, "Extension-Addition-Group"), Erule ++ [{outdir, PrivDir}]),
        {ok, _M} = compile:file(filename:join(DataDir, "extensionAdditionGroup"), [{i, PrivDir}, {outdir, PrivDir}, debug_info]),
        ok = extensionAdditionGroup:run(Erule),
            ok = extensionAdditionGroup:run2(Erule),
        ok = asn1ct:compile(filename:join(DataDir, "EUTRA-RRC-Definitions"), Erule ++ [{record_name_prefix, "RRC-"}, {outdir, PrivDir}]),
        ok = extensionAdditionGroup:run3(Erule)
           end,
    [DoIt(Rule)|| Rule <- [[per_bin], [per_bin, optimize], [uper_bin]]],
    %% FIXME problems with automatic tags [ber_bin], [ber_bin, optimize]
    code:set_path(Path).



% parse_modules() ->
%   ["ImportsFrom"].

per_modules() ->
    [X || X <- test_modules()].
ber_modules() ->
    [X || X <- test_modules(),
        X =/= "CommonDataTypes",
        X =/= "DS-EquipmentUser-CommonFunctionOrig-TransmissionPath",
        X =/= "H323-MESSAGES",
            X =/= "H235-SECURITY-MESSAGES",
            X =/= "MULTIMEDIA-SYSTEM-CONTROL"].
test_modules() ->
    _Modules = [
           "BitStr",
           "CAP",
           "CommonDataTypes",
           "Constraints",
           "ContextSwitchingTypes",
           "DS-EquipmentUser-CommonFunctionOrig-TransmissionPath",
           "Enum",
           "From",
           "H235-SECURITY-MESSAGES",
           "H323-MESSAGES",
           %%"MULTIMEDIA-SYSTEM-CONTROL", recursive type , problem for asn1ct:value
           "Import",
           "Int",
           "MAP-commonDataTypes",
% ambigous tags        "MAP-insertSubscriberData-def",
           "Null",
           "Octetstr",
           "One",
           "P-Record",
           "P",
%          "PDUs",
           "Person",
           "PrimStrings",
           "Real",
           "XSeq",
           "XSeqOf",
           "XSet",
           "XSetOf",
           "String",
           "SwCDR",
%          "Syntax",
           "Time"
% ANY          "Tst",
%          "Two",
% errors that should be detected      "UndefType"
] ++
    [
     "SeqSetLib", % must be compiled before Seq and Set
     "Seq",
     "Set",
     "SetOf",
     "SeqOf",
     "Prim",
     "Cho",
     "Def",
         "Opt",
     "ELDAPv3",
     "LDAP"
    ].

test_OTP_9688(Config) ->
    Asn1Mod = "OTP-9688.asn1",
    %%DataDir = ?config(data_dir,Config),     
    PrivDir = ?config(priv_dir,Config),
    Data = "
OTP-9688 DEFINITIONS ::= BEGIN

 foo INTEGER ::= 1
 bar INTEGER ::= 42

 Baz ::= INTEGER {x-y-z1(foo), x-y-z2(bar)}
 Qux ::= SEQUENCE {flerpInfo SEQUENCE {x INTEGER (-10 | -9 | (0..4))} OPTIONAL}

END
",
    File = filename:join(PrivDir,Asn1Mod),
    ok = file:write_file(File, Data),
    %% Does it compile with changes to asn1ct_check and asn1ct_gen_per_rt2ct?
    %% (see ticket)
    ok = asn1ct:compile(File, [{outdir, PrivDir}]).