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:31 UTC
[15/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/model/impl/CommonSupertypeForUnwrappingHintTest.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/test/java/org/apache/freemarker/core/model/impl/CommonSupertypeForUnwrappingHintTest.java b/freemarker-core/src/test/java/org/apache/freemarker/core/model/impl/CommonSupertypeForUnwrappingHintTest.java
deleted file mode 100644
index ef15dae..0000000
--- a/freemarker-core/src/test/java/org/apache/freemarker/core/model/impl/CommonSupertypeForUnwrappingHintTest.java
+++ /dev/null
@@ -1,129 +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.model.impl;
-
-import java.io.Serializable;
-import java.util.List;
-
-import org.apache.freemarker.core.model.TemplateModelException;
-
-import junit.framework.TestCase;
-
-public class CommonSupertypeForUnwrappingHintTest extends TestCase {
-
- final OverloadedMethodsSubset oms = new DummyOverloadedMethodsSubset();
-
- public CommonSupertypeForUnwrappingHintTest(String name) {
- super(name);
- }
-
- public void testInterfaces() {
- assertEquals(Serializable.class, oms.getCommonSupertypeForUnwrappingHint(String.class, Number.class));
- assertEquals(C1I1.class, oms.getCommonSupertypeForUnwrappingHint(C2ExtC1I1.class, C3ExtC1I1.class));
- assertEquals(Object.class, oms.getCommonSupertypeForUnwrappingHint(C3I1I2.class, C4I1I2.class));
- assertEquals(I1.class, oms.getCommonSupertypeForUnwrappingHint(C3I1I2.class, C5I1.class));
- assertEquals(I1.class, oms.getCommonSupertypeForUnwrappingHint(C3I1I2.class, I1.class));
- assertEquals(I2.class, oms.getCommonSupertypeForUnwrappingHint(C3I1I2.class, I2.class));
- assertEquals(I1.class, oms.getCommonSupertypeForUnwrappingHint(I1I2.class, I1.class));
- assertEquals(I2.class, oms.getCommonSupertypeForUnwrappingHint(I1I2.class, I2.class));
- assertEquals(CharSequence.class, oms.getCommonSupertypeForUnwrappingHint(String.class, StringBuilder.class));
- assertEquals(C6.class, oms.getCommonSupertypeForUnwrappingHint(C7ExtC6I1.class, C8ExtC6I1.class));
- }
-
- public void testArrayAndOther() {
- testArrayAndOther(oms);
- }
-
- /** These will be the same with oms and buggy: */
- private void testArrayAndOther(OverloadedMethodsSubset oms) {
- assertEquals(Serializable.class, oms.getCommonSupertypeForUnwrappingHint(int[].class, String.class));
- assertEquals(Serializable.class, oms.getCommonSupertypeForUnwrappingHint(Object[].class, String.class));
-
- assertEquals(Object.class, oms.getCommonSupertypeForUnwrappingHint(int[].class, List.class));
- assertEquals(Object.class, oms.getCommonSupertypeForUnwrappingHint(Object[].class, List.class));
-
- assertEquals(int[].class, oms.getCommonSupertypeForUnwrappingHint(int[].class, int[].class));
- assertEquals(Object[].class, oms.getCommonSupertypeForUnwrappingHint(Object[].class, Object[].class));
- }
-
- public void testArrayAndDifferentArray() {
- assertEquals(Serializable.class, oms.getCommonSupertypeForUnwrappingHint(int[].class, Object[].class));
- assertEquals(Serializable.class, oms.getCommonSupertypeForUnwrappingHint(int[].class, long[].class));
- }
-
- public void testPrimitive() {
- assertEquals(Integer.class, oms.getCommonSupertypeForUnwrappingHint(int.class, Integer.class));
- assertEquals(Integer.class, oms.getCommonSupertypeForUnwrappingHint(Integer.class, int.class));
- assertEquals(Number.class, oms.getCommonSupertypeForUnwrappingHint(int.class, Long.class));
- assertEquals(Number.class, oms.getCommonSupertypeForUnwrappingHint(Long.class, int.class));
- assertEquals(Number.class, oms.getCommonSupertypeForUnwrappingHint(Integer.class, long.class));
- assertEquals(Number.class, oms.getCommonSupertypeForUnwrappingHint(long.class, Integer.class));
- assertEquals(Boolean.class, oms.getCommonSupertypeForUnwrappingHint(boolean.class, Boolean.class));
- assertEquals(Boolean.class, oms.getCommonSupertypeForUnwrappingHint(Boolean.class, boolean.class));
- assertEquals(Character.class, oms.getCommonSupertypeForUnwrappingHint(char.class, Character.class));
- assertEquals(Character.class, oms.getCommonSupertypeForUnwrappingHint(Character.class, char.class));
- assertEquals(Number.class, oms.getCommonSupertypeForUnwrappingHint(int.class, short.class));
- assertEquals(Number.class, oms.getCommonSupertypeForUnwrappingHint(short.class, int.class));
- }
-
- public void testMisc() {
- assertEquals(Number.class, oms.getCommonSupertypeForUnwrappingHint(Long.class, Integer.class));
- assertEquals(char.class, oms.getCommonSupertypeForUnwrappingHint(char.class, char.class));
- assertEquals(Integer.class, oms.getCommonSupertypeForUnwrappingHint(Integer.class, Integer.class));
- assertEquals(String.class, oms.getCommonSupertypeForUnwrappingHint(String.class, String.class));
- }
-
- static interface I1 { };
- static class C1I1 implements I1 { };
- static class C2ExtC1I1 extends C1I1 { };
- static class C3ExtC1I1 extends C1I1 { };
- static interface I2 { };
- static class C3I1I2 implements I1, I2 { };
- static class C4I1I2 implements I1, I2 { };
- static class C5I1 implements I1 { };
- static interface I1I2 extends I1, I2 { };
- static class C6 { };
- static class C7ExtC6I1 extends C6 implements I1 { };
- static class C8ExtC6I1 extends C6 implements I1 { };
-
- private static class DummyOverloadedMethodsSubset extends OverloadedMethodsSubset {
-
- DummyOverloadedMethodsSubset() {
- super();
- }
-
- @Override
- Class[] preprocessParameterTypes(CallableMemberDescriptor memberDesc) {
- return memberDesc.getParamTypes();
- }
-
- @Override
- void afterWideningUnwrappingHints(Class[] paramTypes, int[] paramNumericalTypes) {
- // Do nothing
- }
-
- @Override
- MaybeEmptyMemberAndArguments getMemberAndArguments(List tmArgs, DefaultObjectWrapper w) throws TemplateModelException {
- throw new RuntimeException("Not implemented in this dummy.");
- }
-
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/28a276c8/freemarker-core/src/test/java/org/apache/freemarker/core/model/impl/DefaultObjectWrapperDesc.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/test/java/org/apache/freemarker/core/model/impl/DefaultObjectWrapperDesc.java b/freemarker-core/src/test/java/org/apache/freemarker/core/model/impl/DefaultObjectWrapperDesc.java
deleted file mode 100644
index 0ed6e7c..0000000
--- a/freemarker-core/src/test/java/org/apache/freemarker/core/model/impl/DefaultObjectWrapperDesc.java
+++ /dev/null
@@ -1,31 +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.model.impl;
-
-import org.apache.freemarker.core.Configuration;
-
-public class DefaultObjectWrapperDesc extends DefaultObjectWrapper {
-
- public DefaultObjectWrapperDesc() {
- super(new DefaultObjectWrapper.Builder(Configuration.VERSION_3_0_0)
- .methodSorter(new AlphabeticalMethodSorter(true)), true);
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/28a276c8/freemarker-core/src/test/java/org/apache/freemarker/core/model/impl/DefaultObjectWrapperInc.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/test/java/org/apache/freemarker/core/model/impl/DefaultObjectWrapperInc.java b/freemarker-core/src/test/java/org/apache/freemarker/core/model/impl/DefaultObjectWrapperInc.java
deleted file mode 100644
index eb2cda0..0000000
--- a/freemarker-core/src/test/java/org/apache/freemarker/core/model/impl/DefaultObjectWrapperInc.java
+++ /dev/null
@@ -1,31 +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.model.impl;
-
-import org.apache.freemarker.core.Configuration;
-
-public class DefaultObjectWrapperInc extends DefaultObjectWrapper {
-
- public DefaultObjectWrapperInc() {
- super(new DefaultObjectWrapper.Builder(Configuration.VERSION_3_0_0)
- .methodSorter(new AlphabeticalMethodSorter(false)), true);
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/28a276c8/freemarker-core/src/test/java/org/apache/freemarker/core/model/impl/DefaultObjectWrapperModelFactoryRegistrationTest.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/test/java/org/apache/freemarker/core/model/impl/DefaultObjectWrapperModelFactoryRegistrationTest.java b/freemarker-core/src/test/java/org/apache/freemarker/core/model/impl/DefaultObjectWrapperModelFactoryRegistrationTest.java
deleted file mode 100644
index 5c2f653..0000000
--- a/freemarker-core/src/test/java/org/apache/freemarker/core/model/impl/DefaultObjectWrapperModelFactoryRegistrationTest.java
+++ /dev/null
@@ -1,63 +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.model.impl;
-
-import static org.junit.Assert.*;
-
-import java.lang.ref.Reference;
-
-import org.apache.freemarker.core.Configuration;
-import org.junit.Test;
-
-public class DefaultObjectWrapperModelFactoryRegistrationTest {
-
- @Test
- public void introspectionSettingChanges() {
- DefaultObjectWrapper ow = new DefaultObjectWrapper.Builder(Configuration.VERSION_3_0_0).usePrivateCaches(true)
- .build();
- ClassIntrospector ci1 = ow.getClassIntrospector();
- checkRegisteredModelFactories(ci1, ow.getStaticModels(), ow.getEnumModels());
- }
-
- private void checkRegisteredModelFactories(ClassIntrospector ci, Object... expected) {
- Object[] actualRefs = ci.getRegisteredModelFactoriesSnapshot();
-
- scanActuals: for (Object actaulRef : actualRefs) {
- Object actualItem = ((Reference) actaulRef).get();
- for (Object expectedItem : expected) {
- if (actualItem == expectedItem) {
- continue scanActuals;
- }
- }
- fail("Actual item " + actualItem + " is not among the expected items");
- }
-
- scanExpecteds: for (Object expectedItem : expected) {
- for (Object ref : actualRefs) {
- Object actualItem = ((Reference) ref).get();
- if (actualItem == expectedItem) {
- continue scanExpecteds;
- }
- }
- fail("Expected item " + expectedItem + " is not among the actual items");
- }
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/28a276c8/freemarker-core/src/test/java/org/apache/freemarker/core/model/impl/DefaultObjectWrapperSingletonsTest.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/test/java/org/apache/freemarker/core/model/impl/DefaultObjectWrapperSingletonsTest.java b/freemarker-core/src/test/java/org/apache/freemarker/core/model/impl/DefaultObjectWrapperSingletonsTest.java
deleted file mode 100644
index 767b640..0000000
--- a/freemarker-core/src/test/java/org/apache/freemarker/core/model/impl/DefaultObjectWrapperSingletonsTest.java
+++ /dev/null
@@ -1,675 +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.model.impl;
-
-import static org.hamcrest.Matchers.*;
-import static org.junit.Assert.*;
-
-import java.lang.ref.Reference;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.freemarker.core.Configuration;
-import org.apache.freemarker.core.Version;
-import org.apache.freemarker.core.model.TemplateDateModel;
-import org.apache.freemarker.core.model.TemplateHashModel;
-import org.apache.freemarker.core.model.TemplateModelException;
-import org.apache.freemarker.core.model.TemplateScalarModel;
-import org.apache.freemarker.test.util.CoreTestUtil;
-
-import junit.framework.TestCase;
-
-public class DefaultObjectWrapperSingletonsTest extends TestCase {
-
- public DefaultObjectWrapperSingletonsTest(String name) {
- super(name);
- }
-
- @Override
- protected void setUp() throws Exception {
- DefaultObjectWrapper.Builder.clearInstanceCache();
- }
-
- public void testBuilderEqualsAndHash() throws Exception {
- assertEquals(Configuration.VERSION_3_0_0, new DefaultObjectWrapper.Builder(Configuration.VERSION_3_0_0).getIncompatibleImprovements());
- try {
- new DefaultObjectWrapper.Builder(CoreTestUtil.getClosestFutureVersion());
- fail("Maybe you need to update this test for the new FreeMarker version");
- } catch (IllegalArgumentException e) {
- assertThat(e.getMessage(), containsString("upgrade"));
- }
-
- DefaultObjectWrapper.Builder builder1;
- DefaultObjectWrapper.Builder builder2;
-
- builder1 = new DefaultObjectWrapper.Builder(Configuration.VERSION_3_0_0);
- builder2 = new DefaultObjectWrapper.Builder(Configuration.VERSION_3_0_0);
- assertEquals(builder1, builder2);
-
- builder1.setExposeFields(true);
- assertNotEquals(builder1, builder2);
- assertNotEquals(builder1.hashCode(), builder2.hashCode());
- builder2.setExposeFields(true);
- assertEquals(builder1, builder2);
- assertEquals(builder1.hashCode(), builder2.hashCode());
-
- builder1.setExposureLevel(0);
- assertNotEquals(builder1, builder2);
- assertNotEquals(builder1.hashCode(), builder2.hashCode());
- builder2.setExposureLevel(0);
- assertEquals(builder1, builder2);
- assertEquals(builder1.hashCode(), builder2.hashCode());
-
- builder1.setExposureLevel(1);
- assertNotEquals(builder1, builder2);
- assertNotEquals(builder1.hashCode(), builder2.hashCode());
- builder2.setExposureLevel(1);
- assertEquals(builder1, builder2);
- assertEquals(builder1.hashCode(), builder2.hashCode());
-
- builder1.setDefaultDateType(TemplateDateModel.DATE);
- assertNotEquals(builder1, builder2);
- builder2.setDefaultDateType(TemplateDateModel.DATE);
- assertEquals(builder1, builder2);
- assertEquals(builder1.hashCode(), builder2.hashCode());
-
- builder1.setStrict(true);
- assertNotEquals(builder1, builder2);
- assertNotEquals(builder1.hashCode(), builder2.hashCode());
- builder2.setStrict(true);
- assertEquals(builder1, builder2);
- assertEquals(builder1.hashCode(), builder2.hashCode());
-
- builder1.setUseModelCache(true);
- assertNotEquals(builder1, builder2);
- assertNotEquals(builder1.hashCode(), builder2.hashCode());
- builder2.setUseModelCache(true);
- assertEquals(builder1, builder2);
- assertEquals(builder1.hashCode(), builder2.hashCode());
-
- AlphabeticalMethodSorter ms = new AlphabeticalMethodSorter(true);
- builder1.setMethodSorter(ms);
- assertNotEquals(builder1, builder2);
- builder2.setMethodSorter(ms);
- assertEquals(builder1, builder2);
- assertEquals(builder1.hashCode(), builder2.hashCode());
-
- MethodAppearanceFineTuner maft = new MethodAppearanceFineTuner() {
- @Override
- public void process(DecisionInput in, Decision out) { }
- };
- builder1.setMethodAppearanceFineTuner(maft);
- assertNotEquals(builder1, builder2);
- builder2.setMethodAppearanceFineTuner(maft);
- assertEquals(builder1, builder2);
- assertEquals(builder1.hashCode(), builder2.hashCode());
- }
-
- public void testDefaultObjectWrapperBuilderProducts() throws Exception {
- List<DefaultObjectWrapper> hardReferences = new LinkedList<>();
-
- assertEquals(0, getDefaultObjectWrapperInstanceCacheSize());
-
- {
- DefaultObjectWrapper ow = getDefaultObjectWrapperWithSetting(Configuration.VERSION_3_0_0, true);
- assertEquals(1, getDefaultObjectWrapperInstanceCacheSize());
- assertSame(ow.getClass(), DefaultObjectWrapper.class);
- assertEquals(Configuration.VERSION_3_0_0, ow.getIncompatibleImprovements());
- assertFalse(ow.isStrict());
- assertTrue(ow.getUseModelCache());
- assertEquals(TemplateDateModel.UNKNOWN, ow.getDefaultDateType());
- assertSame(ow, ow.getOuterIdentity());
- assertTrue(ow.isClassIntrospectionCacheRestricted());
- assertNull(ow.getMethodAppearanceFineTuner());
- assertNull(ow.getMethodSorter());
-
- assertSame(ow, getDefaultObjectWrapperWithSetting(Configuration.VERSION_3_0_0, true));
- assertEquals(1, getDefaultObjectWrapperInstanceCacheSize());
-
- hardReferences.add(ow);
- }
-
- {
- DefaultObjectWrapper ow = getDefaultObjectWrapperWithSetting(Configuration.VERSION_3_0_0, false);
- assertEquals(2, getDefaultObjectWrapperInstanceCacheSize());
- assertSame(ow.getClass(), DefaultObjectWrapper.class);
- assertEquals(Configuration.VERSION_3_0_0, ow.getIncompatibleImprovements());
- assertFalse(ow.getUseModelCache());
-
- assertSame(ow, getDefaultObjectWrapperWithSetting(Configuration.VERSION_3_0_0, false));
-
- hardReferences.add(ow);
- }
-
- {
- DefaultObjectWrapper.Builder factory = new DefaultObjectWrapper.Builder(Configuration.VERSION_3_0_0);
- factory.setExposureLevel(DefaultObjectWrapper.EXPOSE_PROPERTIES_ONLY);
- DefaultObjectWrapper ow1 = factory.build();
- DefaultObjectWrapper ow2 = factory.build();
- assertEquals(3, getDefaultObjectWrapperInstanceCacheSize());
- assertSame(ow1, ow2);
-
- assertSame(ow1.getClass(), DefaultObjectWrapper.class);
- assertEquals(Configuration.VERSION_3_0_0, ow1.getIncompatibleImprovements());
- assertEquals(DefaultObjectWrapper.EXPOSE_PROPERTIES_ONLY, ow1.getExposureLevel());
- assertFalse(ow1.isStrict());
- assertEquals(TemplateDateModel.UNKNOWN, ow1.getDefaultDateType());
- assertSame(ow1, ow1.getOuterIdentity());
-
- hardReferences.add(ow1);
- }
-
- {
- DefaultObjectWrapper.Builder factory = new DefaultObjectWrapper.Builder(Configuration.VERSION_3_0_0);
- factory.setExposeFields(true);
- DefaultObjectWrapper ow1 = factory.build();
- DefaultObjectWrapper ow2 = factory.build();
- assertEquals(4, getDefaultObjectWrapperInstanceCacheSize());
- assertSame(ow1, ow2);
-
- assertSame(ow1.getClass(), DefaultObjectWrapper.class);
- assertEquals(Configuration.VERSION_3_0_0, ow1.getIncompatibleImprovements());
- assertTrue(ow1.isExposeFields());
-
- hardReferences.add(ow1);
- }
-
- {
- DefaultObjectWrapper.Builder factory = new DefaultObjectWrapper.Builder(Configuration.VERSION_3_0_0);
- factory.setStrict(true);
- factory.setDefaultDateType(TemplateDateModel.DATETIME);
- factory.setOuterIdentity(new RestrictedObjectWrapper.Builder(Configuration.VERSION_3_0_0).build());
- DefaultObjectWrapper ow = factory.build();
- assertEquals(5, getDefaultObjectWrapperInstanceCacheSize());
- assertTrue(ow.isStrict());
- assertEquals(TemplateDateModel.DATETIME, ow.getDefaultDateType());
- assertSame(RestrictedObjectWrapper.class, ow.getOuterIdentity().getClass());
-
- hardReferences.add(ow);
- }
-
- // Effect of reference and cache clearings:
- {
- DefaultObjectWrapper bw1 = new DefaultObjectWrapper.Builder(Configuration.VERSION_3_0_0).build();
- assertEquals(5, getDefaultObjectWrapperInstanceCacheSize());
- assertEquals(5, getDefaultObjectWrapperNonClearedInstanceCacheSize());
-
- clearDefaultObjectWrapperInstanceCacheReferences(false);
- assertEquals(5, getDefaultObjectWrapperInstanceCacheSize());
- assertEquals(0, getDefaultObjectWrapperNonClearedInstanceCacheSize());
-
- DefaultObjectWrapper bw2 = new DefaultObjectWrapper.Builder(Configuration.VERSION_3_0_0).build();
- assertNotSame(bw1, bw2);
- assertEquals(5, getDefaultObjectWrapperInstanceCacheSize());
- assertEquals(1, getDefaultObjectWrapperNonClearedInstanceCacheSize());
-
- assertSame(bw2, new DefaultObjectWrapper.Builder(Configuration.VERSION_3_0_0).build());
- assertEquals(1, getDefaultObjectWrapperNonClearedInstanceCacheSize());
-
- clearDefaultObjectWrapperInstanceCacheReferences(true);
- DefaultObjectWrapper bw3 = new DefaultObjectWrapper.Builder(Configuration.VERSION_3_0_0).build();
- assertNotSame(bw2, bw3);
- assertEquals(1, getDefaultObjectWrapperInstanceCacheSize());
- assertEquals(1, getDefaultObjectWrapperNonClearedInstanceCacheSize());
- }
-
- {
- DefaultObjectWrapper.Builder factory = new DefaultObjectWrapper.Builder(Configuration.VERSION_3_0_0);
- factory.setUseModelCache(true);
- DefaultObjectWrapper ow = factory.build();
- assertTrue(ow.getUseModelCache());
- assertEquals(2, getDefaultObjectWrapperInstanceCacheSize());
-
- hardReferences.add(ow);
- }
-
- assertTrue(hardReferences.size() != 0); // just to save it from GC until this line
- }
-
- private DefaultObjectWrapper getDefaultObjectWrapperWithSetting(Version ici, boolean useModelCache) {
- DefaultObjectWrapper.Builder f = new DefaultObjectWrapper.Builder(ici);
- f.setUseModelCache(useModelCache);
- return f.build();
- }
-
- public void testMultipleTCCLs() {
- List<DefaultObjectWrapper> hardReferences = new LinkedList<>();
-
- assertEquals(0, getDefaultObjectWrapperInstanceCacheSize());
-
- DefaultObjectWrapper bw1 = new DefaultObjectWrapper.Builder(Configuration.VERSION_3_0_0).build();
- assertEquals(1, getDefaultObjectWrapperInstanceCacheSize());
- hardReferences.add(bw1);
-
- ClassLoader oldTCCL = Thread.currentThread().getContextClassLoader();
- // Doesn't mater what, just be different from oldTCCL:
- ClassLoader newTCCL = oldTCCL == null ? getClass().getClassLoader() : null;
-
- DefaultObjectWrapper bw2;
- Thread.currentThread().setContextClassLoader(newTCCL);
- try {
- bw2 = new DefaultObjectWrapper.Builder(Configuration.VERSION_3_0_0).build();
- assertEquals(2, getDefaultObjectWrapperInstanceCacheSize());
- hardReferences.add(bw2);
-
- assertNotSame(bw1, bw2);
- assertSame(bw2, new DefaultObjectWrapper.Builder(Configuration.VERSION_3_0_0).build());
- } finally {
- Thread.currentThread().setContextClassLoader(oldTCCL);
- }
-
- assertSame(bw1, new DefaultObjectWrapper.Builder(Configuration.VERSION_3_0_0).build());
- assertEquals(2, getDefaultObjectWrapperInstanceCacheSize());
-
- DefaultObjectWrapper bw3;
- Thread.currentThread().setContextClassLoader(newTCCL);
- try {
- assertSame(bw2, new DefaultObjectWrapper.Builder(Configuration.VERSION_3_0_0).build());
-
- DefaultObjectWrapper.Builder bwb = new DefaultObjectWrapper.Builder(Configuration.VERSION_3_0_0);
- bwb.setExposeFields(true);
- bw3 = bwb.build();
- assertEquals(3, getDefaultObjectWrapperInstanceCacheSize());
- hardReferences.add(bw3);
- } finally {
- Thread.currentThread().setContextClassLoader(oldTCCL);
- }
-
- {
- DefaultObjectWrapper.Builder bwb = new DefaultObjectWrapper.Builder(Configuration.VERSION_3_0_0);
- bwb.setExposeFields(true);
- DefaultObjectWrapper bw4 = bwb.build();
- assertEquals(4, getDefaultObjectWrapperInstanceCacheSize());
- assertNotSame(bw3, bw4);
- hardReferences.add(bw4);
- }
-
- assertTrue(hardReferences.size() != 0); // just to save it from GC until this line
- }
-
- public void testClassInrospectorCache() throws TemplateModelException {
- assertFalse(new DefaultObjectWrapper.Builder(Configuration.VERSION_3_0_0)
- .usePrivateCaches(true).build().isClassIntrospectionCacheRestricted());
- assertTrue(new DefaultObjectWrapper.Builder(Configuration.VERSION_3_0_0)
- .build().isClassIntrospectionCacheRestricted());
-
- ClassIntrospector.Builder.clearInstanceCache();
- DefaultObjectWrapper.Builder.clearInstanceCache();
- checkClassIntrospectorCacheSize(0);
-
- List<DefaultObjectWrapper> hardReferences = new LinkedList<>();
- DefaultObjectWrapper.Builder builder;
-
- {
- builder = new DefaultObjectWrapper.Builder(Configuration.VERSION_3_0_0);
-
- DefaultObjectWrapper bw1 = builder.build();
- checkClassIntrospectorCacheSize(1);
-
- builder.setExposureLevel(DefaultObjectWrapper.EXPOSE_SAFE); // this was already set to this
- builder.setUseModelCache(true); // this shouldn't matter for the introspection cache
- DefaultObjectWrapper bw2 = builder.build();
- checkClassIntrospectorCacheSize(1);
-
- assertSame(bw2.getClassIntrospector(), bw1.getClassIntrospector());
- assertNotSame(bw1, bw2);
-
- // Wrapping tests:
- assertFalse(exposesFields(bw1));
- assertTrue(exposesProperties(bw1));
- assertTrue(exposesMethods(bw1));
- assertFalse(exposesUnsafe(bw1));
- assertTrue(bw1.isClassIntrospectionCacheRestricted());
- // Prevent introspection cache GC:
- hardReferences.add(bw1);
- hardReferences.add(bw2);
- }
-
- {
- builder = new DefaultObjectWrapper.Builder(Configuration.VERSION_3_0_0);
- builder.setExposeFields(true);
- DefaultObjectWrapper ow = builder.build();
- checkClassIntrospectorCacheSize(2);
- // Wrapping tests:
- assertTrue(exposesFields(ow));
- assertTrue(exposesProperties(ow));
- assertTrue(exposesMethods(ow));
- assertFalse(exposesUnsafe(ow));
- // Prevent introspection cache GC:
- hardReferences.add(ow);
- }
-
- {
- builder.setExposureLevel(DefaultObjectWrapper.EXPOSE_ALL);
- DefaultObjectWrapper ow = builder.build();
- checkClassIntrospectorCacheSize(3);
- // Wrapping tests:
- assertTrue(exposesFields(ow));
- assertTrue(exposesProperties(ow));
- assertTrue(exposesMethods(ow));
- assertTrue(exposesUnsafe(ow));
- // Prevent introspection cache GC:
- hardReferences.add(ow);
- }
-
- {
- builder.setExposeFields(false);
- DefaultObjectWrapper ow = builder.build();
- checkClassIntrospectorCacheSize(4);
- // Wrapping tests:
- assertFalse(exposesFields(ow));
- assertTrue(exposesProperties(ow));
- assertTrue(exposesMethods(ow));
- assertTrue(exposesUnsafe(ow));
- // Prevent introspection cache GC:
- hardReferences.add(ow);
- }
-
- {
- builder.setExposureLevel(DefaultObjectWrapper.EXPOSE_NOTHING);
- DefaultObjectWrapper ow = builder.build();
- checkClassIntrospectorCacheSize(5);
- // Wrapping tests:
- assertFalse(exposesFields(ow));
- assertFalse(exposesProperties(ow));
- assertFalse(exposesMethods(ow));
- assertFalse(exposesUnsafe(ow));
- // Prevent introspection cache GC:
- hardReferences.add(ow);
- }
-
- {
- builder.setExposeFields(true);
- DefaultObjectWrapper ow = builder.build();
- checkClassIntrospectorCacheSize(6);
- // Wrapping tests:
- assertTrue(exposesFields(ow));
- assertFalse(exposesProperties(ow));
- assertFalse(exposesMethods(ow));
- assertFalse(exposesUnsafe(ow));
- // Prevent introspection cache GC:
- hardReferences.add(ow);
- }
-
- {
- builder.setExposureLevel(DefaultObjectWrapper.EXPOSE_PROPERTIES_ONLY);
- DefaultObjectWrapper ow = builder.build();
- checkClassIntrospectorCacheSize(7);
- // Wrapping tests:
- assertTrue(exposesFields(ow));
- assertTrue(exposesProperties(ow));
- assertFalse(exposesMethods(ow));
- assertFalse(exposesUnsafe(ow));
- // Prevent introspection cache GC:
- hardReferences.add(ow);
- }
-
- {
- builder = new DefaultObjectWrapper.Builder(Configuration.VERSION_3_0_0);
- builder.setUseModelCache(true);
- builder.setExposeFields(false);
- builder.setExposureLevel(DefaultObjectWrapper.EXPOSE_PROPERTIES_ONLY);
-
- DefaultObjectWrapper bw1 = builder.build();
- checkClassIntrospectorCacheSize(8);
- ClassIntrospector ci1 = bw1.getClassIntrospector();
-
- builder.setUseModelCache(false); // Shouldn't mater for the ClassIntrospector
- DefaultObjectWrapper bw2 = builder.build();
- ClassIntrospector ci2 = bw2.getClassIntrospector();
- checkClassIntrospectorCacheSize(8);
-
- assertSame(ci1, ci2);
- assertNotSame(bw1, bw2);
-
- // Wrapping tests:
- assertFalse(exposesFields(bw1));
- assertTrue(exposesProperties(bw1));
- assertFalse(exposesMethods(bw1));
- assertFalse(exposesUnsafe(bw1));
-
- // Prevent introspection cache GC:
- hardReferences.add(bw1);
- hardReferences.add(bw2);
- }
-
- // The ClassInrospector cache couldn't become cleared in reality otherwise:
- DefaultObjectWrapper.Builder.clearInstanceCache();
-
- clearClassIntrospectorInstanceCacheReferences(false);
- checkClassIntrospectorCacheSize(8);
- assertEquals(0, getClassIntrospectorNonClearedInstanceCacheSize());
-
- {
- builder.setExposeFields(false);
-
- DefaultObjectWrapper bw1 = builder.build();
- checkClassIntrospectorCacheSize(8);
- assertEquals(1, getClassIntrospectorNonClearedInstanceCacheSize());
- ClassIntrospector ci1 = bw1.getClassIntrospector();
-
- builder.setUseModelCache(true); // Shouldn't mater
- DefaultObjectWrapper bw2 = builder.build();
- ClassIntrospector ci2 = bw2.getClassIntrospector();
-
- assertSame(ci1, ci2);
- assertNotSame(bw1, bw2);
-
- // Wrapping tests:
- assertFalse(exposesFields(bw1));
- assertTrue(exposesProperties(bw1));
- assertFalse(exposesMethods(bw1));
- assertFalse(exposesUnsafe(bw1));
-
- // Prevent introspection cache GC:
- hardReferences.add(bw1);
- hardReferences.add(bw2);
- }
-
- {
- builder = new DefaultObjectWrapper.Builder(Configuration.VERSION_3_0_0);
- DefaultObjectWrapper ow = builder.build();
- checkClassIntrospectorCacheSize(8);
- assertEquals(2, getClassIntrospectorNonClearedInstanceCacheSize());
- // Wrapping tests:
- assertFalse(exposesFields(ow));
- assertTrue(exposesProperties(ow));
- assertTrue(exposesMethods(ow));
- assertFalse(exposesUnsafe(ow));
- // Prevent introspection cache GC:
- hardReferences.add(ow);
- }
-
- clearClassIntrospectorInstanceCacheReferences(true);
- checkClassIntrospectorCacheSize(8);
- assertEquals(0, getClassIntrospectorNonClearedInstanceCacheSize());
-
- {
- builder = new DefaultObjectWrapper.Builder(Configuration.VERSION_3_0_0);
- builder.setExposeFields(true);
- DefaultObjectWrapper ow = builder.build();
- checkClassIntrospectorCacheSize(1);
- // Wrapping tests:
- assertTrue(exposesFields(ow));
- assertTrue(exposesProperties(ow));
- assertTrue(exposesMethods(ow));
- assertFalse(exposesUnsafe(ow));
- // Prevent introspection cache GC:
- hardReferences.add(ow);
- }
-
- {
- builder = new DefaultObjectWrapper.Builder(Configuration.VERSION_3_0_0);
- builder.setMethodAppearanceFineTuner(new MethodAppearanceFineTuner() {
- @Override
- public void process(DecisionInput in, Decision out) {
- }
- }); // spoils ClassIntrospector() sharing
-
- builder.setUseModelCache(false);
- DefaultObjectWrapper bw1 = builder.build();
- assertSame(bw1, builder.build());
-
- builder.setUseModelCache(true);
- DefaultObjectWrapper bw2 = builder.build();
- checkClassIntrospectorCacheSize(1);
- assertNotSame(bw1, bw2);
- assertNotSame(bw1.getClassIntrospector(), bw2.getClassIntrospector());
- assertTrue(bw1.isClassIntrospectionCacheRestricted());
- assertTrue(bw2.isClassIntrospectionCacheRestricted());
- }
-
- {
- builder = new DefaultObjectWrapper.Builder(Configuration.VERSION_3_0_0);
- builder.setMethodAppearanceFineTuner(
- GetlessMethodsAsPropertyGettersRule.INSTANCE); // doesn't spoils sharing
-
- builder.setUseModelCache(false);
- DefaultObjectWrapper bw1 = builder.build();
- assertSame(bw1, builder.build());
- checkClassIntrospectorCacheSize(2);
-
- builder.setUseModelCache(true);
- DefaultObjectWrapper bw2 = builder.build();
- checkClassIntrospectorCacheSize(2);
-
- assertNotSame(bw1, bw2);
- assertSame(bw1.getClassIntrospector(), bw2.getClassIntrospector()); // !
- assertTrue(bw2.isClassIntrospectionCacheRestricted());
- }
-
- assertTrue(hardReferences.size() != 0); // just to save it from GC until this line
- }
-
- private void checkClassIntrospectorCacheSize(int expectedSize) {
- assertEquals(expectedSize, getClassIntrospectorInstanceCacheSize());
- }
-
- public class C {
-
- public String foo = "FOO";
-
- public String getBar() {
- return "BAR";
- }
-
- }
-
- private boolean exposesFields(DefaultObjectWrapper ow) throws TemplateModelException {
- TemplateHashModel thm = (TemplateHashModel) ow.wrap(new C());
- TemplateScalarModel r = (TemplateScalarModel) thm.get("foo");
- if (r == null) return false;
- assertEquals("FOO", r.getAsString());
- return true;
- }
-
- private boolean exposesProperties(DefaultObjectWrapper ow) throws TemplateModelException {
- TemplateHashModel thm = (TemplateHashModel) ow.wrap(new C());
- TemplateScalarModel r = (TemplateScalarModel) thm.get("bar");
- if (r == null) return false;
- assertEquals("BAR", r.getAsString());
- return true;
- }
-
- private boolean exposesMethods(DefaultObjectWrapper ow) throws TemplateModelException {
- TemplateHashModel thm = (TemplateHashModel) ow.wrap(new C());
- return thm.get("getBar") != null;
- }
-
- private boolean exposesUnsafe(DefaultObjectWrapper ow) throws TemplateModelException {
- TemplateHashModel thm = (TemplateHashModel) ow.wrap(new C());
- return thm.get("wait") != null;
- }
-
- static int getClassIntrospectorInstanceCacheSize() {
- Map instanceCache = ClassIntrospector.Builder.getInstanceCache();
- synchronized (instanceCache) {
- return instanceCache.size();
- }
- }
-
- static int getClassIntrospectorNonClearedInstanceCacheSize() {
- Map instanceCache = ClassIntrospector.Builder.getInstanceCache();
- synchronized (instanceCache) {
- int cnt = 0;
- for (Iterator it = instanceCache.values().iterator(); it.hasNext(); ) {
- if (((Reference) it.next()).get() != null) cnt++;
- }
- return cnt;
- }
- }
-
- static void clearClassIntrospectorInstanceCacheReferences(boolean enqueue) {
- Map instanceCache = ClassIntrospector.Builder.getInstanceCache();
- synchronized (instanceCache) {
- for (Iterator it = instanceCache.values().iterator(); it.hasNext(); ) {
- Reference ref = ((Reference) it.next());
- ref.clear();
- if (enqueue) {
- ref.enqueue();
- }
- }
- }
- }
-
- static int getDefaultObjectWrapperInstanceCacheSize() {
- Map instanceCache = DefaultObjectWrapper.Builder.getInstanceCache();
- synchronized (instanceCache) {
- int size = 0;
- for (Iterator it1 = instanceCache.values().iterator(); it1.hasNext(); ) {
- size += ((Map) it1.next()).size();
- }
- return size;
- }
- }
-
- static int getDefaultObjectWrapperNonClearedInstanceCacheSize() {
- Map instanceCache = DefaultObjectWrapper.Builder.getInstanceCache();
- synchronized (instanceCache) {
- int cnt = 0;
- for (Iterator it1 = instanceCache.values().iterator(); it1.hasNext(); ) {
- Map tcclScope = (Map) it1.next();
- for (Iterator it2 = tcclScope.values().iterator(); it2.hasNext(); ) {
- if (((Reference) it2.next()).get() != null) cnt++;
- }
- }
- return cnt;
- }
- }
-
- static void clearDefaultObjectWrapperInstanceCacheReferences(boolean enqueue) {
- Map instanceCache = DefaultObjectWrapper.Builder.getInstanceCache();
- synchronized (instanceCache) {
- for (Iterator it1 = instanceCache.values().iterator(); it1.hasNext(); ) {
- Map tcclScope = (Map) it1.next();
- for (Iterator it2 = tcclScope.values().iterator(); it2.hasNext(); ) {
- Reference ref = ((Reference) it2.next());
- ref.clear();
- if (enqueue) {
- ref.enqueue();
- }
- }
- }
- }
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/28a276c8/freemarker-core/src/test/java/org/apache/freemarker/core/model/impl/DefaultObjectWrapperTest.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/test/java/org/apache/freemarker/core/model/impl/DefaultObjectWrapperTest.java b/freemarker-core/src/test/java/org/apache/freemarker/core/model/impl/DefaultObjectWrapperTest.java
deleted file mode 100644
index 6e9ae25..0000000
--- a/freemarker-core/src/test/java/org/apache/freemarker/core/model/impl/DefaultObjectWrapperTest.java
+++ /dev/null
@@ -1,901 +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.model.impl;
-
-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.StringReader;
-import java.io.StringWriter;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeMap;
-import java.util.TreeSet;
-import java.util.Vector;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-
-import org.apache.freemarker.core.Configuration;
-import org.apache.freemarker.core.Template;
-import org.apache.freemarker.core.TemplateException;
-import org.apache.freemarker.core.Version;
-import org.apache.freemarker.core._CoreAPI;
-import org.apache.freemarker.core.model.AdapterTemplateModel;
-import org.apache.freemarker.core.model.ObjectWrapper;
-import org.apache.freemarker.core.model.TemplateBooleanModel;
-import org.apache.freemarker.core.model.TemplateCollectionModel;
-import org.apache.freemarker.core.model.TemplateCollectionModelEx;
-import org.apache.freemarker.core.model.TemplateHashModel;
-import org.apache.freemarker.core.model.TemplateHashModelEx;
-import org.apache.freemarker.core.model.TemplateMethodModelEx;
-import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
-import org.apache.freemarker.core.model.TemplateModelIterator;
-import org.apache.freemarker.core.model.TemplateModelWithAPISupport;
-import org.apache.freemarker.core.model.TemplateNodeModel;
-import org.apache.freemarker.core.model.TemplateNumberModel;
-import org.apache.freemarker.core.model.TemplateScalarModel;
-import org.apache.freemarker.core.model.TemplateSequenceModel;
-import org.apache.freemarker.core.model.WrapperTemplateModel;
-import org.apache.freemarker.core.model.WrappingTemplateModel;
-import org.apache.freemarker.test.TestConfigurationBuilder;
-import org.junit.Test;
-import org.w3c.dom.Document;
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-
-public class DefaultObjectWrapperTest {
-
- private final static DefaultObjectWrapper OW = new DefaultObjectWrapper.Builder(Configuration.VERSION_3_0_0)
- .build();
-
- // This will make sense if we will have multipe incompatibleImprovement versions.
- @Test
- public void testIncompatibleImprovementsVersionBreakPoints() throws Exception {
- List<Version> expected = new ArrayList<>();
- expected.add(Configuration.VERSION_3_0_0);
-
- List<Version> actual = new ArrayList<>();
- int i = _CoreAPI.VERSION_INT_3_0_0;
- while (i <= Configuration.getVersion().intValue()) {
- int major = i / 1000000;
- int minor = i % 1000000 / 1000;
- int micro = i % 1000;
- final Version version = new Version(major, minor, micro);
-
- final Version normalizedVersion = DefaultObjectWrapper.normalizeIncompatibleImprovementsVersion(version);
- actual.add(normalizedVersion);
-
- final DefaultObjectWrapper.Builder builder = new DefaultObjectWrapper.Builder(version);
- assertEquals(normalizedVersion, builder.getIncompatibleImprovements());
- assertEquals(normalizedVersion, builder.build().getIncompatibleImprovements());
-
- i++;
- }
-
- assertEquals(expected, actual);
- }
-
- @Test
- public void testIncompatibleImprovementsVersionOutOfBounds() throws Exception {
- try {
- DefaultObjectWrapper.normalizeIncompatibleImprovementsVersion(new Version(2, 2, 0));
- fail();
- } catch (IllegalArgumentException e) {
- // expected
- }
-
- Version curVersion = Configuration.getVersion();
- final Version futureVersion = new Version(curVersion.getMajor(), curVersion.getMicro(),
- curVersion.getMicro() + 1);
- try {
- DefaultObjectWrapper.normalizeIncompatibleImprovementsVersion(futureVersion);
- fail();
- } catch (IllegalArgumentException e) {
- // expected
- }
- try {
- new DefaultObjectWrapper.Builder(futureVersion);
- fail();
- } catch (IllegalArgumentException e) {
- // expected
- }
- }
-
- @SuppressWarnings("boxing")
- @Test
- public void testBuilder() throws Exception {
- DefaultObjectWrapper.Builder builder = new DefaultObjectWrapper.Builder(Configuration.VERSION_3_0_0);
- DefaultObjectWrapper ow = builder.build();
- assertSame(ow, builder.build());
- assertSame(ow.getClass(), DefaultObjectWrapper.class);
- assertEquals(Configuration.VERSION_3_0_0, ow.getIncompatibleImprovements());
- }
-
- @Test
- public void testWrappedTypes() throws Exception {
- DefaultObjectWrapper.Builder builder = new DefaultObjectWrapper.Builder(Configuration.VERSION_3_0_0);
- DefaultObjectWrapper ow = builder.build();
-
- assertThat(ow.wrap(new HashMap()), instanceOf(DefaultMapAdapter.class));
- assertThat(ow.wrap(new ArrayList()), instanceOf(DefaultListAdapter.class));
- assertThat(ow.wrap(new String[] {}), instanceOf(DefaultArrayAdapter.class));
- assertThat(ow.wrap(new HashSet()), instanceOf(DefaultNonListCollectionAdapter.class));
- assertThat(ow.wrap(new PureIterable()), instanceOf(DefaultIterableAdapter.class));
- assertThat(ow.wrap(new Vector<>().iterator()), instanceOf(DefaultIteratorAdapter.class));
- assertThat(ow.wrap(new Vector<>().elements()), instanceOf(DefaultEnumerationAdapter.class));
- }
-
- @Test
- public void testConstructors() throws Exception {
- {
- DefaultObjectWrapper ow = new DefaultObjectWrapper.Builder(Configuration.VERSION_3_0_0)
- .usePrivateCaches(true).build();
- assertEquals(Configuration.VERSION_3_0_0, ow.getIncompatibleImprovements());
- }
-
- try {
- new DefaultObjectWrapper.Builder(new Version(99, 9, 9)).build();
- fail();
- } catch (IllegalArgumentException e) {
- assertThat(e.getMessage(), containsString("version"));
- }
- }
-
-
- @Test
- public void testCustomization() throws TemplateModelException {
- CustomizedDefaultObjectWrapper ow = new CustomizedDefaultObjectWrapper(Configuration.VERSION_3_0_0);
- assertEquals(Configuration.VERSION_3_0_0, ow.getIncompatibleImprovements());
-
- TemplateSequenceModel seq = (TemplateSequenceModel) ow.wrap(new Tupple(11, 22));
- assertEquals(2, seq.size());
- assertEquals(11, ow.unwrap(seq.get(0)));
- assertEquals(22, ow.unwrap(seq.get(1)));
-
- assertTrue(ow.wrap("x") instanceof SimpleScalar);
- assertTrue(ow.wrap(1.5) instanceof SimpleNumber);
- assertTrue(ow.wrap(new Date()) instanceof SimpleDate);
- assertEquals(TemplateBooleanModel.TRUE, ow.wrap(true));
-
- assertTrue(ow.wrap(Collections.emptyMap()) instanceof DefaultMapAdapter);
- assertTrue(ow.wrap(Collections.emptyList()) instanceof DefaultListAdapter);
- assertTrue(ow.wrap(new boolean[] { }) instanceof DefaultArrayAdapter);
- assertTrue(ow.wrap(new HashSet()) instanceof DefaultNonListCollectionAdapter);
- assertTrue(ow.wrap('c') instanceof TemplateScalarModel); // BeanAndStringModel right now, but should change later
-
- TemplateHashModel bean = (TemplateHashModel) ow.wrap(new TestBean());
- assertEquals(1, ow.unwrap(bean.get("x")));
- {
- // Check method calls, and also if the return value is wrapped with the overidden "wrap".
- final TemplateModel mr = (TemplateModel) ((TemplateMethodModelEx) bean.get("m")).exec(Collections.emptyList());
- assertEquals(
- Collections.singletonList(1),
- ow.unwrap(mr));
- assertTrue(DefaultListAdapter.class.isInstance(mr));
- }
- {
- // Check custom TM usage and round trip:
- final TemplateModel mr = (TemplateModel) ((TemplateMethodModelEx) bean.get("incTupple"))
- .exec(Collections.singletonList(ow.wrap(new Tupple<>(1, 2))));
- assertEquals(new Tupple<>(2, 3), ow.unwrap(mr));
- assertTrue(TuppleAdapter.class.isInstance(mr));
- }
- }
-
- @SuppressWarnings("boxing")
- @Test
- public void testCompositeValueWrapping() throws TemplateModelException, ClassNotFoundException {
- DefaultObjectWrapper ow = new DefaultObjectWrapper.Builder(Configuration.VERSION_3_0_0).build();
-
- final Map hashMap = new HashMap();
- inintTestMap(hashMap);
- final Map treeMap = new TreeMap();
- inintTestMap(treeMap);
- final Map linkedHashMap = new LinkedHashMap();
- inintTestMap(linkedHashMap);
- final Map gMap = ImmutableMap.<String, Object> of("a", 1, "b", 2, "c", 3);
- final LinkedList linkedList = new LinkedList();
- linkedList.add("a");
- linkedList.add("b");
- linkedList.add("c");
- final int[] intArray = new int[] { 1, 2, 3 };
- final String[] stringArray = new String[] { "a", "b", "c" };
- final PureIterable pureIterable = new PureIterable();
- final HashSet hashSet = new HashSet();
-
- assertRoundtrip(ow, linkedHashMap, DefaultMapAdapter.class, LinkedHashMap.class, linkedHashMap.toString());
- assertRoundtrip(ow, treeMap, DefaultMapAdapter.class, TreeMap.class, treeMap.toString());
- assertRoundtrip(ow, gMap, DefaultMapAdapter.class, ImmutableMap.class, gMap.toString());
- assertRoundtrip(ow, linkedList, DefaultListAdapter.class, LinkedList.class, linkedList.toString());
- assertRoundtrip(ow, intArray, DefaultArrayAdapter.class, int[].class, null);
- assertRoundtrip(ow, stringArray, DefaultArrayAdapter.class, String[].class, null);
- assertRoundtrip(ow, pureIterable, DefaultIterableAdapter.class, PureIterable.class, pureIterable.toString());
- assertRoundtrip(ow, hashSet, DefaultNonListCollectionAdapter.class, HashSet.class, hashSet.toString());
- }
-
- @SuppressWarnings("boxing")
- private void inintTestMap(Map map) {
- map.put("a", 1);
- map.put("b", 2);
- map.put("c", 3);
- }
-
- @SuppressWarnings("boxing")
- @Test
- public void testMapAdapter() throws TemplateModelException {
- HashMap<String, Object> testMap = new LinkedHashMap<>();
- testMap.put("a", 1);
- testMap.put("b", null);
- testMap.put("c", "C");
- testMap.put("d", Collections.singletonList("x"));
-
- {
- TemplateHashModelEx hash = (TemplateHashModelEx) OW.wrap(testMap);
- assertEquals(4, hash.size());
- assertFalse(hash.isEmpty());
- assertNull(hash.get("e"));
- assertEquals(1, ((TemplateNumberModel) hash.get("a")).getAsNumber());
- assertNull(hash.get("b"));
- assertEquals("C", ((TemplateScalarModel) hash.get("c")).getAsString());
- assertTrue(hash.get("d") instanceof DefaultListAdapter);
-
- assertCollectionTMEquals(hash.keys(), "a", "b", "c", "d");
- assertCollectionTMEquals(hash.values(), 1, null, "C", Collections.singletonList("x"));
-
- assertSizeThroughAPIModel(4, hash);
- }
-
- {
- assertTrue(((TemplateHashModel) OW.wrap(Collections.emptyMap())).isEmpty());
- }
- }
-
- private void assertCollectionTMEquals(TemplateCollectionModel coll, Object... expectedItems)
- throws TemplateModelException {
- for (int i = 0; i < 2; i++) { // Run twice to check if we always get a new iterator
- int idx = 0;
- TemplateModelIterator it2 = null;
- for (TemplateModelIterator it = coll.iterator(); it.hasNext(); ) {
- TemplateModel actualItem = it.next();
- if (idx >= expectedItems.length) {
- fail("Number of items is more than the expected " + expectedItems.length);
- }
- assertEquals(expectedItems[idx], OW.unwrap(actualItem));
- if (i == 1) {
- // In the 2nd round we also test with two iterators in parallel.
- // This 2nd iterator is also special in that its hasNext() is never called.
- if (it2 == null) {
- it2 = coll.iterator();
- }
- assertEquals(expectedItems[idx], OW.unwrap(it2.next()));
- }
- idx++;
- }
- if (expectedItems.length != idx) {
- fail("Number of items is " + idx + ", which is less than the expected " + expectedItems.length);
- }
- }
- }
-
- @SuppressWarnings("boxing")
- @Test
- public void testListAdapter() throws TemplateModelException {
- {
- List testList = new ArrayList<>();
- testList.add(1);
- testList.add(null);
- testList.add("c");
- testList.add(new String[] { "x" });
-
- TemplateSequenceModel seq = (TemplateSequenceModel) OW.wrap(testList);
- assertTrue(seq instanceof DefaultListAdapter);
- assertFalse(seq instanceof TemplateCollectionModel); // Maybe changes at 2.4.0
- assertEquals(4, seq.size());
- assertNull(seq.get(-1));
- assertEquals(1, ((TemplateNumberModel) seq.get(0)).getAsNumber());
- assertNull(seq.get(1));
- assertEquals("c", ((TemplateScalarModel) seq.get(2)).getAsString());
- assertTrue(seq.get(3) instanceof DefaultArrayAdapter);
- assertNull(seq.get(4));
-
- assertSizeThroughAPIModel(4, seq);
- }
-
- {
- List testList = new LinkedList<>();
- testList.add(1);
- testList.add(null);
- testList.add("c");
-
- TemplateSequenceModel seq = (TemplateSequenceModel) OW.wrap(testList);
- assertTrue(seq instanceof DefaultListAdapter);
- assertTrue(seq instanceof TemplateCollectionModel); // Maybe changes at 2.4.0
- assertEquals(3, seq.size());
- assertNull(seq.get(-1));
- assertEquals(1, ((TemplateNumberModel) seq.get(0)).getAsNumber());
- assertNull(seq.get(1));
- assertEquals("c", ((TemplateScalarModel) seq.get(2)).getAsString());
- assertNull(seq.get(3));
-
- assertCollectionTMEquals((TemplateCollectionModel) seq, 1, null, "c");
-
- TemplateModelIterator it = ((TemplateCollectionModel) seq).iterator();
- it.next();
- it.next();
- it.next();
- try {
- it.next();
- fail();
- } catch (TemplateModelException e) {
- assertThat(e.getMessage(), containsString("no more"));
- }
- }
- }
-
- @Test
- public void testArrayAdapterTypes() throws TemplateModelException {
- assertArrayAdapterClass("Object", OW.wrap(new Object[] {}));
- assertArrayAdapterClass("Object", OW.wrap(new String[] {}));
- assertArrayAdapterClass("byte", OW.wrap(new byte[] {}));
- assertArrayAdapterClass("short", OW.wrap(new short[] {}));
- assertArrayAdapterClass("int", OW.wrap(new int[] {}));
- assertArrayAdapterClass("long", OW.wrap(new long[] {}));
- assertArrayAdapterClass("float", OW.wrap(new float[] {}));
- assertArrayAdapterClass("double", OW.wrap(new double[] {}));
- assertArrayAdapterClass("boolean", OW.wrap(new boolean[] {}));
- assertArrayAdapterClass("char", OW.wrap(new char[] {}));
- }
-
- private void assertArrayAdapterClass(String adapterCompType, TemplateModel adaptedArray) {
- assertTrue(adaptedArray instanceof DefaultArrayAdapter);
- assertThat(adaptedArray.getClass().getName(),
- containsString("$" + adapterCompType.substring(0, 1).toUpperCase() + adapterCompType.substring(1)));
- }
-
- @SuppressWarnings("boxing")
- @Test
- public void testArrayAdapters() throws TemplateModelException {
- {
- final String[] testArray = new String[] { "a", null, "c" };
-
- TemplateSequenceModel seq = (TemplateSequenceModel) OW.wrap(testArray);
- assertEquals(3, seq.size());
- assertNull(seq.get(-1));
- assertEquals("a", ((TemplateScalarModel) seq.get(0)).getAsString());
- assertNull(seq.get(1));
- assertEquals("c", ((TemplateScalarModel) seq.get(2)).getAsString());
- assertNull(seq.get(3));
- }
-
- {
- final int[] testArray = new int[] { 11, 22 };
- TemplateSequenceModel seq = (TemplateSequenceModel) OW.wrap(testArray);
- assertEquals(2, seq.size());
- assertNull(seq.get(-1));
- assertEqualsAndSameClass(Integer.valueOf(11), ((TemplateNumberModel) seq.get(0)).getAsNumber());
- assertEqualsAndSameClass(Integer.valueOf(22), ((TemplateNumberModel) seq.get(1)).getAsNumber());
- assertNull(seq.get(2));
- }
-
- {
- final double[] testArray = new double[] { 11, 22 };
- TemplateSequenceModel seq = (TemplateSequenceModel) OW.wrap(testArray);
- assertEquals(2, seq.size());
- assertNull(seq.get(-1));
- assertEqualsAndSameClass(Double.valueOf(11), ((TemplateNumberModel) seq.get(0)).getAsNumber());
- assertEqualsAndSameClass(Double.valueOf(22), ((TemplateNumberModel) seq.get(1)).getAsNumber());
- assertNull(seq.get(2));
- }
-
- {
- final boolean[] testArray = new boolean[] { true, false };
- TemplateSequenceModel seq = (TemplateSequenceModel) OW.wrap(testArray);
- assertEquals(2, seq.size());
- assertNull(seq.get(-1));
- assertEqualsAndSameClass(Boolean.valueOf(true), ((TemplateBooleanModel) seq.get(0)).getAsBoolean());
- assertEqualsAndSameClass(Boolean.valueOf(false), ((TemplateBooleanModel) seq.get(1)).getAsBoolean());
- assertNull(seq.get(2));
- }
-
- {
- final char[] testArray = new char[] { 'a', 'b' };
- TemplateSequenceModel seq = (TemplateSequenceModel) OW.wrap(testArray);
- assertEquals(2, seq.size());
- assertNull(seq.get(-1));
- assertEquals("a", ((TemplateScalarModel) seq.get(0)).getAsString());
- assertEquals("b", ((TemplateScalarModel) seq.get(1)).getAsString());
- assertNull(seq.get(2));
- }
- }
-
- private void assertEqualsAndSameClass(Object expected, Object actual) {
- assertEquals(expected, actual);
- if (expected != null) {
- assertEquals(expected.getClass(), actual.getClass());
- }
- }
-
- private void assertRoundtrip(DefaultObjectWrapper dow, Object obj, Class expectedTMClass,
- Class expectedPojoClass,
- String expectedPojoToString)
- throws TemplateModelException {
- final TemplateModel objTM = dow.wrap(obj);
- assertThat(objTM.getClass(), typeCompatibleWith(expectedTMClass));
-
- final TemplateHashModel testBeanTM = (TemplateHashModel) dow.wrap(new RoundtripTesterBean());
-
- {
- TemplateMethodModelEx getClassM = (TemplateMethodModelEx) testBeanTM.get("getClass");
- Object r = getClassM.exec(Collections.singletonList(objTM));
- final Class rClass = (Class) ((WrapperTemplateModel) r).getWrappedObject();
- assertThat(rClass, typeCompatibleWith(expectedPojoClass));
- }
-
- if (expectedPojoToString != null) {
- TemplateMethodModelEx getToStringM = (TemplateMethodModelEx) testBeanTM.get("toString");
- Object r = getToStringM.exec(Collections.singletonList(objTM));
- assertEquals(expectedPojoToString, ((TemplateScalarModel) r).getAsString());
- }
- }
-
- @SuppressWarnings("boxing")
- @Test
- public void testCollectionAdapterBasics() throws TemplateModelException {
- {
- Set set = new TreeSet();
- set.add("a");
- set.add("b");
- set.add("c");
- TemplateCollectionModelEx coll = (TemplateCollectionModelEx) OW.wrap(set);
- assertTrue(coll instanceof DefaultNonListCollectionAdapter);
- assertEquals(3, coll.size());
- assertFalse(coll.isEmpty());
- assertCollectionTMEquals(coll, "a", "b", "c");
-
- assertRoundtrip(OW, set, DefaultNonListCollectionAdapter.class, TreeSet.class, "[a, b, c]");
-
- assertSizeThroughAPIModel(3, coll);
- }
-
- {
- Set set = new HashSet();
- final List<String> list = Collections.singletonList("b");
- set.add(list);
- set.add(null);
- TemplateCollectionModelEx coll = (TemplateCollectionModelEx) OW.wrap(set);
- TemplateModelIterator it = coll.iterator();
- final TemplateModel tm1 = it.next();
- Object obj1 = OW.unwrap(tm1);
- final TemplateModel tm2 = it.next();
- Object obj2 = OW.unwrap(tm2);
- assertTrue(obj1 == null || obj2 == null);
- assertTrue(obj1 != null && obj1.equals(list) || obj2 != null && obj2.equals(list));
- assertTrue(tm1 instanceof DefaultListAdapter || tm2 instanceof DefaultListAdapter);
-
- assertRoundtrip(OW, set, DefaultNonListCollectionAdapter.class, HashSet.class, "[" + obj1 + ", "
- + obj2 + "]");
- }
- }
-
- @SuppressWarnings("boxing")
- @Test
- public void testCollectionAdapterOutOfBounds() throws TemplateModelException {
- Set set = Collections.singleton(123);
-
- TemplateCollectionModelEx coll = (TemplateCollectionModelEx) OW.wrap(set);
- TemplateModelIterator it = coll.iterator();
-
- for (int i = 0; i < 3; i++) {
- assertTrue(it.hasNext());
- }
-
- assertEquals(123, OW.unwrap(it.next()));
-
- for (int i = 0; i < 3; i++) {
- assertFalse(it.hasNext());
- try {
- it.next();
- fail();
- } catch (TemplateModelException e) {
- assertThat(e.getMessage(), containsStringIgnoringCase("no more"));
- }
- }
- }
-
- @Test
- public void testCollectionAdapterAndNulls() throws TemplateModelException {
- Set set = new HashSet();
- set.add(null);
-
- TemplateCollectionModelEx coll = (TemplateCollectionModelEx) OW.wrap(set);
- assertEquals(1, coll.size());
- assertFalse(coll.isEmpty());
- assertNull(coll.iterator().next());
- }
-
- @Test
- public void testIteratorWrapping() throws TemplateModelException, ClassNotFoundException {
- final List<String> list = ImmutableList.of("a", "b", "c");
- Iterator<String> it = list.iterator();
- TemplateCollectionModel coll = (TemplateCollectionModel) OW.wrap(it);
-
- assertRoundtrip(OW, coll, DefaultIteratorAdapter.class, Iterator.class, null);
-
- TemplateModelIterator itIt = coll.iterator();
- TemplateModelIterator itIt2 = coll.iterator(); // used later
- assertTrue(itIt.hasNext());
- assertEquals("a", OW.unwrap(itIt.next()));
- assertTrue(itIt.hasNext());
- assertEquals("b", OW.unwrap(itIt.next()));
- assertTrue(itIt.hasNext());
- assertEquals("c", OW.unwrap(itIt.next()));
- assertFalse(itIt.hasNext());
- try {
- itIt.next();
- fail();
- } catch (TemplateModelException e) {
- assertThat(e.getMessage(), containsStringIgnoringCase("no more"));
- }
-
- try {
- itIt2.hasNext();
- fail();
- } catch (TemplateModelException e) {
- assertThat(e.getMessage(), containsString("can be listed only once"));
- }
-
- TemplateModelIterator itIt3 = coll.iterator();
- try {
- itIt3.hasNext();
- fail();
- } catch (TemplateModelException e) {
- assertThat(e.getMessage(), containsString("can be listed only once"));
- }
- }
-
- @Test
- public void testIteratorApiSupport() throws TemplateModelException {
- TemplateModel wrappedIterator = OW.wrap(Collections.emptyIterator());
- assertThat(wrappedIterator, instanceOf(DefaultIteratorAdapter.class));
- DefaultIteratorAdapter iteratorAdapter = (DefaultIteratorAdapter) wrappedIterator;
-
- TemplateHashModel api = (TemplateHashModel) iteratorAdapter.getAPI();
- assertFalse(((TemplateBooleanModel) ((TemplateMethodModelEx)
- api.get("hasNext")).exec(Collections.emptyList())).getAsBoolean());
- }
-
- @SuppressWarnings("boxing")
- @Test
- public void testCharKeyFallback() throws TemplateModelException {
- Map hashMapS = new HashMap<>();
- hashMapS.put("a", 1);
- Map sortedMapS = new TreeMap<>();
- sortedMapS.put("a", 1);
- Map hashMapC = new HashMap<>();
- hashMapC.put('a', 1);
- Map sortedMapC = new TreeMap<>();
- sortedMapC.put('a', 1);
-
- assertEquals(1, OW.unwrap(((TemplateHashModel) OW.wrap(hashMapS)).get("a")));
- assertEquals(1, OW.unwrap(((TemplateHashModel) OW.wrap(hashMapC)).get("a")));
- assertEquals(1, OW.unwrap(((TemplateHashModel) OW.wrap(sortedMapS)).get("a")));
- try {
- ((TemplateHashModel) OW.wrap(sortedMapC)).get("a");
- } catch (TemplateModelException e) {
- assertThat(e.getMessage(), containsStringIgnoringCase("String key"));
- }
-
- assertNull(((TemplateHashModel) OW.wrap(hashMapS)).get("b"));
- assertNull(((TemplateHashModel) OW.wrap(hashMapC)).get("b"));
- assertNull(((TemplateHashModel) OW.wrap(sortedMapS)).get("b"));
- try {
- ((TemplateHashModel) OW.wrap(sortedMapC)).get("b");
- } catch (TemplateModelException e) {
- assertThat(e.getMessage(), containsStringIgnoringCase("String key"));
- }
- }
-
- @Test
- public void testIterableSupport() throws TemplateException, IOException {
- Iterable<String> iterable = new PureIterable();
-
- String listingFTL = "<#list value as x>${x}<#sep>, </#list>";
-
- DefaultObjectWrapper ow = OW;
- TemplateModel tm = ow.wrap(iterable);
- assertThat(tm, instanceOf(TemplateCollectionModel.class));
- TemplateCollectionModel iterableTM = (TemplateCollectionModel) tm;
-
- for (int i = 0; i < 2; i++) {
- TemplateModelIterator iteratorTM = iterableTM.iterator();
- assertTrue(iteratorTM.hasNext());
- assertEquals("a", ow.unwrap(iteratorTM.next()));
- assertTrue(iteratorTM.hasNext());
- assertEquals("b", ow.unwrap(iteratorTM.next()));
- assertTrue(iteratorTM.hasNext());
- assertEquals("c", ow.unwrap(iteratorTM.next()));
- assertFalse(iteratorTM.hasNext());
- try {
- iteratorTM.next();
- fail();
- } catch (TemplateModelException e) {
- assertThat(e.getMessage(), containsStringIgnoringCase("no more"));
- }
- }
-
- assertTemplateOutput(OW, iterable, listingFTL, "a, b, c");
- }
-
- @Test
- public void testEnumerationAdapter() throws TemplateModelException {
- Vector<String> vector = new Vector<String>();
- vector.add("a");
- vector.add("b");
-
- TemplateModel wrappedEnumeration = OW.wrap(vector.elements());
- assertThat(wrappedEnumeration, instanceOf(DefaultEnumerationAdapter.class));
- DefaultEnumerationAdapter enumAdapter = (DefaultEnumerationAdapter) wrappedEnumeration;
- TemplateModelIterator iterator = enumAdapter.iterator();
- assertTrue(iterator.hasNext());
- assertEquals("a", ((TemplateScalarModel) iterator.next()).getAsString());
- assertTrue(iterator.hasNext());
- assertEquals("b", ((TemplateScalarModel) iterator.next()).getAsString());
- assertFalse(iterator.hasNext());
-
- iterator = enumAdapter.iterator();
- try {
- iterator.hasNext();
- } catch (TemplateException e) {
- assertThat(e.getMessage(), containsStringIgnoringCase("only once"));
- }
-
- TemplateHashModel api = (TemplateHashModel) enumAdapter.getAPI();
- assertFalse(((TemplateBooleanModel) ((TemplateMethodModelEx)
- api.get("hasMoreElements")).exec(Collections.emptyList())).getAsBoolean());
- }
-
- @Test
- public void assertCanWrapDOM() throws SAXException, IOException, ParserConfigurationException,
- TemplateModelException {
- DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
- InputSource is = new InputSource();
- is.setCharacterStream(new StringReader("<doc><sub a='1' /></doc>"));
- Document doc = db.parse(is);
- assertTrue(OW.wrap(doc) instanceof TemplateNodeModel);
- }
-
- @Test
- public void testExposureLevel() throws Exception {
- TestBean bean = new TestBean();
-
- {
- TemplateHashModel tm = wrapWithExposureLevel(bean, DefaultObjectWrapper.EXPOSE_SAFE);
- assertNotNull(tm.get("hashCode"));
- assertNotNull(tm.get("class"));
- }
-
- {
- TemplateHashModel tm = wrapWithExposureLevel(bean, DefaultObjectWrapper.EXPOSE_PROPERTIES_ONLY);
- assertNull(tm.get("hashCode"));
- assertNotNull(tm.get("class"));
- }
-
- {
- TemplateHashModel tm = wrapWithExposureLevel(bean, DefaultObjectWrapper.EXPOSE_NOTHING);
- assertNull(tm.get("hashCode"));
- assertNull(tm.get("class"));
- }
-
- {
- TemplateHashModel tm = wrapWithExposureLevel(bean, DefaultObjectWrapper.EXPOSE_ALL);
- assertNotNull(tm.get("hashCode"));
- assertNotNull(tm.get("class"));
- }
- }
-
- private TemplateHashModel wrapWithExposureLevel(Object bean, int exposureLevel) throws TemplateModelException {
- return (TemplateHashModel) new DefaultObjectWrapper.Builder(Configuration.VERSION_3_0_0)
- .exposureLevel(exposureLevel).build()
- .wrap(bean);
- }
-
- private void assertSizeThroughAPIModel(int expectedSize, TemplateModel normalModel) throws TemplateModelException {
- if (!(normalModel instanceof TemplateModelWithAPISupport)) {
- fail();
- }
- TemplateHashModel apiModel = (TemplateHashModel) ((TemplateModelWithAPISupport) normalModel).getAPI();
- TemplateMethodModelEx sizeMethod = (TemplateMethodModelEx) apiModel.get("size");
- TemplateNumberModel r = (TemplateNumberModel) sizeMethod.exec(Collections.emptyList());
- assertEquals(expectedSize, r.getAsNumber().intValue());
- }
-
- private void assertTemplateOutput(ObjectWrapper objectWrapper, Object value, String ftl, String expectedOutput)
- throws TemplateException, IOException {
- assertEquals(expectedOutput, processTemplate(objectWrapper, value, ftl));
- }
-
- private void assertTemplateFails(ObjectWrapper objectWrapper, Object value, String ftl, String expectedMessagePart)
- throws TemplateException, IOException {
- try {
- processTemplate(objectWrapper, value, ftl);
- fail();
- } catch (TemplateException e) {
- assertThat(e.getMessage(), containsString(expectedMessagePart));
- }
- }
-
- private String processTemplate(ObjectWrapper objectWrapper, Object value, String ftl)
- throws TemplateException, IOException {
- Configuration cfg = new TestConfigurationBuilder()
- .logTemplateExceptions(false)
- .objectWrapper(objectWrapper)
- .build();
- StringWriter out = new StringWriter();
- new Template(null, ftl, cfg).process(ImmutableMap.of("value", value), out);
- return out.toString();
- }
-
- private static final class PureIterable implements Iterable<String> {
- @Override
- public Iterator<String> iterator() {
- return ImmutableList.of("a", "b", "c").iterator();
- }
- }
-
- public static class RoundtripTesterBean {
-
- public Class getClass(Object o) {
- return o.getClass();
- }
-
- public String toString(Object o) {
- return o.toString();
- }
-
- }
-
- private static class Tupple<E1, E2> {
-
- private final E1 e1;
- private final E2 e2;
-
- public Tupple(E1 e1, E2 e2) {
- if (e1 == null || e2 == null) throw new NullPointerException();
- this.e1 = e1;
- this.e2 = e2;
- }
-
- public E1 getE1() {
- return e1;
- }
-
- public E2 getE2() {
- return e2;
- }
-
- @Override
- public int hashCode() {
- final int prime = 31;
- int result = 1;
- result = prime * result + ((e1 == null) ? 0 : e1.hashCode());
- result = prime * result + ((e2 == null) ? 0 : e2.hashCode());
- return result;
- }
-
- @Override
- public boolean equals(Object obj) {
- if (this == obj) return true;
- if (obj == null) return false;
- if (getClass() != obj.getClass()) return false;
- Tupple other = (Tupple) obj;
- if (e1 == null) {
- if (other.e1 != null) return false;
- } else if (!e1.equals(other.e1)) return false;
- if (e2 == null) {
- if (other.e2 != null) return false;
- } else if (!e2.equals(other.e2)) return false;
- return true;
- }
-
- }
-
- @SuppressWarnings("boxing")
- public static class TestBean {
-
- public int getX() {
- return 1;
- }
-
- public List<Integer> m() {
- return Collections.singletonList(1);
- }
-
- public Tupple incTupple(Tupple<Integer, Integer> tupple) {
- return new Tupple(tupple.e1 + 1, tupple.e2 + 1);
- }
-
- }
-
- private static class CustomizedDefaultObjectWrapper extends DefaultObjectWrapper {
-
- private CustomizedDefaultObjectWrapper(Version incompatibleImprovements) {
- super(new DefaultObjectWrapper.Builder(incompatibleImprovements), true);
- }
-
- @Override
- protected TemplateModel handleNonBasicTypes(final Object obj) throws TemplateModelException {
- if (obj instanceof Tupple) {
- return new TuppleAdapter((Tupple<?, ?>) obj, this);
- }
-
- return super.handleNonBasicTypes(obj);
- }
-
- }
-
- private static class TuppleAdapter extends WrappingTemplateModel implements TemplateSequenceModel,
- AdapterTemplateModel {
-
- private final Tupple<?, ?> tupple;
-
- public TuppleAdapter(Tupple<?, ?> tupple, ObjectWrapper ow) {
- super(ow);
- this.tupple = tupple;
- }
-
- @Override
- public int size() throws TemplateModelException {
- return 2;
- }
-
- @Override
- public TemplateModel get(int index) throws TemplateModelException {
- switch (index) {
- case 0: return wrap(tupple.getE1());
- case 1: return wrap(tupple.getE2());
- default: return null;
- }
- }
-
- @Override
- public Object getAdaptedObject(Class hint) {
- return tupple;
- }
-
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/28a276c8/freemarker-core/src/test/java/org/apache/freemarker/core/model/impl/EnumModelsTest.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/test/java/org/apache/freemarker/core/model/impl/EnumModelsTest.java b/freemarker-core/src/test/java/org/apache/freemarker/core/model/impl/EnumModelsTest.java
deleted file mode 100644
index fc19bb7..0000000
--- a/freemarker-core/src/test/java/org/apache/freemarker/core/model/impl/EnumModelsTest.java
+++ /dev/null
@@ -1,85 +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.model.impl;
-
-import static org.junit.Assert.*;
-
-import java.util.ArrayList;
-
-import org.apache.freemarker.core.Configuration;
-import org.apache.freemarker.core.model.TemplateHashModel;
-import org.apache.freemarker.core.model.TemplateMethodModelEx;
-import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
-import org.apache.freemarker.core.model.TemplateScalarModel;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-@RunWith(JUnit4.class)
-public class EnumModelsTest {
-
- @Test
- public void modelCaching() throws Exception {
- DefaultObjectWrapper ow = new DefaultObjectWrapper.Builder(Configuration.VERSION_3_0_0).usePrivateCaches(true)
- .build();
- TemplateHashModel enums = ow.getEnumModels();
- TemplateHashModel e = (TemplateHashModel) enums.get(E.class.getName());
- assertNotNull(e);
- assertNotNull(e.get("A"));
- assertNotNull(e.get("B"));
- assertNull(e.get("C"));
-
- try {
- enums.get("no.such.ClassExists");
- fail();
- } catch (TemplateModelException ex) {
- assertTrue(ex.getCause() instanceof ClassNotFoundException);
- }
-
- TemplateModel a = e.get("A");
- assertTrue(a instanceof TemplateScalarModel);
- assertTrue(a instanceof TemplateHashModel);
- assertEquals(((TemplateScalarModel) a).getAsString(), "ts:A");
- TemplateMethodModelEx nameMethod = (TemplateMethodModelEx) ((TemplateHashModel) a).get("name");
- assertEquals(((TemplateScalarModel) nameMethod.exec(new ArrayList())).getAsString(), "A");
-
- assertSame(e, enums.get(E.class.getName()));
-
- ow.clearClassIntrospecitonCache();
- TemplateHashModel eAfterClean = (TemplateHashModel) enums.get(E.class.getName());
- assertNotSame(e, eAfterClean);
- assertSame(eAfterClean, enums.get(E.class.getName()));
- assertNotNull(eAfterClean.get("A"));
- assertNotNull(eAfterClean.get("B"));
- assertNull(eAfterClean.get("C"));
- }
-
- public enum E {
- A, B;
-
- @Override
- public String toString() {
- return "ts:" + super.toString();
- }
-
- }
-
-}