You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@freemarker.apache.org by dd...@apache.org on 2017/05/15 21:23:38 UTC

[22/51] [abbrv] [partial] incubator-freemarker git commit: Restructured project so that freemarker-test-utils depends on freemarker-core (and hence can provide common classes for testing templates, and can use utility classes defined in the core). As a c

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/28a276c8/freemarker-core/src/test/java/org/apache/freemarker/core/ConfigurationTest.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/test/java/org/apache/freemarker/core/ConfigurationTest.java b/freemarker-core/src/test/java/org/apache/freemarker/core/ConfigurationTest.java
deleted file mode 100644
index dcefa3f..0000000
--- a/freemarker-core/src/test/java/org/apache/freemarker/core/ConfigurationTest.java
+++ /dev/null
@@ -1,1486 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you 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.apache.freemarker.core;
-
-import static org.apache.freemarker.test.hamcerst.Matchers.*;
-import static org.hamcrest.Matchers.*;
-import static org.junit.Assert.*;
-
-import java.io.IOException;
-import java.io.Serializable;
-import java.io.StringWriter;
-import java.lang.reflect.Field;
-import java.nio.charset.Charset;
-import java.nio.charset.StandardCharsets;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Set;
-import java.util.TimeZone;
-
-import org.apache.freemarker.core.model.TemplateModelException;
-import org.apache.freemarker.core.model.TemplateScalarModel;
-import org.apache.freemarker.core.model.impl.DefaultObjectWrapper;
-import org.apache.freemarker.core.model.impl.RestrictedObjectWrapper;
-import org.apache.freemarker.core.model.impl.SimpleScalar;
-import org.apache.freemarker.core.outputformat.MarkupOutputFormat;
-import org.apache.freemarker.core.outputformat.OutputFormat;
-import org.apache.freemarker.core.outputformat.UnregisteredOutputFormatException;
-import org.apache.freemarker.core.outputformat.impl.CombinedMarkupOutputFormat;
-import org.apache.freemarker.core.outputformat.impl.HTMLOutputFormat;
-import org.apache.freemarker.core.outputformat.impl.RTFOutputFormat;
-import org.apache.freemarker.core.outputformat.impl.UndefinedOutputFormat;
-import org.apache.freemarker.core.outputformat.impl.XMLOutputFormat;
-import org.apache.freemarker.core.templateresolver.CacheStorageWithGetSize;
-import org.apache.freemarker.core.templateresolver.ConditionalTemplateConfigurationFactory;
-import org.apache.freemarker.core.templateresolver.FileNameGlobMatcher;
-import org.apache.freemarker.core.templateresolver.TemplateLookupContext;
-import org.apache.freemarker.core.templateresolver.TemplateLookupResult;
-import org.apache.freemarker.core.templateresolver.TemplateLookupStrategy;
-import org.apache.freemarker.core.templateresolver.impl.ByteArrayTemplateLoader;
-import org.apache.freemarker.core.templateresolver.impl.ClassTemplateLoader;
-import org.apache.freemarker.core.templateresolver.impl.DefaultTemplateLookupStrategy;
-import org.apache.freemarker.core.templateresolver.impl.DefaultTemplateNameFormat;
-import org.apache.freemarker.core.templateresolver.impl.DefaultTemplateNameFormatFM2;
-import org.apache.freemarker.core.templateresolver.impl.DefaultTemplateResolver;
-import org.apache.freemarker.core.templateresolver.impl.NullCacheStorage;
-import org.apache.freemarker.core.templateresolver.impl.SoftCacheStorage;
-import org.apache.freemarker.core.templateresolver.impl.StringTemplateLoader;
-import org.apache.freemarker.core.templateresolver.impl.StrongCacheStorage;
-import org.apache.freemarker.core.userpkg.BaseNTemplateNumberFormatFactory;
-import org.apache.freemarker.core.userpkg.CustomHTMLOutputFormat;
-import org.apache.freemarker.core.userpkg.DummyOutputFormat;
-import org.apache.freemarker.core.userpkg.EpochMillisDivTemplateDateFormatFactory;
-import org.apache.freemarker.core.userpkg.EpochMillisTemplateDateFormatFactory;
-import org.apache.freemarker.core.userpkg.HexTemplateNumberFormatFactory;
-import org.apache.freemarker.core.util._DateUtil;
-import org.apache.freemarker.core.util._NullArgumentException;
-import org.apache.freemarker.core.util._NullWriter;
-import org.apache.freemarker.core.util._StringUtil;
-import org.apache.freemarker.core.valueformat.TemplateDateFormatFactory;
-import org.apache.freemarker.core.valueformat.TemplateNumberFormatFactory;
-import org.junit.Test;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
-import junit.framework.TestCase;
-
-public class ConfigurationTest extends TestCase {
-
-    private static final Charset ISO_8859_2 = Charset.forName("ISO-8859-2");
-
-    public ConfigurationTest(String name) {
-        super(name);
-    }
-
-    public void testUnsetAndIsSet() throws Exception {
-        Configuration.ExtendableBuilder<?> cfgB = new Configuration.Builder(Configuration.VERSION_3_0_0);
-        
-        assertFalse(cfgB.isLogTemplateExceptionsSet());
-        assertFalse(cfgB.getLogTemplateExceptions());
-        //
-        cfgB.setLogTemplateExceptions(true);
-        {
-            Configuration cfg = cfgB.build();
-            assertTrue(cfgB.isLogTemplateExceptionsSet());
-            assertTrue(cfg.isLogTemplateExceptionsSet());
-            assertTrue(cfgB.getLogTemplateExceptions());
-            assertTrue(cfg.getLogTemplateExceptions());
-        }
-        //
-        for (int i = 0; i < 2; i++) {
-            cfgB.unsetLogTemplateExceptions();
-            Configuration cfg = cfgB.build();
-            assertFalse(cfgB.isLogTemplateExceptionsSet());
-            assertTrue(cfg.isLogTemplateExceptionsSet());
-            assertFalse(cfgB.getLogTemplateExceptions());
-            assertFalse(cfg.getLogTemplateExceptions());
-        }
-
-        DefaultObjectWrapper dow = new DefaultObjectWrapper.Builder(Configuration.VERSION_3_0_0).build();
-        assertFalse(cfgB.isObjectWrapperSet());
-        assertSame(dow, cfgB.getObjectWrapper());
-        //
-        RestrictedObjectWrapper ow = new RestrictedObjectWrapper.Builder(Configuration.VERSION_3_0_0).build();
-        cfgB.setObjectWrapper(ow);
-        assertTrue(cfgB.isObjectWrapperSet());
-        assertSame(ow, cfgB.getObjectWrapper());
-        //
-        for (int i = 0; i < 2; i++) {
-            cfgB.unsetObjectWrapper();
-            assertFalse(cfgB.isObjectWrapperSet());
-            assertSame(dow, cfgB.getObjectWrapper());
-        }
-        
-        assertFalse(cfgB.isTemplateExceptionHandlerSet());
-        assertSame(TemplateExceptionHandler.DEBUG_HANDLER, cfgB.getTemplateExceptionHandler());
-        //
-        cfgB.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
-        assertTrue(cfgB.isTemplateExceptionHandlerSet());
-        assertSame(TemplateExceptionHandler.RETHROW_HANDLER, cfgB.getTemplateExceptionHandler());
-        //
-        for (int i = 0; i < 2; i++) {
-            cfgB.unsetTemplateExceptionHandler();
-            assertFalse(cfgB.isTemplateExceptionHandlerSet());
-            assertSame(TemplateExceptionHandler.DEBUG_HANDLER, cfgB.getTemplateExceptionHandler());
-        }
-        
-        assertFalse(cfgB.isTemplateLoaderSet());
-        assertNull(cfgB.getTemplateLoader());
-        //
-        cfgB.setTemplateLoader(null);
-        assertTrue(cfgB.isTemplateLoaderSet());
-        assertNull(cfgB.getTemplateLoader());
-        //
-        for (int i = 0; i < 3; i++) {
-            if (i == 2) {
-                cfgB.setTemplateLoader(new StringTemplateLoader());
-            }
-            cfgB.unsetTemplateLoader();
-            assertFalse(cfgB.isTemplateLoaderSet());
-            assertNull(cfgB.getTemplateLoader());
-        }
-        
-        assertFalse(cfgB.isTemplateLookupStrategySet());
-        assertSame(DefaultTemplateLookupStrategy.INSTANCE, cfgB.getTemplateLookupStrategy());
-        //
-        cfgB.setTemplateLookupStrategy(DefaultTemplateLookupStrategy.INSTANCE);
-        assertTrue(cfgB.isTemplateLookupStrategySet());
-        //
-        for (int i = 0; i < 2; i++) {
-            cfgB.unsetTemplateLookupStrategy();
-            assertFalse(cfgB.isTemplateLookupStrategySet());
-        }
-        
-        assertFalse(cfgB.isTemplateNameFormatSet());
-        assertSame(DefaultTemplateNameFormatFM2.INSTANCE, cfgB.getTemplateNameFormat());
-        //
-        cfgB.setTemplateNameFormat(DefaultTemplateNameFormat.INSTANCE);
-        assertTrue(cfgB.isTemplateNameFormatSet());
-        assertSame(DefaultTemplateNameFormat.INSTANCE, cfgB.getTemplateNameFormat());
-        //
-        for (int i = 0; i < 2; i++) {
-            cfgB.unsetTemplateNameFormat();
-            assertFalse(cfgB.isTemplateNameFormatSet());
-            assertSame(DefaultTemplateNameFormatFM2.INSTANCE, cfgB.getTemplateNameFormat());
-        }
-        
-        assertFalse(cfgB.isCacheStorageSet());
-        assertTrue(cfgB.getCacheStorage() instanceof SoftCacheStorage);
-        //
-        cfgB.setCacheStorage(NullCacheStorage.INSTANCE);
-        assertTrue(cfgB.isCacheStorageSet());
-        assertSame(NullCacheStorage.INSTANCE, cfgB.getCacheStorage());
-        //
-        for (int i = 0; i < 3; i++) {
-            if (i == 2) {
-                cfgB.setCacheStorage(cfgB.getCacheStorage());
-            }
-            cfgB.unsetCacheStorage();
-            assertFalse(cfgB.isCacheStorageSet());
-            assertTrue(cfgB.getCacheStorage() instanceof SoftCacheStorage);
-        }
-    }
-    
-    public void testTemplateLoadingErrors() throws Exception {
-        Configuration cfg = new Configuration.Builder(Configuration.VERSION_3_0_0)
-                .templateLoader(new ClassTemplateLoader(getClass(), "nosuchpackage"))
-                .build();
-        try {
-            cfg.getTemplate("missing.ftl");
-            fail();
-        } catch (TemplateNotFoundException e) {
-            assertThat(e.getMessage(), not(containsString("wasn't set")));
-        }
-    }
-    
-    public void testVersion() {
-        Version v = Configuration.getVersion();
-        assertTrue(v.intValue() >= _CoreAPI.VERSION_INT_3_0_0);
-        
-        try {
-            new Configuration.Builder(new Version(999, 1, 2));
-        } catch (IllegalArgumentException e) {
-            assertThat(e.getMessage(), containsString("upgrade"));
-        }
-        
-        try {
-            new Configuration.Builder(new Version(2, 3, 0));
-        } catch (IllegalArgumentException e) {
-            assertThat(e.getMessage(), containsString("3.0.0"));
-        }
-    }
-    
-    public void testShowErrorTips() throws Exception {
-        try {
-            Configuration cfg = new Configuration.Builder(Configuration.VERSION_3_0_0).build();
-            new Template(null, "${x}", cfg).process(null, _NullWriter.INSTANCE);
-            fail();
-        } catch (TemplateException e) {
-            assertThat(e.getMessage(), containsString("Tip:"));
-        }
-
-        try {
-            Configuration cfg = new Configuration.Builder(Configuration.VERSION_3_0_0).showErrorTips(false).build();
-            new Template(null, "${x}", cfg).process(null, _NullWriter.INSTANCE);
-            fail();
-        } catch (TemplateException e) {
-            assertThat(e.getMessage(), not(containsString("Tip:")));
-        }
-    }
-    
-    @Test
-    @SuppressWarnings("boxing")
-    public void testGetTemplateOverloads() throws Exception {
-        final Locale hu = new Locale("hu", "HU");
-        final String tFtl = "t.ftl";
-        final String tHuFtl = "t_hu.ftl";
-        final String tEnFtl = "t_en.ftl";
-        final String tUtf8Ftl = "utf8.ftl";
-        final Serializable custLookupCond = 12345;
-
-        ByteArrayTemplateLoader tl = new ByteArrayTemplateLoader();
-        tl.putTemplate(tFtl, "${1}".getBytes(StandardCharsets.UTF_8));
-        tl.putTemplate(tEnFtl, "${1}".getBytes(StandardCharsets.UTF_8));
-        tl.putTemplate(tHuFtl, "${1}".getBytes(StandardCharsets.UTF_8));
-        tl.putTemplate(tUtf8Ftl, "<#ftl encoding='utf-8'>".getBytes(StandardCharsets.UTF_8));
-
-        Configuration cfg = new Configuration.Builder(Configuration.VERSION_3_0_0)
-                .locale(Locale.GERMAN)
-                .sourceEncoding(StandardCharsets.ISO_8859_1)
-                .templateLoader(tl)
-                .templateConfigurations(
-                        new ConditionalTemplateConfigurationFactory(
-                                new FileNameGlobMatcher("*_hu.*"),
-                                new TemplateConfiguration.Builder().sourceEncoding(ISO_8859_2).build()))
-                .build();
-
-        // 1 args:
-        {
-            Template t = cfg.getTemplate(tFtl);
-            assertEquals(tFtl, t.getLookupName());
-            assertEquals(tFtl, t.getSourceName());
-            assertEquals(Locale.GERMAN, t.getLocale());
-            assertNull(t.getCustomLookupCondition());
-            assertEquals(StandardCharsets.ISO_8859_1, t.getActualSourceEncoding());
-        }
-        {
-            Template t = cfg.getTemplate(tUtf8Ftl);
-            assertEquals(tUtf8Ftl, t.getLookupName());
-            assertEquals(tUtf8Ftl, t.getSourceName());
-            assertEquals(Locale.GERMAN, t.getLocale());
-            assertNull(t.getCustomLookupCondition());
-            assertEquals(StandardCharsets.UTF_8, t.getActualSourceEncoding());
-        }
-        
-        // 2 args:
-        {
-            Template t = cfg.getTemplate(tFtl, Locale.GERMAN);
-            assertEquals(tFtl, t.getLookupName());
-            assertEquals(tFtl, t.getSourceName());
-            assertEquals(Locale.GERMAN, t.getLocale());
-            assertNull(t.getCustomLookupCondition());
-            assertEquals(StandardCharsets.ISO_8859_1, t.getActualSourceEncoding());
-        }
-        {
-            Template t = cfg.getTemplate(tFtl, (Locale) null);
-            assertEquals(tFtl, t.getLookupName());
-            assertEquals(tFtl, t.getSourceName());
-            assertEquals(Locale.GERMAN, t.getLocale());
-            assertNull(t.getCustomLookupCondition());
-            assertEquals(StandardCharsets.ISO_8859_1, t.getActualSourceEncoding());
-        }
-        {
-            Template t = cfg.getTemplate(tFtl, Locale.US);
-            assertEquals(tFtl, t.getLookupName());
-            assertEquals(tEnFtl, t.getSourceName());
-            assertEquals(Locale.US, t.getLocale());
-            assertNull(t.getCustomLookupCondition());
-            assertEquals(StandardCharsets.ISO_8859_1, t.getActualSourceEncoding());
-        }
-        {
-            Template t = cfg.getTemplate(tUtf8Ftl, Locale.US);
-            assertEquals(tUtf8Ftl, t.getLookupName());
-            assertEquals(tUtf8Ftl, t.getSourceName());
-            assertEquals(Locale.US, t.getLocale());
-            assertNull(t.getCustomLookupCondition());
-            assertEquals(StandardCharsets.UTF_8, t.getActualSourceEncoding());
-        }
-        {
-            Template t = cfg.getTemplate(tFtl, hu);
-            assertEquals(tFtl, t.getLookupName());
-            assertEquals(tHuFtl, t.getSourceName());
-            assertEquals(hu, t.getLocale());
-            assertNull(t.getCustomLookupCondition());
-            assertEquals(ISO_8859_2, t.getActualSourceEncoding());
-        }
-        {
-            Template t = cfg.getTemplate(tUtf8Ftl, hu);
-            assertEquals(tUtf8Ftl, t.getLookupName());
-            assertEquals(tUtf8Ftl, t.getSourceName());
-            assertEquals(hu, t.getLocale());
-            assertNull(t.getCustomLookupCondition());
-            assertEquals(StandardCharsets.UTF_8, t.getActualSourceEncoding());
-        }
-
-        // 4 args:
-        try {
-            cfg.getTemplate("missing.ftl", hu, custLookupCond, false);
-            fail();
-        } catch (TemplateNotFoundException e) {
-            // Expected
-        }
-        assertNull(cfg.getTemplate("missing.ftl", hu, custLookupCond, true));
-        {
-            Template t = cfg.getTemplate(tFtl, hu, custLookupCond, false);
-            assertEquals(tFtl, t.getLookupName());
-            assertEquals(tHuFtl, t.getSourceName());
-            assertEquals(hu, t.getLocale());
-            assertEquals(custLookupCond, t.getCustomLookupCondition());
-            assertEquals(ISO_8859_2, t.getActualSourceEncoding());
-            assertOutputEquals("1", t);
-        }
-        {
-            Template t = cfg.getTemplate(tFtl, null, custLookupCond, false);
-            assertEquals(tFtl, t.getLookupName());
-            assertEquals(tFtl, t.getSourceName());
-            assertEquals(Locale.GERMAN, t.getLocale());
-            assertEquals(custLookupCond, t.getCustomLookupCondition());
-            assertEquals(StandardCharsets.ISO_8859_1, t.getActualSourceEncoding());
-            assertOutputEquals("1", t);
-        }
-    }
-
-    private void assertOutputEquals(final String expectedContent, final Template t) throws ConfigurationException,
-            IOException, TemplateException {
-        StringWriter sw = new StringWriter();
-        t.process(null, sw);
-        assertEquals(expectedContent, sw.toString());
-    }
-    
-    public void testTemplateResolverCache() throws Exception {
-        Configuration.Builder cfgB = new Configuration.Builder(Configuration.VERSION_3_0_0);
-        
-        CacheStorageWithGetSize cache = (CacheStorageWithGetSize) cfgB.getCacheStorage();
-        assertEquals(0, cache.getSize());
-        cfgB.setCacheStorage(new StrongCacheStorage());
-        cache = (CacheStorageWithGetSize) cfgB.getCacheStorage();
-        assertEquals(0, cache.getSize());
-        cfgB.setTemplateLoader(new ClassTemplateLoader(ConfigurationTest.class, ""));
-        Configuration cfg = cfgB.build();
-        assertEquals(0, cache.getSize());
-        cfg.getTemplate("toCache1.ftl");
-        assertEquals(1, cache.getSize());
-        cfg.getTemplate("toCache2.ftl");
-        assertEquals(2, cache.getSize());
-        cfg.clearTemplateCache();
-        assertEquals(0, cache.getSize());
-        cfg.getTemplate("toCache1.ftl");
-        assertEquals(1, cache.getSize());
-        cfgB.setTemplateLoader(cfgB.getTemplateLoader());
-        assertEquals(1, cache.getSize());
-    }
-
-    public void testTemplateNameFormat() throws Exception {
-        StringTemplateLoader tl = new StringTemplateLoader();
-        tl.putTemplate("a/b.ftl", "In a/b.ftl");
-        tl.putTemplate("b.ftl", "In b.ftl");
-
-        Configuration.Builder cfgB = new Configuration.Builder(Configuration.VERSION_3_0_0)
-                .templateLoader(tl);
-
-        {
-            cfgB.setTemplateNameFormat(DefaultTemplateNameFormatFM2.INSTANCE);
-            final Template template = cfgB.build().getTemplate("a/./../b.ftl");
-            assertEquals("a/b.ftl", template.getLookupName());
-            assertEquals("a/b.ftl", template.getSourceName());
-            assertEquals("In a/b.ftl", template.toString());
-        }
-        
-        {
-            cfgB.setTemplateNameFormat(DefaultTemplateNameFormat.INSTANCE);
-            final Template template = cfgB.build().getTemplate("a/./../b.ftl");
-            assertEquals("b.ftl", template.getLookupName());
-            assertEquals("b.ftl", template.getSourceName());
-            assertEquals("In b.ftl", template.toString());
-        }
-    }
-
-    public void testTemplateNameFormatSetSetting() throws Exception {
-        Configuration.Builder cfgB = new Configuration.Builder(Configuration.VERSION_3_0_0);
-        assertSame(DefaultTemplateNameFormatFM2.INSTANCE, cfgB.getTemplateNameFormat());
-        cfgB.setSetting(Configuration.ExtendableBuilder.TEMPLATE_NAME_FORMAT_KEY, "defAult_2_4_0");
-        assertSame(DefaultTemplateNameFormat.INSTANCE, cfgB.getTemplateNameFormat());
-        cfgB.setSetting(Configuration.ExtendableBuilder.TEMPLATE_NAME_FORMAT_KEY, "defaUlt_2_3_0");
-        assertSame(DefaultTemplateNameFormatFM2.INSTANCE, cfgB.getTemplateNameFormat());
-        assertTrue(cfgB.isTemplateNameFormatSet());
-        cfgB.setSetting(Configuration.ExtendableBuilder.TEMPLATE_NAME_FORMAT_KEY, "defauLt");
-        assertFalse(cfgB.isTemplateNameFormatSet());
-    }
-
-    public void testObjectWrapperSetSetting() throws Exception {
-        Configuration.Builder cfgB = new Configuration.Builder(Configuration.VERSION_3_0_0);
-        {
-            cfgB.setSetting(MutableProcessingConfiguration.OBJECT_WRAPPER_KEY, "defAult");
-            DefaultObjectWrapper dow = new DefaultObjectWrapper.Builder(Configuration.VERSION_3_0_0).build();
-            assertSame(dow, cfgB.getObjectWrapper());
-            assertEquals(Configuration.VERSION_3_0_0, dow.getIncompatibleImprovements());
-        }
-        
-        {
-            cfgB.setSetting(MutableProcessingConfiguration.OBJECT_WRAPPER_KEY, "restricted");
-            assertThat(cfgB.getObjectWrapper(), instanceOf(RestrictedObjectWrapper.class));
-        }
-    }
-    
-    public void testTemplateLookupStrategyDefaultAndSet() throws Exception {
-        Configuration.Builder cfgB = new Configuration.Builder(Configuration.VERSION_3_0_0);
-        assertSame(DefaultTemplateLookupStrategy.INSTANCE, cfgB.getTemplateLookupStrategy());
-        assertSame(DefaultTemplateLookupStrategy.INSTANCE, cfgB.build().getTemplateLookupStrategy());
-
-        cfgB.setTemplateLoader(new ClassTemplateLoader(ConfigurationTest.class, ""));
-        assertSame(DefaultTemplateLookupStrategy.INSTANCE, cfgB.getTemplateLookupStrategy());
-        Configuration cfg = cfgB.build();
-        assertSame(DefaultTemplateLookupStrategy.INSTANCE, cfg.getTemplateLookupStrategy());
-        cfg.getTemplate("toCache1.ftl");
-
-        final TemplateLookupStrategy myStrategy = new TemplateLookupStrategy() {
-            @Override
-            public TemplateLookupResult lookup(TemplateLookupContext ctx) throws IOException {
-                return ctx.lookupWithAcquisitionStrategy("toCache2.ftl");
-            }
-        };
-        cfgB.setTemplateLookupStrategy(myStrategy);
-        assertSame(myStrategy, cfgB.getTemplateLookupStrategy());
-        cfg = cfgB.build();
-        cfg.clearTemplateCache();
-        assertSame(myStrategy, cfg.getTemplateLookupStrategy());
-        Template template = cfg.getTemplate("toCache1.ftl");
-        assertEquals("toCache2.ftl", template.getSourceName());
-    }
-    
-    public void testSetTemplateConfigurations() throws Exception {
-        Configuration.Builder cfgB = new Configuration.Builder(Configuration.VERSION_3_0_0);
-        assertNull(cfgB.getTemplateConfigurations());
-
-        StringTemplateLoader tl = new StringTemplateLoader();
-        tl.putTemplate("t.de.ftlh", "");
-        tl.putTemplate("t.fr.ftlx", "");
-        tl.putTemplate("t.ftlx", "");
-        tl.putTemplate("Stat/t.de.ftlx", "");
-        cfgB.setTemplateLoader(tl);
-        
-        cfgB.setTimeZone(TimeZone.getTimeZone("GMT+09"));
-        
-        cfgB.setSetting(Configuration.ExtendableBuilder.TEMPLATE_CONFIGURATIONS_KEY,
-                "MergingTemplateConfigurationFactory("
-                    + "FirstMatchTemplateConfigurationFactory("
-                        + "ConditionalTemplateConfigurationFactory("
-                            + "FileNameGlobMatcher('*.de.*'), TemplateConfiguration(timeZone=TimeZone('GMT+01'))), "
-                        + "ConditionalTemplateConfigurationFactory("
-                            + "FileNameGlobMatcher('*.fr.*'), TemplateConfiguration(timeZone=TimeZone('GMT'))), "
-                        + "allowNoMatch=true"
-                    + "), "
-                    + "FirstMatchTemplateConfigurationFactory("
-                        + "ConditionalTemplateConfigurationFactory("
-                            + "FileExtensionMatcher('ftlh'), TemplateConfiguration(booleanFormat='TODO,HTML')), "
-                        + "ConditionalTemplateConfigurationFactory("
-                            + "FileExtensionMatcher('ftlx'), TemplateConfiguration(booleanFormat='TODO,XML')), "
-                        + "noMatchErrorDetails='Unrecognized template file extension'"
-                    + "), "
-                    + "ConditionalTemplateConfigurationFactory("
-                        + "PathGlobMatcher('stat/**', caseInsensitive=true), "
-                        + "TemplateConfiguration(timeZone=TimeZone('UTC'))"
-                    + ")"
-                + ")");
-
-        Configuration cfg = cfgB.build();
-        {
-            Template t = cfg.getTemplate("t.de.ftlh");
-            assertEquals("TODO,HTML", t.getBooleanFormat());
-            assertEquals(TimeZone.getTimeZone("GMT+01"), t.getTimeZone());
-        }
-        {
-            Template t = cfg.getTemplate("t.fr.ftlx");
-            assertEquals("TODO,XML", t.getBooleanFormat());
-            assertEquals(TimeZone.getTimeZone("GMT"), t.getTimeZone());
-        }
-        {
-            Template t = cfg.getTemplate("t.ftlx");
-            assertEquals("TODO,XML", t.getBooleanFormat());
-            assertEquals(TimeZone.getTimeZone("GMT+09"), t.getTimeZone());
-        }
-        {
-            Template t = cfg.getTemplate("Stat/t.de.ftlx");
-            assertEquals("TODO,XML", t.getBooleanFormat());
-            assertEquals(_DateUtil.UTC, t.getTimeZone());
-        }
-        
-        assertNotNull(cfgB.getTemplateConfigurations());
-        cfgB.setSetting(Configuration.ExtendableBuilder.TEMPLATE_CONFIGURATIONS_KEY, "null");
-        assertNull(cfgB.getTemplateConfigurations());
-    }
-
-    public void testSetAutoEscaping() throws Exception {
-       Configuration.Builder cfgB = new Configuration.Builder(Configuration.VERSION_3_0_0);
-    
-       assertEquals(ParsingConfiguration.ENABLE_IF_DEFAULT_AUTO_ESCAPING_POLICY, cfgB.getAutoEscapingPolicy());
-
-       cfgB.setAutoEscapingPolicy(ParsingConfiguration.ENABLE_IF_SUPPORTED_AUTO_ESCAPING_POLICY);
-       assertEquals(ParsingConfiguration.ENABLE_IF_SUPPORTED_AUTO_ESCAPING_POLICY, cfgB.getAutoEscapingPolicy());
-
-       cfgB.setAutoEscapingPolicy(ParsingConfiguration.ENABLE_IF_DEFAULT_AUTO_ESCAPING_POLICY);
-       assertEquals(ParsingConfiguration.ENABLE_IF_DEFAULT_AUTO_ESCAPING_POLICY, cfgB.getAutoEscapingPolicy());
-
-       cfgB.setAutoEscapingPolicy(ParsingConfiguration.DISABLE_AUTO_ESCAPING_POLICY);
-       assertEquals(ParsingConfiguration.DISABLE_AUTO_ESCAPING_POLICY, cfgB.getAutoEscapingPolicy());
-       
-       cfgB.setSetting(Configuration.ExtendableBuilder.AUTO_ESCAPING_POLICY_KEY_CAMEL_CASE, "enableIfSupported");
-       assertEquals(ParsingConfiguration.ENABLE_IF_SUPPORTED_AUTO_ESCAPING_POLICY, cfgB.getAutoEscapingPolicy());
-
-       cfgB.setSetting(Configuration.ExtendableBuilder.AUTO_ESCAPING_POLICY_KEY_CAMEL_CASE, "enable_if_supported");
-       assertEquals(ParsingConfiguration.ENABLE_IF_SUPPORTED_AUTO_ESCAPING_POLICY, cfgB.getAutoEscapingPolicy());
-       
-       cfgB.setSetting(Configuration.ExtendableBuilder.AUTO_ESCAPING_POLICY_KEY_CAMEL_CASE, "enableIfDefault");
-       assertEquals(ParsingConfiguration.ENABLE_IF_DEFAULT_AUTO_ESCAPING_POLICY, cfgB.getAutoEscapingPolicy());
-
-       cfgB.setSetting(Configuration.ExtendableBuilder.AUTO_ESCAPING_POLICY_KEY_CAMEL_CASE, "enable_if_default");
-       assertEquals(ParsingConfiguration.ENABLE_IF_DEFAULT_AUTO_ESCAPING_POLICY, cfgB.getAutoEscapingPolicy());
-       
-       cfgB.setSetting(Configuration.ExtendableBuilder.AUTO_ESCAPING_POLICY_KEY_CAMEL_CASE, "disable");
-       assertEquals(ParsingConfiguration.DISABLE_AUTO_ESCAPING_POLICY, cfgB.getAutoEscapingPolicy());
-       
-       try {
-           cfgB.setAutoEscapingPolicy(ParsingConfiguration.CAMEL_CASE_NAMING_CONVENTION);
-           fail();
-       } catch (IllegalArgumentException e) {
-           // Expected
-       }
-    }
-
-    public void testSetOutputFormat() throws Exception {
-       Configuration.Builder cfgB = new Configuration.Builder(Configuration.VERSION_3_0_0);
-       
-       assertEquals(UndefinedOutputFormat.INSTANCE, cfgB.getOutputFormat());
-       assertFalse(cfgB.isOutputFormatSet());
-       
-       try {
-           cfgB.setOutputFormat(null);
-           fail();
-       } catch (_NullArgumentException e) {
-           // Expected
-       }
-       
-       assertFalse(cfgB.isOutputFormatSet());
-       
-       cfgB.setSetting(Configuration.ExtendableBuilder.OUTPUT_FORMAT_KEY_CAMEL_CASE, XMLOutputFormat.class.getSimpleName());
-       assertEquals(XMLOutputFormat.INSTANCE, cfgB.getOutputFormat());
-       
-       cfgB.setSetting(Configuration.ExtendableBuilder.OUTPUT_FORMAT_KEY_SNAKE_CASE, HTMLOutputFormat.class.getSimpleName());
-       assertEquals(HTMLOutputFormat.INSTANCE, cfgB.getOutputFormat());
-       
-       cfgB.unsetOutputFormat();
-       assertEquals(UndefinedOutputFormat.INSTANCE, cfgB.getOutputFormat());
-       assertFalse(cfgB.isOutputFormatSet());
-       
-       cfgB.setOutputFormat(UndefinedOutputFormat.INSTANCE);
-       assertTrue(cfgB.isOutputFormatSet());
-       cfgB.setSetting(Configuration.ExtendableBuilder.OUTPUT_FORMAT_KEY_CAMEL_CASE, "default");
-       assertFalse(cfgB.isOutputFormatSet());
-       
-       try {
-           cfgB.setSetting(Configuration.ExtendableBuilder.OUTPUT_FORMAT_KEY, "null");
-       } catch (ConfigurationSettingValueException e) {
-           assertThat(e.getCause().getMessage(), containsString(UndefinedOutputFormat.class.getSimpleName()));
-       }
-    }
-    
-    @Test
-    public void testGetOutputFormatByName() throws Exception {
-        Configuration cfg = new Configuration.Builder(Configuration.VERSION_3_0_0).build();
-        
-        assertSame(HTMLOutputFormat.INSTANCE, cfg.getOutputFormat(HTMLOutputFormat.INSTANCE.getName()));
-        
-        try {
-            cfg.getOutputFormat("noSuchFormat");
-            fail();
-        } catch (UnregisteredOutputFormatException e) {
-            assertThat(e.getMessage(), containsString("noSuchFormat"));
-        }
-        
-        try {
-            cfg.getOutputFormat("HTML}");
-            fail();
-        } catch (IllegalArgumentException e) {
-            assertThat(e.getMessage(), containsString("'{'"));
-        }
-        
-        {
-            OutputFormat of = cfg.getOutputFormat("HTML{RTF}");
-            assertThat(of, instanceOf(CombinedMarkupOutputFormat.class));
-            CombinedMarkupOutputFormat combinedOF = (CombinedMarkupOutputFormat) of;
-            assertSame(HTMLOutputFormat.INSTANCE, combinedOF.getOuterOutputFormat());
-            assertSame(RTFOutputFormat.INSTANCE, combinedOF.getInnerOutputFormat());
-        }
-
-        {
-            OutputFormat of = cfg.getOutputFormat("XML{HTML{RTF}}");
-            assertThat(of, instanceOf(CombinedMarkupOutputFormat.class));
-            CombinedMarkupOutputFormat combinedOF = (CombinedMarkupOutputFormat) of;
-            assertSame(XMLOutputFormat.INSTANCE, combinedOF.getOuterOutputFormat());
-            MarkupOutputFormat innerOF = combinedOF.getInnerOutputFormat();
-            assertThat(innerOF, instanceOf(CombinedMarkupOutputFormat.class));
-            CombinedMarkupOutputFormat innerCombinedOF = (CombinedMarkupOutputFormat) innerOF; 
-            assertSame(HTMLOutputFormat.INSTANCE, innerCombinedOF.getOuterOutputFormat());
-            assertSame(RTFOutputFormat.INSTANCE, innerCombinedOF.getInnerOutputFormat());
-        }
-        
-        try {
-            cfg.getOutputFormat("plainText{HTML}");
-            fail();
-        } catch (IllegalArgumentException e) {
-            assertThat(e.getMessage(), allOf(containsString("plainText"), containsString("markup")));
-        }
-        try {
-            cfg.getOutputFormat("HTML{plainText}");
-            fail();
-        } catch (IllegalArgumentException e) {
-            assertThat(e.getMessage(), allOf(containsString("plainText"), containsString("markup")));
-        }
-    }
-
-    public void testSetRegisteredCustomOutputFormats() throws Exception {
-        Configuration.Builder cfg = new Configuration.Builder(Configuration.VERSION_3_0_0);
-        
-        assertTrue(cfg.getRegisteredCustomOutputFormats().isEmpty());
-        
-        cfg.setSetting(Configuration.ExtendableBuilder.REGISTERED_CUSTOM_OUTPUT_FORMATS_KEY_CAMEL_CASE,
-                "[org.apache.freemarker.core.userpkg.CustomHTMLOutputFormat(), "
-                + "org.apache.freemarker.core.userpkg.DummyOutputFormat()]");
-        assertEquals(
-                ImmutableList.of(CustomHTMLOutputFormat.INSTANCE, DummyOutputFormat.INSTANCE),
-                new ArrayList(cfg.getRegisteredCustomOutputFormats()));
-        
-        try {
-            cfg.setSetting(Configuration.ExtendableBuilder.REGISTERED_CUSTOM_OUTPUT_FORMATS_KEY_SNAKE_CASE, "[TemplateConfiguration()]");
-            fail();
-        } catch (ConfigurationSettingValueException e) {
-            assertThat(e.getMessage(), containsString(OutputFormat.class.getSimpleName()));
-        }
-    }
-
-    public void testSetRecognizeStandardFileExtensions() throws Exception {
-        Configuration.Builder cfgB = new Configuration.Builder(Configuration.VERSION_3_0_0);
-     
-        assertTrue(cfgB.getRecognizeStandardFileExtensions());
-        assertFalse(cfgB.isRecognizeStandardFileExtensionsSet());
-
-        cfgB.setRecognizeStandardFileExtensions(false);
-        assertFalse(cfgB.getRecognizeStandardFileExtensions());
-        assertTrue(cfgB.isRecognizeStandardFileExtensionsSet());
-     
-        cfgB.unsetRecognizeStandardFileExtensions();
-        assertTrue(cfgB.getRecognizeStandardFileExtensions());
-        assertFalse(cfgB.isRecognizeStandardFileExtensionsSet());
-        
-        cfgB.setRecognizeStandardFileExtensions(true);
-        assertTrue(cfgB.getRecognizeStandardFileExtensions());
-        assertTrue(cfgB.isRecognizeStandardFileExtensionsSet());
-     
-        cfgB.setSetting(Configuration.ExtendableBuilder.RECOGNIZE_STANDARD_FILE_EXTENSIONS_KEY_CAMEL_CASE, "false");
-        assertFalse(cfgB.getRecognizeStandardFileExtensions());
-        assertTrue(cfgB.isRecognizeStandardFileExtensionsSet());
-        
-        cfgB.setSetting(Configuration.ExtendableBuilder.RECOGNIZE_STANDARD_FILE_EXTENSIONS_KEY_SNAKE_CASE, "default");
-        assertTrue(cfgB.getRecognizeStandardFileExtensions());
-        assertFalse(cfgB.isRecognizeStandardFileExtensionsSet());
-     }
-    
-    public void testSetTimeZone() throws ConfigurationException {
-        TimeZone origSysDefTZ = TimeZone.getDefault();
-        try {
-            TimeZone sysDefTZ = TimeZone.getTimeZone("GMT-01");
-            TimeZone.setDefault(sysDefTZ);
-            
-            Configuration.Builder cfgB = new Configuration.Builder(Configuration.VERSION_3_0_0);
-            assertEquals(sysDefTZ, cfgB.getTimeZone());
-            cfgB.setSetting(MutableProcessingConfiguration.TIME_ZONE_KEY, "JVM default");
-            assertEquals(sysDefTZ, cfgB.getTimeZone());
-            
-            TimeZone newSysDefTZ = TimeZone.getTimeZone("GMT+09");
-            TimeZone.setDefault(newSysDefTZ);
-            assertEquals(sysDefTZ, cfgB.getTimeZone());
-            cfgB.setSetting(MutableProcessingConfiguration.TIME_ZONE_KEY, "JVM default");
-            assertEquals(newSysDefTZ, cfgB.getTimeZone());
-        } finally {
-            TimeZone.setDefault(origSysDefTZ);
-        }
-    }
-    
-    public void testSetSQLDateAndTimeTimeZone() throws ConfigurationException {
-        TimeZone origSysDefTZ = TimeZone.getDefault();
-        try {
-            TimeZone sysDefTZ = TimeZone.getTimeZone("GMT-01");
-            TimeZone.setDefault(sysDefTZ);
-            
-            Configuration.Builder cfgB = new Configuration.Builder(Configuration.VERSION_3_0_0);
-            assertNull(cfgB.getSQLDateAndTimeTimeZone());
-            
-            cfgB.setSQLDateAndTimeTimeZone(null);
-            assertNull(cfgB.getSQLDateAndTimeTimeZone());
-            
-            cfgB.setSetting(MutableProcessingConfiguration.SQL_DATE_AND_TIME_TIME_ZONE_KEY, "JVM default");
-            assertEquals(sysDefTZ, cfgB.getSQLDateAndTimeTimeZone());
-            
-            cfgB.setSetting(MutableProcessingConfiguration.SQL_DATE_AND_TIME_TIME_ZONE_KEY, "null");
-            assertNull(cfgB.getSQLDateAndTimeTimeZone());
-        } finally {
-            TimeZone.setDefault(origSysDefTZ);
-        }
-    }
-
-    public void testTimeZoneLayers() throws Exception {
-        TimeZone localTZ = TimeZone.getTimeZone("Europe/Brussels");
-
-        {
-            Configuration cfg = new Configuration.Builder(Configuration.VERSION_3_0_0).build();
-            Template t = new Template(null, "", cfg);
-            Environment env1 = t.createProcessingEnvironment(null, new StringWriter());
-            Environment env2 = t.createProcessingEnvironment(null, new StringWriter());
-
-            // cfg:
-            assertEquals(TimeZone.getDefault(), cfg.getTimeZone());
-            assertNull(cfg.getSQLDateAndTimeTimeZone());
-            // env:
-            assertEquals(TimeZone.getDefault(), env1.getTimeZone());
-            assertNull(env1.getSQLDateAndTimeTimeZone());
-            // env 2:
-            assertEquals(TimeZone.getDefault(), env2.getTimeZone());
-            assertNull(env2.getSQLDateAndTimeTimeZone());
-
-            env1.setSQLDateAndTimeTimeZone(_DateUtil.UTC);
-            // cfg:
-            assertEquals(TimeZone.getDefault(), cfg.getTimeZone());
-            assertNull(cfg.getSQLDateAndTimeTimeZone());
-            // env:
-            assertEquals(TimeZone.getDefault(), env1.getTimeZone());
-            assertEquals(_DateUtil.UTC, env1.getSQLDateAndTimeTimeZone());
-
-            env1.setTimeZone(localTZ);
-            // cfg:
-            assertEquals(TimeZone.getDefault(), cfg.getTimeZone());
-            assertNull(cfg.getSQLDateAndTimeTimeZone());
-            // env:
-            assertEquals(localTZ, env1.getTimeZone());
-            assertEquals(_DateUtil.UTC, env1.getSQLDateAndTimeTimeZone());
-            // env 2:
-            assertEquals(TimeZone.getDefault(), env2.getTimeZone());
-            assertNull(env2.getSQLDateAndTimeTimeZone());
-        }
-
-        {
-            TimeZone otherTZ1 = TimeZone.getTimeZone("GMT+05");
-            TimeZone otherTZ2 = TimeZone.getTimeZone("GMT+06");
-            Configuration cfg = new Configuration.Builder(Configuration.VERSION_3_0_0)
-                    .timeZone(otherTZ1)
-                    .sqlDateAndTimeTimeZone(otherTZ2)
-                    .build();
-
-            Template t = new Template(null, "", cfg);
-            Environment env1 = t.createProcessingEnvironment(null, new StringWriter());
-            Environment env2 = t.createProcessingEnvironment(null, new StringWriter());
-
-            env1.setTimeZone(localTZ);
-            env1.setSQLDateAndTimeTimeZone(_DateUtil.UTC);
-
-            // cfg:
-            assertEquals(otherTZ1, cfg.getTimeZone());
-            assertEquals(otherTZ2, cfg.getSQLDateAndTimeTimeZone());
-            // env:
-            assertEquals(localTZ, env1.getTimeZone());
-            assertEquals(_DateUtil.UTC, env1.getSQLDateAndTimeTimeZone());
-            // env 2:
-            assertEquals(otherTZ1, env2.getTimeZone());
-            assertEquals(otherTZ2, env2.getSQLDateAndTimeTimeZone());
-
-            try {
-                setTimeZoneToNull(env2);
-                fail();
-            } catch (IllegalArgumentException e) {
-                // expected
-            }
-            env2.setSQLDateAndTimeTimeZone(null);
-            assertEquals(otherTZ1, env2.getTimeZone());
-            assertNull(env2.getSQLDateAndTimeTimeZone());
-        }
-    }
-
-    @SuppressFBWarnings(value="NP_NULL_PARAM_DEREF_ALL_TARGETS_DANGEROUS", justification="Expected to fail")
-    private void setTimeZoneToNull(Environment env2) {
-        env2.setTimeZone(null);
-    }
-    
-    public void testSetICIViaSetSettingAPI() throws ConfigurationException {
-        Configuration.Builder cfg = new Configuration.Builder(Configuration.VERSION_3_0_0);
-        assertEquals(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS, cfg.getIncompatibleImprovements());
-        // This is the only valid value ATM:
-        cfg.setSetting(Configuration.ExtendableBuilder.INCOMPATIBLE_IMPROVEMENTS_KEY, "3.0.0");
-        assertEquals(Configuration.VERSION_3_0_0, cfg.getIncompatibleImprovements());
-    }
-
-    public void testSetLogTemplateExceptionsViaSetSettingAPI() throws ConfigurationException {
-        Configuration.Builder cfg = new Configuration.Builder(Configuration.VERSION_3_0_0);
-        assertFalse(cfg.getLogTemplateExceptions());
-        cfg.setSetting(MutableProcessingConfiguration.LOG_TEMPLATE_EXCEPTIONS_KEY, "true");
-        assertTrue(cfg.getLogTemplateExceptions());
-    }
-    
-    public void testSharedVariables() throws TemplateException, IOException {
-        Configuration.Builder cfgB = new Configuration.Builder(Configuration.VERSION_3_0_0);
-
-        Map<String, Object> vars = new HashMap<>();
-        vars.put("a", "aa");
-        vars.put("b", "bb");
-        vars.put("c", new MyScalarModel());
-        cfgB.setSharedVariables(vars);
-
-        assertNull(cfgB.getSharedVariable("erased"));
-        
-        {
-            Configuration cfg = cfgB.build();
-
-            TemplateScalarModel aVal = (TemplateScalarModel) cfg.getWrappedSharedVariable("a");
-            assertEquals("aa", aVal.getAsString());
-            assertEquals(SimpleScalar.class, aVal.getClass());
-
-            TemplateScalarModel bVal = (TemplateScalarModel) cfg.getWrappedSharedVariable("b");
-            assertEquals("bb", bVal.getAsString());
-            assertEquals(SimpleScalar.class, bVal.getClass());
-            
-            TemplateScalarModel cVal = (TemplateScalarModel) cfg.getWrappedSharedVariable("c");
-            assertEquals("my", cVal.getAsString());
-            assertEquals(MyScalarModel.class, cfg.getWrappedSharedVariable("c").getClass());
-
-            // See if it actually works in templates:
-            StringWriter sw = new StringWriter();
-            new Template(null, "${a} ${b}", cfg)
-                    .process(ImmutableMap.of("a", "aaDM"), sw);
-            assertEquals("aaDM bb", sw.toString());
-        }
-        
-        cfgB.setSharedVariable("b", "bbLegacy");
-        
-        {
-            Configuration cfg = cfgB.build();
-
-            TemplateScalarModel aVal = (TemplateScalarModel) cfg.getWrappedSharedVariable("a");
-            assertEquals("aa", aVal.getAsString());
-            assertEquals(SimpleScalar.class, aVal.getClass());
-            
-            TemplateScalarModel bVal = (TemplateScalarModel) cfg.getWrappedSharedVariable("b");
-            assertEquals("bbLegacy", bVal.getAsString());
-            assertEquals(SimpleScalar.class, bVal.getClass());
-        }
-    }
-
-    @Test
-    public void testApiBuiltinEnabled() throws Exception {
-        try {
-            new Template(
-                    null, "${1?api}",
-                    new Configuration.Builder(Configuration.VERSION_3_0_0).build())
-                    .process(null, _NullWriter.INSTANCE);
-            fail();
-        } catch (TemplateException e) {
-            assertThat(e.getMessage(), containsString(MutableProcessingConfiguration.API_BUILTIN_ENABLED_KEY));
-        }
-            
-        new Template(
-                null, "${m?api.hashCode()}",
-                new Configuration.Builder(Configuration.VERSION_3_0_0).apiBuiltinEnabled(true).build())
-                .process(Collections.singletonMap("m", new HashMap()), _NullWriter.INSTANCE);
-    }
-
-    @Test
-    public void testTemplateUpdateDelay() throws Exception {
-        Configuration.Builder cfgB = new Configuration.Builder(Configuration.VERSION_3_0_0);
-
-        assertEquals(DefaultTemplateResolver.DEFAULT_TEMPLATE_UPDATE_DELAY_MILLIS, cfgB.getTemplateUpdateDelayMilliseconds());
-        
-        cfgB.setTemplateUpdateDelayMilliseconds(4000);
-        assertEquals(4000L, cfgB.getTemplateUpdateDelayMilliseconds());
-        
-        cfgB.setTemplateUpdateDelayMilliseconds(100);
-        assertEquals(100L, cfgB.getTemplateUpdateDelayMilliseconds());
-        
-        try {
-            cfgB.setSetting(Configuration.ExtendableBuilder.TEMPLATE_UPDATE_DELAY_KEY, "5");
-            assertEquals(5000L, cfgB.getTemplateUpdateDelayMilliseconds());
-        } catch (ConfigurationSettingValueException e) {
-            assertThat(e.getMessage(), containsStringIgnoringCase("unit must be specified"));
-        }
-        cfgB.setSetting(Configuration.ExtendableBuilder.TEMPLATE_UPDATE_DELAY_KEY, "0");
-        assertEquals(0L, cfgB.getTemplateUpdateDelayMilliseconds());
-        try {
-            cfgB.setSetting(Configuration.ExtendableBuilder.TEMPLATE_UPDATE_DELAY_KEY, "5 foo");
-            assertEquals(5000L, cfgB.getTemplateUpdateDelayMilliseconds());
-        } catch (ConfigurationSettingValueException e) {
-            assertThat(e.getMessage(), containsStringIgnoringCase("\"foo\""));
-        }
-        
-        cfgB.setSetting(Configuration.ExtendableBuilder.TEMPLATE_UPDATE_DELAY_KEY, "3 ms");
-        assertEquals(3L, cfgB.getTemplateUpdateDelayMilliseconds());
-        cfgB.setSetting(Configuration.ExtendableBuilder.TEMPLATE_UPDATE_DELAY_KEY, "4ms");
-        assertEquals(4L, cfgB.getTemplateUpdateDelayMilliseconds());
-        
-        cfgB.setSetting(Configuration.ExtendableBuilder.TEMPLATE_UPDATE_DELAY_KEY, "3 s");
-        assertEquals(3000L, cfgB.getTemplateUpdateDelayMilliseconds());
-        cfgB.setSetting(Configuration.ExtendableBuilder.TEMPLATE_UPDATE_DELAY_KEY, "4s");
-        assertEquals(4000L, cfgB.getTemplateUpdateDelayMilliseconds());
-        
-        cfgB.setSetting(Configuration.ExtendableBuilder.TEMPLATE_UPDATE_DELAY_KEY, "3 m");
-        assertEquals(1000L * 60 * 3, cfgB.getTemplateUpdateDelayMilliseconds());
-        cfgB.setSetting(Configuration.ExtendableBuilder.TEMPLATE_UPDATE_DELAY_KEY, "4m");
-        assertEquals(1000L * 60 * 4, cfgB.getTemplateUpdateDelayMilliseconds());
-
-        cfgB.setSetting(Configuration.ExtendableBuilder.TEMPLATE_UPDATE_DELAY_KEY, "1 h");
-        assertEquals(1000L * 60 * 60, cfgB.getTemplateUpdateDelayMilliseconds());
-        cfgB.setSetting(Configuration.ExtendableBuilder.TEMPLATE_UPDATE_DELAY_KEY, "2h");
-        assertEquals(1000L * 60 * 60 * 2, cfgB.getTemplateUpdateDelayMilliseconds());
-    }
-    
-    @Test
-    @SuppressFBWarnings(value = "NP_NULL_PARAM_DEREF_ALL_TARGETS_DANGEROUS ", justification = "Testing wrong args")
-    public void testSetCustomNumberFormat() throws Exception {
-        Configuration.Builder cfgB = new Configuration.Builder(Configuration.VERSION_3_0_0);
-        
-        try {
-            cfgB.setCustomNumberFormats(null);
-            fail();
-        } catch (IllegalArgumentException e) {
-            assertThat(e.getMessage(), containsString("null"));
-        }
-
-        try {
-            cfgB.setCustomNumberFormats(Collections.<String, TemplateNumberFormatFactory>singletonMap(
-                    "", HexTemplateNumberFormatFactory.INSTANCE));
-            fail();
-        } catch (IllegalArgumentException e) {
-            assertThat(e.getMessage(), containsString("0 length"));
-        }
-
-        try {
-            cfgB.setCustomNumberFormats(Collections.<String, TemplateNumberFormatFactory>singletonMap(
-                    "a_b", HexTemplateNumberFormatFactory.INSTANCE));
-            fail();
-        } catch (IllegalArgumentException e) {
-            assertThat(e.getMessage(), containsString("a_b"));
-        }
-
-        try {
-            cfgB.setCustomNumberFormats(Collections.<String, TemplateNumberFormatFactory>singletonMap(
-                    "a b", HexTemplateNumberFormatFactory.INSTANCE));
-            fail();
-        } catch (IllegalArgumentException e) {
-            assertThat(e.getMessage(), containsString("a b"));
-        }
-        
-        try {
-            cfgB.setCustomNumberFormats(ImmutableMap.<String, TemplateNumberFormatFactory>of(
-                    "a", HexTemplateNumberFormatFactory.INSTANCE,
-                    "@wrong", HexTemplateNumberFormatFactory.INSTANCE));
-            fail();
-        } catch (IllegalArgumentException e) {
-            assertThat(e.getMessage(), containsString("@wrong"));
-        }
-        
-        cfgB.setSetting(MutableProcessingConfiguration.CUSTOM_NUMBER_FORMATS_KEY_CAMEL_CASE,
-                "{ 'base': " + BaseNTemplateNumberFormatFactory.class.getName() + "() }");
-        assertEquals(
-                Collections.singletonMap("base", BaseNTemplateNumberFormatFactory.INSTANCE),
-                cfgB.getCustomNumberFormats());
-        
-        cfgB.setSetting(MutableProcessingConfiguration.CUSTOM_NUMBER_FORMATS_KEY_SNAKE_CASE,
-                "{ "
-                + "'base': " + BaseNTemplateNumberFormatFactory.class.getName() + "(), "
-                + "'hex': " + HexTemplateNumberFormatFactory.class.getName() + "()"
-                + " }");
-        assertEquals(
-                ImmutableMap.of(
-                        "base", BaseNTemplateNumberFormatFactory.INSTANCE,
-                        "hex", HexTemplateNumberFormatFactory.INSTANCE),
-                cfgB.getCustomNumberFormats());
-        
-        cfgB.setSetting(MutableProcessingConfiguration.CUSTOM_NUMBER_FORMATS_KEY, "{}");
-        assertEquals(Collections.emptyMap(), cfgB.getCustomNumberFormats());
-        
-        try {
-            cfgB.setSetting(MutableProcessingConfiguration.CUSTOM_NUMBER_FORMATS_KEY_CAMEL_CASE,
-                    "{ 'x': " + EpochMillisTemplateDateFormatFactory.class.getName() + "() }");
-            fail();
-        } catch (ConfigurationException e) {
-            assertThat(e.getCause().getMessage(), allOf(
-                    containsString(EpochMillisTemplateDateFormatFactory.class.getName()),
-                    containsString(TemplateNumberFormatFactory.class.getName())));
-        }
-    }
-
-    @Test
-    public void testSetTabSize() throws Exception {
-        Configuration.Builder cfgB = new Configuration.Builder(Configuration.VERSION_3_0_0);
-        
-        String ftl = "${\t}";
-        
-        try {
-            new Template(null, ftl, cfgB.build());
-            fail();
-        } catch (ParseException e) {
-            assertEquals(9, e.getColumnNumber());
-        }
-        
-        cfgB.setTabSize(1);
-        try {
-            new Template(null, ftl, cfgB.build());
-            fail();
-        } catch (ParseException e) {
-            assertEquals(4, e.getColumnNumber());
-        }
-        
-        try {
-            cfgB.setTabSize(0);
-            fail();
-        } catch (IllegalArgumentException e) {
-            // Expected
-        }
-        
-        try {
-            cfgB.setTabSize(257);
-            fail();
-        } catch (IllegalArgumentException e) {
-            // Expected
-        }
-    }
-
-    @Test
-    public void testTabSizeSetting() throws Exception {
-        Configuration.Builder cfgB = new Configuration.Builder(Configuration.VERSION_3_0_0);
-        assertEquals(8, cfgB.getTabSize());
-        cfgB.setSetting(Configuration.ExtendableBuilder.TAB_SIZE_KEY_CAMEL_CASE, "4");
-        assertEquals(4, cfgB.getTabSize());
-        cfgB.setSetting(Configuration.ExtendableBuilder.TAB_SIZE_KEY_SNAKE_CASE, "1");
-        assertEquals(1, cfgB.getTabSize());
-        
-        try {
-            cfgB.setSetting(Configuration.ExtendableBuilder.TAB_SIZE_KEY_SNAKE_CASE, "x");
-            fail();
-        } catch (ConfigurationException e) {
-            assertThat(e.getCause(), instanceOf(NumberFormatException.class));
-        }
-    }
-    
-    @SuppressFBWarnings(value="NP_NULL_PARAM_DEREF_ALL_TARGETS_DANGEROUS", justification="We test failures")
-    @Test
-    public void testSetCustomDateFormat() throws Exception {
-        Configuration.Builder cfgB = new Configuration.Builder(Configuration.VERSION_3_0_0);
-        
-        try {
-            cfgB.setCustomDateFormats(null);
-            fail();
-        } catch (IllegalArgumentException e) {
-            assertThat(e.getMessage(), containsString("null"));
-        }
-        
-        try {
-            cfgB.setCustomDateFormats(Collections.<String, TemplateDateFormatFactory>singletonMap(
-                    "", EpochMillisTemplateDateFormatFactory.INSTANCE));
-            fail();
-        } catch (IllegalArgumentException e) {
-            assertThat(e.getMessage(), containsString("0 length"));
-        }
-
-        try {
-            cfgB.setCustomDateFormats(Collections.<String, TemplateDateFormatFactory>singletonMap(
-                    "a_b", EpochMillisTemplateDateFormatFactory.INSTANCE));
-            fail();
-        } catch (IllegalArgumentException e) {
-            assertThat(e.getMessage(), containsString("a_b"));
-        }
-
-        try {
-            cfgB.setCustomDateFormats(Collections.<String, TemplateDateFormatFactory>singletonMap(
-                    "a b", EpochMillisTemplateDateFormatFactory.INSTANCE));
-            fail();
-        } catch (IllegalArgumentException e) {
-            assertThat(e.getMessage(), containsString("a b"));
-        }
-        
-        try {
-            cfgB.setCustomDateFormats(ImmutableMap.<String, TemplateDateFormatFactory>of(
-                    "a", EpochMillisTemplateDateFormatFactory.INSTANCE,
-                    "@wrong", EpochMillisTemplateDateFormatFactory.INSTANCE));
-            fail();
-        } catch (IllegalArgumentException e) {
-            assertThat(e.getMessage(), containsString("@wrong"));
-        }
-        
-        cfgB.setSetting(MutableProcessingConfiguration.CUSTOM_DATE_FORMATS_KEY_CAMEL_CASE,
-                "{ 'epoch': " + EpochMillisTemplateDateFormatFactory.class.getName() + "() }");
-        assertEquals(
-                Collections.singletonMap("epoch", EpochMillisTemplateDateFormatFactory.INSTANCE),
-                cfgB.getCustomDateFormats());
-        
-        cfgB.setSetting(MutableProcessingConfiguration.CUSTOM_DATE_FORMATS_KEY_SNAKE_CASE,
-                "{ "
-                + "'epoch': " + EpochMillisTemplateDateFormatFactory.class.getName() + "(), "
-                + "'epochDiv': " + EpochMillisDivTemplateDateFormatFactory.class.getName() + "()"
-                + " }");
-        assertEquals(
-                ImmutableMap.of(
-                        "epoch", EpochMillisTemplateDateFormatFactory.INSTANCE,
-                        "epochDiv", EpochMillisDivTemplateDateFormatFactory.INSTANCE),
-                cfgB.getCustomDateFormats());
-        
-        cfgB.setSetting(MutableProcessingConfiguration.CUSTOM_DATE_FORMATS_KEY, "{}");
-        assertEquals(Collections.emptyMap(), cfgB.getCustomDateFormats());
-        
-        try {
-            cfgB.setSetting(MutableProcessingConfiguration.CUSTOM_DATE_FORMATS_KEY_CAMEL_CASE,
-                    "{ 'x': " + HexTemplateNumberFormatFactory.class.getName() + "() }");
-            fail();
-        } catch (ConfigurationException e) {
-            assertThat(e.getCause().getMessage(), allOf(
-                    containsString(HexTemplateNumberFormatFactory.class.getName()),
-                    containsString(TemplateDateFormatFactory.class.getName())));
-        }
-    }
-
-    public void testNamingConventionSetSetting() throws ConfigurationException {
-        Configuration.Builder cfg = new Configuration.Builder(Configuration.VERSION_3_0_0);
-
-        assertEquals(ParsingConfiguration.AUTO_DETECT_NAMING_CONVENTION, cfg.getNamingConvention());
-        
-        cfg.setSetting("naming_convention", "legacy");
-        assertEquals(ParsingConfiguration.LEGACY_NAMING_CONVENTION, cfg.getNamingConvention());
-        
-        cfg.setSetting("naming_convention", "camel_case");
-        assertEquals(ParsingConfiguration.CAMEL_CASE_NAMING_CONVENTION, cfg.getNamingConvention());
-        
-        cfg.setSetting("naming_convention", "auto_detect");
-        assertEquals(ParsingConfiguration.AUTO_DETECT_NAMING_CONVENTION, cfg.getNamingConvention());
-    }
-
-    public void testLazyImportsSetSetting() throws ConfigurationException {
-        Configuration.Builder cfgB = new Configuration.Builder(Configuration.VERSION_3_0_0);
-
-        assertFalse(cfgB.getLazyImports());
-        assertFalse(cfgB.isLazyImportsSet());
-        cfgB.setSetting("lazy_imports", "true");
-        assertTrue(cfgB.getLazyImports());
-        cfgB.setSetting("lazyImports", "false");
-        assertFalse(cfgB.getLazyImports());
-        assertTrue(cfgB.isLazyImportsSet());
-    }
-    
-    public void testLazyAutoImportsSetSetting() throws ConfigurationException {
-        Configuration.Builder cfgB = new Configuration.Builder(Configuration.VERSION_3_0_0);
-
-        assertNull(cfgB.getLazyAutoImports());
-        assertFalse(cfgB.isLazyAutoImportsSet());
-        cfgB.setSetting("lazy_auto_imports", "true");
-        assertEquals(Boolean.TRUE, cfgB.getLazyAutoImports());
-        assertTrue(cfgB.isLazyAutoImportsSet());
-        cfgB.setSetting("lazyAutoImports", "false");
-        assertEquals(Boolean.FALSE, cfgB.getLazyAutoImports());
-        cfgB.setSetting("lazyAutoImports", "null");
-        assertNull(cfgB.getLazyAutoImports());
-        assertTrue(cfgB.isLazyAutoImportsSet());
-        cfgB.unsetLazyAutoImports();
-        assertNull(cfgB.getLazyAutoImports());
-        assertFalse(cfgB.isLazyAutoImportsSet());
-    }
-
-    public void testLocaleSetting() throws TemplateException, ConfigurationException {
-        Configuration.Builder cfgB = new Configuration.Builder(Configuration.VERSION_3_0_0);
-
-        assertEquals(Locale.getDefault(), cfgB.getLocale());
-        assertFalse(cfgB.isLocaleSet());
-
-        Locale nonDefault = Locale.getDefault().equals(Locale.GERMANY) ? Locale.FRANCE : Locale.GERMANY;
-        cfgB.setLocale(nonDefault);
-        assertTrue(cfgB.isLocaleSet());
-        assertEquals(nonDefault, cfgB.getLocale());
-
-        cfgB.unsetLocale();
-        assertEquals(Locale.getDefault(), cfgB.getLocale());
-        assertFalse(cfgB.isLocaleSet());
-
-        cfgB.setSetting(Configuration.ExtendableBuilder.LOCALE_KEY, "JVM default");
-        assertEquals(Locale.getDefault(), cfgB.getLocale());
-        assertTrue(cfgB.isLocaleSet());
-    }
-
-    public void testDefaultEncodingSetting() throws TemplateException, ConfigurationException {
-        Configuration.Builder cfgB = new Configuration.Builder(Configuration.VERSION_3_0_0);
-
-        assertEquals(Charset.defaultCharset(), cfgB.getSourceEncoding());
-        assertFalse(cfgB.isSourceEncodingSet());
-
-        Charset nonDefault = Charset.defaultCharset().equals(StandardCharsets.UTF_8) ? StandardCharsets.ISO_8859_1
-                : StandardCharsets.UTF_8;
-        cfgB.setSourceEncoding(nonDefault);
-        assertTrue(cfgB.isSourceEncodingSet());
-        assertEquals(nonDefault, cfgB.getSourceEncoding());
-
-        cfgB.unsetSourceEncoding();
-        assertEquals(Charset.defaultCharset(), cfgB.getSourceEncoding());
-        assertFalse(cfgB.isSourceEncodingSet());
-
-        cfgB.setSetting(Configuration.ExtendableBuilder.SOURCE_ENCODING_KEY, "JVM default");
-        assertEquals(Charset.defaultCharset(), cfgB.getSourceEncoding());
-        assertTrue(cfgB.isSourceEncodingSet());
-    }
-
-    public void testTimeZoneSetting() throws TemplateException, ConfigurationException {
-        Configuration.Builder cfgB = new Configuration.Builder(Configuration.VERSION_3_0_0);
-
-        assertEquals(TimeZone.getDefault(), cfgB.getTimeZone());
-        assertFalse(cfgB.isTimeZoneSet());
-
-        TimeZone nonDefault = TimeZone.getDefault().equals(_DateUtil.UTC) ? TimeZone.getTimeZone("PST") : _DateUtil.UTC;
-        cfgB.setTimeZone(nonDefault);
-        assertTrue(cfgB.isTimeZoneSet());
-        assertEquals(nonDefault, cfgB.getTimeZone());
-
-        cfgB.unsetTimeZone();
-        assertEquals(TimeZone.getDefault(), cfgB.getTimeZone());
-        assertFalse(cfgB.isTimeZoneSet());
-
-        cfgB.setSetting(Configuration.ExtendableBuilder.TIME_ZONE_KEY, "JVM default");
-        assertEquals(TimeZone.getDefault(), cfgB.getTimeZone());
-        assertTrue(cfgB.isTimeZoneSet());
-    }
-
-    @Test
-    public void testGetSettingNamesAreSorted() throws Exception {
-        Configuration cfg = new Configuration.Builder(Configuration.VERSION_3_0_0).build();
-        for (boolean camelCase : new boolean[] { false, true }) {
-            List<String> names = new ArrayList<>(Configuration.Builder.getSettingNames(camelCase));
-            List<String> procCfgNames = new ArrayList<>(new Template(null, "", cfg)
-                    .createProcessingEnvironment(null, _NullWriter.INSTANCE)
-                    .getSettingNames(camelCase));
-            assertStartsWith(names, procCfgNames);
-            
-            String prevName = null;
-            for (int i = procCfgNames.size(); i < names.size(); i++) {
-                String name = names.get(i);
-                if (prevName != null) {
-                    assertThat(name, greaterThan(prevName));
-                }
-                prevName = name;
-            }
-        }
-    }
-
-    @Test
-    @SuppressFBWarnings("DLS_DEAD_LOCAL_STORE")
-    public void testGetSettingNamesNameConventionsContainTheSame() throws Exception {
-        Configuration.Builder cfgB = new Configuration.Builder(Configuration.VERSION_3_0_0);
-        ConfigurableTest.testGetSettingNamesNameConventionsContainTheSame(
-                new ArrayList<>(cfgB.getSettingNames(false)),
-                new ArrayList<>(cfgB.getSettingNames(true)));
-    }
-
-    @Test
-    @SuppressFBWarnings("DLS_DEAD_LOCAL_STORE")
-    public void testStaticFieldKeysCoverAllGetSettingNames() throws Exception {
-        Configuration.Builder cfgB = new Configuration.Builder(Configuration.VERSION_3_0_0);
-        List<String> names = new ArrayList<>(cfgB.getSettingNames(false));
-        List<String> cfgableNames = new ArrayList<>(cfgB.getSettingNames(false));
-        assertStartsWith(names, cfgableNames);
-        
-        for (int i = cfgableNames.size(); i < names.size(); i++) {
-            String name = names.get(i);
-            assertTrue("No field was found for " + name, keyFieldExists(name));
-        }
-    }
-    
-    @Test
-    public void testGetSettingNamesCoversAllStaticKeyFields() throws Exception {
-        Collection<String> names = new Configuration.Builder(Configuration.VERSION_3_0_0).getSettingNames(false);
-        
-        for (Class<? extends MutableProcessingConfiguration> cfgableClass : new Class[] { Configuration.class, MutableProcessingConfiguration.class }) {
-            for (Field f : cfgableClass.getFields()) {
-                if (f.getName().endsWith("_KEY")) {
-                    final Object name = f.get(null);
-                    assertTrue("Missing setting name: " + name, names.contains(name));
-                }
-            }
-        }
-    }
-    
-    @Test
-    public void testKeyStaticFieldsHasAllVariationsAndCorrectFormat() throws IllegalArgumentException, IllegalAccessException {
-        ConfigurableTest.testKeyStaticFieldsHasAllVariationsAndCorrectFormat(Configuration.ExtendableBuilder.class);
-    }
-
-    @Test
-    public void testGetSettingNamesCoversAllSettingNames() throws Exception {
-        Collection<String> names = new Configuration.Builder(Configuration.VERSION_3_0_0).getSettingNames(false);
-        
-        for (Field f : MutableProcessingConfiguration.class.getFields()) {
-            if (f.getName().endsWith("_KEY")) {
-                final Object name = f.get(null);
-                assertTrue("Missing setting name: " + name, names.contains(name));
-            }
-        }
-    }
-
-    @Test
-    public void testSetSettingSupportsBothNamingConventions() throws Exception {
-        Configuration.Builder cfgB = new Configuration.Builder(Configuration.VERSION_3_0_0);
-        
-        cfgB.setSetting(Configuration.ExtendableBuilder.SOURCE_ENCODING_KEY_CAMEL_CASE, StandardCharsets.UTF_16LE.name());
-        assertEquals(StandardCharsets.UTF_16LE, cfgB.getSourceEncoding());
-        cfgB.setSetting(Configuration.ExtendableBuilder.SOURCE_ENCODING_KEY_SNAKE_CASE, StandardCharsets.UTF_8.name());
-        assertEquals(StandardCharsets.UTF_8, cfgB.getSourceEncoding());
-        
-        for (String nameCC : cfgB.getSettingNames(true)) {
-            for (String value : new String[] { "1", "default", "true" }) {
-                Exception resultCC = null;
-                try {
-                    cfgB.setSetting(nameCC, value);
-                } catch (Exception e) {
-                    assertThat(e, not(instanceOf(UnknownConfigurationSettingException.class)));
-                    resultCC = e;
-                }
-                
-                String nameSC = _StringUtil.camelCaseToUnderscored(nameCC);
-                Exception resultSC = null;
-                try {
-                    cfgB.setSetting(nameSC, value);
-                } catch (Exception e) {
-                    assertThat(e, not(instanceOf(UnknownConfigurationSettingException.class)));
-                    resultSC = e;
-                }
-                
-                if (resultCC == null) {
-                    assertNull(resultSC);
-                } else {
-                    assertNotNull(resultSC);
-                    assertEquals(resultCC.getClass(), resultSC.getClass());
-                }
-            }
-        }
-    }
-    
-    @Test
-    public void testGetSupportedBuiltInDirectiveNames() {
-        Configuration cfg = new Configuration.Builder(Configuration.VERSION_3_0_0).build();
-        
-        Set<String> allNames = cfg.getSupportedBuiltInDirectiveNames(ParsingConfiguration.AUTO_DETECT_NAMING_CONVENTION);
-        Set<String> lNames = cfg.getSupportedBuiltInDirectiveNames(ParsingConfiguration.LEGACY_NAMING_CONVENTION);
-        Set<String> cNames = cfg.getSupportedBuiltInDirectiveNames(ParsingConfiguration.CAMEL_CASE_NAMING_CONVENTION);
-        
-        checkNamingConventionNameSets(allNames, lNames, cNames);
-        
-        for (String name : cNames) {
-            assertThat(name.toLowerCase(), isIn(lNames));
-        }
-    }
-
-    @Test
-    public void testGetSupportedBuiltInNames() {
-        Configuration cfg = new Configuration.Builder(Configuration.VERSION_3_0_0).build();
-        
-        Set<String> allNames = cfg.getSupportedBuiltInNames(ParsingConfiguration.AUTO_DETECT_NAMING_CONVENTION);
-        Set<String> lNames = cfg.getSupportedBuiltInNames(ParsingConfiguration.LEGACY_NAMING_CONVENTION);
-        Set<String> cNames = cfg.getSupportedBuiltInNames(ParsingConfiguration.CAMEL_CASE_NAMING_CONVENTION);
-        
-        checkNamingConventionNameSets(allNames, lNames, cNames);
-    }
-
-    private void checkNamingConventionNameSets(Set<String> allNames, Set<String> lNames, Set<String> cNames) {
-        for (String name : lNames) {
-            assertThat(allNames, hasItem(name));
-            assertTrue("Should be all-lowercase: " + name, name.equals(name.toLowerCase()));
-        }
-        for (String name : cNames) {
-            assertThat(allNames, hasItem(name));
-        }
-        for (String name : allNames) {
-            assertThat(name, anyOf(isIn(lNames), isIn(cNames)));
-        }
-        assertEquals(lNames.size(), cNames.size());
-    }
-    
-    @Test
-    public void testRemovedSettings() {
-        Configuration.Builder cfgB = new Configuration.Builder(Configuration.VERSION_3_0_0);
-        try {
-            cfgB.setSetting("classic_compatible", "true");
-            fail();
-        } catch (ConfigurationException e) {
-            assertThat(e.getMessage(), allOf(containsString("removed"), containsString("3.0.0")));
-        }
-        try {
-            cfgB.setSetting("strict_syntax", "true");
-            fail();
-        } catch (ConfigurationException e) {
-            assertThat(e.getMessage(), allOf(containsString("removed"), containsString("3.0.0")));
-        }
-    }
-    
-    @SuppressWarnings("boxing")
-    private void assertStartsWith(List<String> list, List<String> headList) {
-        int index = 0;
-        for (String name : headList) {
-            assertThat(index, lessThan(list.size()));
-            assertEquals(name, list.get(index));
-            index++;
-        }
-    }
-
-    private boolean keyFieldExists(String name) throws Exception {
-        Field field;
-        try {
-            field = Configuration.class.getField(name.toUpperCase() + "_KEY");
-        } catch (NoSuchFieldException e) {
-            return false;
-        }
-        assertEquals(name, field.get(null));
-        return true;
-    }
-    
-    private static class MyScalarModel implements TemplateScalarModel {
-
-        @Override
-        public String getAsString() throws TemplateModelException {
-            return "my";
-        }
-        
-    }
-    
-}

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/28a276c8/freemarker-core/src/test/java/org/apache/freemarker/core/CoreLocaleUtilsTest.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/test/java/org/apache/freemarker/core/CoreLocaleUtilsTest.java b/freemarker-core/src/test/java/org/apache/freemarker/core/CoreLocaleUtilsTest.java
deleted file mode 100644
index 6714fc3..0000000
--- a/freemarker-core/src/test/java/org/apache/freemarker/core/CoreLocaleUtilsTest.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you 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.apache.freemarker.core;
-
-import static org.junit.Assert.*;
-
-import java.util.Locale;
-
-import org.apache.freemarker.core.util._LocaleUtil;
-import org.junit.Test;
-
-public class CoreLocaleUtilsTest {
-
-    @Test
-    public void testGetLessSpecificLocale() {
-        Locale locale;
-        
-        locale = new Locale("ru", "RU", "Linux");
-        assertEquals("ru_RU_Linux", locale.toString());
-        locale = _LocaleUtil.getLessSpecificLocale(locale);
-        assertEquals("ru_RU", locale.toString());
-        locale = _LocaleUtil.getLessSpecificLocale(locale);
-        assertEquals("ru", locale.toString());
-        locale = _LocaleUtil.getLessSpecificLocale(locale);
-        assertNull(locale);
-        
-        locale = new Locale("ch", "CH");
-        assertEquals("ch_CH", locale.toString());
-        locale = _LocaleUtil.getLessSpecificLocale(locale);
-        assertEquals("ch", locale.toString());
-        locale = _LocaleUtil.getLessSpecificLocale(locale);
-        assertNull(locale);
-        
-        locale = new Locale("ja");
-        assertEquals("ja", locale.toString());
-        locale = _LocaleUtil.getLessSpecificLocale(locale);
-        assertNull(locale);
-
-        locale = new Locale("ja", "", "");
-        assertEquals("ja", locale.toString());
-        locale = _LocaleUtil.getLessSpecificLocale(locale);
-        assertNull(locale);
-        
-        locale = new Locale("");
-        assertEquals("", locale.toString());
-        locale = _LocaleUtil.getLessSpecificLocale(locale);
-        assertNull(locale);
-        
-        locale = new Locale("hu", "", "Linux");
-        assertEquals("hu__Linux", locale.toString());
-        locale = _LocaleUtil.getLessSpecificLocale(locale);
-        assertEquals("hu", locale.toString());
-        locale = _LocaleUtil.getLessSpecificLocale(locale);
-        assertNull(locale);
-    }
-    
-}

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/28a276c8/freemarker-core/src/test/java/org/apache/freemarker/core/CustomAttributeTest.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/test/java/org/apache/freemarker/core/CustomAttributeTest.java b/freemarker-core/src/test/java/org/apache/freemarker/core/CustomAttributeTest.java
deleted file mode 100644
index 726a20c..0000000
--- a/freemarker-core/src/test/java/org/apache/freemarker/core/CustomAttributeTest.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you 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.apache.freemarker.core;
-
-import static org.junit.Assert.*;
-
-import java.math.BigDecimal;
-import java.util.Arrays;
-
-import org.junit.Test;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSet;
-
-@SuppressWarnings("boxing")
-public class CustomAttributeTest {
-    
-    private static final String KEY_1 = "key1";
-    private static final String KEY_2 = "key2";
-    private static final String KEY_3 = "key3";
-    private static final Integer KEY_4 = 4;
-
-    private static final Integer VALUE_1 = 1; // Serializable
-    private static final Object VALUE_2 = new Object();
-    private static final Object VALUE_3 = new Object();
-    private static final Object VALUE_4 = new Object();
-    private static final Object VALUE_LIST = ImmutableList.<Object>of(
-            "s", BigDecimal.valueOf(2), Boolean.TRUE, ImmutableMap.of("a", "A"));
-    private static final Object VALUE_BIGDECIMAL = BigDecimal.valueOf(22);
-
-    private static final Object CUST_ATT_KEY = new Object();
-
-    @Test
-    public void testStringKey() throws Exception {
-        // Need some MutableProcessingConfiguration:
-        TemplateConfiguration.Builder mpc = new TemplateConfiguration.Builder();
-
-        assertEquals(0, mpc.getCustomAttributeNames().length);
-        assertNull(mpc.getCustomAttribute(KEY_1));
-        
-        mpc.setCustomAttribute(KEY_1, VALUE_1);
-        assertArrayEquals(new String[] { KEY_1 }, mpc.getCustomAttributeNames());
-        assertSame(VALUE_1, mpc.getCustomAttribute(KEY_1));
-        
-        mpc.setCustomAttribute(KEY_2, VALUE_2);
-        assertArrayEquals(new String[] { KEY_1, KEY_2 }, sort(mpc.getCustomAttributeNames()));
-        assertSame(VALUE_1, mpc.getCustomAttribute(KEY_1));
-        assertSame(VALUE_2, mpc.getCustomAttribute(KEY_2));
-
-        mpc.setCustomAttribute(KEY_1, VALUE_2);
-        assertArrayEquals(new String[] { KEY_1, KEY_2 }, sort(mpc.getCustomAttributeNames()));
-        assertSame(VALUE_2, mpc.getCustomAttribute(KEY_1));
-        assertSame(VALUE_2, mpc.getCustomAttribute(KEY_2));
-
-        mpc.setCustomAttribute(KEY_1, null);
-        assertArrayEquals(new String[] { KEY_1, KEY_2 }, sort(mpc.getCustomAttributeNames()));
-        assertNull(mpc.getCustomAttribute(KEY_1));
-        assertSame(VALUE_2, mpc.getCustomAttribute(KEY_2));
-
-        mpc.removeCustomAttribute(KEY_1);
-        assertArrayEquals(new String[] { KEY_2 }, mpc.getCustomAttributeNames());
-        assertNull(mpc.getCustomAttribute(KEY_1));
-        assertSame(VALUE_2, mpc.getCustomAttribute(KEY_2));
-    }
-
-    @Test
-    public void testRemoveFromEmptySet() throws Exception {
-        // Need some MutableProcessingConfiguration:
-        TemplateConfiguration.Builder mpc = new TemplateConfiguration.Builder();
-
-        mpc.removeCustomAttribute(KEY_1);
-        assertEquals(0, mpc.getCustomAttributeNames().length);
-        assertNull(mpc.getCustomAttribute(KEY_1));
-
-        mpc.setCustomAttribute(KEY_1, VALUE_1);
-        assertArrayEquals(new String[] { KEY_1 }, mpc.getCustomAttributeNames());
-        assertSame(VALUE_1, mpc.getCustomAttribute(KEY_1));
-    }
-
-    @Test
-    public void testAttrsFromFtlHeaderOnly() throws Exception {
-        Template t = new Template(null, "<#ftl attributes={"
-                + "'" + KEY_1 + "': [ 's', 2, true, {  'a': 'A' } ], "
-                + "'" + KEY_2 + "': " + VALUE_BIGDECIMAL + " "
-                + "}>",
-                new Configuration.Builder(Configuration.VERSION_3_0_0).build());
-
-        assertEquals(ImmutableSet.of(KEY_1, KEY_2), t.getCustomAttributes().keySet());
-        assertEquals(VALUE_LIST, t.getCustomAttribute(KEY_1));
-        assertEquals(VALUE_BIGDECIMAL, t.getCustomAttribute(KEY_2));
-
-        t.setCustomAttribute(KEY_1, VALUE_1);
-        assertEquals(VALUE_1, t.getCustomAttribute(KEY_1));
-        assertEquals(VALUE_BIGDECIMAL, t.getCustomAttribute(KEY_2));
-
-        t.setCustomAttribute(KEY_1, null);
-        assertEquals(ImmutableSet.of(KEY_1, KEY_2), t.getCustomAttributes().keySet());
-        assertNull(t.getCustomAttribute(KEY_1));
-    }
-
-    @Test
-    public void testAttrsFromFtlHeaderAndFromTemplateConfiguration() throws Exception {
-        TemplateConfiguration.Builder tcb = new TemplateConfiguration.Builder();
-        tcb.setCustomAttribute(KEY_3, VALUE_3);
-        tcb.setCustomAttribute(KEY_4, VALUE_4);
-        Template t = new Template(null, "<#ftl attributes={"
-                + "'" + KEY_1 + "': 'a', "
-                + "'" + KEY_2 + "': 'b', "
-                + "'" + KEY_3 + "': 'c' "
-                + "}>",
-                new Configuration.Builder(Configuration.VERSION_3_0_0).build(),
-                tcb.build());
-
-        assertEquals(ImmutableSet.of(KEY_1, KEY_2, KEY_3, KEY_4), t.getCustomAttributes().keySet());
-        assertEquals("a", t.getCustomAttribute(KEY_1));
-        assertEquals("b", t.getCustomAttribute(KEY_2));
-        assertEquals("c", t.getCustomAttribute(KEY_3)); // Has overridden TC attribute
-        assertEquals(VALUE_4, t.getCustomAttribute(KEY_4)); // Inherited TC attribute
-
-        t.setCustomAttribute(KEY_3, null);
-        assertEquals(ImmutableSet.of(KEY_1, KEY_2, KEY_3, KEY_4), t.getCustomAttributes().keySet());
-        assertNull("null value shouldn't cause fallback to TC attribute", t.getCustomAttribute(KEY_3));
-    }
-
-
-    @Test
-    public void testAttrsFromTemplateConfigurationOnly() throws Exception {
-        TemplateConfiguration.Builder tcb = new TemplateConfiguration.Builder();
-        tcb.setCustomAttribute(KEY_3, VALUE_3);
-        tcb.setCustomAttribute(KEY_4, VALUE_4);
-        Template t = new Template(null, "",
-                new Configuration.Builder(Configuration.VERSION_3_0_0).build(),
-                tcb.build());
-
-        assertEquals(ImmutableSet.of(KEY_3, KEY_4), t.getCustomAttributes().keySet());
-        assertEquals(VALUE_3, t.getCustomAttribute(KEY_3));
-        assertEquals(VALUE_4, t.getCustomAttribute(KEY_4));
-    }
-
-    private Object[] sort(String[] customAttributeNames) {
-        Arrays.sort(customAttributeNames);
-        return customAttributeNames;
-    }
-
-}