You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by iv...@apache.org on 2009/10/11 02:02:29 UTC

svn commit: r823984 [10/11] - in /wicket/trunk: ./ wicket/src/main/java/org/apache/wicket/ng/ wicket/src/main/java/org/apache/wicket/ng/application/ wicket/src/main/java/org/apache/wicket/ng/behavior/ wicket/src/main/java/org/apache/wicket/ng/markup/ w...

Added: wicket/trunk/wicket/src/test/java/org/apache/wicket/ng/page/persistent/disk/DiskDataStoreTest.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/test/java/org/apache/wicket/ng/page/persistent/disk/DiskDataStoreTest.java?rev=823984&view=auto
==============================================================================
--- wicket/trunk/wicket/src/test/java/org/apache/wicket/ng/page/persistent/disk/DiskDataStoreTest.java (added)
+++ wicket/trunk/wicket/src/test/java/org/apache/wicket/ng/page/persistent/disk/DiskDataStoreTest.java Sun Oct 11 00:02:25 2009
@@ -0,0 +1,306 @@
+package org.apache.wicket.ng.page.persistent.disk;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Random;
+import java.util.UUID;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentLinkedQueue;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import junit.framework.TestCase;
+
+import org.apache.wicket.ng.page.persistent.AsynchronousDataStore;
+import org.apache.wicket.ng.page.persistent.DataStore;
+import org.apache.wicket.ng.util.lang.Check;
+
+public class DiskDataStoreTest extends TestCase
+{
+
+	public DiskDataStoreTest()
+	{
+		
+	}
+
+	private static final Random random = new Random();
+	private static final int FILE_SIZE_MIN = 1024 * 200;
+	private static final int FILE_SIZE_MAX = 1024 * 300;
+	private static final int MAX_SIZE_PER_SESSION = 1000000;
+	private static final int FILE_CHANNEL_POOL_CAPACITY = 100;
+	private static final int SESSION_COUNT = 50;
+	private static final int FILES_COUNT = 1000;
+	private static final int SLEEP_MAX = 10;
+	private static final int THREAD_COUNT = 20;
+	private static final int READ_MODULO = 100;
+	
+	private static class File
+	{
+		private final String sessionId;
+		private final int id;
+		
+		private byte first;
+		private byte last;
+		private int length;
+		
+		public File(String sessionId, int id)
+		{
+			this.sessionId = sessionId;
+			this.id = id;
+		}
+		
+		public String getSessionId()
+		{
+			return sessionId;
+		}
+		
+		public int getId()
+		{
+			return id;
+		}
+		
+		public byte[] generateData()
+		{
+			length = FILE_SIZE_MIN + random.nextInt(FILE_SIZE_MAX - FILE_SIZE_MIN);
+			byte data[] = new byte[length];
+			random.nextBytes(data);
+			first = data[0];
+			last = data[data.length - 1];
+			return data;
+		}
+		
+		public boolean checkData(byte data[])
+		{
+			Check.argumentNotNull(data, "data");
+			if (data.length != length)
+			{
+				return false;
+			}
+			if (first != data[0])
+			{
+				return false;
+			}
+			if (last != data[data.length - 1])
+			{
+				return false;
+			}
+			return true;
+		}
+	}
+		
+	private Map<String, AtomicInteger> sessionCounter = new ConcurrentHashMap<String, AtomicInteger>();
+	private ConcurrentLinkedQueue<File> filesToSave = new ConcurrentLinkedQueue<File>();
+	private ConcurrentLinkedQueue<File> filesToRead1 = new ConcurrentLinkedQueue<File>();
+	private ConcurrentLinkedQueue<File> filesToRead2 = new ConcurrentLinkedQueue<File>();
+	
+	private AtomicInteger read1Count = new AtomicInteger(0);
+	private AtomicInteger read2Count = new AtomicInteger(0);
+	private AtomicInteger saveCount = new AtomicInteger(0);
+	
+	private AtomicBoolean saveDone = new AtomicBoolean(false);
+	private AtomicBoolean read1Done = new AtomicBoolean(false);
+	private AtomicBoolean read2Done = new AtomicBoolean(false);
+	
+	private AtomicInteger failures = new AtomicInteger();
+	
+	private AtomicInteger bytesWritten = new AtomicInteger(0);
+	private AtomicInteger bytesRead = new AtomicInteger(0);
+	
+	private AtomicInteger saveTime = new AtomicInteger(0);
+	
+	private String randomSessionId()
+	{
+		List<String> s = new ArrayList<String>(sessionCounter.keySet());
+		return s.get(random.nextInt(s.size()));
+	}
+	
+	private int nextSessionId(String sessionId)
+	{
+		AtomicInteger i = sessionCounter.get(sessionId);
+		return i.incrementAndGet();
+	}
+	
+	private void generateFiles()
+	{
+		for (int i = 0; i < SESSION_COUNT; ++i)
+		{
+			sessionCounter.put(UUID.randomUUID().toString(), new AtomicInteger(0));
+		}
+		for (int i = 0; i < FILES_COUNT; ++i)
+		{
+			String session = randomSessionId();
+			File file = new File(session, nextSessionId(session));
+			long now = System.nanoTime();
+			filesToSave.add(file);
+			long duration = System.nanoTime() - now;
+			saveTime.addAndGet((int) duration);
+		}
+		
+	}
+	
+	private DataStore dataStore;
+	
+	private class SaveRunnable implements Runnable
+	{
+		public void run()
+		{
+			File file;
+			
+			while ((file = filesToSave.poll()) != null || saveCount.get() < FILES_COUNT)
+			{
+				if (file != null)
+				{					
+					byte data[] = file.generateData();
+					dataStore.storeData(file.getSessionId(), file.getId(), data);
+					
+					if (saveCount.get() % READ_MODULO == 0)
+					{
+						filesToRead1.add(file);
+					}
+					saveCount.incrementAndGet();
+					bytesWritten.addAndGet(data.length);
+				}
+					
+				try
+				{
+					Thread.sleep(random.nextInt(SLEEP_MAX));
+				}
+				catch (InterruptedException e)
+				{
+					e.printStackTrace();
+				}
+			}						
+			
+			saveDone.set(true);			
+		}		
+	};
+	
+	private class Read1Runnable implements Runnable
+	{
+		public void run()
+		{
+			File file;
+			while ((file = filesToRead1.poll()) != null || !saveDone.get())
+			{
+				if (file != null)
+				{
+					byte bytes[] = dataStore.getData(file.getSessionId(), file.getId());
+					if (file.checkData(bytes) == false)
+					{
+						failures.incrementAndGet();
+					}
+					filesToRead2.add(file);	
+					read1Count.incrementAndGet();
+					bytesRead.addAndGet(bytes.length);
+				}
+								
+				try
+				{
+					Thread.sleep(random.nextInt(SLEEP_MAX));
+				}
+				catch (InterruptedException e)
+				{
+					e.printStackTrace();
+				}
+			}			
+			
+			read1Done.set(true);
+		}		
+	};
+	
+	
+	private class Read2Runnable implements Runnable
+	{
+		public void run()
+		{
+			File file;
+			while ((file = filesToRead2.poll()) != null || !read1Done.get())
+			{
+				if (file != null)
+				{
+					byte bytes[] = dataStore.getData(file.getSessionId(), file.getId());
+					if (file.checkData(bytes) == false)
+					{
+						failures.incrementAndGet();
+					}	
+					read2Count.incrementAndGet();
+					bytesRead.addAndGet(bytes.length);
+				}
+								
+				try
+				{
+					Thread.sleep(random.nextInt(SLEEP_MAX));
+				}
+				catch (InterruptedException e)
+				{
+					e.printStackTrace();
+				}							
+			}
+			
+			read2Done.set(true);			
+		}
+	};
+	
+	private void doTestDataStore()
+	{
+		System.out.println("Starting...");
+		long start = System.currentTimeMillis();
+		
+		for (int i = 0; i < THREAD_COUNT; ++i)
+		{
+			new Thread(new SaveRunnable()).start();
+		}
+		
+		for (int i = 0; i < THREAD_COUNT; ++i)
+		{
+			new Thread(new Read1Runnable()).start();
+		}
+		
+		for (int i = 0; i < THREAD_COUNT; ++i)
+		{
+			new Thread(new Read2Runnable()).start();
+		}
+		
+		while(!(read1Done.get() && read2Done.get() && saveDone.get()))
+		{
+			try
+			{
+				Thread.sleep(5);
+			}
+			catch (InterruptedException e)
+			{
+				e.printStackTrace();
+			}
+		}
+
+		long duration = System.currentTimeMillis() - start;
+		
+		System.out.println("Took: " + duration + " ms");
+		System.out.println("Save: " + saveCount.intValue() + " files, " + bytesWritten.get() +" bytes");
+		System.out.println("Read: " + (read1Count.get() + read2Count.get()) + " files, " + bytesRead.get() + " bytes");
+
+		System.out.println("Average save time (ns): " + (double) saveTime.get() / (double) saveCount.get());
+		
+		assertEquals(0, failures.get());
+		
+		for (String s : sessionCounter.keySet())
+		{
+			dataStore.removeData(s);
+		}		
+	}
+	
+	public void test1()
+	{
+		generateFiles();		
+		
+		dataStore = new DiskDataStore("app1", MAX_SIZE_PER_SESSION, FILE_CHANNEL_POOL_CAPACITY);
+		dataStore = new AsynchronousDataStore(dataStore);
+		
+		doTestDataStore();
+		
+		dataStore.destroy();
+	}
+
+
+}

