Refactor test code a bit
[dbsrgits/SQL-Abstract-2.0-ish.git] / t / lib / Test / SQL / Abstract / Util.pm
1 package Test::SQL::Abstract::Util;
2
3 use strict;
4 use warnings;
5
6 use Sub::Exporter -setup => {
7   exports => [qw/
8     mk_name
9     mk_value
10     mk_alias
11     field_op_value
12   /],
13   groups => [
14     dumper_sort => sub {
15
16       require Data::Dumper;
17       my $Dump = Data::Dumper->can('Dump');
18
19       no warnings 'redefine';
20
21       *Data::Dumper::Dump = sub {
22         local $Data::Dumper::Sortkeys = sub {
23           my $hash = $_[0];
24           my @keys = sort {
25             my $a_minus = substr($a,0,1) eq '-';
26             my $b_minus = substr($b,0,1) eq '-';
27
28             return $a cmp $b if $a_minus || $b_minus;
29
30             return -1 if $a eq 'op';
31             return  1 if $b eq 'op';
32             return $a cmp $b;
33           } keys %$hash;
34
35           return \@keys;
36         };
37         return $Dump->(@_);
38       };
39       return {};
40     }
41   ],
42 };
43
44 sub mk_alias {
45   return {
46     -type => 'alias',
47     ident => shift,
48     as    => shift,
49   };
50 }
51
52 sub mk_name {
53   my ($field) = shift;
54   $field = ref $field eq 'HASH'
55          ? $field
56          : ref $field eq 'ARRAY'
57          ? { -type => 'identifier', elements => $field }
58          : { -type => 'identifier', elements => [$field,@_] };
59   return $field;
60 }
61
62 sub mk_value {
63   return { -type => 'value', value => $_[0] }
64 }
65
66
67 sub field_op_value {
68   my ($field, $op, $value) = @_;
69
70   $field = ref $field eq 'HASH'
71          ? $field
72          : mk_name($field);
73
74   my @value = ref $value eq 'HASH'
75             ? $value
76             : ref $value eq 'ARRAY'
77             ? @$value
78             : mk_value($value);
79
80   return {
81     -type => 'expr',
82     op => $op,
83     args => [
84       $field,
85       @value
86     ]
87   };
88 }
89
90 1;