1#!/usr/bin/env perl 2use strict; 3use warnings; 4no warnings 'redefine'; 5use utf8; 6 7use Test::More tests => 42; 8use Scalar::Util qw(reftype blessed); 9 10use RDF::Query::Node; 11use RDF::Query::Algebra; 12 13my $bz = RDF::Query::Node::Blank->new( 'z' ); 14my $bb = RDF::Query::Node::Blank->new( 'b' ); 15my $ba = RDF::Query::Node::Blank->new( 'a' ); 16 17my $lb = RDF::Query::Node::Literal->new( 'b' ); 18my $la = RDF::Query::Node::Literal->new( 'a' ); 19my $lal = RDF::Query::Node::Literal->new( 'a', 'en' ); 20my $l1 = RDF::Query::Node::Literal->new( '1' ); 21my $l2d = RDF::Query::Node::Literal->new( '2.0', undef, 'http://www.w3.org/2001/XMLSchema#float' ); 22my $l1d = RDF::Query::Node::Literal->new( '1', undef, 'http://www.w3.org/2001/XMLSchema#integer' ); 23my $l4d = RDF::Query::Node::Literal->new( '-4', undef, 'http://www.w3.org/2001/XMLSchema#integer' ); 24my $l5d = RDF::Query::Node::Literal->new( '5.3', undef, 'http://www.w3.org/2001/XMLSchema#float' ); 25my $l01d = RDF::Query::Node::Literal->new( '01', undef, 'http://www.w3.org/2001/XMLSchema#integer' ); 26my $l0d = RDF::Query::Node::Literal->new( '0', undef, 'http://www.w3.org/2001/XMLSchema#integer' ); 27my $l3dd = RDF::Query::Node::Literal->new( '3', undef, 'http://www.w3.org/2001/XMLSchema#double' ); 28my $true = RDF::Query::Node::Literal->new( 'true', undef, 'http://www.w3.org/2001/XMLSchema#boolean' ); 29my $false = RDF::Query::Node::Literal->new( 'false', undef, 'http://www.w3.org/2001/XMLSchema#boolean' ); 30 31my $rea = RDF::Query::Node::Resource->new( 'http://example.org/a' ); 32my $reb = RDF::Query::Node::Resource->new( 'http://example.org/b' ); 33my $lea = RDF::Query::Node::Literal->new( 'http://example.org/a' ); 34 35my $dt3 = RDF::Query::Node::Literal->new( '2007-12-31T22:55:00-06:00', undef, 'http://www.w3.org/2001/XMLSchema#dateTime' ); 36my $dt2 = RDF::Query::Node::Literal->new( '2007-12-31T23:55:00-05:00', undef, 'http://www.w3.org/2001/XMLSchema#dateTime' ); 37my $dt1 = RDF::Query::Node::Literal->new( '2008-01-01T00:00:00Z', undef, 'http://www.w3.org/2001/XMLSchema#dateTime' ); 38 39my $cv = RDF::Query::Node::Literal->new( '1', undef, 'http://example.org/mytype' ); 40my $ct = RDF::Query::Node::Literal->new( 'true', undef, 'http://example.org/mytype' ); 41 42my $un = 'RDF::Query::Expression::Unary'; 43my $bin = 'RDF::Query::Expression::Binary'; 44 45{ 46 # NUMERIC OPERATORS 47 { 48 my $TEST = 'integer add'; 49 my $plus = $bin->new( '+', $l1d, $l01d ); 50 my $value = $plus->evaluate( undef, undef, {} ); 51 isa_ok( $value, 'RDF::Query::Node::Literal' ); 52 is( $value->numeric_value, 2, "$TEST value" ); 53 is( $value->literal_datatype, 'http://www.w3.org/2001/XMLSchema#integer', "$TEST datatype" ); 54 } 55 56 { 57 my $plus = $bin->new( '+', $l1d, $l2d ); 58 my $value = $plus->evaluate( undef, undef, {} ); 59 isa_ok( $value, 'RDF::Query::Node::Literal' ); 60 is( $value->numeric_value, 3, 'integer-float add value' ); 61 is( $value->literal_datatype, 'http://www.w3.org/2001/XMLSchema#float', 'integer-float add datatype' ); 62 } 63 64 { 65 my $diff = $bin->new( '-', $l0d, $l1d ); 66 my $value = $diff->evaluate( undef, undef, {} ); 67 isa_ok( $value, 'RDF::Query::Node::Literal' ); 68 is( $value->numeric_value, -1, 'integer subtract value' ); 69 is( $value->literal_datatype, 'http://www.w3.org/2001/XMLSchema#integer', 'integer subtract datatype' ); 70 } 71 72 { 73 my $diff = $bin->new( '-', $l2d, $l1d ); 74 my $value = $diff->evaluate( undef, undef, {} ); 75 isa_ok( $value, 'RDF::Query::Node::Literal' ); 76 is( $value->numeric_value, 1, 'integer-float subtract value' ); 77 is( $value->literal_datatype, 'http://www.w3.org/2001/XMLSchema#float', 'integer-float subtract datatype' ); 78 } 79 80 { 81 my $prod = $bin->new( '*', $l2d, $l3dd ); 82 my $value = $prod->evaluate( undef, undef, {} ); 83 isa_ok( $value, 'RDF::Query::Node::Literal' ); 84 is( $value->numeric_value, 6, 'doule-float quotient value' ); 85 is( $value->literal_datatype, 'http://www.w3.org/2001/XMLSchema#double', 'double-float quotient datatype' ); 86 } 87 88 { 89 my $quo = $bin->new( '/', $l3dd, $l2d ); 90 my $value = $quo->evaluate( undef, undef, {} ); 91 isa_ok( $value, 'RDF::Query::Node::Literal' ); 92 is( $value->numeric_value, 1.5, 'doule-float quotient value' ); 93 is( $value->literal_datatype, 'http://www.w3.org/2001/XMLSchema#double', 'double-float quotient datatype' ); 94 } 95 96 { 97 my $TEST = 'integer unary-plus'; 98 my $plus = $un->new( '+', $l4d ); 99 my $value = $plus->evaluate( undef, undef, {} ); 100 isa_ok( $value, 'RDF::Query::Node::Literal' ); 101 is( $value->numeric_value, -4, $TEST ); 102 is( $value->literal_datatype, 'http://www.w3.org/2001/XMLSchema#integer', "$TEST datatype" ); 103 } 104 105 { 106 my $TEST = 'integer unary-minus'; 107 my $plus = $un->new( '-', $l4d ); 108 my $value = $plus->evaluate( undef, undef, {} ); 109 isa_ok( $value, 'RDF::Query::Node::Literal' ); 110 is( $value->numeric_value, 4, $TEST ); 111 is( $value->literal_datatype, 'http://www.w3.org/2001/XMLSchema#integer', "$TEST datatype" ); 112 } 113 114 { 115 my $sum = $bin->new( '+', $l1d, $l2d ); 116 my $diff = $bin->new( '-', $l0d, $l1d ); 117 my $prod = $bin->new( '*', $sum, $diff ); 118 my $value = $prod->evaluate( undef, undef, {} ); 119 isa_ok( $value, 'RDF::Query::Node::Literal' ); 120 is( $value->numeric_value, -3, 'prod(sum, diff)' ); 121 is( $value->literal_datatype, 'http://www.w3.org/2001/XMLSchema#float', 'double-float quotient datatype' ); 122 } 123 124} 125 126{ 127 # RELATIONAL OPERATORS 128 local($RDF::Query::Node::Literal::LAZY_COMPARISONS) = 1; 129 { 130 my $TEST = 'double-float less-than'; 131 my $lt = $bin->new( '<', $l3dd, $l2d ); 132 my $value = $lt->evaluate( undef, undef, {} ); 133 isa_ok( $value, 'RDF::Query::Node::Literal' ); 134 is( $value->literal_value, 'false', "$TEST value" ); 135 is( $value->literal_datatype, 'http://www.w3.org/2001/XMLSchema#boolean', "$TEST datatype" ); 136 } 137 138 { 139 my $TEST = 'resource-float less-than'; 140 my $lt = $bin->new( '<', $rea, $l2d ); 141 my $value = $lt->evaluate( undef, undef, {} ); 142 isa_ok( $value, 'RDF::Query::Node::Literal' ); 143 is( $value->literal_value, 'true', "$TEST value" ); 144 is( $value->literal_datatype, 'http://www.w3.org/2001/XMLSchema#boolean', "$TEST datatype" ); 145 } 146 147 { 148 my $TEST = 'literal-blank greater-than'; 149 my $lt = $bin->new( '>', $la, $ba ); 150 my $value = $lt->evaluate( undef, undef, {} ); 151 isa_ok( $value, 'RDF::Query::Node::Literal' ); 152 is( $value->literal_value, 'true', "$TEST value" ); 153 is( $value->literal_datatype, 'http://www.w3.org/2001/XMLSchema#boolean', "$TEST datatype" ); 154 } 155 156 { 157 my $TEST = 'dateTime less-than'; 158 my $lt = $bin->new( '<', $dt1, $dt2 ); 159 my $value = $lt->evaluate( undef, undef, {} ); 160 isa_ok( $value, 'RDF::Query::Node::Literal' ); 161 is( $value->literal_value, 'true', "$TEST value" ); 162 is( $value->literal_datatype, 'http://www.w3.org/2001/XMLSchema#boolean', "$TEST datatype" ); 163 } 164 165 { 166 my $TEST = 'dateTime equal'; 167 my $lt = $bin->new( '==', $dt3, $dt2 ); 168 my $value = $lt->evaluate( undef, undef, {} ); 169 isa_ok( $value, 'RDF::Query::Node::Literal' ); 170 is( $value->literal_value, 'true', "$TEST value" ); 171 is( $value->literal_datatype, 'http://www.w3.org/2001/XMLSchema#boolean', "$TEST datatype" ); 172 } 173} 174 175 176 177 178 179