Added: wicket/trunk/wicket/src/test/java/org/apache/wicket/ng/page/persistent/disk/PageWindowManagerTest.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/test/java/org/apache/wicket/ng/page/persistent/disk/PageWindowManagerTest.java?rev=823984&view=auto
==============================================================================
--- wicket/trunk/wicket/src/test/java/org/apache/wicket/ng/page/persistent/disk/PageWindowManagerTest.java (added)
+++ wicket/trunk/wicket/src/test/java/org/apache/wicket/ng/page/persistent/disk/PageWindowManagerTest.java Sun Oct 11 00:02:25 2009
@@ -0,0 +1,146 @@
+/*
+ * 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.page.persistent.disk;
+
+import junit.framework.TestCase;
+
+import org.apache.wicket.ng.page.persistent.disk.PageWindowManager.PageWindow;
+
+/**
+ * @author Matej Knopp
+ */
+public class PageWindowManagerTest extends TestCase
+{
+	/**
+	 * 
+	 */
+	public void testAddRemove()
+	{
+		PageWindowManager manager = new PageWindowManager(300);
+		PageWindow window;
+
+		window = manager.createPageWindow(1, 50);
+		assertWindow(window, 1, 0, 50);
+
+		window = manager.createPageWindow(2, 40);
+		assertWindow(window, 2, 50, 40);
+
+		assertEquals(manager.getTotalSize(), 90);
+
+		window = manager.createPageWindow(2, 30);
+		assertWindow(window, 2, 50, 30);
+		assertEquals(manager.getTotalSize(), 80);
+
+		manager.removePage(2);
+		assertEquals(manager.getTotalSize(), 50);
+
+		window = manager.createPageWindow(3, 30);
+		assertWindow(window, 3, 50, 30);
+		assertEquals(manager.getTotalSize(), 80);
+	}
+
+	/**
+	 * 
+	 */
+	public void testPageWindowCycle()
+	{
+		PageWindowManager manager = new PageWindowManager(100);
+		PageWindow window;
+
+		window = manager.createPageWindow(1, 30);
+
+		window = manager.createPageWindow(2, 30);
+
+		window = manager.createPageWindow(3, 30);
+
+		assertWindow(window, 3, 60, 30);
+
+		window = manager.createPageWindow(4, 30);
+
+		assertWindow(window, 4, 90, 30);
+
+		// should start at the beginging
+
+		window = manager.createPageWindow(5, 20);
+
+		assertWindow(window, 5, 0, 20);
+
+		assertNull(manager.getPageWindow(1));
+
+		window = manager.getPageWindow(2);
+		assertWindow(window, 2, 30, 30);
+
+		window = manager.createPageWindow(6, 10);
+
+		assertWindow(window, 6, 20, 10);
+
+		window = manager.getPageWindow(2);
+		assertWindow(window, 2, 30, 30);
+
+		window = manager.createPageWindow(6, 30);
+		assertWindow(window, 6, 20, 30);
+
+		assertNull(manager.getPageWindow(2));
+		assertNotNull(manager.getPageWindow( 3));
+
+		window = manager.createPageWindow(6, 60);
+		assertWindow(window, 6, 20, 60);
+
+		assertNull(manager.getPageWindow(3));
+
+		window = manager.createPageWindow(7, 20);
+		assertWindow(window,7, 80, 20);
+
+		assertNotNull(manager.getPageWindow( 7));
+
+		// should start at the beginning again
+
+		window = manager.createPageWindow(8, 10);
+		assertWindow(window, 8, 0, 10);
+
+		assertNull(manager.getPageWindow(5));
+		assertNotNull(manager.getPageWindow(6));
+
+		window = manager.createPageWindow( 9, 20);
+		assertWindow(window, 9, 10, 20);
+
+		assertNull(manager.getPageWindow(6));
+		assertNotNull(manager.getPageWindow(7));
+
+		window = manager.createPageWindow(10, 20);
+		assertWindow(window,10, 30, 20);
+
+		assertNull(manager.getPageWindow(6));
+		assertNotNull(manager.getPageWindow(7));
+		
+		// make sure when replacing a page that's not last the old "instance" is
+		// not valid anymore
+
+		manager.createPageWindow(8, 10);
+
+		window = manager.getPageWindow(8);
+		assertWindow(window, 8, 50, 10);
+	}
+
+
+	private void assertWindow(PageWindow window, int pageId, int filePartOffset, int filePartSize)
+	{
+		assertTrue(window.getPageId() == pageId && 
+				window.getFilePartOffset() == filePartOffset &&
+				window.getFilePartSize() == filePartSize);
+	}
+}

Added: 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=823984&view=auto
==============================================================================
--- wicket/trunk/wicket/src/test/java/org/apache/wicket/ng/request/UrlTest.java (added)
+++ wicket/trunk/wicket/src/test/java/org/apache/wicket/ng/request/UrlTest.java Sun Oct 11 00:02:25 2009
@@ -0,0 +1,234 @@
+/*
+ * 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.request;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.apache.wicket.ng.request.Url;
+import org.apache.wicket.ng.request.Url.QueryParameter;
+
+/**
+ * @author Matej Knopp
+ * @author Igor Vaynberg
+ */
+
+// TODO test removeleadingsegments,prependleadingsegments
+public class UrlTest extends TestCase
+{
+	private void checkSegments(Url url, String... segments)
+	{
+		assertEquals(Arrays.asList(segments), url.getSegments());
+	}
+
+	private void checkQueryParams(Url url, String... params)
+	{
+		List<QueryParameter> list = new ArrayList<QueryParameter>();
+		for (int i = 0; i < params.length; i += 2)
+		{
+			QueryParameter p = new QueryParameter(params[i], params[i + 1]);
+			list.add(p);
+		}
+
+		assertEquals(list, url.getQueryParameters());
+	}
+
+	/**
+	 * 
+	 */
+	public void testParse1()
+	{
+		String s = "foo/bar/baz?a=4&b=5";
+		Url url = Url.parse(s);
+		checkSegments(url, "foo", "bar", "baz");
+		checkQueryParams(url, "a", "4", "b", "5");
+	}
+
+	/**
+	 * 
+	 */
+	public void testParse2()
+	{
+		String s = "foo/bar//baz?=4&6";
+		Url url = Url.parse(s);
+		checkSegments(url, "foo", "bar", "", "baz");
+		checkQueryParams(url, "", "4", "6", "");
+	}
+
+	/**
+	 * 
+	 */
+	public void testParse3()
+	{
+		String s = "//foo/bar/";
+		Url url = Url.parse(s);
+		checkSegments(url, "", "", "foo", "bar", "");
+		checkQueryParams(url);
+	}
+
+	/**
+	 * 
+	 */
+	public void testParse4()
+	{
+		String s = "/foo/bar//";
+		Url url = Url.parse(s);
+		checkSegments(url, "", "foo", "bar", "", "");
+		checkQueryParams(url);
+	}
+
+	/**
+	 * 
+	 */
+	public void testParse5()
+	{
+		String s = "foo/b%3Dr/b%26z/x%3F?a=b&x%3F%264=y%3Dz";
+		Url url = Url.parse(s);
+		checkSegments(url, "foo", "b=r", "b&z", "x?");
+		checkQueryParams(url, "a", "b", "x?&4", "y=z");
+	}
+
+	/**
+	 * 
+	 */
+	public void testParse6()
+	{
+		String s = "";
+		Url url = Url.parse(s);
+		checkSegments(url);
+		checkQueryParams(url);
+	}
+
+	/**
+	 * 
+	 */
+	public void testParse7()
+	{
+		String s = "?a=b";
+		Url url = Url.parse(s);
+		checkSegments(url);
+		checkQueryParams(url, "a", "b");
+	}
+	
+	/**
+	 * 
+	 */
+	public void testParse8()
+	{
+		String s = "/";
+		Url url = Url.parse(s);
+		checkSegments(url, "", "");
+		checkQueryParams(url);
+	}
+	
+	/**
+	 * 
+	 */
+	public void testParse9()
+	{
+		String s = "/?a=b";
+		Url url = Url.parse(s);
+		checkSegments(url, "", "");
+		checkQueryParams(url, "a", "b");
+	}
+
+	/**
+	 * 
+	 */
+	public void testRender1()
+	{
+		Url url = new Url();
+		url.getSegments().add("foo");
+		url.getSegments().add("b=r");
+		url.getSegments().add("b&z");
+		url.getSegments().add("x?");
+		url.setQueryParameter("a", "b");
+		url.setQueryParameter("x?&4", "y=z");
+
+		assertEquals("foo/b=r/b&z/x%3F?a=b&x?%264=y%3Dz", url.toString());
+	}
+
+	/**
+	 * 
+	 */
+	public void testRender2()
+	{
+		String s = "/absolute/url";
+		Url url = Url.parse(s);
+		assertEquals(url.toString(), s);
+	}
+	
+	/**
+	 * 
+	 */
+	public void testRender3()
+	{
+		String s = "//absolute/url";
+		Url url = Url.parse(s);
+		assertEquals(url.toString(), s);
+	}
+	
+	/**
+	 * 
+	 */
+	public void testRender4()
+	{
+		String s = "/";
+		Url url = Url.parse(s);
+		assertEquals(url.toString(), s);
+	}
+
+	/**
+	 * 
+	 */
+	public void testAbsolute1()
+	{
+		Url url = Url.parse("abc/efg");
+		assertFalse(url.isAbsolute());
+	}
+	
+	/**
+	 * 
+	 */
+	public void testAbsolute2()
+	{
+		Url url = Url.parse("");
+		assertFalse(url.isAbsolute());
+	}
+	
+	/**
+	 * 
+	 */
+	public void testAbsolute3()
+	{
+		Url url = Url.parse("/");
+		assertTrue(url.isAbsolute());
+	}
+	
+	/**
+	 * 
+	 */
+	public void testAbsolute4()
+	{
+		Url url = Url.parse("/abc/efg");
+		assertTrue(url.isAbsolute());
+	}
+
+}

