Author: knopp
Date: Mon Nov 16 13:07:15 2009
New Revision: 880735

URL: http://svn.apache.org/viewvc?rev=880735&view=rev
Log:
Initial possible NG WicketTester implementation. 

Added:
    
wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/mock/WicketTester.java   
(with props)
    
wicket/trunk/wicket/src/test/java/org/apache/wicket/ng/test/TestWicketTester.java
   (with props)
Removed:
    
wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/mock/MockRenderPageRequestHandlerDelegate.java
Modified:
    wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/Session.java
    
wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/mock/MockApplication.java
    
wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/mock/MockPageManager.java
    wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/Url.java
    wicket/trunk/wicket/src/test/java/org/apache/wicket/ng/request/UrlTest.java

Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/Session.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/Session.java?rev=880735&r1=880734&r2=880735&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/Session.java 
(original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/Session.java Mon Nov 
16 13:07:15 2009
@@ -42,7 +42,8 @@
 
        private Request getRequest()
        {
-               return RequestCycle.get().getRequest();
+               RequestCycle cycle = RequestCycle.get();
+               return cycle != null ? cycle.getRequest() : null;
        }
 
        public void invalidateNow()

Modified: 
wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/mock/MockApplication.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/mock/MockApplication.java?rev=880735&r1=880734&r2=880735&view=diff
==============================================================================
--- 
wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/mock/MockApplication.java
 (original)
+++ 
wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/mock/MockApplication.java
 Mon Nov 16 13:07:15 2009
@@ -19,9 +19,11 @@
 import org.apache.wicket.ng.page.PageManager;
 import org.apache.wicket.ng.protocol.http.WebApplication;
 import org.apache.wicket.ng.request.component.RequestablePage;
+import org.apache.wicket.ng.request.cycle.RequestCycle;
 import org.apache.wicket.ng.request.cycle.RequestCycleContext;
 import org.apache.wicket.ng.request.handler.impl.RenderPageRequestHandler;
 import 
org.apache.wicket.ng.request.handler.impl.render.RenderPageRequestHandlerDelegate;
+import 
org.apache.wicket.ng.request.handler.impl.render.WebRenderPageRequestHandlerDelegate;
 import org.apache.wicket.ng.session.SessionStore;
 
 public class MockApplication extends WebApplication
@@ -59,12 +61,13 @@
        public RenderPageRequestHandlerDelegate 
getRenderPageRequestHandlerDelegate(
                RenderPageRequestHandler renderPageRequestHandler)
        {
-               return new 
MockRenderPageRequestHandlerDelegate(renderPageRequestHandler)
+               return new 
WebRenderPageRequestHandlerDelegate(renderPageRequestHandler)
                {
                        @Override
-                       protected void onPageRender(RequestablePage page)
+                       public void respond(RequestCycle requestCycle)
                        {
-                               lastRenderedPage = page;
+                               lastRenderedPage = 
getPageProvider().getPageInstance();
+                               super.respond(requestCycle);
                        }
                };
        }

Modified: 
wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/mock/MockPageManager.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/mock/MockPageManager.java?rev=880735&r1=880734&r2=880735&view=diff
==============================================================================
--- 
wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/mock/MockPageManager.java
 (original)
+++ 
wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/mock/MockPageManager.java
 Mon Nov 16 13:07:15 2009
@@ -17,23 +17,20 @@
 package org.apache.wicket.ng.mock;
 
 import java.util.HashMap;
-import java.util.List;
 import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
 
 import org.apache.wicket.ng.page.ManageablePage;
 import org.apache.wicket.ng.page.PageManager;
 import org.apache.wicket.ng.page.PageManagerContext;
-import org.apache.wicket.ng.page.common.AbstractPageManager;
-import org.apache.wicket.ng.page.common.RequestAdapter;
 
 /**
  * Simple {...@link PageManager} used for testing.
  * 
  * @author Matej Knopp
  */
-public class MockPageManager extends AbstractPageManager
+public class MockPageManager implements PageManager
 {
+       private final Map<Integer, ManageablePage> pages = new HashMap<Integer, 
ManageablePage>();
 
        /**
         * Construct.
@@ -42,65 +39,39 @@
        {
        }
 
-       private final Map<String, Map<Integer, ManageablePage>> sessionMap = 
new ConcurrentHashMap<String, Map<Integer, ManageablePage>>();
+       public void commitRequest()
+       {
+       }
+
+       public void destroy()
+       {
+       }
 
-       private class MockRequestAdapter extends RequestAdapter
+       public ManageablePage getPage(int id)
        {
-               public MockRequestAdapter(PageManagerContext context)
-               {
-                       super(context);
-               }
-
-               @Override
-               protected ManageablePage getPage(int id)
-               {
-                       Map<Integer, ManageablePage> pages = 
sessionMap.get(getSessionId());
-                       return pages != null ? pages.get(id) : null;
-               }
-
-               @Override
-               protected void newSessionCreated()
-               {
-
-               }
-
-               @Override
-               protected void storeTouchedPages(List<ManageablePage> 
touchedPages)
-               {
-                       bind();
-                       Map<Integer, ManageablePage> pages = 
sessionMap.get(getSessionId());
-                       if (pages == null)
-                       {
-                               pages = new HashMap<Integer, ManageablePage>();
-                               sessionMap.put(getSessionId(), pages);
-                       }
-                       for (ManageablePage page : touchedPages)
-                       {
-                               pages.put(page.getPageId(), page);
-                       }
-               }
-       };
+               return pages.get(id);
+       }
 
-       @Override
-       protected RequestAdapter newRequestAdapter(PageManagerContext context)
+       public void newSessionCreated()
        {
-               return new MockRequestAdapter(context);
        }
 
-       @Override
        public void sessionExpired(String sessionId)
        {
-               sessionMap.remove(sessionId);
        }
 
-       @Override
+       public void setContext(PageManagerContext context)
+       {
+       }
+
        public boolean supportsVersioning()
        {
                return false;
        }
 
-       public void destroy()
+       public void touchPage(ManageablePage page)
        {
-               sessionMap.clear();
+               pages.put(page.getPageId(), page);
        }
+
 }

Added: 
wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/mock/WicketTester.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/mock/WicketTester.java?rev=880735&view=auto
==============================================================================
--- 
wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/mock/WicketTester.java 
(added)
+++ 
wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/mock/WicketTester.java 
Mon Nov 16 13:07:15 2009
@@ -0,0 +1,282 @@
+/*
+ * 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.ng.mock;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.wicket.ng.Component;
+import org.apache.wicket.ng.Page;
+import org.apache.wicket.ng.ThreadContext;
+import org.apache.wicket.ng.WicketRuntimeException;
+import org.apache.wicket.ng.request.RequestHandler;
+import org.apache.wicket.ng.request.RequestMapper;
+import org.apache.wicket.ng.request.Url;
+import org.apache.wicket.ng.request.cycle.RequestCycle;
+import org.apache.wicket.ng.request.handler.DefaultPageProvider;
+import org.apache.wicket.ng.request.handler.PageAndComponentProvider;
+import org.apache.wicket.ng.request.handler.PageProvider;
+import 
org.apache.wicket.ng.request.handler.impl.ListenerInterfaceRequestHandler;
+import org.apache.wicket.ng.request.handler.impl.RenderPageRequestHandler;
+import org.apache.wicket.ng.request.listener.RequestListenerInterface;
+import org.apache.wicket.ng.settings.RequestCycleSettings.RenderStrategy;
+
+/**
+ * Experimental implementation
+ * 
+ * @author Matej Knopp
+ */
+public class WicketTester
+{
+       private final MockApplication application;
+
+       private boolean followRedirects = true;
+
+       private MockWebRequest lastRequest;
+       private MockWebResponse lastResponse;
+
+       private final List<MockWebRequest> previousRequests = new 
ArrayList<MockWebRequest>();
+       private final List<MockWebResponse> previousResponses = new 
ArrayList<MockWebResponse>();
+
+       private final ThreadContext oldThreadContext;
+
+       /**
+        * Creates a new {...@link WicketTester} instance. It also binds it's 
Application to current thread
+        * so all activities that needs the original application (if there was 
one bound to current
+        * thread) need to wait until {...@link #destroy()} is invoked.
+        */
+       public WicketTester()
+       {
+               oldThreadContext = ThreadContext.getAndClean();
+
+               application = new MockApplication();
+               application.setName("WicketTesterApplication");
+               application.set();
+               application.initApplication();
+       }
+
+       /**
+        * Destroys the tester. Restores {...@link ThreadContext} to state 
before instance of
+        * {...@link WicketTester} was created.
+        */
+       public void destroy()
+       {
+               ThreadContext.restore(oldThreadContext);
+               application.destroy();
+       }
+
+       int redirectCount;
+
+       /**
+        * Processes the request in mocked Wicket environment.
+        * 
+        * @param request
+        *            request to process
+        * 
+        * @param forcedRequestHandler
+        *            optional parameter to override parsing the request URL 
and force
+        *            {...@link RequestHandler}
+        */
+       public void processRequest(MockWebRequest request, RequestHandler 
forcedRequestHandler)
+       {
+               try
+               {
+                       if (lastRequest != null)
+                       {
+                               previousRequests.add(lastRequest);
+                       }
+                       if (lastResponse != null)
+                       {
+                               previousResponses.add(lastResponse);
+                       }
+
+                       lastRequest = request;
+                       lastResponse = new MockWebResponse();
+
+                       MockRequestCycle cycle = 
(MockRequestCycle)application.createRequestCycle(request,
+                               lastResponse);
+
+                       if (forcedRequestHandler != null)
+                       {
+                               cycle.forceRequestHandler(forcedRequestHandler);
+                       }
+
+                       cycle.processRequestAndDetach();
+
+                       if (followRedirects && lastResponse.isRedirect())
+                       {
+                               if (redirectCount == 100)
+                               {
+                                       throw new IllegalStateException(
+                                               "Possible infinite redirect 
detected. Bailing out.");
+                               }
+                               ++redirectCount;
+                               Url newUrl = 
Url.parse(lastResponse.getRedirectUrl());
+                               if (newUrl.isAbsolute())
+                               {
+                                       throw new WicketRuntimeException("Can 
not follow absolute redirect URL.");
+                               }
+
+                               // append redirect URL to current URL (what 
browser would do)
+                               Url mergedURL = new 
Url(request.getUrl().getSegments(), newUrl.getQueryParameters());
+                               mergedURL.concatSegments(newUrl.getSegments());
+
+                               processRequest(new MockWebRequest(mergedURL), 
null);
+
+                               --redirectCount;
+                       }
+               }
+               finally
+               {
+                       redirectCount = 0;
+               }
+       }
+
+       /**
+        * Renders the page specified by given {...@link PageProvider}. After 
render the page instance can
+        * be retreived using {...@link #getLastRenderedPage()} and the 
rendered document will be available
+        * in {...@link #getLastResponse()}.
+        * 
+        * Depending on {...@link RenderStrategy} invoking this method can mean 
that a redirect will happen
+        * before the actual render.
+        * 
+        * @param pageProvider
+        */
+       public void startPage(PageProvider pageProvider)
+       {
+               MockWebRequest request = new MockWebRequest(new Url());
+               RequestHandler handler = new 
RenderPageRequestHandler(pageProvider);
+               processRequest(request, handler);
+       }
+
+       /**
+        * Renders the page.
+        * 
+        * @see #startPage(PageProvider)
+        * 
+        * @param page
+        */
+       public void startPage(Page page)
+       {
+               startPage(new DefaultPageProvider(page));
+       }
+
+       /**
+        * Simulates processing URL that invokes specified {...@link 
RequestListenerInterface} on
+        * component.
+        * 
+        * After the listener interface is invoked the page containing the 
component will be rendered
+        * (with an optional redirect - depending on {...@link RenderStrategy}).
+        * 
+        * @param component
+        * @param listener
+        */
+       public void executeListener(Component component, 
RequestListenerInterface listener)
+       {
+               // there are two ways to do this. RequestCycle could be forced 
to call the handler
+               // directly but constructing and parsing the URL increases the 
chance of triggering bugs
+               RequestHandler handler = new 
ListenerInterfaceRequestHandler(new PageAndComponentProvider(
+                       component.getPage(), component), listener);
+
+               Url url = urlFor(handler);
+
+               processRequest(new MockWebRequest(url), null);
+       }
+
+       /**
+        * @return last request or <code>null</code> if no request has happened 
yet.
+        */
+       public MockWebRequest getLastRequest()
+       {
+               return lastRequest;
+       }
+
+       /**
+        * @return last response or <code>null</code>> if no response has been 
produced yet.
+        */
+       public MockWebResponse getLastResponse()
+       {
+               return lastResponse;
+       }
+
+       /**
+        * @return list of prior requests
+        */
+       public List<MockWebRequest> getPreviousRequests()
+       {
+               return Collections.unmodifiableList(previousRequests);
+       }
+
+       /**
+        * @return list of prior responses
+        */
+       public List<MockWebResponse> getPreviousResponses()
+       {
+               return Collections.unmodifiableList(previousResponses);
+       }
+
+       /**
+        * @return last rendered page
+        */
+       public Page getLastRenderedPage()
+       {
+               return (Page)application.getLastRenderedPage();
+       }
+
+       /**
+        * Sets whether responses with redirects will be followed automatically.
+        * 
+        * @param followRedirects
+        */
+       public void setFollowRedirects(boolean followRedirects)
+       {
+               this.followRedirects = followRedirects;
+       }
+
+       /**
+        * @return <code>true</code> if redirect responses will be followed 
automatically,
+        *         <code>false</code> otherwise.
+        */
+       public boolean isFollowRedirects()
+       {
+               return followRedirects;
+       }
+
+       /**
+        * Encodes the {...@link RequestHandler} to {...@link Url}. It should 
be safe to call this method
+        * outside request thread as log as no registered {...@link 
RequestMapper} requires a
+        * {...@link RequestCycle}.
+        * 
+        * @param handler
+        * @return {...@link Url} for handler.
+        */
+       public Url urlFor(RequestHandler handler)
+       {
+               return application.getRootRequestMapper().mapHandler(handler);
+       }
+
+       /**
+        * Returns the {...@link MockApplication} for this environment.
+        * 
+        * @return application
+        */
+       public MockApplication getApplication()
+       {
+               return application;
+       }
+}

Propchange: 
wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/mock/WicketTester.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: 
wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/Url.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/Url.java?rev=880735&r1=880734&r2=880735&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/Url.java 
(original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/Url.java Mon 
Nov 16 13:07:15 2009
@@ -29,7 +29,11 @@
 import org.apache.wicket.util.string.Strings;
 
 /**
- * Represents the URL part after Wicket Filter.
+ * Represents the URL part <b>after Wicket Filter</b>. For example if Wicket 
Filter is mapped to
+ * <code>/app/*</code> then with URL <code>/app/my/url</code> the {...@link 
Url} object would represent
+ * part <code>my/url</code>. If Wicket Filter is mapped to <code>/*</code> 
then with URL
+ * <code>/my/url</code> the {...@link Url} object would represent 
<code>my/url</code> (without leading
+ * the slash).
  * <p>
  * URL consists of segments and query parameters.
  * <p>
@@ -46,8 +50,7 @@
  *                                                an additional slash, i.e. //
  * </pre>
  * 
- * The Url class takes care of encoding and decoding of the segments and
- * parameters.
+ * The Url class takes care of encoding and decoding of the segments and 
parameters.
  * 
  * @author Matej Knopp
  * @author Igor Vaynberg
@@ -119,8 +122,7 @@
        /**
         * Returns whether the URL is absolute.
         * 
-        * @return <code>true</code> if URL is absolute, <code>false</code>
-        *         otherwise.
+        * @return <code>true</code> if URL is absolute, <code>false</code> 
otherwise.
         */
        public boolean isAbsolute()
        {
@@ -160,8 +162,7 @@
        }
 
        /**
-        * Convenience method that prepends <code>segments</code> to the 
segments
-        * collection
+        * Convenience method that prepends <code>segments</code> to the 
segments collection
         * 
         * @param newSegments
         */
@@ -172,8 +173,8 @@
        }
 
        /**
-        * Convenience method that removes all query parameters with given name 
and
-        * adds new query parameter with specified name and value
+        * Convenience method that removes all query parameters with given name 
and adds new query
+        * parameter with specified name and value
         * 
         * @param name
         * @param value
@@ -189,8 +190,8 @@
        }
 
        /**
-        * Returns first query parameter with specified name or null if such 
query
-        * parameter doesn't exist.
+        * Returns first query parameter with specified name or null if such 
query parameter doesn't
+        * exist.
         * 
         * @param name
         * @return query parameter or <code>null</code>
@@ -208,9 +209,8 @@
        }
 
        /**
-        * Returns the value of first query parameter with specified name. Note 
that
-        * this method never returns <code>null</code>. Not even if the 
parameter
-        * does not exist.
+        * Returns the value of first query parameter with specified name. Note 
that this method never
+        * returns <code>null</code>. Not even if the parameter does not exist.
         * 
         * @see StringValue#isNull()
         * 
@@ -241,9 +241,8 @@
                private final String value;
 
                /**
-                * Creates new {...@link QueryParameter} instance. The 
<code>name</code>
-                * and <code>value</code> parameters must not be 
<code>null</code>,
-                * though they can be empty strings.
+                * Creates new {...@link QueryParameter} instance. The 
<code>name</code> and <code>value</code>
+                * parameters must not be <code>null</code>, though they can be 
empty strings.
                 * 
                 * @param name
                 *            parameter name
@@ -291,8 +290,8 @@
                                return false;
                        }
                        QueryParameter rhs = (QueryParameter)obj;
-                       return Objects.equal(getName(), rhs.getName())
-                                       && Objects.equal(getValue(), 
rhs.getValue());
+                       return Objects.equal(getName(), rhs.getName()) &&
+                               Objects.equal(getValue(), rhs.getValue());
                }
 
                @Override
@@ -328,8 +327,8 @@
                }
                Url rhs = (Url)obj;
 
-               return getSegments().equals(rhs.getSegments())
-                               && 
getQueryParameters().equals(rhs.getQueryParameters());
+               return getSegments().equals(rhs.getSegments()) &&
+                       getQueryParameters().equals(rhs.getQueryParameters());
        }
 
        @Override
@@ -481,4 +480,58 @@
 
                return result;
        };
+
+       private boolean isLastSegmentReal()
+       {
+               if (segments.isEmpty())
+               {
+                       return false;
+               }
+               String last = segments.get(segments.size() - 1);
+               return last.length() > 0 && !".".equals(last) && 
!"..".equals(last);
+       }
+
+       private boolean isLastSegmentEmpty()
+       {
+               if (segments.isEmpty())
+               {
+                       return false;
+               }
+               String last = segments.get(segments.size() - 1);
+               return last.length() == 0;
+       }
+
+       /**
+        * Concatenate the specified segments; The segments can be relative - 
begin with "." or "..".
+        * 
+        * @param segments
+        */
+       public void concatSegments(List<String> segments)
+       {
+               boolean checkedLastSegment = false;
+
+               for (String s : segments)
+               {
+                       if (".".equals(s))
+                       {
+                               continue;
+                       }
+                       else if ("..".equals(s) && isLastSegmentReal())
+                       {
+                               this.segments.remove(this.segments.size() - 1);
+                       }
+                       else
+                       {
+                               if (!checkedLastSegment)
+                               {
+                                       if (isLastSegmentReal() || 
isLastSegmentEmpty())
+                                       {
+                                               
this.segments.remove(this.segments.size() - 1);
+                                       }
+                                       checkedLastSegment = true;
+                               }
+                               this.segments.add(s);
+                       }
+               }
+       }
 }

Modified: 
wicket/trunk/wicket/src/test/java/org/apache/wicket/ng/request/UrlTest.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/test/java/org/apache/wicket/ng/request/UrlTest.java?rev=880735&r1=880734&r2=880735&view=diff
==============================================================================
--- wicket/trunk/wicket/src/test/java/org/apache/wicket/ng/request/UrlTest.java 
(original)
+++ wicket/trunk/wicket/src/test/java/org/apache/wicket/ng/request/UrlTest.java 
Mon Nov 16 13:07:15 2009
@@ -125,7 +125,7 @@
                checkSegments(url);
                checkQueryParams(url, "a", "b");
        }
-       
+
        /**
         * 
         */
@@ -136,7 +136,7 @@
                checkSegments(url, "", "");
                checkQueryParams(url);
        }
