1# -*- cperl -*- 2 3use ExtUtils::testlib; 4use Test::More; 5use Test::Exception; 6use Test::Warn 0.11; 7use Test::Differences; 8use Test::Memory::Cycle; 9use Config::Model; 10use Config::Model::Lister; 11use Config::Model::Tester::Setup qw/init_test/; 12use Data::Dumper; 13use Log::Log4perl qw(:easy :levels); 14 15use strict; 16use warnings; 17 18my ($model, $trace) = init_test(); 19 20my ( $cat, $models ) = Config::Model::Lister::available_models(1); 21 22eq_or_diff( $cat->{system}, [qw/fstab popcon/], "check available system models" ); 23is( $models->{popcon}{model}, 'PopCon', "check available popcon" ); 24 25eq_or_diff( $cat->{application}, [qw/multistrap/], "check available application models" ); 26 27my $class_name = $model->create_config_class( 28 name => 'Sarge', 29 status => [ D => 'deprecated' ], #could be obsolete, standard 30 description => [ X => 'X-ray (long description)' ], 31 summary => [ X => 'X-ray (summary)' ], 32 33 element => [ 34 [qw/D X Y Z/] => { 35 type => 'leaf', 36 class => 'Config::Model::Value', 37 value_type => 'enum', 38 choice => [qw/Av Bv Cv/] } 39 ], 40); 41 42is( $class_name, 'Sarge', "check $class_name class name" ); 43my $canonical_model = $model->get_model_clone($class_name); 44print "$class_name model:\n", Dumper($canonical_model) if $trace; 45 46eq_or_diff( 47 $model->get_element_model( $class_name, 'D' ), 48 { 49 'value_type' => 'enum', 50 'status' => 'deprecated', 51 'type' => 'leaf', 52 'class' => 'Config::Model::Value', 53 'choice' => [ 'Av', 'Bv', 'Cv' ] 54 }, 55 "check $class_name D element model" 56); 57 58eq_or_diff( 59 $model->get_element_model( $class_name, 'X' ), 60 { 61 'value_type' => 'enum', 62 'summary' => 'X-ray (summary)', 63 'type' => 'leaf', 64 'class' => 'Config::Model::Value', 65 'choice' => [ 'Av', 'Bv', 'Cv' ], 66 'description' => 'X-ray (long description)' 67 }, 68 "check $class_name X element model" 69); 70 71$class_name = $model->create_config_class( 72 name => 'Captain', 73 element => [ 74 bar => { 75 type => 'node', 76 config_class_name => 'Sarge' 77 } ] ); 78 79my @bad_model = ( 80 name => "Master", 81 level => [ [qw/captain many/] => 'important' ], 82 element => [ 83 captain => { 84 type => 'node', 85 config_class_name => 'Captain', 86 }, 87 ], 88); 89 90throws_ok { $model->create_config_class(@bad_model) } 91"Config::Model::Exception::ModelDeclaration", 92 "check model with orphan level"; 93 94$class_name = $model->create_config_class( 95 name => "Master", 96 level => [ qw/captain/ => 'important' ], 97 element => [ 98 captain => { 99 type => 'node', 100 config_class_name => 'Captain', 101 }, 102 [qw/array_args hash_args/] => { 103 type => 'node', 104 config_class_name => 'Captain', 105 }, 106 ], 107 class_description => "Master description", 108 description => [ 109 captain => "officer", 110 array_args => 'not officer' 111 ] ); 112 113ok( 1, "Model created" ); 114 115is( $class_name, 'Master', "check $class_name class name" ); 116 117$canonical_model = $model->get_model_clone($class_name); 118print "$class_name model:\n", Dumper($canonical_model) if $trace; 119 120memory_cycle_ok( $model, "memory cycles" ); 121done_testing; 122