Added: wicket/trunk/wicket/src/test/java/org/apache/wicket/ng/request/cycle/RequestHandlerStackTest.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/test/java/org/apache/wicket/ng/request/cycle/RequestHandlerStackTest.java?rev=823984&view=auto
==============================================================================
--- wicket/trunk/wicket/src/test/java/org/apache/wicket/ng/request/cycle/RequestHandlerStackTest.java (added)
+++ wicket/trunk/wicket/src/test/java/org/apache/wicket/ng/request/cycle/RequestHandlerStackTest.java Sun Oct 11 00:02:25 2009
@@ -0,0 +1,365 @@
+/*
+ * 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.request.cycle;
+
+import junit.framework.TestCase;
+
+import org.apache.wicket.ng.request.RequestHandler;
+import org.apache.wicket.ng.request.response.Response;
+
+/**
+ * 
+ * @author Matej Knopp
+ */
+public class RequestHandlerStackTest extends TestCase
+{
+
+    /**
+     * Construct.
+     */
+    public RequestHandlerStackTest()
+    {
+    }
+
+    private Response newResponse()
+    {
+        return new Response()
+        {
+            @Override
+            public void write(byte[] array)
+            {
+            }
+
+            @Override
+            public void write(CharSequence sequence)
+            {
+            }
+
+            @Override
+            public String encodeURL(String url)
+            {
+                return null;
+            }
+        };
+    }
+
+    private RequestHandlerStack newStack(Response response)
+    {
+        return new RequestHandlerStack(response)
+        {
+            @Override
+            protected RequestCycle getRequestCycle()
+            {
+                return null;
+            }
+        };
+    }
+
+    private boolean testFlag1;
+    private boolean testFlag2;
+    private boolean testFlag3;
+    private boolean testFlag4;
+
+    private boolean detachedFlag1;
+    private boolean detachedFlag2;
+    private boolean detachedFlag3;
+    private boolean detachedFlag4;
+
+    private void initFlags()
+    {
+        testFlag1 = true;
+        testFlag2 = true;
+        testFlag3 = true;
+        testFlag4 = true;
+
+        detachedFlag1 = false;
+        detachedFlag2 = false;
+        detachedFlag3 = false;
+        detachedFlag4 = false;
+    }
+
+    /**
+	 * 
+	 */
+    public void test1()
+    {
+        initFlags();
+
+        final Response originalResponse = newResponse();
+
+        final RequestHandlerStack stack = newStack(originalResponse);
+
+        final RequestHandler handler3 = new RequestHandler()
+        {
+            public void respond(RequestCycle requestCycle)
+            {
+                testFlag3 = false;
+            }
+
+            public void detach(RequestCycle requestCycle)
+            {
+                detachedFlag3 = true;
+            }
+        };
+
+        final RequestHandler handler2 = new RequestHandler()
+        {
+            public void respond(RequestCycle requestCycle)
+            {
+                testFlag2 = false;
+
+                stack.replaceCurrentRequestHandler(handler3);
+
+                // this code must not be executed
+                testFlag2 = true;
+            }
+
+            public void detach(RequestCycle requestCycle)
+            {
+                detachedFlag2 = true;
+            }
+        };
+
+        final RequestHandler handler1 = new RequestHandler()
+        {
+            public void respond(RequestCycle requestCycle)
+            {
+                testFlag1 = false;
+
+                Response resp = newResponse();
+                stack.setResponse(resp);
+                stack.executeRequestHandler(handler2);
+                assertEquals(stack.getResponse(), resp);
+
+                // this code must be executed
+                testFlag1 = true;
+            }
+
+            public void detach(RequestCycle requestCycle)
+            {
+                detachedFlag1 = true;
+            }
+        };
+
+        stack.executeRequestHandler(handler1);
+
+        assertEquals(stack.getResponse(), originalResponse);
+
+        stack.detach();
+
+        assertTrue(testFlag1);
+        assertFalse(testFlag2);
+        assertFalse(testFlag3);
+
+        assertTrue(detachedFlag1);
+        assertTrue(detachedFlag2);
+        assertTrue(detachedFlag3);
+    }
+
+    /**
+	 * 
+	 */
+    public void test2()
+    {
+        initFlags();
+
+        final Response originalResponse = newResponse();
+        final RequestHandlerStack stack = newStack(originalResponse);
+
+        final RequestHandler handler4 = new RequestHandler()
+        {
+            public void respond(RequestCycle requestCycle)
+            {
+                testFlag4 = false;
+
+                assertEquals(stack.getResponse(), originalResponse);
+
+                stack.setResponse(newResponse());
+            }
+
+            public void detach(RequestCycle requestCycle)
+            {
+                detachedFlag4 = true;
+            }
+        };
+
+        final RequestHandler handler3 = new RequestHandler()
+        {
+            public void respond(RequestCycle requestCycle)
+            {
+                testFlag3 = false;
+                stack.setResponse(newResponse());
+                stack.replaceAllRequestHandlers(handler4);
+                // code must not be reached
+                testFlag3 = true;
+            }
+
+            public void detach(RequestCycle requestCycle)
+            {
+                detachedFlag3 = true;
+            }
+        };
+
+        final RequestHandler handler2 = new RequestHandler()
+        {
+            public void respond(RequestCycle requestCycle)
+            {
+                testFlag2 = false;
+                stack.setResponse(newResponse());
+                stack.executeRequestHandler(handler3);
+                // code must not be reached
+                testFlag2 = true;
+            }
+
+            public void detach(RequestCycle requestCycle)
+            {
+                detachedFlag2 = true;
+            }
+        };
+
+        RequestHandler handler1 = new RequestHandler()
+        {
+            public void respond(RequestCycle requestCycle)
+            {
+                testFlag1 = false;
+                stack.setResponse(newResponse());
+                stack.executeRequestHandler(handler2);
+
+                // code must not be reached
+                testFlag1 = true;
+            }
+
+            public void detach(RequestCycle requestCycle)
+            {
+                detachedFlag1 = true;
+            }
+        };
+
+        stack.executeRequestHandler(handler1);
+
+        assertEquals(stack.getResponse(), originalResponse);
+
+        stack.detach();
+
+        assertFalse(testFlag1);
+        assertFalse(testFlag2);
+        assertFalse(testFlag3);
+        assertFalse(testFlag4);
+
+        assertTrue(detachedFlag1);
+        assertTrue(detachedFlag2);
+        assertTrue(detachedFlag3);
+        assertTrue(detachedFlag4);
+    }
+    
+    
+    /**
+	 * 
+	 */
+    public void test3()
+    {
+        initFlags();
+
+        final Response originalResponse = newResponse();
+        final RequestHandlerStack stack = newStack(originalResponse);
+
+        final RequestHandler handler4 = new RequestHandler()
+        {
+            public void respond(RequestCycle requestCycle)
+            {
+                testFlag4 = true;
+
+                stack.setResponse(newResponse());
+            }
+
+            public void detach(RequestCycle requestCycle)
+            {
+                detachedFlag4 = true;
+            }
+        };
+
+        final RequestHandler handler3 = new RequestHandler()
+        {
+            public void respond(RequestCycle requestCycle)
+            {
+                testFlag3 = false;
+                stack.scheduleRequestHandlerAfterCurrent(handler4);
+
+                // make sure that handler4's respond method is fired after this one ends
+                testFlag4 = false;
+                
+                
+                // code must be be reached
+                testFlag3 = true;
+            }
+
+            public void detach(RequestCycle requestCycle)
+            {
+                detachedFlag3 = true;
+            }
+        };
+
+        final RequestHandler handler2 = new RequestHandler()
+        {
+            public void respond(RequestCycle requestCycle)
+            {
+                testFlag2 = false;
+                stack.executeRequestHandler(handler3);
+                // code must be reached
+                testFlag2 = true;
+            }
+
+            public void detach(RequestCycle requestCycle)
+            {
+                detachedFlag2 = true;
+            }
+        };
+
+        RequestHandler handler1 = new RequestHandler()
+        {
+            public void respond(RequestCycle requestCycle)
+            {
+                testFlag1 = false;
+                stack.executeRequestHandler(handler2);
+
+                // code must be reached
+                testFlag1 = true;
+            }
+
+            public void detach(RequestCycle requestCycle)
+            {
+                detachedFlag1 = true;
+            }
+        };
+
+        stack.executeRequestHandler(handler1);
+
+        assertEquals(stack.getResponse(), originalResponse);
+
+        stack.detach();
+
+        assertTrue(testFlag1);
+        assertTrue(testFlag2);
+        assertTrue(testFlag3);
+        assertTrue(testFlag4);
+
+        assertTrue(detachedFlag1);
+        assertTrue(detachedFlag2);
+        assertTrue(detachedFlag3);
+        assertTrue(detachedFlag4);
+    }
+}

