package cn.org.rapid_framework.generator; import java.io.File; import java.io.IOException; import java.io.StringReader; import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; import junit.framework.TestCase; import cn.org.rapid_framework.generator.Generator.GeneratorModel; import cn.org.rapid_framework.generator.GeneratorFacade.GeneratorModelUtils; import cn.org.rapid_framework.generator.provider.db.DataSourceProvider; import cn.org.rapid_framework.generator.provider.db.sql.SqlFactory; import cn.org.rapid_framework.generator.provider.db.table.TableFactory; import cn.org.rapid_framework.generator.provider.db.table.model.Table; import cn.org.rapid_framework.generator.util.DBHelper; import cn.org.rapid_framework.generator.util.FileHelper; import cn.org.rapid_framework.generator.util.GLogger; import cn.org.rapid_framework.generator.util.IOHelper; import cn.org.rapid_framework.generator.util.StringHelper; import cn.org.rapid_framework.generator.util.sqlparse.SqlParseHelper; public class GeneratorTestCase extends TestCase{ protected Generator g; public synchronized void setUp()throws Exception { clearGeneratorCache(); g = new Generator(); GLogger.logLevel = GLogger.DEBUG; GeneratorProperties.setProperty(GeneratorConstants.GG_IS_OVERRIDE.code, "true"); try { runSqlScripts(); }catch(Exception e) { e.printStackTrace(); } // System.getProperties().list(System.out); if(isRuningByMaven()) { String tempDir = getTempDir(); System.out.println("running by maven, set outRootDir to tempDir="+tempDir); g.setOutRootDir(tempDir); }else { if(g.getOutRootDir() == null) g.setOutRootDir("."); } } private void clearGeneratorCache() { GeneratorProperties.clear(); TableFactory.getInstance().clearTableFactoryListener(); DataSourceProvider.setDataSource(null); SqlFactory.cache.clear(); } @Override protected void tearDown() throws Exception { super.tearDown(); DataSourceProvider.getConnection().close(); clearGeneratorCache(); } public boolean isRuningByMaven() { return System.getProperty("surefire.real.class.path") != null; } protected String testDbType = "h2"; public void runSqlScripts() throws SQLException, IOException { if("hsql".equals(testDbType)) { GeneratorProperties.setProperty(GeneratorConstants.JDBC_URL, "jdbc:hsqldb:mem:generatorDB"+StringHelper.randomNumeric(20)); GeneratorProperties.setProperty(GeneratorConstants.JDBC_DRIVER, "org.hsqldb.jdbcDriver"); }else if("h2".equals(testDbType)) { GeneratorProperties.setProperty(GeneratorConstants.JDBC_USERNAME, "sa"); GeneratorProperties.setProperty(GeneratorConstants.JDBC_PASSWORD, ""); GeneratorProperties.setProperty(GeneratorConstants.JDBC_URL, "jdbc:h2:mem:test"+StringHelper.randomNumeric(20)+";DB_CLOSE_DELAY=-1"); GeneratorProperties.setProperty(GeneratorConstants.JDBC_DRIVER, "org.h2.Driver"); }else if("mysql".equals(testDbType)) { GeneratorProperties.setProperty(GeneratorConstants.JDBC_USERNAME, "root"); GeneratorProperties.setProperty(GeneratorConstants.JDBC_PASSWORD, "123456"); GeneratorProperties.setProperty(GeneratorConstants.JDBC_URL, "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8"); GeneratorProperties.setProperty(GeneratorConstants.JDBC_DRIVER, "com.mysql.jdbc.Driver"); }else if("oracle".equals(testDbType)) { GeneratorProperties.setProperty(GeneratorConstants.JDBC_URL, "jdbc:hsqldb:mem:generatorDB"); GeneratorProperties.setProperty(GeneratorConstants.JDBC_DRIVER, "oracle.jdbc.driver.OracleDriver"); }else if("sqlserver".equals(testDbType)) { GeneratorProperties.setProperty(GeneratorConstants.JDBC_URL, "jdbc:hsqldb:mem:generatorDB"); GeneratorProperties.setProperty(GeneratorConstants.JDBC_DRIVER, "com.microsoft.jdbc.sqlserver.SQLServerDriver"); }else { throw new RuntimeException("请指定数据库类型"); } GeneratorProperties.setProperty(GeneratorConstants.JDBC_SCHEMA, ""); GeneratorProperties.setProperty(GeneratorConstants.JDBC_CATALOG, ""); runSqlScripts("generator_test_table.sql"); } public static void runSqlScripts(String file) throws SQLException, IOException { Connection conn = DataSourceProvider.getConnection(); Connection conn2 = DataSourceProvider.getConnection(); assertEquals(conn,conn2); // System.out.println(conn.getCatalog()); Statement stat = conn.createStatement(); try { String sqls = IOHelper.readFile(FileHelper.getFileByClassLoader(file),"UTF-8"); sqls = SqlParseHelper.removeSqlComments(sqls); System.out.println(sqls); for(String t : sqls.trim().split(";")) { stat.execute(t.trim()); } }finally { DBHelper.close(conn); DBHelper.close(conn2); DBHelper.close(stat); } } public void generateByTable(Table table) throws Exception { GeneratorModel m = GeneratorModelUtils.newGeneratorModel("table",table); // g.setIgnoreTemplateGenerateException(false); g.generateBy(m.templateModel, m.filePathModel); } public void generateByTable(Generator g,Table table) throws Exception { GeneratorModel m = GeneratorModelUtils.newGeneratorModel("table",table); g.generateBy(m.templateModel, m.filePathModel); } public String getTempDir() { String tempDir = System.getProperty("java.io.tmpdir"); return new File(tempDir,"test_generator_out").getAbsolutePath(); } public static void assertContains(String str,String... regexArray) { for(String regex : regexArray) { assertTrue("not match Regex:"+regex+" str:"+str,isStringMatch(str, regex)); } } private static boolean isStringMatch(String str, String regex) { String noSpaceString = str.replaceAll("\\s*", ""); if(str.contains(regex) || noSpaceString.contains(regex.replaceAll("\\s*", ""))) { return true; } for(String segment : StringHelper.tokenizeToStringArray(regex, "----")) { // segment = segment.replaceAll("file:.*",""); // List<String> files = getFiles(segment); if(!noSpaceString.contains(segment.replaceAll("\\s*", "").replace("file:.*",""))) { for(String line : IOHelper.readLines(new StringReader(segment))) { if(StringHelper.isBlank(line)) continue; if(!noSpaceString.contains(line.replaceAll("\\s*", ""))) { throw new RuntimeException("not match on line:\n"+line+" \n\n\n\nstr:\n"+str); } } throw new RuntimeException("not match segment:"+segment+" \n\n\n\nstr:\n"+str); } } return true; } public static void assertNotContains(String str,String... regexArray) { for(String regex : regexArray) { assertFalse("not match Regex:"+regex+" str:"+str,str.contains(regex)); } } }