-       
+
        /**
         * 
         */
@@ -173,7 +173,7 @@
                Url url = Url.parse(s);
                assertEquals(url.toString(), s);
        }
-       
+
        /**
         * 
         */
@@ -183,7 +183,7 @@
                Url url = Url.parse(s);
                assertEquals(url.toString(), s);
        }
-       
+
        /**
         * 
         */
@@ -202,7 +202,7 @@
                Url url = Url.parse("abc/efg");
                assertFalse(url.isAbsolute());
        }
-       
+
        /**
         * 
         */
@@ -211,7 +211,7 @@
                Url url = Url.parse("");
                assertFalse(url.isAbsolute());
        }
-       
+
        /**
         * 
         */
@@ -220,7 +220,7 @@
                Url url = Url.parse("/");
                assertTrue(url.isAbsolute());
        }
-       
+
        /**
         * 
         */
@@ -230,4 +230,53 @@
                assertTrue(url.isAbsolute());
        }
 
+       /**
+        * 
+        */
+       public void testConcat1()
+       {
+               Url url = Url.parse("abc/efg");
+               url.concatSegments(Arrays.asList("xx", "yy"));
+               assertEquals(Url.parse("abc/xx/yy"), url);
+       }
+
+       /**
+        * 
+        */
+       public void testConcat2()
+       {
+               Url url = Url.parse("abc/efg");
+               url.concatSegments(Arrays.asList(".", "..", "xx", "yy"));
+               assertEquals(Url.parse("xx/yy"), url);
+       }
+
+       /**
+        * 
+        */
+       public void testConcat3()
+       {
+               Url url = Url.parse("abc/efg");
+               url.concatSegments(Arrays.asList("..", "..", "xx", "yy"));
+               assertEquals(Url.parse("xx/yy"), url);
+       }
+
+       /**
+        * 
+        */
+       public void testConcat4()
+       {
+               Url url = Url.parse("abc/efg");
+               url.concatSegments(Arrays.asList("..", "..", "..", "xx", "yy"));
+               assertEquals(Url.parse("../xx/yy"), url);
+       }
+
+       /**
+        * 
+        */
+       public void testConcat5()
+       {
+               Url url = Url.parse("abc/efg/");
+               url.concatSegments(Arrays.asList("xx", "yy"));
+               assertEquals(Url.parse("abc/efg/xx/yy"), url);
+       }
 }