Added: wicket/trunk/wicket/src/test/java/org/apache/wicket/ng/request/cycle/UrlRendererTest.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/test/java/org/apache/wicket/ng/request/cycle/UrlRendererTest.java?rev=823984&view=auto
==============================================================================
--- wicket/trunk/wicket/src/test/java/org/apache/wicket/ng/request/cycle/UrlRendererTest.java (added)
+++ wicket/trunk/wicket/src/test/java/org/apache/wicket/ng/request/cycle/UrlRendererTest.java Sun Oct 11 00:02:25 2009
@@ -0,0 +1,95 @@
+/*
+ * 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.request.cycle;
+
+import junit.framework.TestCase;
+
+import org.apache.wicket.ng.request.Url;
+import org.apache.wicket.ng.request.cycle.UrlRenderer;
+
+/**
+ * @author MAtej Knopp
+ */
+public class UrlRendererTest extends TestCase
+{
+	/**
+	 * 
+	 */
+	public void test1()
+	{
+		UrlRenderer r1 = new UrlRenderer(Url.parse("foo/bar/baz?a=b"));
+		assertEquals("xyz?x=y", r1.renderUrl(Url.parse("foo/bar/xyz?x=y")));
+		assertEquals("baz/xyz?x=y", r1.renderUrl(Url.parse("foo/bar/baz/xyz?x=y")));
+		assertEquals("../aaa/xyz?x=y", r1.renderUrl(Url.parse("foo/aaa/xyz?x=y")));
+		assertEquals("../../bbb/aaa/xyz?x=y", r1.renderUrl(Url.parse("bbb/aaa/xyz?x=y")));
+	}
+	
+	/**
+	 * 
+	 */
+	public void test2()
+	{
+		UrlRenderer r1 = new UrlRenderer(Url.parse("foo/bar/baz?a=b"));
+		assertEquals("../../foo?x=y", r1.renderUrl(Url.parse("foo?x=y")));
+		assertEquals("../../aaa?x=y", r1.renderUrl(Url.parse("aaa?x=y")));
+	}
+	
+	/**
+	 * 
+	 */
+	public void test3()
+	{
+		UrlRenderer r1 = new UrlRenderer(Url.parse("?a=b"));
+		assertEquals("a/b/c?x=y", r1.renderUrl(Url.parse("a/b/c?x=y")));
+	}
+	
+	/**
+	 * 
+	 */
+	public void test5()
+	{
+		UrlRenderer r1 = new UrlRenderer(Url.parse("url"));
+		assertEquals("url?1", r1.renderUrl(Url.parse("url?1")));	
+	}
+	
+	/**
+	 * 
+	 */
+	public void test6()
+	{
+		UrlRenderer r1 = new UrlRenderer(Url.parse("url/"));
+		assertEquals("x?1", r1.renderUrl(Url.parse("url/x?1")));
+	}
+	
+	/**
+	 * 
+	 */
+	public void test7()
+	{
+		UrlRenderer r1 = new UrlRenderer(Url.parse("MyTestPage/indexed1/indexed2/indexed3?10-27.ILinkListener-l2&p1=v1"));
+		assertEquals("../../../MyTestPage?10", r1.renderUrl(Url.parse("MyTestPage?10")));
+	}
+	
+	/**
+	 * 
+	 */
+	public void test8()
+	{
+		UrlRenderer r1 = new UrlRenderer(Url.parse("en/first-test-page?16-1.ILinkListener-l1"));
+		assertEquals("first-test-page/indexed1/indexed2/indexed3?p1=v1", r1.renderUrl(Url.parse("en/first-test-page/indexed1/indexed2/indexed3?p1=v1")));
+	}
+}

Added: wicket/trunk/wicket/src/test/java/org/apache/wicket/ng/request/mapper/AbstractEncoderTest.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/test/java/org/apache/wicket/ng/request/mapper/AbstractEncoderTest.java?rev=823984&view=auto
==============================================================================
--- wicket/trunk/wicket/src/test/java/org/apache/wicket/ng/request/mapper/AbstractEncoderTest.java (added)
+++ wicket/trunk/wicket/src/test/java/org/apache/wicket/ng/request/mapper/AbstractEncoderTest.java Sun Oct 11 00:02:25 2009
@@ -0,0 +1,67 @@
+/*
+ * 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.request.mapper;
+
+import junit.framework.TestCase;
+
+import org.apache.wicket.ng.markup.html.link.ILinkListener;
+import org.apache.wicket.ng.request.Request;
+import org.apache.wicket.ng.request.Url;
+import org.apache.wicket.ng.request.component.RequestablePage;
+import org.apache.wicket.ng.request.listener.RequestListenerInterface;
+
+/**
+ * @author Matej Knopp
+ */
+public abstract class AbstractEncoderTest extends TestCase
+{
+
+	/**
+	 * Construct.
+	 */
+	public AbstractEncoderTest()
+	{
+	}
+
+	protected TestMapperContext context = new TestMapperContext();
+
+	@Override
+	protected void setUp() throws Exception
+	{
+		// inititalize the interface
+		@SuppressWarnings("unused")
+		RequestListenerInterface i = ILinkListener.INTERFACE;
+	}
+
+	protected Request getRequest(final Url url)
+	{
+		return new Request()
+		{
+			@Override
+			public Url getUrl()
+			{
+				return url;
+			}			
+		};
+	}
+
+	protected void checkPage(RequestablePage page, int id)
+	{
+		assertEquals(id, page.getPageId());
+	}
+
+}

Added: wicket/trunk/wicket/src/test/java/org/apache/wicket/ng/request/mapper/AbstractResourceReferenceEncoderTest.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/test/java/org/apache/wicket/ng/request/mapper/AbstractResourceReferenceEncoderTest.java?rev=823984&view=auto
==============================================================================
--- wicket/trunk/wicket/src/test/java/org/apache/wicket/ng/request/mapper/AbstractResourceReferenceEncoderTest.java (added)
+++ wicket/trunk/wicket/src/test/java/org/apache/wicket/ng/request/mapper/AbstractResourceReferenceEncoderTest.java Sun Oct 11 00:02:25 2009
@@ -0,0 +1,129 @@
+/*
+ * 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.request.mapper;
+
+import java.util.Locale;
+
+import org.apache.wicket.ng.resource.Resource;
+import org.apache.wicket.ng.resource.ResourceReference;
+
+/**
+ * @author Matej Knopp
+ */
+public abstract class AbstractResourceReferenceEncoderTest extends AbstractEncoderTest
+{
+
+	/**
+	 * Construct.
+	 */
+	public AbstractResourceReferenceEncoderTest()
+	{
+	}
+
+	protected final Resource resource1 = new Resource()
+	{
+		private static final long serialVersionUID = 1L;
+
+		public void respond(Attributes attributes)
+		{
+		}
+	};
+	
+	protected final Resource resource2 = new Resource()
+	{
+		private static final long serialVersionUID = 1L;
+
+		public void respond(Attributes attributes)
+		{
+		}
+	};
+	
+	protected final Resource resource3 = new Resource()
+	{
+		private static final long serialVersionUID = 1L;
+
+		public void respond(Attributes attributes)
+		{
+		}
+	};
+	
+	protected final Resource resource4 = new Resource()
+	{
+		private static final long serialVersionUID = 1L;
+
+		public void respond(Attributes attributes)
+		{
+		}
+	};
+	
+	protected String CLASS_NAME = AbstractResourceReferenceEncoderTest.class.getName();
+
+	protected ResourceReference reference1 = new ResourceReference(
+		AbstractResourceReferenceEncoderTest.class, "reference1", null, null)
+	{
+		private static final long serialVersionUID = 1L;
+
+		public Resource getResource()
+		{
+			return resource1;
+		};
+	};
+	
+	protected ResourceReference reference2 = new ResourceReference(
+		AbstractResourceReferenceEncoderTest.class, "reference2/name2", new Locale("en", "en"), null)
+	{
+		private static final long serialVersionUID = 1L;
+
+		public Resource getResource()
+		{
+			return resource2;
+		};
+	};
+	
+	protected ResourceReference reference3 = new ResourceReference(
+		AbstractResourceReferenceEncoderTest.class, "reference3", null, "style")
+	{
+		private static final long serialVersionUID = 1L;
+
+		public Resource getResource()
+		{
+			return resource3;
+		};
+	};
+	
+	protected ResourceReference reference4 = new ResourceReference(
+		AbstractResourceReferenceEncoderTest.class, "reference4", Locale.ENGLISH, "style")
+	{
+		private static final long serialVersionUID = 1L;
+
+		public Resource getResource()
+		{
+			return resource4;
+		};
+	};
+
+	@Override
+	protected void setUp() throws Exception
+	{
+		super.setUp();
+
+		context.getResourceReferenceRegistry().registerResourceReference(reference1);
+		context.getResourceReferenceRegistry().registerResourceReference(reference2);
+		context.getResourceReferenceRegistry().registerResourceReference(reference3);
+		context.getResourceReferenceRegistry().registerResourceReference(reference4);
+	}
+}

