#!/usr/bin/env perl
use strict;
use warnings;
use File::Basename;
use lib File::Basename::dirname(__FILE__)."/../../../lib";
use lib File::Basename::dirname(__FILE__)."/../..";
use URT;
use Test::More tests => 162;
use Data::Dumper;
class URT::Item {
id_by => [qw/name group/],
has => [
name => { is => "String" },
group => { is => "String" },
parent => { is => "URT::Item", is_optional => 1, id_by => ['parent_name','parent_group'] },
foo => { is => "String", is_optional => 1 },
bar => { is => "Number", is_optional => 1 },
# These are designed to be similar to things stripped out of BoolExpr keys during resolve()
is_id_only => { is => 'Boolean' },
some_param_key => { is => 'Text' },
a_unique_string => { is => 'Text' },
clobber__get_serial_number => { is => 'Number'},
the_change_count => { is => 'Number' },
]
};
class URT::FancyItem {
is => 'URT::Item',
has => [
feet => { is => "String" }
]
};
class URT::UnrelatedItem {
id_by => [
ui_id => { is => 'Integer' },
],
has => [
name => { is => "String" },
group => { is => "String" },
],
};
my $test_obj = URT::Item->create(name => 'blah', group => 'cool', foo => 'foo', bar => 12345);
foreach my $class_name ( qw( URT::Item URT::FancyItem ) ) {
foreach my $meta_params ( [], [-group_by => ['bar']] ) {
my $bx = $class_name->define_boolexpr(@$meta_params);
my $tmpl = $bx->template;
ok(! $bx->is_id_only, 'Rule with no filters is not is_id_only');
ok(! $tmpl->is_id_only, 'Rule template with no filters is not is_id_only');
ok(! $tmpl->is_partial_id, 'Rule template with no filters is not is_partial_id');
ok($tmpl->matches_all, 'Rule template with no filters is matches_all');
$bx = $class_name->define_boolexpr(name => 'blah', @$meta_params);
$tmpl = $bx->template;
ok(! $bx->is_id_only, 'Rule with one ID property filter is not is_id_only');
ok(! $tmpl->is_id_only, 'Rule template with one ID property filter is not is_id_only');
ok($tmpl->is_partial_id, 'Rule template with one ID property filter is is_partial_id');
ok(!$tmpl->matches_all, 'Rule template with one ID property filter is not matches_all');
$bx = $class_name->define_boolexpr(name => 'blah', group => 'foo', @$meta_params);
$tmpl = $bx->template;
ok($bx->is_id_only, 'Rule with both ID property filters is is_id_only');
ok($tmpl->is_id_only, 'Rule template with both ID property filters is is_id_only');
ok(! $tmpl->is_partial_id, 'Rule template with both ID property filter is not is_partial_id');
ok(! $tmpl->matches_all, 'Rule template with both ID property filter is not matches_all');
$bx = $class_name->define_boolexpr(parent_name => '12345', @$meta_params);
$tmpl = $bx->template;
ok(! $bx->is_id_only, 'Rule with no ID filters is not is_id_only');
ok(! $tmpl->is_id_only, 'Rule template with no ID filters is not is_id_only');
ok(! $tmpl->is_partial_id, 'Rule template with no ID filters is not is_partial_id');
ok(! $tmpl->matches_all, 'Rule template with no ID filters is not matches_all');
}
}
foreach my $meta_params ( [], [-group_by => ['group']] ) {
my $bx = URT::UnrelatedItem->define_boolexpr(@$meta_params);
my $tmpl = $bx->template;
ok(! $bx->is_id_only, 'Rule with no filters is not is_id_only');
ok(! $tmpl->is_id_only, 'Rule template with no filters is not is_id_only');
ok(! $tmpl->is_partial_id, 'Rule template with no filters is not is_partial_id');
ok($tmpl->matches_all, 'Rule template with no filters is matches_all');
$bx = URT::UnrelatedItem->define_boolexpr(ui_id => 1, @$meta_params);
$tmpl = $bx->template;
ok($tmpl->is_id_only, 'Rule with the single ID param is is_id_only');
ok(! $tmpl->is_partial_id, 'Rule with the single ID param is not is_partial_id');
ok(! $tmpl->matches_all, 'Rule with the single ID param is not matches_all');
$bx = URT::UnrelatedItem->define_boolexpr(ui_id => [2], @$meta_params);
$tmpl = $bx->template;
ok($tmpl->is_id_only, 'Rule with the single ID in-clause param is is_id_only');
ok(! $tmpl->is_partial_id, 'Rule with the single ID in-clause param is not is_partial_id');
ok(! $tmpl->matches_all, 'Rule with the single ID in-clause param is not matches_all');
$bx = URT::UnrelatedItem->define_boolexpr(name => 'foo', @$meta_params);
$tmpl = $bx->template;
ok(! $tmpl->is_id_only, 'Rule template with no ID filters is not is_id_only');
ok(! $tmpl->is_partial_id, 'Rule template with no ID filters is not is_partial_id');
ok(! $tmpl->matches_all, 'Rule template with no ID filters is not matches_all');
}
my @tests = (
# get params property operator expected val
[ [ name => 'blah'], 'name', '=', 'blah' ],
[ [ name => { operator => '=', value => 'blah'}], 'name', '=', 'blah' ],
[ [ 'name =' => 'blah'], 'name', '=', 'blah' ],
[ [ name => undef], 'name', '=', undef ],
[ [ bar => 1 ], 'bar', '=', 1 ],
[ [ bar => { operator => '<', value => 1 }], 'bar', '<', 1 ],
[ [ name => [ 'bob', 'joe', 'frank' ] ], 'name', 'in', ['bob','frank','joe']], # list values are sorted
[ [ name => { operator => 'not in', value => [1,2,3]} ], 'name', 'not in', [1,2,3] ],
[ [ 'name in', => [ 'bob', 'joe', 'frank' ] ], 'name', 'in', ['bob','frank','joe']],
[ [ 'name not in' => [ 'bob', 'joe', 'frank' ] ], 'name', 'not in', ['bob','frank','joe']],
[ [ name => [ undef ] ], 'name', 'in', [undef] ],
[ [ name => { operator => 'in', value => [ undef ] } ], 'name', 'in', [undef] ],
[ [ 'name in' => [undef] ], 'name', 'in', [undef] ],
[ [ 'name in' => [ 1, undef]], 'name', 'in', [1, undef] ],
[ [ bar => { operator => 'between', value => [0,3] } ], 'bar', 'between', [0,3] ],
[ [ bar => { operator => 'not between', value => [0,3] } ], 'bar', 'not between', [0,3] ],
[ [ 'bar between' => [0,3] ], 'bar', 'between', [0,3] ],
[ [ 'bar not between' => [0,3] ], 'bar', 'not between', [0,3] ],
[ [ parent => $test_obj ], 'parent_name', '=', 'blah' ],
[ [ parent => $test_obj ], 'parent_group','=', 'cool' ],
[ [ is_id_only => 1 ], 'is_id_only', '=', 1 ],
[ [ a_unique_string => 'hithere'], 'a_unique_string', '=', 'hithere' ],
[ [ clobber__get_serial_number => 123], 'clobber__get_serial_number','=', 123],
[ [ the_change_count => 456], 'the_change_count', '=', 456],
);
for( my $i = 0; $i < @tests; $i++) {
my $test = $tests[$i];
my @rule_params = @{ $test->[0] };
my $r = URT::Item->define_boolexpr(@rule_params);
ok($r, "Defined a BoolExpr for test $i");
my($property, $expected_operator, $expected_value) = @$test[1..3];
my $got_operator = $r->operator_for($property);
is($got_operator, $expected_operator, "Operator for $property is '$expected_operator'");
my $got_value = $r->value_for($property);
is_deeply($got_value, $expected_value, "Value for $property matched");
}