/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.wicket;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;

import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.session.DefaultPageFactory;
import org.apache.wicket.util.tester.WicketTestCase;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

/**
 * Test the Pagefactory
 */
class PageFactoryTest extends WicketTestCase
{
	private DefaultPageFactory factory;

	/**
	 * 
	 */
	@BeforeEach
	void before()
	{
		factory = new DefaultPageFactory();
	}

	/**
	 * Test creating a new page using a class.
	 */
	@Test
	void newPageClass()
	{
		// MyPage0: no constructor at all
		assertEquals(MyPage0.class, factory.newPage(MyPage0.class).getClass());

		// MyPage1 has only a default constructor
		assertEquals(MyPage1.class, factory.newPage(MyPage1.class).getClass());

		// MyPage2: PageParameter parameter constructor only
		// will call PageParameter constructor with parameter = null
		assertEquals(MyPage2.class, factory.newPage(MyPage2.class, null).getClass());

		// MyPage3: Page parameter constructor only
		Exception e = null;
		try
		{
			factory.newPage(MyPage3.class).getClass();
		}
		catch (WicketRuntimeException ex)
		{
			e = ex;
		}
		assertNotNull(e, "MyPage3 should have thrown an exception as it does not have a default or no constructor");

		// MyPage4: Illegal String parameter constructor only
		e = null;
		try
		{
			factory.newPage(MyPage4.class).getClass();
		}
		catch (WicketRuntimeException ex)
		{
			e = ex;
		}
		assertNotNull(e, "MyPage4 should have thrown an exception as it does not have a default or no constructor");

		// MyPage5: PageParameter and default constructor
		assertEquals(MyPage5.class, factory.newPage(MyPage5.class).getClass());


	}

	/**
	 * Test a new page using a class and page parameters.
	 */
	@Test
	void newPageClassPageParameters()
	{
		assertEquals(MyPage0.class, factory.newPage(MyPage0.class, null).getClass());

		// MyPage0: no constructor at all
		assertEquals(MyPage0.class, factory.newPage(MyPage0.class, new PageParameters()).getClass());

		// MyPage1 has only a default constructor
		assertEquals(MyPage1.class, factory.newPage(MyPage1.class, new PageParameters()).getClass());

		// MyPage2: PageParameter parameter constructor only
		assertEquals(MyPage2.class, factory.newPage(MyPage2.class, new PageParameters()).getClass());

		// MyPage3: Page parameter constructor only
		Exception e = null;
		try
		{
			factory.newPage(MyPage3.class, new PageParameters()).getClass();
		}
		catch (WicketRuntimeException ex)
		{
			e = ex;
		}
		assertNotNull(e, "MyPage4 should have thrown an exception as it does not have a default or no constructor");

		// MyPage4: Illegal String parameter constructor only
		e = null;
		try
		{
			factory.newPage(MyPage4.class, new PageParameters()).getClass();
		}
		catch (WicketRuntimeException ex)
		{
			e = ex;
		}
		assertNotNull(e, "MyPage4 should have thrown an exception as it does not have a default or no constructor");

		// MyPage5: PageParameter and default constructor
		assertEquals(MyPage5.class, factory.newPage(MyPage5.class, new PageParameters()).getClass());


	}
}
