ff21dc0765afcfaec0d7c86b22de5f3fa8fde883
[dbsrgits/SQL-Abstract-2.0-ish.git] / t / compat / ast / 01.t
1 use strict;
2 use warnings;
3
4 use SQL::Abstract::AST::Compat;
5
6 use Test::More tests => 8;
7 use Test::Differences;
8
9 ok(my $visitor = SQL::Abstract::AST::Compat->new);
10
11 my $foo_id = { -type => 'name', args => [qw/foo/] };
12 my $bar_id = { -type => 'name', args => [qw/bar/] };
13
14 my $foo_eq_1 = {
15   -type => 'expr',
16   op => '==',
17   args => [
18     $foo_id,
19     { -type => 'value', value => 1 }
20   ]
21 };
22
23 eq_or_diff
24   $visitor->generate({ foo => 1 }),
25   $foo_eq_1,
26   "Single value hash";
27
28
29 my $bar_eq_str = {
30   -type => 'expr',
31   op => '==',
32   args => [
33     $bar_id,
34     { -type => 'value', value => 'some str' }
35   ]
36 };
37
38 eq_or_diff
39   $visitor->generate({ foo => 1, bar => 'some str' }),
40   { -type => 'expr',
41     op => 'and',
42     args => [
43       $bar_eq_str,
44       $foo_eq_1,
45     ]
46   },
47   "two keys in hash";
48
49 eq_or_diff
50   $visitor->generate({ -or => { foo => 1, bar => 'some str' } }),
51   { -type => 'expr',
52     op => 'or',
53     args => [
54       $bar_eq_str,
55       $foo_eq_1,
56     ]
57   },
58   "-or key in hash";
59
60
61 eq_or_diff
62   $visitor->generate([ -and => { foo => 1, bar => 'some str' } ]),
63   { -type => 'expr',
64     op => 'and',
65     args => [
66       $bar_eq_str,
67       $foo_eq_1,
68     ]
69   },
70   "-and as first element of array";
71
72
73 eq_or_diff
74   $visitor->generate([ -and => { foo => 1, bar => 'some str' }, { foo => 1} ]),
75   { -type => 'expr',
76     op => 'or',
77     args => [
78       { -type => 'expr',
79         op => 'and',
80         args => [
81           $bar_eq_str,
82           $foo_eq_1,
83         ]
84       },
85       $foo_eq_1,
86     ]
87   },
88   "-and as first element of array + hash";
89
90 eq_or_diff
91   $visitor->generate({ foo => { '!=' => 'bar' } }),
92   { -type => 'expr',
93     op => '!=',
94     args => [
95       $foo_id,
96       { -type => 'value', value => 'bar' },
97     ]
98   },
99   "foo => { '!=' => 'bar' }";
100
101 eq_or_diff
102   $visitor->generate({ foo => [ 1, 'bar' ] }),
103   { -type => 'expr',
104     op => 'or',
105     args => [
106       $foo_eq_1,
107       { -type => 'expr',
108         op => '==',
109         args => [
110           $foo_id,
111           { -type => 'value', value => 'bar' },
112         ]
113       },
114     ],
115   },
116   "foo => [ 1, 'bar' ]";
117