X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=t%2F11unparse.t;h=e61416bcc79b803a43db0e98e71ae0f0834d8ff3;hb=fab0bed9d6f7c688660726c1f23448c136ba222b;hp=edad5ee62dc645a45a0ce5f552eac030a5f47e25;hpb=54750c7a150274c9711c8797b3c14a59f496a224;p=dbsrgits%2FSQL-Abstract.git diff --git a/t/11unparse.t b/t/11unparse.t index edad5ee..e61416b 100644 --- a/t/11unparse.t +++ b/t/11unparse.t @@ -2,89 +2,701 @@ use strict; use warnings; use Test::More; +use Test::Deep; use SQL::Abstract::Tree; -subtest no_formatting => sub { - my $sqlat = SQL::Abstract::Tree->new; +my $sqlat = SQL::Abstract::Tree->new; - { - my $sql = "SELECT a, b, c FROM foo WHERE foo.a =1 and foo.b LIKE 'station'"; - my $expected_sql = - "SELECT a, b, c FROM foo WHERE foo.a = 1 AND foo.b LIKE 'station' "; - is($sqlat->format($sql), $expected_sql, - 'simple statement formatted correctly' - ); - } +cmp_deeply($sqlat->parse("SELECT a, b, c FROM foo WHERE foo.a =1 and foo.b LIKE 'station'"), [ + [ + [ + "SELECT", + [ + [ + "LIST", + [ + [ + "LITERAL", + [ + "a" + ] + ], + [ + "LITERAL", + [ + "b" + ] + ], + [ + "LITERAL", + [ + "c" + ] + ] + ] + ] + ] + ], + [ + "FROM", + [ + [ + "LITERAL", + [ + "foo" + ] + ] + ] + ] + ], + [ + "WHERE", + [ + [ + "AND", + [ + [ + "=", + [ + [ + "LITERAL", + [ + "foo.a" + ] + ], + [ + "LITERAL", + [ + 1 + ] + ] + ] + ], + [ + "LIKE", + [ + [ + "LITERAL", + [ + "foo.b" + ] + ], + [ + "LITERAL", + [ + "'station'" + ] + ] + ] + ] + ] + ] + ] + ] +], 'simple statement parsed correctly'); - { - my $sql = "SELECT * FROM (SELECT * FROM foobar) WHERE foo.a =1 and foo.b LIKE 'station'"; - my $expected_sql = - "SELECT * FROM (SELECT * FROM foobar ) WHERE foo.a = 1 AND foo.b LIKE 'station' "; - is($sqlat->format($sql), $expected_sql, - 'subquery statement formatted correctly' - ); - } +cmp_deeply($sqlat->parse( "SELECT * FROM (SELECT * FROM foobar) WHERE foo.a =1 and foo.b LIKE 'station'"), [ + [ + [ + "SELECT", + [ + [ + "LITERAL", + [ + "*" + ] + ] + ] + ], + [ + "FROM", + [ + [ + "PAREN", + [ + [ + [ + "SELECT", + [ + [ + "LITERAL", + [ + "*" + ] + ] + ] + ], + [ + "FROM", + [ + [ + "LITERAL", + [ + "foobar" + ] + ] + ] + ] + ] + ] + ] + ] + ] + ], + [ + "WHERE", + [ + [ + "AND", + [ + [ + "=", + [ + [ + "LITERAL", + [ + "foo.a" + ] + ], + [ + "LITERAL", + [ + 1 + ] + ] + ] + ], + [ + "LIKE", + [ + [ + "LITERAL", + [ + "foo.b" + ] + ], + [ + "LITERAL", + [ + "'station'" + ] + ] + ] + ] + ] + ] + ] + ] +], 'subquery statement parsed correctly'); - { - my $sql = "SELECT * FROM lolz WHERE ( foo.a =1 ) and foo.b LIKE 'station'"; - my $expected_sql = - "SELECT * FROM lolz WHERE (foo.a = 1) AND foo.b LIKE 'station' "; +cmp_deeply($sqlat->parse("SELECT * FROM lolz WHERE ( foo.a =1 ) and foo.b LIKE 'station'"), [ + [ + [ + "SELECT", + [ + [ + "LITERAL", + [ + "*" + ] + ] + ] + ], + [ + "FROM", + [ + [ + "LITERAL", + [ + "lolz" + ] + ] + ] + ] + ], + [ + "WHERE", + [ + [ + "AND", + [ + [ + "PAREN", + [ + [ + "=", + [ + [ + "LITERAL", + [ + "foo.a" + ] + ], + [ + "LITERAL", + [ + 1 + ] + ] + ] + ] + ] + ], + [ + "LIKE", + [ + [ + "LITERAL", + [ + "foo.b" + ] + ], + [ + "LITERAL", + [ + "'station'" + ] + ] + ] + ] + ] + ] + ] + ] +], 'simple statement with parens in where parsed correctly'); - is($sqlat->format($sql), $expected_sql, - 'simple statement with parens in where formatted correctly' - ); - } - done_testing; -}; +cmp_deeply($sqlat->parse( "SELECT [screen].[id], [screen].[name], [screen].[section_id], [screen].[xtype] FROM [users_roles] [me] JOIN [roles] [role] ON [role].[id] = [me].[role_id] JOIN [roles_permissions] [role_permissions] ON [role_permissions].[role_id] = [role].[id] JOIN [permissions] [permission] ON [permission].[id] = [role_permissions].[permission_id] JOIN [permissionscreens] [permission_screens] ON [permission_screens].[permission_id] = [permission].[id] JOIN [screens] [screen] ON [screen].[id] = [permission_screens].[screen_id] WHERE ( [me].[user_id] = ? ) GROUP BY [screen].[id], [screen].[name], [screen].[section_id], [screen].[xtype]"), [ + [ + [ + [ + [ + [ + [ + [ + [ + [ + [ + [ + [ + [ + "SELECT", + [ + [ + "LIST", + [ + [ + "LITERAL", + [ + "[screen].[id]" + ] + ], + [ + "LITERAL", + [ + "[screen].[name]" + ] + ], + [ + "LITERAL", + [ + "[screen].[section_id]" + ] + ], + [ + "LITERAL", + [ + "[screen].[xtype]" + ] + ] + ] + ] + ] + ], + [ + "FROM", + [ + [ + [ + "LITERAL", + [ + "[users_roles]" + ] + ], + [ + "LITERAL", + [ + "[me]" + ] + ] + ] + ] + ] + ], + [ + "JOIN", + [ + [ + [ + "LITERAL", + [ + "[roles]" + ] + ], + [ + "LITERAL", + [ + "[role]" + ] + ] + ] + ] + ] + ], + [ + "ON", + [ + [ + "=", + [ + [ + "LITERAL", + [ + "[role].[id]" + ] + ], + [ + "LITERAL", + [ + "[me].[role_id]" + ] + ] + ] + ] + ] + ] + ], + [ + "JOIN", + [ + [ + [ + "LITERAL", + [ + "[roles_permissions]" + ] + ], + [ + "LITERAL", + [ + "[role_permissions]" + ] + ] + ] + ] + ] + ], + [ + "ON", + [ + [ + "=", + [ + [ + "LITERAL", + [ + "[role_permissions].[role_id]" + ] + ], + [ + "LITERAL", + [ + "[role].[id]" + ] + ] + ] + ] + ] + ] + ], + [ + "JOIN", + [ + [ + [ + "LITERAL", + [ + "[permissions]" + ] + ], + [ + "LITERAL", + [ + "[permission]" + ] + ] + ] + ] + ] + ], + [ + "ON", + [ + [ + "=", + [ + [ + "LITERAL", + [ + "[permission].[id]" + ] + ], + [ + "LITERAL", + [ + "[role_permissions].[permission_id]" + ] + ] + ] + ] + ] + ] + ], + [ + "JOIN", + [ + [ + [ + "LITERAL", + [ + "[permissionscreens]" + ] + ], + [ + "LITERAL", + [ + "[permission_screens]" + ] + ] + ] + ] + ] + ], + [ + "ON", + [ + [ + "=", + [ + [ + "LITERAL", + [ + "[permission_screens].[permission_id]" + ] + ], + [ + "LITERAL", + [ + "[permission].[id]" + ] + ] + ] + ] + ] + ] + ], + [ + "JOIN", + [ + [ + [ + "LITERAL", + [ + "[screens]" + ] + ], + [ + "LITERAL", + [ + "[screen]" + ] + ] + ] + ] + ] + ], + [ + "ON", + [ + [ + "=", + [ + [ + "LITERAL", + [ + "[screen].[id]" + ] + ], + [ + "LITERAL", + [ + "[permission_screens].[screen_id]" + ] + ] + ] + ] + ] + ] + ], + [ + "WHERE", + [ + [ + "PAREN", + [ + [ + "=", + [ + [ + "LITERAL", + [ + "[me].[user_id]" + ] + ], + [ + "PLACEHOLDER", + [ + "?" + ] + ] + ] + ] + ] + ] + ] + ] + ], + [ + "GROUP BY", + [ + [ + "LIST", + [ + [ + "LITERAL", + [ + "[screen].[id]" + ] + ], + [ + "LITERAL", + [ + "[screen].[name]" + ] + ], + [ + "LITERAL", + [ + "[screen].[section_id]" + ] + ], + [ + "LITERAL", + [ + "[screen].[xtype]" + ] + ] + ] + ] + ] + ] +], 'real life statement 1 parsed correctly'); -subtest console_monochrome => sub { - my $sqlat = SQL::Abstract::Tree->new({ - profile => 'console_monochrome', - }); - - { - my $sql = "SELECT a, b, c FROM foo WHERE foo.a =1 and foo.b LIKE 'station'"; - my $expected_sql = - qq{SELECT a, b, c \n} . - qq{ FROM foo \n} . - qq{ WHERE foo.a = 1 AND foo.b LIKE 'station' }; - is($sqlat->format($sql), $expected_sql, - 'simple statement formatted correctly' - ); - } - - { - my $sql = "SELECT * FROM (SELECT * FROM foobar) WHERE foo.a =1 and foo.b LIKE 'station'"; - my $expected_sql = - qq{SELECT * \n} . - qq{ FROM (\n} . - qq{ SELECT * \n} . - qq{ FROM foobar \n} . - qq{ ) \n} . - qq{ WHERE foo.a = 1 AND foo.b LIKE 'station' }; - - is($sqlat->format($sql), $expected_sql, - 'subquery statement formatted correctly' - ); - } - - { - my $sql = "SELECT * FROM lolz WHERE ( foo.a =1 ) and foo.b LIKE 'station'"; - my $expected_sql = - qq{SELECT * \n} . - qq{ FROM lolz \n} . - qq{ WHERE (foo.a = 1) AND foo.b LIKE 'station' }; - - is($sqlat->format($sql), $expected_sql, - 'simple statement with parens in where formatted correctly' - ); - } - done_testing; -}; +cmp_deeply($sqlat->parse("SELECT x, y FROM foo WHERE x IN (?, ?, ?, ?)"), [ + [ + [ + "SELECT", + [ + [ + "LIST", + [ + [ + "LITERAL", + [ + "x" + ] + ], + [ + "LITERAL", + [ + "y" + ] + ] + ] + ] + ] + ], + [ + "FROM", + [ + [ + "LITERAL", + [ + "foo" + ] + ] + ] + ] + ], + [ + "WHERE", + [ + [ + "IN", + [ + [ + "LITERAL", + [ + "x" + ] + ], + [ + "PAREN", + [ + [ + "LIST", + [ + [ + "PLACEHOLDER", + [ + "?" + ] + ], + [ + "PLACEHOLDER", + [ + "?" + ] + ], + [ + "PLACEHOLDER", + [ + "?" + ] + ], + [ + "PLACEHOLDER", + [ + "?" + ] + ] + ] + ] + ] + ] + ] + ] + ] + ] +], 'Lists parsed correctly'); done_testing; -# stuff we want: -# Nested indentation -# Max Width -# Color coding (console) -# Color coding (html)