📄 templatetestcase.java
字号:
/*
* Copyright (c) 2005 The Visigoth Software Society. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowledgement:
* "This product includes software developed by the
* Visigoth Software Society (http://www.visigoths.org/)."
* Alternately, this acknowledgement may appear in the software itself,
* if and wherever such third-party acknowledgements normally appear.
*
* 4. Neither the name "FreeMarker", "Visigoth", nor any of the names of the
* project contributors may be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact visigoths@visigoths.org.
*
* 5. Products derived from this software may not be called "FreeMarker" or "Visigoth"
* nor may "FreeMarker" or "Visigoth" appear in their names
* without prior written permission of the Visigoth Software Society.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE VISIGOTH SOFTWARE SOCIETY OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Visigoth Software Society. For more
* information on the Visigoth Software Society, please see
* http://www.visigoths.org/
*/
package freemarker.testcase;
import freemarker.template.*;
import freemarker.ext.beans.*;
import freemarker.ext.dom.NodeModel;
import freemarker.ext.jdom.NodeListModel;
import freemarker.testcase.models.*;
import freemarker.template.utility.*;
import freemarker.template.utility.NormalizeNewlines;
import freemarker.testcase.models.TransformHashWrapper;
import junit.framework.*;
import java.util.*;
import java.io.*;
import java.net.URL;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.jdom.input.SAXBuilder;
import org.xml.sax.InputSource;
public class TemplateTestCase extends TestCase {
Template template;
HashMap dataModel = new HashMap();
String filename, testName;
String inputDir = "template";
String referenceDir = "reference";
File outputDir;
Configuration conf = new Configuration();
public TemplateTestCase(String name, String filename) {
super(name);
this.filename = filename;
this.testName = name;
}
public void setTemplateDirectory(String dirname) throws IOException {
URL url = getClass().getResource("TemplateTestCase.class");
File parent = new File(url.getFile()).getParentFile();
File dir = new File(parent, dirname);
conf.setDirectoryForTemplateLoading(dir);
System.out.println("Setting loading directory as: " + dir);
}
public void setOutputDirectory(String dirname) {
URL url = getClass().getResource("TemplateTestCase.class");
File parent = new File(url.getFile()).getParentFile();
this.outputDir = new File(parent, dirname);
System.out.println("Setting reference directory as: " + outputDir);
}
public void setConfigParam(String param, String value) throws IOException {
if ("templatedir".equals(param)) {
setTemplateDirectory(value);
}
else if ("auto_import".equals(param)) {
StringTokenizer st = new StringTokenizer(value);
if (!st.hasMoreTokens()) fail("Expecting libname");
String libname = st.nextToken();
if (!st.hasMoreTokens()) fail("Expecting 'as <alias>' in autoimport");
String as = st.nextToken();
if (!as.equals("as")) fail("Expecting 'as <alias>' in autoimport");
if (!st.hasMoreTokens()) fail("Expecting alias after 'as' in autoimport");
String alias = st.nextToken();
conf.addAutoImport(alias, libname);
}
else if ("clear_encoding_map".equals(param)) {
if (StringUtil.getYesNo(value)) {
conf.clearEncodingMap();
}
}
else if ("input_encoding".equals(param)) {
conf.setDefaultEncoding(value);
}
else if ("outputdir".equals(param)) {
setOutputDirectory(value);
}
else if ("output_encoding".equals(param)) {
conf.setOutputEncoding(value);
}
else if ("locale".equals(param)) {
String lang = "", country="", variant="";
StringTokenizer st = new StringTokenizer(value,"_", false);
if (st.hasMoreTokens()) {
lang = st.nextToken();
}
if (st.hasMoreTokens()) {
country = st.nextToken();
}
if (st.hasMoreTokens()){
variant = st.nextToken();
}
if (lang != "") {
Locale loc = new Locale(lang, country, variant);
conf.setLocale(loc);
}
}
else if ("object_wrapper".equals(param)) {
try {
Class cl = Class.forName(value);
ObjectWrapper ow = (ObjectWrapper) cl.newInstance();
conf.setObjectWrapper(ow);
} catch (Exception e) {
fail("Error setting object wrapper to " + value + "\n" + e.getMessage());
}
}
else if ("input_encoding".equals(param)) {
conf.setDefaultEncoding(value);
}
else if ("output_encoding".equals(param)) {
conf.setOutputEncoding(value);
}
else if ("strict_syntax".equals(param)) {
boolean b = StringUtil.getYesNo(value);
conf.setStrictSyntaxMode(b);
}
else if ("url_escaping_charset".equals(param)) {
conf.setURLEscapingCharset(value);
}
}
/*
* This method just contains all the code to seed the data model
* ported over from the individual classes. This seems ugly and unnecessary.
* We really might as well just expose pretty much
* the same tree to all our tests. (JR)
*/
public void setUp() throws Exception {
dataModel.put("message", "Hello, world!");
if (testName.equals("bean-maps")) {
BeansWrapper w1 = new BeansWrapper();
BeansWrapper w2 = new BeansWrapper();
BeansWrapper w3 = new BeansWrapper();
BeansWrapper w4 = new BeansWrapper();
BeansWrapper w5 = new BeansWrapper();
BeansWrapper w6 = new BeansWrapper();
BeansWrapper w7 = new BeansWrapper();
w1.setExposureLevel(BeansWrapper.EXPOSE_PROPERTIES_ONLY);
w2.setExposureLevel(BeansWrapper.EXPOSE_PROPERTIES_ONLY);
w3.setExposureLevel(BeansWrapper.EXPOSE_NOTHING);
w4.setExposureLevel(BeansWrapper.EXPOSE_NOTHING);
w5.setExposureLevel(BeansWrapper.EXPOSE_ALL);
w6.setExposureLevel(BeansWrapper.EXPOSE_ALL);
w1.setMethodsShadowItems(true);
w2.setMethodsShadowItems(false);
w3.setMethodsShadowItems(true);
w4.setMethodsShadowItems(false);
w5.setMethodsShadowItems(true);
w6.setMethodsShadowItems(false);
w7.setSimpleMapWrapper(true);
Object test = getTestBean();
dataModel.put("m1", w1.wrap(test));
dataModel.put("m2", w2.wrap(test));
dataModel.put("m3", w3.wrap(test));
dataModel.put("m4", w4.wrap(test));
dataModel.put("m5", w5.wrap(test));
dataModel.put("m6", w6.wrap(test));
dataModel.put("m7", w7.wrap(test));
dataModel.put("s1", w1.wrap("hello"));
dataModel.put("s2", w1.wrap("world"));
dataModel.put("s3", w5.wrap("hello"));
dataModel.put("s4", w5.wrap("world"));
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -