blob: 1c5757104d8d7ba6f96896b299eee6728c5daf8d [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.jupiter.api.Assertions.assertEquals;
import org.apache.commons.collections4.MultiSet;
import org.apache.commons.collections4.multiset.HashMultiSet;
import org.apache.wicket.application.IOnComponentTagListener;
import org.apache.wicket.markup.ComponentTag;
import org.apache.wicket.markup.IMarkupResourceStreamProvider;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.util.resource.IResourceStream;
import org.apache.wicket.util.resource.StringResourceStream;
import org.apache.wicket.util.tester.WicketTestCase;
import org.junit.jupiter.api.Test;
/**
* Tests {@link IOnComponentTagListener}
*
* @author Igor Vaynberg (ivaynberg)
*/
class OnComponentTagListenerTest extends WicketTestCase {
@Test
void multipleListeners() {
TestListener listener1 = new TestListener();
TestListener listener2 = new TestListener();
tester.getApplication().getOnComponentTagListeners().add(listener1);
tester.getApplication().getOnComponentTagListeners().add(listener2);
TestPage page = new TestPage();
tester.startPage(page);
assertEquals(1, listener1.components.getCount("c1"));
assertEquals(1, listener1.components.getCount("c2"));
assertEquals(1, listener1.components.getCount("c3"));
assertEquals(1, listener2.components.getCount("c1"));
assertEquals(1, listener2.components.getCount("c2"));
assertEquals(1, listener2.components.getCount("c3"));
}
@Test
void visibility() {
TestListener listener = new TestListener();
tester.getApplication().getOnComponentTagListeners().add(listener);
TestPage page = new TestPage();
page.c1.setVisible(false);
tester.startPage(page);
assertEquals(0, listener.components.getCount("c1"));
assertEquals(0, listener.components.getCount("c2"));
assertEquals(1, listener.components.getCount("c3"));
}
@Test
void calledEvenIfNoSuper() {
class DoesntCallSuper extends WebMarkupContainer {
private DoesntCallSuper(String id) {
super(id);
}
@Override
protected void onComponentTag(ComponentTag tag) {
// missing call to super on purpose
}
}
TestListener listener = new TestListener();
tester.getApplication().getOnComponentTagListeners().add(listener);
TestPage page = new TestPage();
page.c3 = new DoesntCallSuper(page.c3.getId());
page.replace(page.c3);
tester.startPage(page);
assertEquals(1, listener.components.getCount("c1"));
assertEquals(1, listener.components.getCount("c2"));
assertEquals(1, listener.components.getCount("c3"));
}
static class TestPage extends WebPage implements IMarkupResourceStreamProvider {
private static final long serialVersionUID = 1L;
private WebMarkupContainer c1, c2, c3;
TestPage() {
c1 = new WebMarkupContainer("c1");
c2 = new WebMarkupContainer("c2");
c3 = new WebMarkupContainer("c3");
add(c1, c3);
c1.add(c2);
}
@Override
public IResourceStream getMarkupResourceStream(MarkupContainer container,
Class<?> containerClass) {
return new StringResourceStream("<html><body><div wicket:id='c1'><div wicket:id='c2'></div></div><div wicket:id='c3'></div></body></html>");
}
}
private static class TestListener implements IOnComponentTagListener {
private MultiSet<String> components = new HashMultiSet<>();
@Override
public void onComponentTag(Component component, ComponentTag tag) {
components.add(component.getId());
}
}
}