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