af6404d3bf0841aacbe939c91d9d17b0c3bb37b6
[dbsrgits/SQL-Abstract.git] / t / 10test.t
1 #!/usr/bin/perl
2
3 use strict;
4 use warnings;
5 use List::Util qw(sum);
6 use Data::Dumper;
7
8 use Test::More;
9
10
11 my @bind_tests = (
12   # scalar - equal
13   {
14     equal => 1,
15     bindvals => [
16       undef,
17       undef,
18     ]
19   },
20   {
21     equal => 1,
22     bindvals => [
23       'foo',
24       'foo',
25     ]
26   },
27   {
28     equal => 1,
29     bindvals => [
30       42,
31       42,
32       '42',
33     ]
34   },
35
36   # scalarref - equal
37   {
38     equal => 1,
39     bindvals => [
40       \'foo',
41       \'foo',
42     ]
43   },
44   {
45     equal => 1,
46     bindvals => [
47       \42,
48       \42,
49       \'42',
50     ]
51   },
52
53   # arrayref - equal
54   {
55     equal => 1,
56     bindvals => [
57       [],
58       []
59     ]
60   },
61   {
62     equal => 1,
63     bindvals => [
64       [42],
65       [42],
66       ['42'],
67     ]
68   },
69   {
70     equal => 1,
71     bindvals => [
72       [1, 42],
73       [1, 42],
74       ['1', 42],
75       [1, '42'],
76       ['1', '42'],
77     ]
78   },
79
80   # hashref - equal
81   {
82     equal => 1,
83     bindvals => [
84       { foo => 42 },
85       { foo => 42 },
86       { foo => '42' },
87     ]
88   },
89   {
90     equal => 1,
91     bindvals => [
92       { foo => 42, bar => 1 },
93       { foo => 42, bar => 1 },
94       { foo => '42', bar => 1 },
95     ]
96   },
97
98   # blessed object - equal
99   {
100     equal => 1,
101     bindvals => [
102       bless(\(local $_ = 42), 'Life::Universe::Everything'),
103       bless(\(local $_ = 42), 'Life::Universe::Everything'),
104     ]
105   },
106   {
107     equal => 1,
108     bindvals => [
109       bless([42], 'Life::Universe::Everything'),
110       bless([42], 'Life::Universe::Everything'),
111     ]
112   },
113   {
114     equal => 1,
115     bindvals => [
116       bless({ answer => 42 }, 'Life::Universe::Everything'),
117       bless({ answer => 42 }, 'Life::Universe::Everything'),
118     ]
119   },
120
121   # complex data structure - equal
122   {
123     equal => 1,
124     bindvals => [
125       [42, { foo => 'bar', quux => [1, 2, \3, { quux => [4, 5] } ] }, 8 ],
126       [42, { foo => 'bar', quux => [1, 2, \3, { quux => [4, 5] } ] }, 8 ],
127     ]
128   },
129
130
131   # scalar - different
132   {
133     equal => 0,
134     bindvals => [
135       undef,
136       'foo',
137       42,
138     ]
139   },
140
141   # scalarref - different
142   {
143     equal => 0,
144     bindvals => [
145       \undef,
146       \'foo',
147       \42,
148     ]
149   },
150
151   # arrayref - different
152   {
153     equal => 0,
154     bindvals => [
155       [undef],
156       ['foo'],
157       [42],
158     ]
159   },
160
161   # hashref - different
162   {
163     equal => 0,
164     bindvals => [
165       { foo => undef },
166       { foo => 'bar' },
167       { foo => 42 },
168     ]
169   },
170
171   # different types
172   {
173     equal => 0,
174     bindvals => [
175       'foo',
176       \'foo',
177       ['foo'],
178       { foo => 'bar' },
179     ]
180   },
181
182   # complex data structure - different
183   {
184     equal => 0,
185     bindvals => [
186       [42, { foo => 'bar', quux => [1, 2, \3, { quux => [4, 5] } ] }, 8 ],
187       [43, { foo => 'bar', quux => [1, 2, \3, { quux => [4, 5] } ] }, 8 ],
188       [42, { foo => 'baz', quux => [1, 2, \3, { quux => [4, 5] } ] }, 8 ],
189       [42, { bar => 'bar', quux => [1, 2, \3, { quux => [4, 5] } ] }, 8 ],
190       [42, { foo => 'bar', quuux => [1, 2, \3, { quux => [4, 5] } ] }, 8 ],
191       [42, { foo => 'bar', quux => [0, 1, 2, \3, { quux => [4, 5] } ] }, 8 ],
192       [42, { foo => 'bar', quux => [1, 2, 3, { quux => [4, 5] } ] }, 8 ],
193       [42, { foo => 'bar', quux => [1, 2, \4, { quux => [4, 5] } ] }, 8 ],
194       [42, { foo => 'bar', quux => [1, 2, \3, { quuux => [4, 5] } ] }, 8 ],
195       [42, { foo => 'bar', quux => [1, 2, \3, { quux => [4, 5, 6] } ] }, 8 ],
196       [42, { foo => 'bar', quux => [1, 2, \3, { quux => 4 } ] }, 8 ],
197       [42, { foo => 'bar', quux => [1, 2, \3, { quux => [4, 5], quuux => 1 } ] }, 8 ],
198       [42, { foo => 'bar', quux => [1, 2, \3, { quux => [4, 5] } ] }, 8, 9 ],
199     ]
200   },
201 );
202
203
204 plan tests => 1 + sum
205   map { $_ * ($_ - 1) / 2 }
206     map { scalar @{$_->{bindvals}} }
207       @bind_tests;
208
209 use_ok('SQL::Abstract::Test', import => [qw(eq_sql eq_bind is_same_sql_bind)]);
210
211 for my $test (@bind_tests) {
212   my $bindvals = $test->{bindvals};
213   while (@$bindvals) {
214     my $bind1 = shift @$bindvals;
215     foreach my $bind2 (@$bindvals) {
216       my $equal = eq_bind($bind1, $bind2);
217       if ($test->{equal}) {
218         ok($equal, "equal bind values considered equal");
219       } else {
220         ok(!$equal, "different bind values considered not equal");
221       }
222
223       if ($equal ^ $test->{equal}) {
224         diag("bind1: " . Dumper($bind1));
225         diag("bind2: " . Dumper($bind2));
226       }
227     }
228   }
229 }