123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 |
- #!/usr/bin/perl
- # ------------------------------------------------------------------------------
- # (C) Crown copyright Met Office. All rights reserved.
- # For further details please refer to the file COPYRIGHT.txt
- # which you should have received as part of this distribution.
- # ------------------------------------------------------------------------------
- use strict;
- use warnings;
- use Fcm::CfgLine;
- use Fcm::Config;
- use Scalar::Util qw{reftype};
- use Test::More (tests => 90);
- BEGIN: {
- use_ok('Fcm::ConfigSystem');
- }
- my $CONFIG = undef;
- # ------------------------------------------------------------------------------
- if (!caller()) {
- main(@ARGV);
- }
- # ------------------------------------------------------------------------------
- sub main {
- local @ARGV = @_;
- test_compare_setting_in_config();
- }
- # ------------------------------------------------------------------------------
- # Tests "compare_setting_in_config".
- sub test_compare_setting_in_config {
- my $PREFIX = 'TEST';
- my %S = (egg => [qw{boiled poached}], ham => 'roasted', bacon => 'fried');
- my %S_MOD = (ham => 'boiled');
- my %S_MOD_ARRAY = (egg => [qw{scrambled omelette}]);
- my %S_ADD = (mushroom => 'sauteed');
- my %S_DEL = (bacon => undef);
- my @ITEMS = (
- {
- name => 'empty',
- original => {},
- added => {},
- removed => {},
- modified => {},
- },
- {
- name => 'add keys to empty',
- original => {},
- added => {%S},
- removed => {},
- modified => {%S},
- },
- {
- name => 'remove all',
- original => {%S},
- added => {},
- removed => {},
- modified => {map {($_, undef)} keys(%S)},
- },
- {
- name => 'no change',
- original => {%S},
- added => {%S},
- removed => {},
- modified => {},
- },
- {
- name => 'modify key',
- original => {%S},
- added => {%S, %S_MOD},
- removed => {},
- modified => {%S_MOD},
- },
- {
- name => 'modify an array key',
- original => {%S},
- added => {%S, %S_MOD_ARRAY},
- removed => {},
- modified => {%S_MOD_ARRAY},
- },
- {
- name => 'add a key',
- original => {%S},
- added => {%S, %S_ADD},
- removed => {},
- modified => {%S_ADD},
- },
- {
- name => 'delete a key',
- original => {%S},
- added => {%S},
- removed => {%S_DEL},
- modified => {%S_DEL},
- },
- {
- name => 'modify a key and delete a key',
- original => {%S},
- added => {%S, %S_MOD},
- removed => {%S_DEL},
- modified => {%S_MOD, %S_DEL},
- },
- {
- name => 'add a key and delete a key',
- original => {%S},
- added => {%S, %S_ADD},
- removed => {%S_DEL},
- modified => {%S_ADD, %S_DEL},
- },
- );
- # A naive function to serialise an array reference
- my $flatten = sub {
- if (ref($_[0]) && reftype($_[0]) eq 'ARRAY') {
- join(q{ }, sort(@{$_[0]}))
- }
- else {
- $_[0];
- }
- };
- my $CONFIG = Fcm::Config->instance();
- for my $item (@ITEMS) {
- # New settings
- $CONFIG->{setting}{$PREFIX} = {%{$item->{added}}};
- for my $key (keys(%{$item->{removed}})) {
- delete($CONFIG->{setting}{$PREFIX}{$key});
- }
- # Old lines
- my @old_lines = map {
- Fcm::CfgLine->new(
- LABEL => $PREFIX . $Fcm::Config::DELIMITER . $_,
- VALUE => $flatten->($item->{original}{$_}),
- )
- } keys(%{$item->{original}});
- # Invokes the method
- my $system = Fcm::ConfigSystem->new();
- my ($changed_hash_ref, $new_cfg_lines_ref)
- = $system->compare_setting_in_config($PREFIX, \@old_lines);
- # Tests the return values
- my $T = $item->{name};
- is_deeply(
- $changed_hash_ref, $item->{modified},
- "$T: \$changed_hash_ref content",
- );
- is(
- scalar(@{$new_cfg_lines_ref}),
- scalar(keys(%{$item->{added}})) - scalar(keys(%{$item->{removed}})),
- "$T: \$new_cfg_lines_ref length",
- );
- for my $line (@{$new_cfg_lines_ref}) {
- my $key = $line->label_from_field(1);
- ok(exists($item->{added}{$key}), "$T: expected label $key");
- ok(!exists($item->{removed}{$key}), "$T: unexpected label $key");
- is(
- $line->value(), $flatten->($item->{added}{$key}),
- "$T: line content $key",
- );
- }
- }
- }
- __END__
|