/* * Copyright 2006 Le Duc Bao, Ralf Joachim * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package org.castor.ddlgen.test.framework; import java.text.MessageFormat; import org.castor.ddlgen.DDLGenConfiguration; /** * Expected result pattern to match. * * @author <a href="mailto:leducbao AT gmail DOT com">Le Duc Bao</a> * @author <a href="mailto:ralf DOT joachim AT syscon DOT eu">Ralf Joachim</a> * @version $Revision: 5951 $ $Date: 2006-04-25 16:09:10 -0600 (Tue, 25 Apr 2006) $ * @since 1.1 */ public final class Match { //-------------------------------------------------------------------------- /** Match generated DDL and expected result exactly. */ public static final String EXACT = "exact"; /** Match generated DDL and expected result by ignoring whitespaces. */ public static final String PLAIN = "plain"; /** Match generated DDL and expected result with regular expression. */ public static final String REGEXP = "regexp"; //-------------------------------------------------------------------------- /** Configuration of DDL generator. */ private DDLGenConfiguration _conf; /** Method used to compare generated DDL and expected result. */ private String _method; /** Index of generated DDL and expected result to compare. */ private int _index; /** Database engine the expected result is defined for. */ private String _engine; /** Expected result pattern. */ private String _pattern; //-------------------------------------------------------------------------- /** * Get configuration of DDL generator. * * @return Configuration of DDL generator. */ public DDLGenConfiguration getConf() { return _conf; } /** * Set configuration of DDL generator. * * @param conf Configuration of DDL generator. */ public void setConf(final DDLGenConfiguration conf) { _conf = conf; } /** * Get method used to compare generated DDL and expected result. * * @return Method used to compare generated DDL and expected result. */ public String getMethod() { return _method; } /** * Set method used to compare generated DDL and expected result. * * @param method Method used to compare generated DDL and expected result. */ public void setMethod(final String method) { _method = method; } /** * Get index of generated DDL and expected result to compare. * * @return Index of generated DDL and expected result to compare. */ public int getIndex() { return _index; } /** * Set index of generated DDL and expected result to compare. * * @param index Index of generated DDL and expected result to compare. */ public void setIndex(final int index) { _index = index; } /** * Get database engine the expected result is defined for. * * @return Database engine the expected result is defined for. */ public String getEngine() { return _engine; } /** * Set database engine the expected result is defined for. * * @param engine Database engine the expected result is defined for. */ public void setEngine(final String engine) { _engine = engine; } /** * Get expected result pattern. * * @return Expected result pattern. */ public String getDdl() { return _pattern; } /** * Set expected result pattern. * * @param pattern Expected result pattern. */ public void setDdl(final String pattern) { _pattern = pattern; } //-------------------------------------------------------------------------- /** * Match generated DDL given with expected result pattern. * * @param ddl Generated DDL. * @return <code>true</code> if generated DDL matches expected result. */ public boolean match(final String ddl) { return match(ddl, null); } /** * Match generated DDL given with expected result pattern. Replace any parameters of * expected result pattern with given parameter values before comparing with * generated DDL. * * @param ddl Generated DDL. * @param params Values for parameters in expected result. * @return <code>true</code> if generated DDL matches expected result. */ public boolean match(final String ddl, final Object[] params) { if (_method.equals(REGEXP)) { return matchRegExp(ddl, params); } if (_method.equals(PLAIN)) { return matchPlain(ddl, params); } if (_method.equals(EXACT)) { return matchExact(ddl, params); } throw new IllegalStateException("Unsupport match method: " + _method); } /** * Exactly match generated DDL given with expected result. Replace any parameters of * expected result pattern with given parameter values before comparing with * generated DDL. * * @param ddl Generated DDL. * @param params Values for parameters in expected result. * @return <code>true</code> if generated DDL matches expected result. */ private boolean matchExact(final String ddl, final Object[] params) { String actual = ddl.toLowerCase().trim(); String expected = _pattern; if (expected == null) { expected = ""; } if ((params != null) && (params.length != 0)) { expected = MessageFormat.format(expected, params); } expected = expected.toLowerCase().trim(); return actual.equals(expected); } /** * Match generated DDL given with expected result ignoring whitespace. Replace any * parameters of expected result pattern with given parameter values before comparing * with generated DDL. * * @param ddl Generated DDL. * @param params Values for parameters in expected result. * @return <code>true</code> if generated DDL matches expected result. */ private boolean matchPlain(final String ddl, final Object[] params) { String newline = _conf.getStringValue( DDLGenConfiguration.NEWLINE_KEY, DDLGenConfiguration.DEFAULT_NEWLINE); String actual = ddl.toLowerCase().trim(); actual = actual.replaceAll(newline, " "); actual = actual.replaceAll("[ \t]+", " ").trim(); String expected = _pattern; if (expected == null) { expected = ""; } if ((params != null) && (params.length != 0)) { expected = MessageFormat.format(expected, params); } expected = expected.toLowerCase().trim(); expected = expected.replaceAll(newline, " "); expected = expected.replaceAll("[ \t]+", " "); return actual.equals(expected); } /** * Match generated DDL given with expected regular expression. Replace any parameters * of expected result pattern with given parameter values before comparing with * generated DDL. * * @param ddl Generated DDL. * @param params Values for parameters in expected result. * @return <code>true</code> if generated DDL matches expected result. */ private boolean matchRegExp(final String ddl, final Object[] params) { String newline = _conf.getStringValue( DDLGenConfiguration.NEWLINE_KEY, DDLGenConfiguration.DEFAULT_NEWLINE); String indent = _conf.getStringValue( DDLGenConfiguration.INDENT_KEY, DDLGenConfiguration.DEFAULT_INDENT); String actual = ddl.toLowerCase().trim(); actual = actual.replaceAll(newline, " "); actual = actual.replaceAll(indent, " "); actual = actual.replaceAll("[ \t]+", " "); String expected = _pattern; if (expected == null) { expected = ""; } if ((params != null) && (params.length != 0)) { expected = MessageFormat.format(expected, params); } expected = expected.toLowerCase().trim(); expected = expected.replaceAll(newline, " "); expected = expected.replaceAll("[ \t]+", " "); return actual.matches(expected); } //-------------------------------------------------------------------------- /** * {@inheritDoc} */ public String toString() { return "match(method=" + _method + " index=" + _index + " engine=" + _engine + "):\n" + _pattern; } //-------------------------------------------------------------------------- }