Finish a RHS branch before applying ASC/DESC mods
[dbsrgits/SQL-Abstract.git] / t / 10test.t
index 4d14014..68de857 100644 (file)
@@ -153,7 +153,7 @@ my @sql_tests = (
       },
       {
         equal => 0,
-        parenthesis_significant => 1,
+        opts => { parenthesis_significant => 1 },
         statements => [
           q/SELECT foo FROM bar WHERE a = 1 AND b = 1 AND c = 1/,
           q/SELECT foo FROM bar WHERE (a = 1 AND b = 1 AND c = 1)/,
@@ -164,7 +164,7 @@ my @sql_tests = (
       },
       {
         equal => 0,
-        parenthesis_significant => 1,
+        opts => { parenthesis_significant => 1 },
         statements => [
           q/SELECT foo FROM bar WHERE a = 1 OR b = 1 OR c = 1/,
           q/SELECT foo FROM bar WHERE (a = 1 OR b = 1) OR c = 1/,
@@ -174,7 +174,7 @@ my @sql_tests = (
       },
       {
         equal => 0,
-        parenthesis_significant => 1,
+        opts => { parenthesis_significant => 1 },
         statements => [
           q/SELECT foo FROM bar WHERE (a = 1) AND (b = 1 OR c = 1 OR d = 1) AND (e = 1 AND f = 1)/,
           q/SELECT foo FROM bar WHERE a = 1 AND (b = 1 OR c = 1 OR d = 1) AND e = 1 AND (f = 1)/,
@@ -260,7 +260,7 @@ my @sql_tests = (
       },
       {
         equal => 0,
-        parenthesis_significant => 1,
+        opts => { parenthesis_significant => 1 },
         statements => [
           q/SELECT foo FROM bar WHERE a IN (1,2,3)/,
           q/SELECT foo FROM bar WHERE a IN (1,3,2)/,
@@ -592,6 +592,41 @@ my @sql_tests = (
         ]
       },
 
+      # order by
+      {
+        equal => 1,
+        statements => [
+          q/SELECT * FROM foo ORDER BY bar/,
+          q/SELECT * FROM foo ORDER BY bar ASC/,
+          q/SELECT * FROM foo ORDER BY bar asc/,
+        ],
+      },
+      {
+        equal => 1,
+        statements => [
+          q/SELECT * FROM foo ORDER BY bar, baz ASC/,
+          q/SELECT * FROM foo ORDER BY bar ASC, baz/,
+          q/SELECT * FROM foo ORDER BY bar asc, baz ASC/,
+          q/SELECT * FROM foo ORDER BY bar, baz/,
+        ],
+      },
+      {
+        equal => 1,
+        statements => [
+          q/ORDER BY colA, colB LIKE ? DESC, colC LIKE ?/,
+          q/ORDER BY colA ASC, colB LIKE ? DESC, colC LIKE ? ASC/,
+        ],
+      },
+      {
+        equal => 0,
+        opts => { order_by_asc_significant => 1 },
+        statements => [
+          q/SELECT * FROM foo ORDER BY bar/,
+          q/SELECT * FROM foo ORDER BY bar ASC/,
+          q/SELECT * FROM foo ORDER BY bar desc/,
+        ],
+      },
+
       # list permutations
       {
         equal => 0,
@@ -615,6 +650,20 @@ my @sql_tests = (
           'SELECT * FROM foo WHERE a IN (3,2,1)',
         ]
       },
+
+      # list consistency
+      {
+        equal => 0,
+        statements => [
+          'SELECT a,b FROM foo',
+          'SELECT a,,b FROM foo',
+          'SELECT a,b, FROM foo',
+          'SELECT ,a,b, FROM foo',
+          'SELECT ,a,,b, FROM foo',
+        ],
+      },
+
+      # misc func
       {
         equal => 0,
         statements => [
@@ -625,7 +674,6 @@ my @sql_tests = (
           'SELECT count(1) FROM foo',
         ]
       },
-      # misc func
       {
         equal => 1,
         statements => [
@@ -691,6 +739,33 @@ my @sql_tests = (
           'SELECT * FROM foo WHERE bar = (baz( buzz ))',
         ]
       },
+      # oddballs
+      {
+        equal => 1,
+        statements => [
+          'WHERE ( foo GLOB ? )',
+          'WHERE foo GLOB ?',
+        ],
+      },
+      {
+        equal => 1,
+        statements => [
+          'SELECT FIRST ? SKIP ? [me].[id], [me].[owner]
+            FROM [books] [me]
+          WHERE ( ( (EXISTS (
+            SELECT FIRST ? SKIP ? [owner].[id]
+              FROM [owners] [owner]
+            WHERE ( [books].[owner] = [owner].[id] )
+          )) AND [source] = ? ) )',
+          'SELECT FIRST ? SKIP ? [me].[id], [me].[owner]
+            FROM [books] [me]
+          WHERE ( ( EXISTS (
+            SELECT FIRST ? SKIP ? [owner].[id]
+              FROM [owners] [owner]
+            WHERE ( [books].[owner] = [owner].[id] )
+          ) AND [source] = ? ) )',
+        ],
+      },
 );
 
 my @bind_tests = (
@@ -896,21 +971,30 @@ plan tests => 1 +
       map { scalar @{$_->{bindvals}} }
         @bind_tests
   ) +
-  3;
+  9;
 
 use_ok('SQL::Abstract::Test', import => [qw(
   eq_sql_bind eq_sql eq_bind is_same_sql_bind
 )]);
 
 for my $test (@sql_tests) {
+
+  # this does not work on 5.8.8 and earlier :(
+  #local @{*SQL::Abstract::Test::}{keys %{$test->{opts}}} = map { \$_ } values %{$test->{opts}}
+  #  if $test->{opts};
+
+  my %restore_globals;
+
+  for (keys %{$test->{opts} || {} }) {
+    $restore_globals{$_} = ${${*SQL::Abstract::Test::}{$_}};
+    ${*SQL::Abstract::Test::}{$_} = \ do { my $cp = $test->{opts}{$_} };
+  }
+
   my $statements = $test->{statements};
   while (@$statements) {
     my $sql1 = shift @$statements;
     foreach my $sql2 (@$statements) {
 
-      no warnings qw/once/; # perl 5.10 is dumb
-      local $SQL::Abstract::Test::parenthesis_significant = $test->{parenthesis_significant}
-        if $test->{parenthesis_significant};
       my $equal = eq_sql($sql1, $sql2);
 
       TODO: {
@@ -935,6 +1019,9 @@ for my $test (@sql_tests) {
       }
     }
   }
+
+  ${*SQL::Abstract::Test::}{$_} = \$restore_globals{$_}
+    for keys %restore_globals;
 }
 
 for my $test (@bind_tests) {
@@ -978,3 +1065,36 @@ ok(!eq_sql_bind(
   ),
   "eq_sql_bind considers different SQL expressions and equal bind values different"
 );
+
+# test diag string
+ok (! eq_sql (
+  'SELECT owner_name FROM books me WHERE ( source = ? )',
+  'SELECT owner_name FROM books me WHERE ( sUOrce = ? )',
+));
+like(
+  $SQL::Abstract::Test::sql_differ,
+  qr/\Q[ source ] != [ sUOrce ]/,
+  'expected debug of literal diff',
+);
+
+ok (! eq_sql (
+  'SELECT owner_name FROM books me ORDER BY owner_name',
+  'SELECT owner_name FROM books me GROUP BY owner_name',
+));
+like(
+  $SQL::Abstract::Test::sql_differ,
+  qr/\QOP [ORDER BY] != [GROUP BY]/,
+  'expected debug of op diff',
+);
+
+ok (! eq_sql (
+  'SELECT owner_name FROM books WHERE ( source = ? )',
+  'SELECT owner_name FROM books'
+));
+
+like(
+  $SQL::Abstract::Test::sql_differ,
+  qr|\Q[WHERE source = ?] != [N/A]|,
+  'expected debug of missing branch',
+);
+