/*
* 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.markup.html.internal;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.regex.Pattern;
import org.apache.wicket.Component;
import org.apache.wicket.MarkupContainer;
import org.apache.wicket.Page;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.mock.MockApplication;
import org.apache.wicket.protocol.http.WebApplication;
import org.apache.wicket.util.tester.WicketTestCase;
import org.apache.wicket.util.visit.IVisit;
import org.apache.wicket.util.visit.IVisitor;
import org.junit.Test;
/**
* Simple test using the WicketTester
*
* @author Joonas Hamalainen
*/
public class AjaxEnclosureTest extends WicketTestCase
{
private final String inlineEnclosureIdPrefix = "wicket__InlineEnclosure_";
private final String inlineEnclosureHiddenPattern = "<div id=\"" + inlineEnclosureIdPrefix +
"\\w+\" style=\"display:none\"></div>";
private final String inlineEnclosureVisiblePattern = "<div id=\"" + inlineEnclosureIdPrefix +
"\\w+\">";
@Override
protected WebApplication newApplication()
{
WebApplication webApplication = new MockApplication()
{
@Override
protected void init()
{
super.init();
getMarkupSettings().setStripWicketTags(true);
}
};
return webApplication;
}
/**
* Test toggling the controlling child inside the inline enclosure
*/
@Test
public void ajaxTogglingControllingChildShouldToggleInlineEnclosure()
{
{
// enclosure On
AjaxEnclosurePage_1 ajaxPage = tester.startPage(AjaxEnclosurePage_1.class);
assertVisible(ajaxPage.getLabel1(), true);
assertVisible(ajaxPage.getLabel2(), true);
String doc = tester.getLastResponseAsString();
tester.clickLink(ajaxPage.getToggleLabel1Link().getPageRelativePath());
}
{
// enclosure Off
String doc = tester.getLastResponseAsString();
AjaxEnclosurePage_1 ajaxPage = (AjaxEnclosurePage_1)tester.getLastRenderedPage();
tester.assertContains(inlineEnclosureHiddenPattern);
assertInvisible(ajaxPage.getLabel1());
assertInvisible(ajaxPage.getLabel2());
tester.clickLink(ajaxPage.getToggleLabel1Link().getPageRelativePath());
}
{
// enclosure On
String doc = tester.getLastResponseAsString();
AjaxEnclosurePage_1 ajaxPage = (AjaxEnclosurePage_1)tester.getLastRenderedPage();
tester.assertContains(inlineEnclosureVisiblePattern);
assertVisible(ajaxPage.getLabel1(), true);
assertVisible(ajaxPage.getLabel2(), true);
tester.clickLink(ajaxPage.getToggleLabel1Link().getPageRelativePath());
}
{
// enclosure Off
String doc = tester.getLastResponseAsString();
AjaxEnclosurePage_1 ajaxPage = (AjaxEnclosurePage_1)tester.getLastRenderedPage();
tester.assertContains(inlineEnclosureHiddenPattern);
assertInvisible(ajaxPage.getLabel1());
assertInvisible(ajaxPage.getLabel2());
tester.clickLink(ajaxPage.getToggleLabel1Link().getPageRelativePath());
}
}
/**
* Test toggling a non-controlling child inside the inline enclosure
*/
@Test
public void ajaxTogglingNonControllingChildShouldNotToggleEnclosure()
{
{
// label 2 On
AjaxEnclosurePage_1 ajaxPage = tester.startPage(AjaxEnclosurePage_1.class);
ensureEnclosureIsVisible(ajaxPage, new AtomicInteger(1));
assertVisible(ajaxPage.getLabel1(), true);
assertVisible(ajaxPage.getLabel2(), true);
tester.clickLink(ajaxPage.getToggleLabel2Link().getPageRelativePath());
}
{
// label 2 Off
AjaxEnclosurePage_1 ajaxPage = (AjaxEnclosurePage_1)tester.getLastRenderedPage();
ensureEnclosureIsVisible(ajaxPage, new AtomicInteger(1));
assertVisible(ajaxPage.getLabel1(), false);
assertInvisible(ajaxPage.getLabel2());
tester.clickLink(ajaxPage.getToggleLabel2Link().getPageRelativePath());
}
{
// label 2 On
AjaxEnclosurePage_1 ajaxPage = (AjaxEnclosurePage_1)tester.getLastRenderedPage();
ensureEnclosureIsVisible(ajaxPage, new AtomicInteger(1));
assertVisible(ajaxPage.getLabel1(), false);
assertVisible(ajaxPage.getLabel2(), false);
tester.clickLink(ajaxPage.getToggleLabel2Link().getPageRelativePath());
}
{
// label 2 Off
AjaxEnclosurePage_1 ajaxPage = (AjaxEnclosurePage_1)tester.getLastRenderedPage();
ensureEnclosureIsVisible(ajaxPage, new AtomicInteger(1));
assertVisible(ajaxPage.getLabel1(), false);
assertInvisible(ajaxPage.getLabel2());
tester.clickLink(ajaxPage.getToggleLabel2Link().getPageRelativePath());
}
}
/**
*
*/
@Test
public void nestedInlineEnclosuresShouldToggleNormally()
{
{
// 1. test that enclosure1, enclosure2, label1, label2 are visible, click link1,
// hiding label1 and the whole enclosure
AjaxEnclosurePage_2 ajaxPage = tester.startPage(AjaxEnclosurePage_2.class);
ensureEnclosureIsVisible(ajaxPage, new AtomicInteger(1));
assertVisible(ajaxPage.getEnclosure2Marker(), true);
assertVisible(ajaxPage.getLabel1(), true);
assertVisible(ajaxPage.getLabel2(), true);
tester.clickLink(ajaxPage.getToggleLabel1Link().getPageRelativePath());
}
{
// 2. test that enclosure1, enclosure2, label1, label2 are INvisible, click link 1,
// bringing all back
AjaxEnclosurePage_2 ajaxPage = (AjaxEnclosurePage_2)tester.getLastRenderedPage();
ensureEnclosureIsInvisible(ajaxPage, new AtomicInteger(2));
assertInvisible(ajaxPage.getEnclosure2Marker());
assertInvisible(ajaxPage.getLabel1());
assertInvisible(ajaxPage.getLabel2());
tester.clickLink(ajaxPage.getToggleLabel1Link().getPageRelativePath());
}
{
// 3. test that enclosure1, enclosure2, label1, label2 are visble, click link 2,
// hiding label 2 and enclosure 2
AjaxEnclosurePage_2 ajaxPage = (AjaxEnclosurePage_2)tester.getLastRenderedPage();
ensureEnclosureIsVisible(ajaxPage, new AtomicInteger(1));
// ensureEnclosureIsVisible(enclosure2Path, ajaxPage);
assertVisible(ajaxPage.getEnclosure2Marker(), false);
assertVisible(ajaxPage.getLabel1(), false);
assertVisible(ajaxPage.getLabel2(), false);
tester.clickLink(ajaxPage.getToggleLabel2Link().getPageRelativePath());
}
{
// 4. test that enclosure1, label1 are visible and enclosure2, label2 INvisible.
// click link 2 again
AjaxEnclosurePage_2 ajaxPage = (AjaxEnclosurePage_2)tester.getLastRenderedPage();
ensureEnclosureIsVisible(ajaxPage, new AtomicInteger(2));
assertVisible(ajaxPage.getLabel1(), false);
assertInvisible(ajaxPage.getEnclosure2Marker());
assertInvisible(ajaxPage.getLabel2());
tester.clickLink(ajaxPage.getToggleLabel2Link().getPageRelativePath());
}
{
// 3. test that enclosure1, enclosure2, label1, label2 are visble, Click link 1,
// hiding all
AjaxEnclosurePage_2 ajaxPage = (AjaxEnclosurePage_2)tester.getLastRenderedPage();
ensureEnclosureIsVisible(ajaxPage, new AtomicInteger(1));
assertVisible(ajaxPage.getEnclosure2Marker(), false);
assertVisible(ajaxPage.getLabel1(), false);
assertVisible(ajaxPage.getLabel2(), false);
tester.clickLink(ajaxPage.getToggleLabel1Link().getPageRelativePath());
}
{
// 4. test that enclosure1, enclosure2 label1, label2 are invisible. click link 2
AjaxEnclosurePage_2 ajaxPage = (AjaxEnclosurePage_2)tester.getLastRenderedPage();
ensureEnclosureIsInvisible(ajaxPage, new AtomicInteger(2));
assertInvisible(ajaxPage.getEnclosure2Marker());
assertInvisible(ajaxPage.getLabel1());
assertInvisible(ajaxPage.getLabel2());
tester.clickLink(ajaxPage.getToggleLabel2Link().getPageRelativePath());
}
{
// 5. test that enclosure1, enclosure2 label1, label2 are invisible. click link 1
AjaxEnclosurePage_2 ajaxPage = (AjaxEnclosurePage_2)tester.getLastRenderedPage();
ensureEnclosureIsInvisible(ajaxPage, new AtomicInteger(1));
assertInvisible(ajaxPage.getEnclosure2Marker());
assertInvisible(ajaxPage.getLabel1());
assertInvisible(ajaxPage.getLabel2());
tester.clickLink(ajaxPage.getToggleLabel1Link().getPageRelativePath());
}
{
// 6. test that enclosure1, label1 are visible, and enclosure2, label2 invisible
// (because of step 4)
AjaxEnclosurePage_2 ajaxPage = (AjaxEnclosurePage_2)tester.getLastRenderedPage();
ensureEnclosureIsVisible(ajaxPage, new AtomicInteger(2));
assertInvisible(ajaxPage.getEnclosure2Marker());
assertVisible(ajaxPage.getLabel1(), false);
assertInvisible(ajaxPage.getLabel2());
tester.clickLink(ajaxPage.getToggleLabel1Link().getPageRelativePath());
}
}
/**
*
*/
@Test
public void controllingChildShouldDefaultToTheSingleComponentInsideEnclosure()
{
{
// enclosure On
AjaxEnclosurePage_3 ajaxPage = tester.startPage(AjaxEnclosurePage_3.class);
assertVisible(ajaxPage.getLabel1(), true);
ensureEnclosureIsVisible(ajaxPage, new AtomicInteger(1));
tester.clickLink(ajaxPage.getToggleLabel1Link().getPageRelativePath());
}
{
// enclosure Off
AjaxEnclosurePage_3 ajaxPage = (AjaxEnclosurePage_3)tester.getLastRenderedPage();
tester.assertContains(inlineEnclosureHiddenPattern);
assertInvisible(ajaxPage.getLabel1());
ensureEnclosureIsInvisible(ajaxPage, new AtomicInteger(1));
tester.clickLink(ajaxPage.getToggleLabel1Link().getPageRelativePath());
}
{
// enclosure On
AjaxEnclosurePage_3 ajaxPage = (AjaxEnclosurePage_3)tester.getLastRenderedPage();
tester.assertContains(inlineEnclosureVisiblePattern);
assertVisible(ajaxPage.getLabel1(), true);
ensureEnclosureIsVisible(ajaxPage, new AtomicInteger(1));
tester.clickLink(ajaxPage.getToggleLabel1Link().getPageRelativePath());
}
{
// enclosure Off
AjaxEnclosurePage_3 ajaxPage = (AjaxEnclosurePage_3)tester.getLastRenderedPage();
tester.assertContains(inlineEnclosureHiddenPattern);
assertInvisible(ajaxPage.getLabel1());
ensureEnclosureIsInvisible(ajaxPage, new AtomicInteger(1));
tester.clickLink(ajaxPage.getToggleLabel1Link().getPageRelativePath());
}
}
private void ensureEnclosureIsVisible(Page ajaxPage, AtomicInteger n)
{
InlineEnclosure enclosure = findNthComponent(InlineEnclosure.class, ajaxPage, n);
assertTrue("Is not visible", enclosure.determineVisibility());
}
private void ensureEnclosureIsInvisible(Page ajaxPage, AtomicInteger n)
{
InlineEnclosure enclosure = findNthComponent(InlineEnclosure.class, ajaxPage, n);
if (enclosure != null)
{
assertFalse("Is visible", enclosure.determineVisibility());
}
}
private <T> T findNthComponent(final Class<T> type, MarkupContainer container, final AtomicInteger n)
{
// finds the Nth InlineEnclosure in the children
Component instance = container.visitChildren(new IVisitor<Component, Component>()
{
@Override
public void component(Component object, IVisit<Component> visit)
{
if (type.isInstance(object) && n.decrementAndGet() == 0)
{
visit.stop(object);
}
}
});
return type.cast(instance);
}
protected void assertVisible(Label label, boolean checkAlsoMarkup)
{
tester.assertVisible(label.getPageRelativePath());
if (checkAlsoMarkup)
{
tester.assertContains(Pattern.quote(label.getInnermostModel().getObject().toString()));
}
}
protected void assertInvisible(Label label)
{
// tester.assertInvisible(label.getPageRelativePath());
assertDoesNotContain(Pattern.quote(label.getInnermostModel().getObject().toString()));
}
protected void assertDoesNotContain(String string)
{
assertFalse("Should not contain: " + string,
tester.getLastResponseAsString().contains(string));
}
}