/*
* 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 org.junit.Assert;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.form.FormComponent;
import org.apache.wicket.util.tester.WicketTestCase;
import org.apache.wicket.util.visit.ClassVisitFilter;
import org.apache.wicket.util.visit.IVisit;
import org.apache.wicket.util.visit.IVisitor;
import org.apache.wicket.util.visit.Visits;
import org.junit.Test;
/**
* <code>
* A
* +-B
* +-C
* | +-D
* | +-E
* | +-F
* +-G
* +-H
* </code>
*
* @author igor.vaynberg
*/
public class VisitorTest extends WicketTestCase
{
/**
* testVisit()
*/
@Test
public void visit()
{
final StringBuilder path = new StringBuilder();
TestContainer container = new TestContainer();
Visits.visit(container, new IVisitor<Component, Void>()
{
@Override
public void component(Component component, IVisit<Void> visit)
{
path.append(component.getId());
}
});
Assert.assertEquals("ABCDEFGH", path.toString());
}
/**
* testContinueTraversal()
*/
@Test
public void continueTraversal()
{
final StringBuilder path = new StringBuilder();
TestContainer container = new TestContainer();
container.visitChildren(new IVisitor<Component, Void>()
{
@Override
public void component(Component component, IVisit<Void> visit)
{
path.append(component.getId());
}
});
Assert.assertEquals("BCDEFGH", path.toString());
}
/**
* testContinuePostOrder()
*/
@Test
public void continuePostOrder()
{
final StringBuilder path = new StringBuilder();
TestContainer container = new TestContainer();
FormComponent.visitComponentsPostOrder(container, new IVisitor<Component, Void>()
{
@Override
public void component(Component component, IVisit<Void> visit)
{
path.append(component.getId());
}
});
Assert.assertEquals("BDFECHGA", path.toString());
}
/**
* testStop()
*/
@Test
public void stop()
{
final StringBuilder path = new StringBuilder();
TestContainer container = new TestContainer();
Object result = container.visitChildren(new IVisitor<Component, String>()
{
@Override
public void component(Component component, IVisit<String> visit)
{
path.append(component.getId());
if ("D".equals(component.getId()))
{
visit.stop("RESULT");
}
}
});
Assert.assertEquals("BCD", path.toString());
Assert.assertEquals("RESULT", result);
}
/**
* testDoNotGoDeeper1()
*/
@Test
public void doNotGoDeeper1()
{
final StringBuilder path = new StringBuilder();
TestContainer container = new TestContainer();
container.visitChildren(new IVisitor<Component, Void>()
{
@Override
public void component(Component component, IVisit<Void> visit)
{
path.append(component.getId());
if ("C".equals(component.getId()))
{
visit.dontGoDeeper();
}
}
});
Assert.assertEquals("BCGH", path.toString());
}
/**
* testDoNotGoDeeper2()
*/
@Test
public void doNotGoDeeper2()
{
final StringBuilder path = new StringBuilder();
TestContainer container = new TestContainer();
container.visitChildren(new IVisitor<Component, Void>()
{
@Override
public void component(Component component, IVisit<Void> visit)
{
path.append(component.getId());
if ("E".equals(component.getId()))
{
visit.dontGoDeeper();
}
}
});
Assert.assertEquals("BCDEGH", path.toString());
}
/**
* https://issues.apache.org/jira/browse/WICKET-3805
*
* Visit parents with arbitrary type
*/
@Test
public void testVisitParents()
{
TestContainer testContainer = new TestContainer();
IVisitor<MarkupContainer, MarkerInterface> visitor = new IVisitor<MarkupContainer, MarkerInterface>()
{
@Override
public void component(MarkupContainer object, IVisit<MarkerInterface> visit)
{
visit.stop((MarkerInterface)object);
}
};
MarkerInterface markedParent = testContainer.get("G:H").visitParents(MarkupContainer.class,
visitor, new ClassVisitFilter(MarkerInterface.class));
assertEquals("G", markedParent.getId());
}
private static interface MarkerInterface
{
public String getId();
}
private static class MarkedWebMarkupContainer extends WebMarkupContainer
implements
MarkerInterface
{
private static final long serialVersionUID = 1L;
public MarkedWebMarkupContainer(String id)
{
super(id);
}
}
private static class TestContainer extends WebMarkupContainer
{
private static final long serialVersionUID = 1L;
public TestContainer()
{
super("A");
WebMarkupContainer b = new WebMarkupContainer("B");
WebMarkupContainer c = new WebMarkupContainer("C");
WebMarkupContainer d = new WebMarkupContainer("D");
WebMarkupContainer e = new WebMarkupContainer("E");
WebMarkupContainer f = new WebMarkupContainer("F");
WebMarkupContainer g = new MarkedWebMarkupContainer("G");
WebMarkupContainer h = new WebMarkupContainer("H");
add(b);
add(c);
c.add(d);
c.add(e);
e.add(f);
add(g);
g.add(h);
}
}
}