/* * 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.behavior; import java.util.List; import org.apache.wicket.AttributeModifier; import org.apache.wicket.Component; import org.apache.wicket.IRequestListener; import org.apache.wicket.MarkupContainer; 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.request.mapper.parameter.PageParameters; import org.apache.wicket.util.resource.IResourceStream; import org.apache.wicket.util.resource.StringResourceStream; import org.apache.wicket.util.tester.WicketTestCase; import org.junit.Test; /** IBehavior array management tests */ public class ImmutableBehaviorIdsTest extends WicketTestCase { /** Tests simple behavior */ @Test public void simple() { MyPage page = new MyPage(); page.getContainer().add(new AttributeModifier("class", "border")); tester.startPage(page); assertTrue(tester.getLastResponseAsString().contains("class=\"border\"")); } /** * Tests the fact that url-behavior indexes do not change even if behaviors are removed/added */ @Test public void urlIndexRendering() { Behavior border = new AttributeModifier("class", "border"); Behavior border2 = new AttributeModifier("class2", "border"); Behavior auto = new AttributeModifier("autocomplete", "off"); Behavior auto2 = new AttributeModifier("autocomplete2", "off"); Behavior link = new LinkBehavior("href"); Behavior link2 = new LinkBehavior("onclick"); MyPage page = new MyPage(); page.getContainer().add(border, auto, link, border2, link2, auto2); tester.startPage(page); String output = tester.getLastResponseAsString(); // System.out.println(output); assertTrue(output.contains("class=\"border\"")); assertTrue(output.contains("autocomplete=\"off\"")); assertTrue(output.contains("class2=\"border\"")); assertTrue(output.contains("autocomplete2=\"off\"")); assertTrue(output.contains(".0")); assertTrue(output.contains(".1")); assertEquals(link, page.getContainer().getBehaviorById(0)); assertEquals(link2, page.getContainer().getBehaviorById(1)); // if we remove a behavior that is before the ibehaviorlistener its url index should not // change page.getContainer().remove(border); page.getContainer().remove(border2); page.getContainer().remove(auto); page.getContainer().remove(auto2); tester.startPage(page); output = tester.getLastResponseAsString(); // System.out.println(output); assertTrue(output.contains(".0")); assertTrue(output.contains(".1")); assertEquals(link, page.getContainer().getBehaviorById(0)); assertEquals(link2, page.getContainer().getBehaviorById(1)); } /** * Tests that removal of behaviors properly cleans up the data array */ @Test public void behaviorDataArrayCleanup() { Behavior border = new AttributeModifier("class", "border"); Behavior border2 = new AttributeModifier("class2", "border"); Behavior auto = new AttributeModifier("autocomplete", "off"); Behavior auto2 = new AttributeModifier("autocomplete2", "off"); Behavior link = new LinkBehavior("href"); Behavior link2 = new LinkBehavior("onclick"); MyPage page = new MyPage(); page.getContainer().add(border, auto, link, border2, link2, auto2); int borderId = page.container.getBehaviorId(border); int border2Id = page.container.getBehaviorId(border2); int autoId = page.container.getBehaviorId(auto); int auto2Id = page.container.getBehaviorId(auto2); int linkId = page.container.getBehaviorId(link); int link2Id = page.container.getBehaviorId(link2); List<? extends Behavior> behaviors = page.getContainer().getBehaviors(); assertEquals(6, behaviors.size()); // test removal of various behaviors and make sure they preserve indexes as long as there is // a IBehaviorListener in the list // border,auto,link,border2,link2,auto2 page.getContainer().remove(border); behaviors = page.getContainer().getBehaviors(); assertEquals(5, behaviors.size()); assertEquals(autoId, page.container.getBehaviorId(auto)); assertEquals(link2Id, page.container.getBehaviorId(link2)); // auto,link,border2,link2,auto2 page.getContainer().remove(link); behaviors = page.getContainer().getBehaviors(); assertEquals(4, behaviors.size()); assertEquals(autoId, page.container.getBehaviorId(auto)); assertEquals(link2Id, page.container.getBehaviorId(link2)); // auto,border2,link2,auto2 page.getContainer().remove(auto2); behaviors = page.getContainer().getBehaviors(); assertEquals(3, behaviors.size()); assertEquals(autoId, page.container.getBehaviorId(auto)); assertEquals(link2Id, page.container.getBehaviorId(link2)); // auto,border2,link2 page.getContainer().remove(link2); // last IBehaviorListener behaviors = page.getContainer().getBehaviors(); assertEquals(2, behaviors.size()); assertEquals(autoId, page.container.getBehaviorId(auto)); assertEquals(border2Id, page.container.getBehaviorId(border2)); } private static class LinkBehavior extends Behavior implements IRequestListener { private static final long serialVersionUID = 1L; private final String attr; public LinkBehavior(String attr) { this.attr = attr; } @Override public void onComponentTag(Component component, ComponentTag tag) { super.onComponentTag(component, tag); tag.put(attr, component.urlForListener(this, new PageParameters())); } @Override public void onRequest() { } } private static class MyPage extends WebPage implements IMarkupResourceStreamProvider { private static final long serialVersionUID = 1L; private final WebMarkupContainer container; public MyPage() { container = new WebMarkupContainer("container"); add(container); } @Override public IResourceStream getMarkupResourceStream(MarkupContainer container, Class<?> containerClass) { return new StringResourceStream( "<html><body><a wicket:id='container'></a></body></html>"); } public WebMarkupContainer getContainer() { return container; } } }