Return-Path: X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183]) by cust-asf2.ponee.io (Postfix) with ESMTP id 39114200C67 for ; Mon, 15 May 2017 23:23:36 +0200 (CEST) Received: by cust-asf.ponee.io (Postfix) id 378BE160BD4; Mon, 15 May 2017 21:23:36 +0000 (UTC) Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by cust-asf.ponee.io (Postfix) with SMTP id B1C62160BA9 for ; Mon, 15 May 2017 23:23:33 +0200 (CEST) Received: (qmail 76496 invoked by uid 500); 15 May 2017 21:23:32 -0000 Mailing-List: contact notifications-help@freemarker.incubator.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@freemarker.incubator.apache.org Delivered-To: mailing list notifications@freemarker.incubator.apache.org Received: (qmail 76486 invoked by uid 99); 15 May 2017 21:23:32 -0000 Received: from pnap-us-west-generic-nat.apache.org (HELO spamd1-us-west.apache.org) (209.188.14.142) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 15 May 2017 21:23:32 +0000 Received: from localhost (localhost [127.0.0.1]) by spamd1-us-west.apache.org (ASF Mail Server at spamd1-us-west.apache.org) with ESMTP id 6801CC06D1 for ; Mon, 15 May 2017 21:23:32 +0000 (UTC) X-Virus-Scanned: Debian amavisd-new at spamd1-us-west.apache.org X-Spam-Flag: NO X-Spam-Score: -4.222 X-Spam-Level: X-Spam-Status: No, score=-4.222 tagged_above=-999 required=6.31 tests=[KAM_ASCII_DIVIDERS=0.8, RCVD_IN_DNSWL_HI=-5, RCVD_IN_MSPIKE_H3=-0.01, RCVD_IN_MSPIKE_WL=-0.01, RP_MATCHES_RCVD=-0.001, SPF_PASS=-0.001] autolearn=disabled Received: from mx1-lw-us.apache.org ([10.40.0.8]) by localhost (spamd1-us-west.apache.org [10.40.0.7]) (amavisd-new, port 10024) with ESMTP id uLY23_97FjrW for ; Mon, 15 May 2017 21:23:28 +0000 (UTC) Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by mx1-lw-us.apache.org (ASF Mail Server at mx1-lw-us.apache.org) with SMTP id 227C85F613 for ; Mon, 15 May 2017 21:23:19 +0000 (UTC) Received: (qmail 75925 invoked by uid 99); 15 May 2017 21:23:18 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 15 May 2017 21:23:18 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id 606A5E00EF; Mon, 15 May 2017 21:23:18 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: ddekany@apache.org To: notifications@freemarker.incubator.apache.org Date: Mon, 15 May 2017 21:23:31 -0000 Message-Id: <1f0d820079dd40658d6bc2a44811456d@git.apache.org> In-Reply-To: <4bfc87c4667d4f69a855365b7369a594@git.apache.org> References: <4bfc87c4667d4f69a855365b7369a594@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: [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 archived-at: Mon, 15 May 2017 21:23:36 -0000 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 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 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 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 expected = new ArrayList<>(); - expected.add(Configuration.VERSION_3_0_0); - - List 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. 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 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 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 list = ImmutableList.of("a", "b", "c"); - Iterator 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 iterable = new PureIterable(); - - String listingFTL = "<#list value as x>${x}<#sep>, "; - - 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 vector = new Vector(); - 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("")); - 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 { - @Override - public Iterator 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 { - - 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 m() { - return Collections.singletonList(1); - } - - public Tupple incTupple(Tupple 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(); - } - - } - -}