1#!perl
2
3use strict;
4use warnings;
5
6use lib 't/lib';
7use Test::More;
8use Test::Deep;
9use Test::Fatal 'dies_ok', 'lives_ok';
10
11use TestSchema;
12my $schema = TestSchema->deploy_or_connect();
13$schema->prepopulate;
14
15my $rs = $schema->resultset('Foo')->search({ id => 1 });
16my $rs2 = $schema->resultset('Foo')->search({ id => { '>=' => 3 } });
17my $rs3 = $schema->resultset('Foo')->search({ id => [ 1, 3 ] });
18
19cmp_deeply [ sort map $_->id, $rs2->union($rs2)->all ], [3, 4, 5],
20   'union returns correct values';
21
22cmp_deeply [ sort map $_->id, $rs2->union_all($rs2)->all ], [3, 3, 4, 4, 5, 5],
23   'union returns correct values';
24
25cmp_deeply [ sort map $_->id, $rs2->union($rs)->all ], [1, 3, 4, 5],
26   'union returns correct values';
27
28cmp_deeply [ sort map $_->id, $rs3->union($rs)->all ], [1, 3],
29   'union returns correct values';
30
31cmp_deeply [ sort map $_->id, $rs3->union_all($rs)->all ], [1, 1, 3],
32   'union returns correct values';
33
34cmp_deeply [ sort map $_->id, $rs2->intersect($rs)->all ], [],
35   'intersect returns correct values';
36
37cmp_deeply [ sort map $_->id, $rs3->intersect($rs)->all ], [1],
38   'intersect returns correct values';
39
40cmp_deeply [ sort map $_->id, $rs->intersect($rs3)->all ], [1],
41   'intersect returns correct values';
42
43cmp_deeply [ sort map $_->id, $rs2->intersect($rs3)->all ], [3],
44   'intersect returns correct values';
45
46cmp_deeply [ sort map $_->id, $rs3->intersect($rs2)->all ], [3],
47   'intersect returns correct values';
48
49cmp_deeply [ sort map $_->id, $rs2->except($rs)->all ], [3, 4, 5],
50   'except returns correct values';
51
52cmp_deeply [ sort map $_->id, $rs->except($rs2)->all ], [1],
53   'except returns correct values';
54
55cmp_deeply [ sort map $_->id, $rs3->except($rs)->all ], [3],
56   'except returns correct values';
57
58cmp_deeply [ sort map $_->id, $rs->except($rs3)->all ], [],
59   'except returns correct values';
60
61cmp_deeply [ sort map $_->id, $rs2->except($rs3)->all ], [4, 5],
62   'except returns correct values';
63
64cmp_deeply [ sort map $_->id, $rs3->except($rs2)->all ], [1],
65   'except returns correct values';
66
67dies_ok {
68   my $rs3 = $rs->search(undef, { columns => ['id'] });
69   $rs->union($rs3) ;
70} 'unioning differing ColSpecs dies';
71
72dies_ok {
73   $rs->union($rs->search_rs(undef, { result_class => 'DBIx::Class::ResultClass::HashRefInflator'})) ;
74} 'unioning with differing ResultClasses dies';
75
76dies_ok { $rs->union($schema->resultset('Bar')) } 'unioning differing ResultSets dies';
77
78{
79   my $rs3 = $rs->search(undef, {
80      columns => ['id'],
81      '+select' => [\'"foo" as station'],
82      '+as'     => ['station'],
83   });
84   my $rs4 = $schema->resultset('Bar')->search(undef, {
85      columns => ['id'],
86      '+select' => [\'"bar" as station'],
87      '+as'     => ['station'],
88   });
89   $rs3->result_class('DBIx::Class::ResultClass::HashRefInflator');
90   $rs4->result_class('DBIx::Class::ResultClass::HashRefInflator');
91   my $rs5 = $rs3->union($rs4);
92   lives_ok { [ $rs5->all ] }
93      q{unioning differing ResultSets does not die when you know what you're doing};
94}
95
96done_testing;
97