The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl -T

use Test::More;
use Data::Dumper;

use_ok('Monitoring::Livestatus::Class::Abstract::Filter');

my @testings = (
    # normal query with 3 ands
    [
        state => { '='  => 1 },
        name  => { '!=' => [ qw/localhost router/] },
    ],
    [   "Filter: state = 1",
        "Filter: name != localhost",
        "Filter: name != router" 
    ],

    # simple or query
    {
        -or => [
          state => { '='  => 0 },
          state => { '='  => 1 },
        ]
    },
    [   "Filter: state = 0",
        "Filter: state = 1",
        "Or: 2",
    ],

    # normal or query
    [
        -or => [
          state => { '='  => 0 },
          state => { '='  => 1 },
        ],
        group => { '>=' => 'linux' }
    ],
    [   "Filter: state = 0",
        "Filter: state = 1",
        "Or: 2",
        "Filter: group >= linux",
    ],

    # cascaded query
    [
        -and => [
            -or => [
              state => { '='  => 0 },
              state => { '='  => 1 },
            ],
            group => { '>=' => 'linux' }
        ],
    ],
    [   "Filter: state = 0",
        "Filter: state = 1",
        "Or: 2",
        "Filter: group >= linux",
        "And: 2",
    ],

);

for ( my $i = 0 ; $i < scalar @testings ; $i++ ) {
    my $search            = $testings[$i];
    my $expected_statment = $testings[ ++$i ];
    my $filter_obj         = Monitoring::Livestatus::Class::Abstract::Filter->new();
    my $got_statment;
    eval {
        $got_statment = $filter_obj->apply($search);
    } or  warn @_;
    is_deeply( $got_statment, $expected_statment, sprintf( "Test %d", ( $i / 2 ) + 1 ) )
        or diag("got: ".Dumper($got_statment)."\nbut expected ".Dumper($expected_statment));
}

done_testing;