Added: 
wicket/trunk/wicket/src/test/java/org/apache/wicket/ng/test/TestWicketTester.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/test/java/org/apache/wicket/ng/test/TestWicketTester.java?rev=880735&view=auto
==============================================================================
--- 
wicket/trunk/wicket/src/test/java/org/apache/wicket/ng/test/TestWicketTester.java
 (added)
+++ 
wicket/trunk/wicket/src/test/java/org/apache/wicket/ng/test/TestWicketTester.java
 Mon Nov 16 13:07:15 2009
@@ -0,0 +1,70 @@
+/*
+ * 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.ng.test;
+
+import junit.framework.TestCase;
+
+import org.apache.wicket.ng.Component;
+import org.apache.wicket.ng.Page;
+import org.apache.wicket.ng.markup.html.link.ILinkListener;
+import org.apache.wicket.ng.markup.html.link.Link;
+import org.apache.wicket.ng.mock.WicketTester;
+
+
+public class TestWicketTester extends TestCase
+{
+       public static class Page1 extends Page
+       {
+               private static final long serialVersionUID = 1L;
+
+               public Page1()
+               {
+                       Link l;
+                       add(l = new Link("link")
+                       {
+                               private static final long serialVersionUID = 1L;
+
+                               public void onLinkClicked()
+                               {
+                                       System.out.println("Link clicked!");
+                               }
+                       });
+                       l.setLabel("A Link!");
+               }
+
+               @Override
+               public void renderPage()
+               {
+                       super.renderPage();
+               }
+       };
+
+       public void testPageRender1()
+       {
+               WicketTester tester = new WicketTester();
+
+               tester.startPage(new Page1());
+
+               System.out.println(tester.getLastResponse().getTextResponse());
+
+               Component c = tester.getLastRenderedPage().get("link");
+
+               tester.executeListener(c, ILinkListener.INTERFACE);
+
+               tester.destroy();
+       }
+}

Propchange: 
wicket/trunk/wicket/src/test/java/org/apache/wicket/ng/test/TestWicketTester.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain


Reply via email to