/* * 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.wicket; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.WebPage; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.util.tester.WicketTesterScope; import org.junit.Rule; import org.junit.Test; public class OnReAddTest { @Rule public WicketTesterScope scope = new WicketTesterScope(); private boolean onReAddCalled = false; private boolean onInitializeCalled = false; @Test public void onFirstAddInitializeIsCalled() { Page page = createPage(); page.internalInitialize(); page.add(createUninitializedProbe()); assertFalse(onReAddCalled); assertTrue(onInitializeCalled); } @Test public void nothingIsCalledWithoutConnectionToPage() { MarkupContainer container = createContainer(); container.internalInitialize(); container.add(createUninitializedProbe()); assertFalse(onReAddCalled); assertFalse(onInitializeCalled); } @Test public void uninitializedComponentIsInitializedOnConnectionToPage() { // "old", initialized container + "new" uninitialized component: // oninitialize should be called on the component when the container // is added to the page, not before. MarkupContainer container = createContainer(); container.internalInitialize(); container.add(createUninitializedProbe()); assertFalse(onReAddCalled); assertFalse(onInitializeCalled); WebPage page = createPage(); page.internalInitialize(); page.add(container); assertFalse(onReAddCalled); assertTrue(onInitializeCalled); } @Test public void onReAddIsOnlyCalledAfterRemove() { Page page = createPage(); page.internalInitialize(); Component probe = createUninitializedProbe(); page.add(probe); assertFalse(onReAddCalled); assertTrue(onInitializeCalled); onInitializeCalled = false; page.internalInitialize(); assertFalse(onReAddCalled); assertFalse(onInitializeCalled); page.remove(probe); assertFalse(onReAddCalled); assertFalse(onInitializeCalled); page.add(probe); assertTrue(onReAddCalled); assertFalse(onInitializeCalled); } @Test public void initializeIsCalledOnFirstAdd_OnReAddIsCalledAfterEachRemoveAndAdd() { Page page = createPage(); page.internalInitialize(); Component probe = createUninitializedProbe(); page.add(probe); assertFalse(onReAddCalled); assertTrue(onInitializeCalled); onInitializeCalled = false; page.internalInitialize(); assertFalse(onReAddCalled); assertFalse(onInitializeCalled); page.remove(probe); assertFalse(onReAddCalled); assertFalse(onInitializeCalled); page.add(probe); assertTrue(onReAddCalled); assertFalse(onInitializeCalled); onReAddCalled = false; page.internalInitialize(); // just another initialize run shouldn't call onReAdd nor onInitialize. onReAdd should only be called // after remove and add assertFalse(onReAddCalled); assertFalse(onInitializeCalled); page.remove(probe); page.add(probe); assertTrue(onReAddCalled); assertFalse(onInitializeCalled); } @Test public void onReAddRecursesToChildrenLikeOnInitialize() { Page page = createPage(); page.internalInitialize(); Component probe = createNestedProbe(); page.add(probe); assertFalse(onReAddCalled); assertTrue(onInitializeCalled); onInitializeCalled = false; probe.remove(); assertFalse(onInitializeCalled); assertFalse(onReAddCalled); page.add(probe); assertFalse(onInitializeCalled); assertTrue(onReAddCalled); } @Test public void onReAddEnforcesSuperCall() { Page page = createPage(); page.internalInitialize(); Label brokenProbe = new Label("foo") { @Override protected void onReAdd() { ; // I should call super, but since I don't, this should throw an exception } }; brokenProbe.internalInitialize(); page.add(brokenProbe); page.remove(brokenProbe); try { page.add(brokenProbe); fail("should have thrown exception"); } catch (IllegalStateException e) { assertTrue(e.getMessage().contains("super.onReAdd")); } } private Component createUninitializedProbe() { return new Label("foo") { @Override protected void onReAdd() { super.onReAdd(); onReAddCalled = true; } @Override protected void onInitialize() { super.onInitialize(); onInitializeCalled = true; } }; } private Component createInitializedProbe() { Component probe = createUninitializedProbe(); probe.internalInitialize(); return probe; } private WebPage createPage() { return new WebPage() { }; } private Component createNestedProbe() { return createContainer().add(createUninitializedProbe()); } private MarkupContainer createContainer() { return new WebMarkupContainer("bar"); } }