Added: wicket/trunk/wicket/src/test/java/org/apache/wicket/ng/request/mapper/BookmarkableEncoderTest.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/test/java/org/apache/wicket/ng/request/mapper/BookmarkableEncoderTest.java?rev=823984&view=auto
==============================================================================
--- wicket/trunk/wicket/src/test/java/org/apache/wicket/ng/request/mapper/BookmarkableEncoderTest.java (added)
+++ wicket/trunk/wicket/src/test/java/org/apache/wicket/ng/request/mapper/BookmarkableEncoderTest.java Sun Oct 11 00:02:25 2009
@@ -0,0 +1,406 @@
+/*
+ * 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.request.mapper;
+
+import org.apache.wicket.ng.MockPage;
+import org.apache.wicket.ng.markup.html.link.ILinkListener;
+import org.apache.wicket.ng.request.RequestHandler;
+import org.apache.wicket.ng.request.Url;
+import org.apache.wicket.ng.request.component.PageParameters;
+import org.apache.wicket.ng.request.component.RequestableComponent;
+import org.apache.wicket.ng.request.component.RequestablePage;
+import org.apache.wicket.ng.request.handler.PageAndComponentProvider;
+import org.apache.wicket.ng.request.handler.PageProvider;
+import org.apache.wicket.ng.request.handler.PageRequestHandler;
+import org.apache.wicket.ng.request.handler.impl.BookmarkableListenerInterfaceRequestHandler;
+import org.apache.wicket.ng.request.handler.impl.BookmarkablePageRequestHandler;
+import org.apache.wicket.ng.request.handler.impl.ListenerInterfaceRequestHandler;
+import org.apache.wicket.ng.request.handler.impl.RenderPageRequestHandler;
+import org.apache.wicket.ng.request.mapper.BookmarkableMapper;
+import org.apache.wicket.ng.request.mapper.MapperContext;
+import org.apache.wicket.ng.request.mapper.StalePageException;
+
+/**
+ * @author Matej Knopp
+ */
+public class BookmarkableEncoderTest extends AbstractEncoderTest
+{
+
+    /**
+     * Construct.
+     */
+    public BookmarkableEncoderTest()
+    {
+    }
+
+    private BookmarkableMapper encoder = new BookmarkableMapper()
+    {
+        @Override
+        protected MapperContext getContext()
+        {
+            return context;
+        }
+    };
+
+    private static final String PAGE_CLASS_NAME = MockPage.class.getName();
+
+    /**
+	 * 
+	 */
+    public void testDecode1()
+    {
+        Url url = Url.parse("wicket/bookmarkable/" + PAGE_CLASS_NAME);
+        RequestHandler handler = encoder.mapRequest(getRequest(url));
+
+        assertTrue(handler instanceof RenderPageRequestHandler);
+        RequestablePage page = ((RenderPageRequestHandler)handler).getPage();
+        assertEquals(PAGE_CLASS_NAME, page.getClass().getName());
+        assertEquals(0, page.getPageParameters().getIndexedParamsCount());
+        assertTrue(page.getPageParameters().getNamedParameterKeys().isEmpty());
+    }
+
+    /**
+	 * 
+	 */
+    public void testDecode2()
+    {
+        Url url = Url.parse("wicket/bookmarkable/" + PAGE_CLASS_NAME + "/indexed1?a=b&b=c");
+        RequestHandler handler = encoder.mapRequest(getRequest(url));
+
+        assertTrue(handler instanceof RenderPageRequestHandler);
+        RequestablePage page = ((RenderPageRequestHandler)handler).getPage();
+        assertEquals(PAGE_CLASS_NAME, page.getClass().getName());
+
+        PageParameters p = page.getPageParameters();
+        assertEquals(1, p.getIndexedParamsCount());
+        assertEquals("indexed1", p.getIndexedParameter(0).toString());
+
+        assertEquals(2, p.getNamedParameterKeys().size());
+        assertEquals("b", p.getNamedParameter("a").toString());
+        assertEquals("c", p.getNamedParameter("b").toString());
+    }
+
+    /**
+	 * 
+	 */
+    public void testDecode3()
+    {
+        Url url = Url.parse("wicket/bookmarkable/" + PAGE_CLASS_NAME + "?15");
+        RequestHandler handler = encoder.mapRequest(getRequest(url));
+
+        assertTrue(handler instanceof RenderPageRequestHandler);
+        RequestablePage page = ((RenderPageRequestHandler)handler).getPage();
+        checkPage(page, 15);
+    }
+
+    /**
+	 * 
+	 */
+    public void testDecode4()
+    {
+        Url url = Url.parse("wicket/bookmarkable/" + PAGE_CLASS_NAME + "/i1/i2?15&a=b&b=c");
+        RequestHandler handler = encoder.mapRequest(getRequest(url));
+
+        assertTrue(handler instanceof RenderPageRequestHandler);
+        RequestablePage page = ((RenderPageRequestHandler)handler).getPage();
+        checkPage(page, 15);
+
+        PageParameters p = page.getPageParameters();
+        assertEquals(2, p.getIndexedParamsCount());
+        assertEquals("i1", p.getIndexedParameter(0).toString());
+        assertEquals("i2", p.getIndexedParameter(1).toString());
+
+        assertEquals(2, p.getNamedParameterKeys().size());
+        assertEquals("b", p.getNamedParameter("a").toString());
+        assertEquals("c", p.getNamedParameter("b").toString());
+    }
+
+    /**
+	 * 
+	 */
+    public void testDecode5()
+    {
+        Url url = Url.parse("wicket/bookmarkable/" + PAGE_CLASS_NAME + "?15-ILinkListener-foo-bar");
+        RequestHandler handler = encoder.mapRequest(getRequest(url));
+
+        assertTrue(handler instanceof ListenerInterfaceRequestHandler);
+
+        ListenerInterfaceRequestHandler h = (ListenerInterfaceRequestHandler)handler;
+
+        RequestablePage page = h.getPage();
+        checkPage(page, 15);
+
+        assertEquals(ILinkListener.INTERFACE, h.getListenerInterface());
+        assertEquals("foo:bar", h.getComponent().getPath());
+        assertNull(h.getBehaviorIndex());
+    }
+
+    /**
+	 * 
+	 */
+    public void testDecode6()
+    {
+        Url url = Url.parse("wicket/bookmarkable/" + PAGE_CLASS_NAME +
+                "/i1/i2?15-ILinkListener-foo-bar&a=b&b=c");
+        RequestHandler handler = encoder.mapRequest(getRequest(url));
+
+        assertTrue(handler instanceof ListenerInterfaceRequestHandler);
+        ListenerInterfaceRequestHandler h = (ListenerInterfaceRequestHandler)handler;
+
+        RequestablePage page = h.getPage();
+        checkPage(page, 15);
+
+        assertEquals(ILinkListener.INTERFACE, h.getListenerInterface());
+        assertEquals("foo:bar", h.getComponent().getPath());
+
+        PageParameters p = page.getPageParameters();
+        assertEquals(2, p.getIndexedParamsCount());
+        assertEquals("i1", p.getIndexedParameter(0).toString());
+        assertEquals("i2", p.getIndexedParameter(1).toString());
+
+        assertEquals(2, p.getNamedParameterKeys().size());
+        assertEquals("b", p.getNamedParameter("a").toString());
+        assertEquals("c", p.getNamedParameter("b").toString());
+    }
+
+    /**
+	 * 
+	 */
+    public void testDecode7()
+    {
+        Url url = Url.parse("wicket/bookmarkable/" + PAGE_CLASS_NAME +
+                "?15-ILinkListener.4-foo-bar");
+        RequestHandler handler = encoder.mapRequest(getRequest(url));
+
+        assertTrue(handler instanceof ListenerInterfaceRequestHandler);
+
+        ListenerInterfaceRequestHandler h = (ListenerInterfaceRequestHandler)handler;
+
+        RequestablePage page = h.getPage();
+        checkPage(page, 15);
+
+        assertEquals(ILinkListener.INTERFACE, h.getListenerInterface());
+        assertEquals("foo:bar", h.getComponent().getPath());
+        assertEquals((Object)4, h.getBehaviorIndex());
+    }
+
+    /**
+	 * 
+	 */
+    public void testDecode8()
+    {
+        Url url = Url.parse("wicket/bookmarkable/" + PAGE_CLASS_NAME +
+                "/i1/i2?15-5.ILinkListener-foo-bar&a=b&b=c");
+
+        context.setNextPageRenderCount(5);
+
+        RequestHandler handler = encoder.mapRequest(getRequest(url));
+
+        assertTrue(handler instanceof ListenerInterfaceRequestHandler);
+        ListenerInterfaceRequestHandler h = (ListenerInterfaceRequestHandler)handler;
+
+        RequestablePage page = h.getPage();
+        assertEquals(page.getRenderCount(), 5);
+    }
+
+    /**
+	 * 
+	 */
+    public void testDecode9()
+    {
+        Url url = Url.parse("wicket/bookmarkable/" + PAGE_CLASS_NAME +
+                "/i1/i2?15-5.ILinkListener-foo-bar&a=b&b=c");
+
+        context.setNextPageRenderCount(6);
+
+        try
+        {
+            RequestHandler handler = encoder.mapRequest(getRequest(url));
+
+            ((PageRequestHandler)handler).getPage();
+
+            // should never get here
+            assertFalse(true);
+        }
+        catch (StalePageException e)
+        {
+
+        }
+    }
+
+    /**
+	 * 
+	 */
+    public void testEncode1()
+    {
+        PageProvider provider = new PageProvider(MockPage.class, new PageParameters());
+        provider.setPageSource(context);
+        RequestHandler handler = new BookmarkablePageRequestHandler(provider);
+        Url url = encoder.mapHandler(handler);
+        assertEquals("wicket/bookmarkable/" + PAGE_CLASS_NAME, url.toString());
+    }
+
+    /**
+	 * 
+	 */
+    public void testEncode2()
+    {
+        PageParameters parameters = new PageParameters();
+        parameters.setIndexedParameter(0, "i1");
+        parameters.setIndexedParameter(1, "i2");
+        parameters.setNamedParameter("a", "b");
+        parameters.setNamedParameter("b", "c");
+        PageProvider provider = new PageProvider(MockPage.class, parameters);
+        provider.setPageSource(context);
+        RequestHandler handler = new BookmarkablePageRequestHandler(provider);
+        Url url = encoder.mapHandler(handler);
+        assertEquals("wicket/bookmarkable/" + PAGE_CLASS_NAME + "/i1/i2?a=b&b=c", url.toString());
+    }
+
+    /**
+	 * 
+	 */
+    public void testEncode3()
+    {
+        PageParameters parameters = new PageParameters();
+        parameters.setIndexedParameter(0, "i1");
+        parameters.setIndexedParameter(1, "i2");
+        parameters.setNamedParameter("a", "b");
+        parameters.setNamedParameter("b", "c");
+
+        PageProvider provider = new PageProvider(MockPage.class, parameters);
+        provider.setPageSource(context);
+        RequestHandler handler = new BookmarkablePageRequestHandler(provider);
+        Url url = encoder.mapHandler(handler);
+
+        assertEquals("wicket/bookmarkable/" + PAGE_CLASS_NAME + "/i1/i2?a=b&b=c", url.toString());
+    }
+
+    /**
+	 * 
+	 */
+    public void testEncode4()
+    {
+        MockPage page = new MockPage(15);
+        page.getPageParameters().setIndexedParameter(0, "i1");
+        page.getPageParameters().setIndexedParameter(1, "i2");
+        page.getPageParameters().setNamedParameter("a", "b");
+        page.getPageParameters().setNamedParameter("b", "c");
+        page.setCreatedBookmarkable(true);
+
+        PageProvider provider = new PageProvider(page);
+        RequestHandler handler = new RenderPageRequestHandler(provider);
+        Url url = encoder.mapHandler(handler);
+
+        assertEquals("wicket/bookmarkable/" + PAGE_CLASS_NAME + "/i1/i2?15&a=b&b=c", url.toString());
+    }
+
+    /**
+	 * 
+	 */
+    public void testEncode5()
+    {
+        MockPage page = new MockPage(15);
+        page.getPageParameters().setIndexedParameter(0, "i1");
+        page.getPageParameters().setIndexedParameter(1, "i2");
+        page.getPageParameters().setNamedParameter("a", "b");
+        page.getPageParameters().setNamedParameter("b", "c");
+
+        page.setCreatedBookmarkable(false);
+
+        PageProvider provider = new PageProvider(page);
+        RequestHandler handler = new RenderPageRequestHandler(provider);
+        Url url = encoder.mapHandler(handler);
+
+        // never allow bookmarkable render url for page that has not been created by bookmarkable
+        // URL
+
+        assertNull(url);
+    }
+
+    /**
+	 * 
+	 */
+    public void testEncode6()
+    {
+        MockPage page = new MockPage(15);
+        page.getPageParameters().setIndexedParameter(0, "i1");
+        page.getPageParameters().setIndexedParameter(1, "i2");
+        page.getPageParameters().setNamedParameter("a", "b");
+        page.getPageParameters().setNamedParameter("b", "c");
+
+        // shouldn't make any difference for BookmarkableListenerInterfaceRequestHandler,
+        // as this explicitely says the url must be bookmarkable
+        page.setCreatedBookmarkable(false);
+
+        RequestableComponent c = page.get("foo:bar");
+
+        PageAndComponentProvider provider = new PageAndComponentProvider(page, c);
+        RequestHandler handler = new BookmarkableListenerInterfaceRequestHandler(provider,
+                ILinkListener.INTERFACE);
+
+        Url url = encoder.mapHandler(handler);
+
+        assertEquals("wicket/bookmarkable/" + PAGE_CLASS_NAME +
+                "/i1/i2?15-0.ILinkListener-foo-bar&a=b&b=c", url.toString());
+    }
+
+    /**
+	 * 
+	 */
+    public void testEncode7()
+    {
+        MockPage page = new MockPage(15);
+        page.getPageParameters().setIndexedParameter(0, "i1");
+        page.getPageParameters().setIndexedParameter(1, "i2");
+        page.getPageParameters().setNamedParameter("a", "b");
+        page.getPageParameters().setNamedParameter("b", "c");
+
+        // shouldn't make any difference for BookmarkableListenerInterfaceRequestHandler,
+        // as this explicitely says the url must be bookmarkable
+        page.setCreatedBookmarkable(false);
+
+        RequestableComponent c = page.get("foo:bar");
+
+        PageAndComponentProvider provider = new PageAndComponentProvider(page, c);
+        RequestHandler handler = new BookmarkableListenerInterfaceRequestHandler(provider,
+                ILinkListener.INTERFACE, 4);
+
+        Url url = encoder.mapHandler(handler);
+
+        assertEquals("wicket/bookmarkable/" + PAGE_CLASS_NAME +
+                "/i1/i2?15-0.ILinkListener.4-foo-bar&a=b&b=c", url.toString());
+    }
+
+    /**
+	 * 
+	 */
+    public void testEncode8()
+    {
+        MockPage page = new MockPage(15);
+        page.setBookmarkable(true);
+        page.setCreatedBookmarkable(true);
+        page.setPageStateless(true);
+
+        PageProvider provider = new PageProvider(page);
+        RequestHandler handler = new RenderPageRequestHandler(provider);
+
+        Url url = encoder.mapHandler(handler);
+
+        assertEquals("wicket/bookmarkable/" + PAGE_CLASS_NAME, url.toString());
+    }
+}

