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