blob: be664cc31473bd946effe57ccfae7c097708aadf [file] [log] [blame]
/*
* 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");
}
}