Added: wicket/trunk/wicket/src/test/java/org/apache/wicket/ng/request/mapper/MountedMapperTest.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/test/java/org/apache/wicket/ng/request/mapper/MountedMapperTest.java?rev=823984&view=auto
==============================================================================
--- wicket/trunk/wicket/src/test/java/org/apache/wicket/ng/request/mapper/MountedMapperTest.java (added)
+++ wicket/trunk/wicket/src/test/java/org/apache/wicket/ng/request/mapper/MountedMapperTest.java Sun Oct 11 00:02:25 2009
@@ -0,0 +1,529 @@
+/*
+ * 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.request.mapper;
+
+import org.apache.wicket.ng.MockPage;
+import org.apache.wicket.ng.markup.html.link.ILinkListener;
+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.component.PageParameters;
+import org.apache.wicket.ng.request.component.RequestableComponent;
+import org.apache.wicket.ng.request.component.RequestablePage;
+import org.apache.wicket.ng.request.handler.PageAndComponentProvider;
+import org.apache.wicket.ng.request.handler.PageProvider;
+import org.apache.wicket.ng.request.handler.PageRequestHandler;
+import org.apache.wicket.ng.request.handler.impl.BookmarkableListenerInterfaceRequestHandler;
+import org.apache.wicket.ng.request.handler.impl.BookmarkablePageRequestHandler;
+import org.apache.wicket.ng.request.handler.impl.ListenerInterfaceRequestHandler;
+import org.apache.wicket.ng.request.handler.impl.RenderPageRequestHandler;
+import org.apache.wicket.ng.request.mapper.MapperContext;
+import org.apache.wicket.ng.request.mapper.MountedMapper;
+import org.apache.wicket.ng.request.mapper.StalePageException;
+
+/**
+ * @author Matej Knopp
+ */
+public class MountedMapperTest extends AbstractEncoderTest
+{
+
+    /**
+     * Construct.
+     */
+    public MountedMapperTest()
+    {
+    }
+
+    private MountedMapper encoder = new MountedMapper("/some/mount/path", MockPage.class)
+    {
+        @Override
+        protected MapperContext getContext()
+        {
+            return context;
+        }
+    };
+
+    private MountedMapper placeholderEncoder = new MountedMapper("/some/${param1}/path/${param2}",
+            MockPage.class)
+    {
+        @Override
+        protected MapperContext getContext()
+        {
+            return context;
+        }
+    };
+
+    /**
+	 * 
+	 */
+    public void testDecode1()
+    {
+        Url url = Url.parse("some/mount/path");
+        RequestHandler handler = encoder.mapRequest(getRequest(url));
+
+        assertTrue(handler instanceof RenderPageRequestHandler);
+        RequestablePage page = ((RenderPageRequestHandler)handler).getPage();
+
+        assertEquals(0, page.getPageParameters().getIndexedParamsCount());
+        assertTrue(page.getPageParameters().getNamedParameterKeys().isEmpty());
+    }
+
+    /**
+	 * 
+	 */
+    public void testDecode2()
+    {
+        Url url = Url.parse("some/mount/path/indexed1?a=b&b=c");
+        RequestHandler handler = encoder.mapRequest(getRequest(url));
+
+        assertTrue(handler instanceof RenderPageRequestHandler);
+        RequestablePage page = ((RenderPageRequestHandler)handler).getPage();
+
+        PageParameters p = page.getPageParameters();
+        assertEquals(1, p.getIndexedParamsCount());
+        assertEquals("indexed1", p.getIndexedParameter(0).toString());
+
+        assertEquals(2, p.getNamedParameterKeys().size());
+        assertEquals("b", p.getNamedParameter("a").toString());
+        assertEquals("c", p.getNamedParameter("b").toString());
+    }
+
+    /**
+	 * 
+	 */
+    public void testDecode3()
+    {
+        Url url = Url.parse("some/mount/path?15");
+        RequestHandler handler = encoder.mapRequest(getRequest(url));
+
+        assertTrue(handler instanceof RenderPageRequestHandler);
+        RequestablePage page = ((RenderPageRequestHandler)handler).getPage();
+        checkPage(page, 15);
+    }
+
+    /**
+	 * 
+	 */
+    public void testDecode4()
+    {
+        Url url = Url.parse("some/mount/path/i1/i2?15&a=b&b=c");
+        RequestHandler handler = encoder.mapRequest(getRequest(url));
+
+        assertTrue(handler instanceof RenderPageRequestHandler);
+        RequestablePage page = ((RenderPageRequestHandler)handler).getPage();
+        checkPage(page, 15);
+
+        PageParameters p = page.getPageParameters();
+        assertEquals(2, p.getIndexedParamsCount());
+        assertEquals("i1", p.getIndexedParameter(0).toString());
+        assertEquals("i2", p.getIndexedParameter(1).toString());
+
+        assertEquals(2, p.getNamedParameterKeys().size());
+        assertEquals("b", p.getNamedParameter("a").toString());
+        assertEquals("c", p.getNamedParameter("b").toString());
+    }
+
+    /**
+	 * 
+	 */
+    public void testDecode5()
+    {
+        Url url = Url.parse("some/mount/path?15-ILinkListener-foo-bar");
+        RequestHandler handler = encoder.mapRequest(getRequest(url));
+
+        assertTrue(handler instanceof ListenerInterfaceRequestHandler);
+
+        ListenerInterfaceRequestHandler h = (ListenerInterfaceRequestHandler)handler;
+
+        RequestablePage page = h.getPage();
+        checkPage(page, 15);
+
+        assertEquals(ILinkListener.INTERFACE, h.getListenerInterface());
+        assertEquals("foo:bar", h.getComponent().getPath());
+        assertNull(h.getBehaviorIndex());
+    }
+
+    /**
+	 * 
+	 */
+    public void testDecode6()
+    {
+        Url url = Url.parse("some/mount/path/i1/i2?15-ILinkListener-foo-bar&a=b&b=c");
+        RequestHandler handler = encoder.mapRequest(getRequest(url));
+
+        assertTrue(handler instanceof ListenerInterfaceRequestHandler);
+        ListenerInterfaceRequestHandler h = (ListenerInterfaceRequestHandler)handler;
+
+        RequestablePage page = h.getPage();
+        checkPage(page, 15);
+
+        assertEquals(ILinkListener.INTERFACE, h.getListenerInterface());
+        assertEquals("foo:bar", h.getComponent().getPath());
+
+        PageParameters p = page.getPageParameters();
+        assertEquals(2, p.getIndexedParamsCount());
+        assertEquals("i1", p.getIndexedParameter(0).toString());
+        assertEquals("i2", p.getIndexedParameter(1).toString());
+
+        assertEquals(2, p.getNamedParameterKeys().size());
+        assertEquals("b", p.getNamedParameter("a").toString());
+        assertEquals("c", p.getNamedParameter("b").toString());
+    }
+
+    /**
+	 * 
+	 */
+    public void testDecode7()
+    {
+        Url url = Url.parse("some/mount/path?15-ILinkListener.4-foo-bar");
+        RequestHandler handler = encoder.mapRequest(getRequest(url));
+
+        assertTrue(handler instanceof ListenerInterfaceRequestHandler);
+
+        ListenerInterfaceRequestHandler h = (ListenerInterfaceRequestHandler)handler;
+
+        RequestablePage page = h.getPage();
+        checkPage(page, 15);
+
+        assertEquals(ILinkListener.INTERFACE, h.getListenerInterface());
+        assertEquals("foo:bar", h.getComponent().getPath());
+        assertEquals((Object)4, h.getBehaviorIndex());
+    }
+
+    /**
+	 * 
+	 */
+    public void testDecode8()
+    {
+        Url url = Url.parse("some/mmount/path?15-ILinkListener.4-foo-bar");
+        RequestHandler handler = encoder.mapRequest(getRequest(url));
+
+        assertNull(handler);
+    }
+
+    /**
+	 * 
+	 */
+    public void testDecode9()
+    {
+        // capture the home page
+        Url url = Url.parse("");
+        RequestHandler handler = encoder.mapRequest(getRequest(url));
+        assertTrue(handler instanceof RenderPageRequestHandler);
+    }
+
+    /**
+	 * 
+	 */
+    public void testDecode10()
+    {
+        Url url = Url.parse("some/mount/path?15-5.ILinkListener.4-foo-bar");
+        context.setNextPageRenderCount(5);
+        RequestHandler handler = encoder.mapRequest(getRequest(url));
+
+        assertTrue(handler instanceof ListenerInterfaceRequestHandler);
+
+        ListenerInterfaceRequestHandler h = (ListenerInterfaceRequestHandler)handler;
+
+        RequestablePage page = h.getPage();
+        assertEquals(5, page.getRenderCount());
+    }
+
+    /**
+	 * 
+	 */
+    public void testDecode11()
+    {
+        Url url = Url.parse("some/mount/path?15-5.ILinkListener.4-foo-bar");
+        context.setNextPageRenderCount(7);
+
+        try
+        {
+            RequestHandler handler = encoder.mapRequest(getRequest(url));
+
+            ((PageRequestHandler)handler).getPage();
+
+            // should never get here
+            assertTrue(false);
+        }
+        catch (StalePageException e)
+        {
+
+        }
+    }
+
+    /**
+	 * 
+	 */
+    public void testEncode1()
+    {
+        PageProvider provider = new PageProvider(MockPage.class, new PageParameters());
+        provider.setPageSource(context);
+        RequestHandler handler = new BookmarkablePageRequestHandler(provider);
+        Url url = encoder.mapHandler(handler);
+        assertEquals("some/mount/path", url.toString());
+    }
+
+    /**
+	 * 
+	 */
+    public void testEncode2()
+    {
+        PageParameters parameters = new PageParameters();
+        parameters.setIndexedParameter(0, "i1");
+        parameters.setIndexedParameter(1, "i2");
+        parameters.setNamedParameter("a", "b");
+        parameters.setNamedParameter("b", "c");
+        PageProvider provider = new PageProvider(MockPage.class, parameters);
+        provider.setPageSource(context);
+        RequestHandler handler = new BookmarkablePageRequestHandler(provider);
+        Url url = encoder.mapHandler(handler);
+        assertEquals("some/mount/path/i1/i2?a=b&b=c", url.toString());
+    }
+
+    /**
+	 * 
+	 */
+    public void testEncode3()
+    {
+        PageParameters parameters = new PageParameters();
+        parameters.setIndexedParameter(0, "i1");
+        parameters.setIndexedParameter(1, "i2");
+        parameters.setNamedParameter("a", "b");
+        parameters.setNamedParameter("b", "c");
+
+        PageProvider provider = new PageProvider(MockPage.class, parameters);
+        provider.setPageSource(context);
+        RequestHandler handler = new BookmarkablePageRequestHandler(provider);
+        Url url = encoder.mapHandler(handler);
+
+        assertEquals("some/mount/path/i1/i2?a=b&b=c", url.toString());
+    }
+
+    /**
+	 * 
+	 */
+    public void testEncode4()
+    {
+        MockPage page = new MockPage(15);
+        page.getPageParameters().setIndexedParameter(0, "i1");
+        page.getPageParameters().setIndexedParameter(1, "i2");
+        page.getPageParameters().setNamedParameter("a", "b");
+        page.getPageParameters().setNamedParameter("b", "c");
+        page.setCreatedBookmarkable(true);
+
+        PageProvider provider = new PageProvider(page);
+        RequestHandler handler = new RenderPageRequestHandler(provider);
+        Url url = encoder.mapHandler(handler);
+
+        assertEquals("some/mount/path/i1/i2?15&a=b&b=c", url.toString());
+    }
+
+    /**
+	 * 
+	 */
+    public void testEncode5()
+    {
+        MockPage page = new MockPage(15);
+        page.getPageParameters().setIndexedParameter(0, "i1");
+        page.getPageParameters().setIndexedParameter(1, "i2");
+        page.getPageParameters().setNamedParameter("a", "b");
+        page.getPageParameters().setNamedParameter("b", "c");
+
+        page.setCreatedBookmarkable(false);
+
+        PageProvider provider = new PageProvider(page);
+        RequestHandler handler = new RenderPageRequestHandler(provider);
+        Url url = encoder.mapHandler(handler);
+
+        // mounted pages must render mounted url even for page that has not been created by
+        // bookmarkable
+        // URL
+
+        assertEquals("some/mount/path/i1/i2?15&a=b&b=c", url.toString());
+    }
+
+    /**
+	 * 
+	 */
+    public void testEncode6()
+    {
+        MockPage page = new MockPage(15);
+        page.getPageParameters().setIndexedParameter(0, "i1");
+        page.getPageParameters().setIndexedParameter(1, "i2");
+        page.getPageParameters().setNamedParameter("a", "b");
+        page.getPageParameters().setNamedParameter("b", "c");
+        page.setRenderCount(4);
+
+        // shouldn't make any difference for BookmarkableListenerInterfaceRequestHandler,
+        // as this explicitely says the url must be bookmarkable
+        page.setCreatedBookmarkable(false);
+
+        RequestableComponent c = page.get("foo:bar");
+
+        PageAndComponentProvider provider = new PageAndComponentProvider(page, c);
+        RequestHandler handler = new BookmarkableListenerInterfaceRequestHandler(provider,
+                ILinkListener.INTERFACE);
+
+        Url url = encoder.mapHandler(handler);
+
+        assertEquals("some/mount/path/i1/i2?15-4.ILinkListener-foo-bar&a=b&b=c", url.toString());
+    }
+
+    /**
+	 * 
+	 */
+    public void testEncode7()
+    {
+        MockPage page = new MockPage(15);
+        page.getPageParameters().setIndexedParameter(0, "i1");
+        page.getPageParameters().setIndexedParameter(1, "i2");
+        page.getPageParameters().setNamedParameter("a", "b");
+        page.getPageParameters().setNamedParameter("b", "c");
+        page.setRenderCount(5);
+
+        // shouldn't make any difference for BookmarkableListenerInterfaceRequestHandler,
+        // as this explicitely says the url must be bookmarkable
+        page.setCreatedBookmarkable(false);
+
+        RequestableComponent c = page.get("foo:bar");
+
+        PageAndComponentProvider provider = new PageAndComponentProvider(page, c);
+        RequestHandler handler = new BookmarkableListenerInterfaceRequestHandler(provider,
+                ILinkListener.INTERFACE, 4);
+
+        Url url = encoder.mapHandler(handler);
+
+        assertEquals("some/mount/path/i1/i2?15-5.ILinkListener.4-foo-bar&a=b&b=c", url.toString());
+    }
+
+    /**
+	 * 
+	 */
+    public void testEncode8()
+    {
+        MockPage page = new MockPage(15);
+        page.setBookmarkable(true);
+        page.setCreatedBookmarkable(true);
+        page.setPageStateless(true);
+
+        PageProvider provider = new PageProvider(page);
+        RequestHandler handler = new RenderPageRequestHandler(provider);
+
+        Url url = encoder.mapHandler(handler);
+
+        assertEquals("some/mount/path", url.toString());
+    }
+
+    /**
+	 * 
+	 */
+    public void testConstruct1()
+    {
+        try
+        {
+            @SuppressWarnings("unused")
+            RequestMapper e = new MountedMapper("", MockPage.class);
+
+            // should never get here
+            assertFalse(true);
+        }
+        catch (IllegalArgumentException e)
+        {
+            // ok
+        }
+    }
+
+    /**
+	 * 
+	 */
+    public void testConstruct2()
+    {
+        try
+        {
+            @SuppressWarnings("unused")
+            RequestMapper e = new MountedMapper("/", MockPage.class);
+
+            // should never get here
+            assertFalse(true);
+        }
+        catch (IllegalArgumentException e)
+        {
+            // ok
+        }
+    }
+
+    /**
+	 * 
+	 */
+    public void testPlaceholderDecode1()
+    {
+        Url url = Url.parse("some/p1/path/p2");
+        RequestHandler handler = placeholderEncoder.mapRequest(getRequest(url));
+
+        assertTrue(handler instanceof RenderPageRequestHandler);
+        RequestablePage page = ((RenderPageRequestHandler)handler).getPage();
+
+        assertEquals(0, page.getPageParameters().getIndexedParamsCount());
+        assertTrue(page.getPageParameters().getNamedParameterKeys().size() == 2);
+        assertEquals("p1", page.getPageParameters().getNamedParameter("param1").toString());
+        assertEquals("p2", page.getPageParameters().getNamedParameter("param2").toString());
+    }
+
+    /**
+	 * 
+	 */
+    public void testPlaceholderDecode2()
+    {
+        Url url = Url.parse("some/p1/path/p2/indexed1?a=b&b=c");
+        RequestHandler handler = placeholderEncoder.mapRequest(getRequest(url));
+
+        assertTrue(handler instanceof RenderPageRequestHandler);
+        RequestablePage page = ((RenderPageRequestHandler)handler).getPage();
+
+        PageParameters p = page.getPageParameters();
+        assertEquals(1, p.getIndexedParamsCount());
+        assertEquals("indexed1", p.getIndexedParameter(0).toString());
+
+        assertEquals(4, p.getNamedParameterKeys().size());
+        assertEquals("b", p.getNamedParameter("a").toString());
+        assertEquals("c", p.getNamedParameter("b").toString());
+        assertEquals("p1", page.getPageParameters().getNamedParameter("param1").toString());
+        assertEquals("p2", page.getPageParameters().getNamedParameter("param2").toString());
+    }
+
+    /**
+	 * 
+	 */
+    public void testPlaceholderEncode2()
+    {
+        PageParameters parameters = new PageParameters();
+        parameters.setIndexedParameter(0, "i1");
+        parameters.setIndexedParameter(1, "i2");
+        parameters.setNamedParameter("a", "b");
+        parameters.setNamedParameter("b", "c");
+        parameters.setNamedParameter("param1", "p1");
+        parameters.setNamedParameter("param2", "p2");
+
+
+        PageProvider provider = new PageProvider(MockPage.class, parameters);
+        provider.setPageSource(context);
+        RequestHandler handler = new BookmarkablePageRequestHandler(provider);
+        Url url = placeholderEncoder.mapHandler(handler);
+        assertEquals("some/p1/path/p2/i1/i2?a=b&b=c", url.toString());
+    }
+}

