#!/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 => 24; 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 => "String", is_optional => 1 }, score => { is => 'Integer' }, ] }; class URT::FancyItem { is => 'URT::Item', has => [ feet => { is => "String" } ] }; class URT::UnrelatedItem { has => [ name => { is => "String" }, group => { is => "String" }, ], }; my($r1, $r2); $r1 = URT::FancyItem->define_boolexpr(); ok($r1->is_subset_of($r1), 'boolexpr with no filters is a subset of itself'); $r1 = URT::FancyItem->define_boolexpr(name => 'Bob'); ok($r1->is_subset_of($r1), 'boolexpr with one filter is a subset of itself'); $r1 = URT::Item->define_boolexpr(name => 'Bob'); $r2 = URT::Item->define_boolexpr(name => 'Bob'); ok($r1->is_subset_of($r2), 'Two rules with the same filters are a subset'); ok($r2->is_subset_of($r1), 'Two rules with the same filters are a subset'); $r1 = URT::Item->define_boolexpr(name => 'Bob', group => 'home'); $r2 = URT::Item->define_boolexpr(name => 'Bob', group => 'home'); ok($r1->is_subset_of($r2), 'Two rules with the same filters are a subset'); ok($r2->is_subset_of($r1), 'Two rules with the same filters are a subset'); $r1 = URT::Item->define_boolexpr(name => 'Bob', group => 'home'); $r2 = URT::Item->define_boolexpr(group => 'home', name => 'Bob'); ok($r1->is_subset_of($r2), 'Two rules with the same filters in a different order are a subset'); ok($r2->is_subset_of($r1), 'Two rules with the same filters in a different order are a subset'); $r1 = URT::Item->define_boolexpr(name => 'Bob'); $r2 = URT::Item->define_boolexpr(name => 'Fred'); ok(! $r1->is_subset_of($r2), 'Rule with different value for same filter name is not a subset'); ok(! $r2->is_subset_of($r1), 'Rule with different value for same filter name is not a subset'); $r1 = URT::Item->define_boolexpr(name => 'Bob'); $r2 = URT::Item->define_boolexpr(group => 'Bob'); ok(! $r1->is_subset_of($r2), 'Rule with different param names and same value is not a subset'); ok(! $r2->is_subset_of($r1), 'Rule with different param names and same value is not a subset'); $r1 = URT::Item->define_boolexpr(name => 'Bob'); $r2 = URT::Item->define_boolexpr(); ok($r1->is_subset_of($r2), 'one filter is a subset of no filters'); ok(! $r2->is_subset_of($r1), 'converse is not a subset'); $r1 = URT::Item->define_boolexpr(name => 'Bob', group => 'home'); $r2 = URT::Item->define_boolexpr(name => 'Bob'); ok($r1->is_subset_of($r2), 'Rule with two filters is subset of rule with one filter'); ok(! $r2->is_subset_of($r1),' Rule with one filter is not a subset of rule with two filters'); $r1 = URT::FancyItem->define_boolexpr(); $r2 = URT::Item->define_boolexpr(); ok($r1->is_subset_of($r2), 'subset by inheritance with no filters'); ok(! $r2->is_subset_of($r1), 'ancestry is not a subset'); $r1 = URT::FancyItem->define_boolexpr(name => 'Bob'); $r2 = URT::Item->define_boolexpr(name => 'Bob'); ok($r1->is_subset_of($r2), 'inheritance and one filter is subset'); ok(! $r2->is_subset_of($r1), 'ancestry and one filter is not a subset'); $r1 = URT::FancyItem->define_boolexpr(name => 'Bob', group => 'home'); $r2 = URT::Item->define_boolexpr(group => 'home', name => 'Bob'); ok($r1->is_subset_of($r2), 'inheritance and two filters in different order is subset'); ok(! $r2->is_subset_of($r1), 'ancestry and two filters in different order is not a subset'); $r1 = URT::Item->define_boolexpr(name => 'Bob'); $r2 = URT::UnrelatedItem->define_boolexpr(name => 'Bob'); ok(! $r1->is_subset_of($r2), 'Rules on unrelated classes with same filters is not a subset'); ok(! $r2->is_subset_of($r1), 'Rules on unrelated classes with same filters is not a subset');