From: <hib...@li...> - 2006-05-30 13:17:52
|
Author: max...@jb... Date: 2006-05-30 09:17:45 -0400 (Tue, 30 May 2006) New Revision: 9961 Added: trunk/Hibernate3/test/org/hibernate/test/pretty/SQLFormatterTest.java Modified: trunk/Hibernate3/src/org/hibernate/pretty/Formatter.java Log: HHH-1748 formatter breaks on single tick in e.g. a comment + Tests for the formatter Modified: trunk/Hibernate3/src/org/hibernate/pretty/Formatter.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/pretty/Formatter.java 2006-05-30 13:17:40 UTC (rev 9960) +++ trunk/Hibernate3/src/org/hibernate/pretty/Formatter.java 2006-05-30 13:17:45 UTC (rev 9961) @@ -112,7 +112,7 @@ t = tokens.nextToken(); token += t; } - while ( !"'".equals(t) ); + while ( !"'".equals(t) && tokens.hasMoreTokens() ); // cannot handle single quotes } else if ( "\"".equals(token) ) { String t; @@ -365,30 +365,6 @@ if ( args.length>0 ) System.out.println( new Formatter( StringHelper.join(" ", args) ).format() ); - System.out.println( - new Formatter("insert into Address (city, state, zip, \"from\") values (?, ?, ?, 'insert value')").format() - ); - System.out.println( - new Formatter("delete from Address where id = ? and version = ?").format() - ); - System.out.println( - new Formatter("update Address set city = ?, state=?, zip=?, version = ? where id = ? and version = ?").format() - ); - System.out.println( - new Formatter("update Address set city = ?, state=?, zip=?, version = ? where id in (select aid from Person)").format() - ); - System.out.println( - new Formatter("select p.name, a.zipCode, count(*) from Person p left outer join Employee e on e.id = p.id and p.type = 'E' and (e.effective>? or e.effective<?) join Address a on a.pid = p.id where upper(p.name) like 'G%' and p.age > 100 and (p.sex = 'M' or p.sex = 'F') and coalesce( trim(a.street), a.city, (a.zip) ) is not null order by p.name asc, a.zipCode asc").format() - ); - System.out.println( - new Formatter("select ( (m.age - p.age) * 12 ), trim(upper(p.name)) from Person p, Person m where p.mother = m.id and ( p.age = (select max(p0.age) from Person p0 where (p0.mother=m.id)) and p.name like ? )").format() - ); - System.out.println( - new Formatter("select * from Address a join Person p on a.pid = p.id, Person m join Address b on b.pid = m.id where p.mother = m.id and p.name like ?").format() - ); - System.out.println( - new Formatter("select case when p.age > 50 then 'old' when p.age > 18 then 'adult' else 'child' end from Person p where ( case when p.age > 50 then 'old' when p.age > 18 then 'adult' else 'child' end ) like ?").format() - ); } } Added: trunk/Hibernate3/test/org/hibernate/test/pretty/SQLFormatterTest.java =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/pretty/SQLFormatterTest.java 2006-05-30 13:17:40 UTC (rev 9960) +++ trunk/Hibernate3/test/org/hibernate/test/pretty/SQLFormatterTest.java 2006-05-30 13:17:45 UTC (rev 9961) @@ -0,0 +1,40 @@ +package org.hibernate.test.pretty; + +import java.util.StringTokenizer; + +import junit.framework.TestCase; + +import org.hibernate.pretty.Formatter; + +public class SQLFormatterTest extends TestCase { + + public void testNoLoss() { + assertNoLoss("insert into Address (city, state, zip, \"from\") values (?, ?, ?, 'insert value')"); + assertNoLoss("delete from Address where id = ? and version = ?"); + assertNoLoss("update Address set city = ?, state=?, zip=?, version = ? where id = ? and version = ?"); + assertNoLoss("update Address set city = ?, state=?, zip=?, version = ? where id in (select aid from Person)"); + assertNoLoss("select p.name, a.zipCode, count(*) from Person p left outer join Employee e on e.id = p.id and p.type = 'E' and (e.effective>? or e.effective<?) join Address a on a.pid = p.id where upper(p.name) like 'G%' and p.age > 100 and (p.sex = 'M' or p.sex = 'F') and coalesce( trim(a.street), a.city, (a.zip) ) is not null order by p.name asc, a.zipCode asc"); + assertNoLoss("select ( (m.age - p.age) * 12 ), trim(upper(p.name)) from Person p, Person m where p.mother = m.id and ( p.age = (select max(p0.age) from Person p0 where (p0.mother=m.id)) and p.name like ? )"); + assertNoLoss("select * from Address a join Person p on a.pid = p.id, Person m join Address b on b.pid = m.id where p.mother = m.id and p.name like ?"); + assertNoLoss("select case when p.age > 50 then 'old' when p.age > 18 then 'adult' else 'child' end from Person p where ( case when p.age > 50 then 'old' when p.age > 18 then 'adult' else 'child' end ) like ?"); + assertNoLoss("/* Here we' go! */ select case when p.age > 50 then 'old' when p.age > 18 then 'adult' else 'child' end from Person p where ( case when p.age > 50 then 'old' when p.age > 18 then 'adult' else 'child' end ) like ?"); + } + + private void assertNoLoss(String query) { + String formattedQuery = new Formatter(query).format(); + StringTokenizer formatted = new StringTokenizer(formattedQuery," \t\n\r\f()"); + StringTokenizer plain = new StringTokenizer(query," \t\n\r\f()"); + + System.out.println("Original: " + query); + System.out.println("Formatted: " + formattedQuery); + while(formatted.hasMoreTokens() && plain.hasMoreTokens()) { + String plainToken = plain.nextToken(); + String formattedToken = formatted.nextToken(); + assertEquals("formatter did not return the same token",plainToken, formattedToken); + } + assertFalse(formatted.hasMoreTokens()); + assertFalse(plain.hasMoreTokens()); + } + + +} |