Added: wicket/trunk/wicket/src/test/java/org/apache/wicket/ng/request/mapper/PageInstanceMapperTest.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/test/java/org/apache/wicket/ng/request/mapper/PageInstanceMapperTest.java?rev=823984&view=auto
==============================================================================
--- wicket/trunk/wicket/src/test/java/org/apache/wicket/ng/request/mapper/PageInstanceMapperTest.java (added)
+++ wicket/trunk/wicket/src/test/java/org/apache/wicket/ng/request/mapper/PageInstanceMapperTest.java Sun Oct 11 00:02:25 2009
@@ -0,0 +1,213 @@
+/*
+ * 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.request.mapper;
+
+import org.apache.wicket.ng.MockPage;
+import org.apache.wicket.ng.markup.html.link.ILinkListener;
+import org.apache.wicket.ng.request.RequestHandler;
+import org.apache.wicket.ng.request.Url;
+import org.apache.wicket.ng.request.component.RequestableComponent;
+import org.apache.wicket.ng.request.handler.PageAndComponentProvider;
+import org.apache.wicket.ng.request.handler.PageProvider;
+import org.apache.wicket.ng.request.handler.PageRequestHandler;
+import org.apache.wicket.ng.request.handler.impl.ListenerInterfaceRequestHandler;
+import org.apache.wicket.ng.request.handler.impl.RenderPageRequestHandler;
+import org.apache.wicket.ng.request.mapper.MapperContext;
+import org.apache.wicket.ng.request.mapper.PageInstanceMapper;
+import org.apache.wicket.ng.request.mapper.StalePageException;
+
+/**
+ * 
+ * @author Matej Knopp
+ */
+public class PageInstanceMapperTest extends AbstractEncoderTest
+{
+
+    /**
+     * 
+     * Construct.
+     */
+    public PageInstanceMapperTest()
+    {
+    }
+
+    private PageInstanceMapper encoder = new PageInstanceMapper()
+    {
+        @Override
+        protected MapperContext getContext()
+        {
+            return context;
+        }
+    };
+
+    /**
+	 * 
+	 */
+    public void testDecode1()
+    {
+        Url url = Url.parse("wicket/page?4");
+
+        RequestHandler handler = encoder.mapRequest(getRequest(url));
+        assertTrue(handler instanceof RenderPageRequestHandler);
+
+        RenderPageRequestHandler h = (RenderPageRequestHandler)handler;
+        checkPage(h.getPage(), 4);
+    }
+
+    /**
+	 * 
+	 */
+    public void testDecode2()
+    {
+        Url url = Url.parse("wicket/page/ingore/me?4&a=3&b=3");
+
+        RequestHandler handler = encoder.mapRequest(getRequest(url));
+        assertTrue(handler instanceof RenderPageRequestHandler);
+
+        RenderPageRequestHandler h = (RenderPageRequestHandler)handler;
+        checkPage(h.getPage(), 4);
+    }
+
+    /**
+	 * 
+	 */
+    public void testDecode3()
+    {
+        Url url = Url.parse("wicket/page?4-ILinkListener-a-b-c");
+
+        RequestHandler handler = encoder.mapRequest(getRequest(url));
+        assertTrue(handler instanceof ListenerInterfaceRequestHandler);
+
+        ListenerInterfaceRequestHandler h = (ListenerInterfaceRequestHandler)handler;
+        checkPage(h.getPage(), 4);
+        assertEquals(h.getComponent().getPath(), "a:b:c");
+        assertEquals(ILinkListener.INTERFACE, h.getListenerInterface());
+        assertNull(h.getBehaviorIndex());
+    }
+
+    /**
+	 * 
+	 */
+    public void testDecode4()
+    {
+        Url url = Url.parse("wickett/pagee?4-ILinkListener-a:b-c");
+
+        RequestHandler handler = encoder.mapRequest(getRequest(url));
+        assertNull(handler);
+    }
+
+    /**
+	 * 
+	 */
+    public void testDecode5()
+    {
+        Url url = Url.parse("wicket/page?abc");
+
+        RequestHandler handler = encoder.mapRequest(getRequest(url));
+        assertNull(handler);
+    }
+
+    /**
+	 * 
+	 */
+    public void testDecode6()
+    {
+        Url url = Url.parse("wicket/page?4-ILinkListener.5-a-b-c");
+
+        RequestHandler handler = encoder.mapRequest(getRequest(url));
+        assertTrue(handler instanceof ListenerInterfaceRequestHandler);
+
+        ListenerInterfaceRequestHandler h = (ListenerInterfaceRequestHandler)handler;
+        checkPage(h.getPage(), 4);
+        assertEquals(h.getComponent().getPath(), "a:b:c");
+        assertEquals(ILinkListener.INTERFACE, h.getListenerInterface());
+        assertEquals((Object)5, h.getBehaviorIndex());
+    }
+
+    /**
+	 * 
+	 */
+    public void testDecode7()
+    {
+        Url url = Url.parse("wicket/page?4-6.ILinkListener.5-a-b-c");
+
+        context.setNextPageRenderCount(6);
+
+        RequestHandler handler = encoder.mapRequest(getRequest(url));
+        assertTrue(handler instanceof ListenerInterfaceRequestHandler);
+
+        ListenerInterfaceRequestHandler h = (ListenerInterfaceRequestHandler)handler;
+        assertEquals(6, h.getPage().getRenderCount());
+    }
+
+    /**
+	 * 
+	 */
+    public void testDecode8()
+    {
+        Url url = Url.parse("wicket/page?4-6.ILinkListener.5-a-b-c");
+
+        context.setNextPageRenderCount(8);
+
+        try
+        {
+            RequestHandler handler = encoder.mapRequest(getRequest(url));
+
+            ((PageRequestHandler)handler).getPage();
+
+            // should never get here
+            assertFalse(true);
+        }
+        catch (StalePageException e)
+        {
+
+        }
+    }
+
+    /**
+	 * 
+	 */
+    public void testEncode1()
+    {
+        MockPage page = new MockPage(15);
+        PageProvider provider = new PageProvider(page);
+        RequestHandler handler = new RenderPageRequestHandler(provider);
+
+        Url url = encoder.mapHandler(handler);
+        assertEquals("wicket/page?15", url.toString());
+    }
+
+
+    /**
+	 * 
+	 */
+    public void testEncode2()
+    {
+        MockPage page = new MockPage(15);
+        page.setRenderCount(5);
+
+        RequestableComponent c = page.get("a:b:c");
+
+        PageAndComponentProvider provider = new PageAndComponentProvider(page, c);
+        RequestHandler handler = new ListenerInterfaceRequestHandler(provider,
+                ILinkListener.INTERFACE);
+
+        Url url = encoder.mapHandler(handler);
+        assertEquals("wicket/page?15-5.ILinkListener-a-b-c", url.toString());
+    }
+
+}