001: package org.apache.velocity.test;
002:
003: /*
004: * Licensed to the Apache Software Foundation (ASF) under one
005: * or more contributor license agreements. See the NOTICE file
006: * distributed with this work for additional information
007: * regarding copyright ownership. The ASF licenses this file
008: * to you under the Apache License, Version 2.0 (the
009: * "License"); you may not use this file except in compliance
010: * with the License. You may obtain a copy of the License at
011: *
012: * http://www.apache.org/licenses/LICENSE-2.0
013: *
014: * Unless required by applicable law or agreed to in writing,
015: * software distributed under the License is distributed on an
016: * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
017: * KIND, either express or implied. See the License for the
018: * specific language governing permissions and limitations
019: * under the License.
020: */
021:
022: import java.io.BufferedWriter;
023: import java.io.FileOutputStream;
024: import java.io.OutputStreamWriter;
025: import java.io.Writer;
026:
027: import junit.framework.Test;
028: import junit.framework.TestSuite;
029:
030: import org.apache.velocity.Template;
031: import org.apache.velocity.VelocityContext;
032: import org.apache.velocity.app.VelocityEngine;
033: import org.apache.velocity.context.Context;
034: import org.apache.velocity.runtime.RuntimeConstants;
035: import org.apache.velocity.runtime.RuntimeServices;
036: import org.apache.velocity.runtime.log.LogChute;
037:
038: /**
039: * Test a reported bug in which method overloading throws IllegalArgumentException
040: * after a null return value.
041: * (VELOCITY-132).
042: *
043: * @author <a href="mailto:wglass@forio.com">Will Glass-Husain</a>
044: * @version $Id: MethodOverloadingTestCase.java 463298 2006-10-12 16:10:32Z henning $
045: */
046: public class MethodOverloadingTestCase extends BaseTestCase implements
047: LogChute {
048: String logData;
049:
050: /**
051: * VTL file extension.
052: */
053: private static final String TMPL_FILE_EXT = "vm";
054:
055: /**
056: * Comparison file extension.
057: */
058: private static final String CMP_FILE_EXT = "cmp";
059:
060: /**
061: * Comparison file extension.
062: */
063: private static final String RESULT_FILE_EXT = "res";
064:
065: /**
066: * Path for templates. This property will override the
067: * value in the default velocity properties file.
068: */
069: private final static String FILE_RESOURCE_LOADER_PATH = TEST_COMPARE_DIR
070: + "/methodoverloading";
071:
072: /**
073: * Results relative to the build directory.
074: */
075: private static final String RESULTS_DIR = TEST_RESULT_DIR
076: + "/methodoverloading";
077:
078: /**
079: * Results relative to the build directory.
080: */
081: private static final String COMPARE_DIR = TEST_COMPARE_DIR
082: + "/methodoverloading/compare";
083:
084: /**
085: * Default constructor.
086: */
087: public MethodOverloadingTestCase(String name) {
088: super (name);
089: }
090:
091: public void setUp() {
092: assureResultsDirectoryExists(RESULTS_DIR);
093: }
094:
095: public static Test suite() {
096: return new TestSuite(MethodOverloadingTestCase.class);
097: }
098:
099: public void testMethodOverloading() throws Exception {
100: /**
101: * test overloading in a single template
102: */
103: testFile("single");
104:
105: assertTrue(logData.indexOf("IllegalArgumentException") == -1);
106: }
107:
108: public void testParsedMethodOverloading() throws Exception {
109: /**
110: * test overloading in a file included with #parse
111: */
112: testFile("main");
113:
114: assertTrue(logData.indexOf("IllegalArgumentException") == -1);
115:
116: }
117:
118: public void testFile(String basefilename) throws Exception {
119:
120: VelocityEngine ve = new VelocityEngine();
121: ve.addProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH,
122: FILE_RESOURCE_LOADER_PATH);
123: ve.setProperty(VelocityEngine.RUNTIME_LOG_LOGSYSTEM, this );
124: ve.init();
125:
126: Template template;
127: FileOutputStream fos;
128: Writer fwriter;
129: Context context;
130:
131: template = ve.getTemplate(getFileName(null, basefilename,
132: TMPL_FILE_EXT));
133:
134: fos = new FileOutputStream(getFileName(RESULTS_DIR,
135: basefilename, RESULT_FILE_EXT));
136:
137: fwriter = new BufferedWriter(new OutputStreamWriter(fos));
138:
139: context = new VelocityContext();
140: setupContext(context);
141: template.merge(context, fwriter);
142: fwriter.flush();
143: fwriter.close();
144:
145: if (!isMatch(RESULTS_DIR, COMPARE_DIR, basefilename,
146: RESULT_FILE_EXT, CMP_FILE_EXT)) {
147: fail("Output incorrect.");
148: }
149: }
150:
151: public void setupContext(Context context) {
152: context.put("test", this );
153: context.put("nullValue", null);
154: }
155:
156: public String overloadedMethod(Integer s) {
157: return "Integer";
158: }
159:
160: public String overloadedMethod(String s) {
161: return "String";
162: }
163:
164: public String overloadedMethod2(Integer s) {
165: return "Integer";
166: }
167:
168: public String overloadedMethod2(String i) {
169: return "String";
170: }
171:
172: public void log(int level, String message) {
173: String out = "";
174:
175: /*
176: * Start with the appropriate prefix
177: */
178: switch (level) {
179: case DEBUG_ID:
180: out = DEBUG_PREFIX;
181: break;
182: case INFO_ID:
183: out = INFO_PREFIX;
184: break;
185: case TRACE_ID:
186: out = TRACE_PREFIX;
187: break;
188: case WARN_ID:
189: out = WARN_PREFIX;
190: break;
191: case ERROR_ID:
192: out = ERROR_PREFIX;
193: break;
194: default:
195: out = INFO_PREFIX;
196: break;
197: }
198:
199: logData += "\n" + out + message;
200: }
201:
202: public void init(RuntimeServices rs) {
203: // do nothing with it
204: }
205:
206: public void log(int level, String message, Throwable t) {
207: // ignore the Throwable, we're not testing this method here
208: log(level, message);
209: }
210:
211: public boolean isLevelEnabled(int level) {
212: return true;
213: }
214: }
|