#!/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 => 32; 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'] }, parant_name => { is => 'String', via => 'parent', to => 'name' }, 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" }, nicknames => { is_many => 1, is => "Integer" }, ], }; # First an easy one.... my $bx = URT::FancyItem->define_boolexpr(name => 'Fred', -order => [ 'bar' ]); ok($bx, 'Made a simple rule with -order'); ok($bx->specifies_value_for('name'), 'Rule has value for name'); is($bx->value_for('name'), 'Fred', 'Rule has correct value for for name'); ok(! $bx->specifies_value_for('foo'), 'Rule correctly has no value for foo'); is_deeply($bx->value_for('-order'), ['bar'], 'Rule has correct value for -order'); # Try a compound rule $bx = URT::FancyItem->define_boolexpr(-or => [ [ name => 'Fred' ], [foo => 'bar'] ], -order => [ 'bar' ]); ok($bx, 'Make Or-type rule with -order'); my @underlying = $bx->underlying_rules(); is(scalar(@underlying), 2, 'There were 2 underlying rules'); ok($underlying[0]->specifies_value_for('name'), 'First underlying rule has value for name'); is($underlying[0]->value_for('name'), 'Fred', 'First underlying rule has correct value for for name'); ok(! $underlying[0]->specifies_value_for('foo'), 'First underlying rule correctly has no value for foo'); is_deeply($underlying[0]->value_for('-order'), ['bar'], 'First underlying rule has correct value for -order'); ok(! $underlying[1]->specifies_value_for('name'), 'Second underlying rule correctly has no value for name'); ok($underlying[1]->specifies_value_for('foo'), 'Second underlying rule has value for foo'); is($underlying[1]->value_for('foo'), 'bar', 'Second underlying rule has correct value for for name'); is_deeply($underlying[1]->value_for('-order'), ['bar'], 'Second underlying rule has correct value for -order'); # another compound rule with 3 parts $bx = URT::FancyItem->define_boolexpr(-or => [ [ name => 'Fred' ], [foo => 'bar'], ['score >' => 3 ]], -hints => ['bar','parent_name']); ok($bx, 'Make Or-type rule with -hints'); @underlying = $bx->underlying_rules(); is(scalar(@underlying), 3, 'There were 3 underlying rules'); ok($underlying[0]->specifies_value_for('name'), 'First underlying rule has value for name'); is($underlying[0]->value_for('name'), 'Fred', 'First underlying rule has correct value for for name'); ok(! $underlying[0]->specifies_value_for('foo'), 'First underlying rule correctly has no value for foo'); ok(! $underlying[0]->specifies_value_for('score'), 'First underlying rule correctly has no value for score'); is_deeply($underlying[0]->value_for('-hints'), ['bar','parent_name'], 'First underlying rule has correct value for -hints'); ok(! $underlying[1]->specifies_value_for('name'), 'Second underlying rule correctly has no value for name'); ok($underlying[1]->specifies_value_for('foo'), 'Second underlying rule has value for foo'); is($underlying[1]->value_for('foo'), 'bar', 'Second underlying rule has correct value for for name'); ok(! $underlying[1]->specifies_value_for('score'), 'Second underlying rule correctly has no value for score'); is_deeply($underlying[1]->value_for('-hints'), ['bar','parent_name'], 'Second underlying rule has correct value for -hints'); ok(! $underlying[2]->specifies_value_for('name'), 'Third underlying rule has value for name'); ok(! $underlying[2]->specifies_value_for('foo'), 'Third underlying rule correctly has no value for foo'); ok($underlying[2]->specifies_value_for('score'), 'Third underlying rule has value for score'); is($underlying[2]->value_for('score'), 3, 'Third underlying rule has correct value for for score'); is_deeply($underlying[2]->value_for('-hints'), ['bar','parent_name'], 'Third underlying rule has correct value for -hints');