The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl -t
######################
#
#    Copyright (C) 2011  TU Clausthal, Institut für Maschinenwesen, Joachim Langenbach
#
#    This program is free software: you can redistribute it and/or modify
#    it under the terms of the GNU General Public License as published by
#    the Free Software Foundation, either version 3 of the License, or
#    (at your option) any later version.
#
#    This program is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#    GNU General Public License for more details.
#
#    You should have received a copy of the GNU General Public License
#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
#
######################

use Test::More tests => 8;
use FindBin;
use strict;
use warnings;

BEGIN {
  # include Diff module
  use_ok( 'CAD::Firemen::Analyze', qw(compare) ) || print "Bail out!\n";
  use_ok( 'CAD::Firemen::Load', qw(loadCDB) ) || print "Bail out!\n";

  # expected result tree
  my %expAdded = ();
  my %expChanged = ();
  my %expRemoved = ();

  %expAdded = (7 => "ACCESSORY_WINDOW_DISPLAY");

  %expRemoved = (
    7 => "THIS_OPTION_DOES_NOT_EXISTS_IN_NEW_CDB",
    12 => "THIS_OPTION_DOES_NOT_EXISTS_IN_NEW_CDB_TOO"
  );

  # compare
  my ($ref, $lines) = loadCDB($FindBin::Bin ."/../corpus/config-old.cdb");
  my %old = %{$ref};
  ($ref, $lines) = loadCDB($FindBin::Bin ."/../corpus/config-new.cdb");
  my %new = %{$ref};
  my ($ref1, $ref2, $ref3) = compare(\%old, \%new);
  my %resAdded = %{$ref1};
  my %resChanged = %{$ref2};
  my %resRemoved = %{$ref3};

  is(scalar(keys(%resAdded)), scalar(keys(%expAdded)), "All added options found");
  is(scalar(keys(%resChanged)), scalar(keys(%expChanged)), "All changed options found");
  is(scalar(keys(%resRemoved)), scalar(keys(%expRemoved)), "All removed options found");
  foreach my $opt (keys(%resAdded)){
    my $found = 0;
    foreach my $opt1(keys(%expAdded)){
      if($opt eq $opt1){
        $found = 1;
        last;
      }
    }
    is($found, 1, "Added option is added");
  }
  foreach my $opt (keys(%resChanged)){
    my $found = 0;
    foreach my $opt1(keys(%expChanged)){
      if($opt eq $opt1){
        $found = 1;
        last;
      }
    }
    is($found, 1, "Changed option is added");
  }
  foreach my $opt (keys(%resRemoved)){
    my $found = 0;
    foreach my $opt1(keys(%expRemoved)){
      if($opt eq $opt1){
        $found = 1;
        last;
      }
    }
    is($found, 1, "Removed option is added");
  }
}

diag( "Testing comparing of CDBs with CAD::Firemen::Analyze $CAD::Firemen::Analyze::VERSION, Perl $], $^X" );