// ***************************************************************************************************************************
// * 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.juneau;

import static org.junit.Assert.*;

import java.util.*;

import org.apache.juneau.transform.*;
import org.junit.*;

@SuppressWarnings({"rawtypes","serial"})
public class ClassMetaTest {

	BeanContext bc = BeanContext.DEFAULT;

	//====================================================================================================
	// Map<String,String> field
	//====================================================================================================
	public Map<String,String> fa;

	@Test
	public void testMap() throws Exception {
		ClassMeta t = bc.getClassMeta(this.getClass().getField("fa").getGenericType());
		assertEquals("java.util.Map<java.lang.String,java.lang.String>", t.toString());
		assertTrue(t.isMap());
		assertFalse(t.isCollection());
		assertNull(t.newInstance());
		assertEquals(Map.class, t.getInnerClass());
		assertEquals(String.class, t.getKeyType().getInnerClass());
		assertEquals(String.class, t.getValueType().getInnerClass());
	}

	//====================================================================================================
	// String field
	//====================================================================================================
	public String fb;

	@Test
	public void testString() throws Exception {
		ClassMeta t = bc.getClassMeta(this.getClass().getField("fb").getGenericType());
		assertEquals(String.class, t.getInnerClass());
		t = bc.getClassMeta(this.getClass().getField("fb").getType());
		assertEquals(String.class, t.getInnerClass());
	}

	//====================================================================================================
	// Map<String,Map<String,Integer>> field
	//====================================================================================================
	public Map<String,Map<String,Integer>> fc;

	@Test
	public void testMapWithMapValues() throws Exception {
		ClassMeta t = bc.getClassMeta(this.getClass().getField("fc").getGenericType());
		assertEquals("java.util.Map<java.lang.String,java.util.Map<java.lang.String,java.lang.Integer>>", t.toString());
		t = bc.getClassMeta(this.getClass().getField("fc").getType());
		assertEquals("java.util.Map", t.toString());
	}

	//====================================================================================================
	// List<Map<String,List>> field
	//====================================================================================================
	public List<Map<String,List>> fd;

	@Test
	public void testListWithMapValues() throws Exception {
		ClassMeta t = bc.getClassMeta(this.getClass().getField("fd").getGenericType());
		assertEquals("java.util.List<java.util.Map<java.lang.String,java.util.List>>", t.toString());
	}

	//====================================================================================================
	// List<? extends String> field, List<? super String> field
	//====================================================================================================
	public List<? extends String> fe1;
	public List<? super String> fe2;

	@Test
	public void testListWithUpperBoundGenericEntryTypes() throws Exception {
		ClassMeta t = bc.getClassMeta(this.getClass().getField("fe1").getGenericType());
		assertEquals("java.util.List", t.toString());
		t = bc.getClassMeta(this.getClass().getField("fe2").getGenericType());
		assertEquals("java.util.List", t.toString());
	}

	//====================================================================================================
	// Bean extends HashMap<String,Object> field
	//====================================================================================================
	public class G extends HashMap<String,Object> {}
	public G g;

	@Test
	public void testBeanExtendsMap() throws Exception {
		ClassMeta t = bc.getClassMeta(this.getClass().getField("g").getGenericType());
		assertEquals("org.apache.juneau.ClassMetaTest$G<java.lang.String,java.lang.Object>", t.toString());
		assertTrue(t.isMap());
		assertFalse(t.isCollection());
	}

	//====================================================================================================
	// testSwaps
	// Ensure swaps on parent and child classes are properly detected.
	//====================================================================================================
	@Test
	public void testSwaps() throws Exception {
		BeanContext bc;
		ClassMeta<?> ooo, hi1, hc1, hi2, hc2;
		BeanSession bs;

		bc = BeanContext.DEFAULT;
		bs = bc.createSession();
		ooo = bc.getClassMeta(Object.class);
		hi1 = bc.getClassMeta(HI1.class);
		hc1 = bc.getClassMeta(HC1.class);
		hi2 = bc.getClassMeta(HI2.class);
		hc2 = bc.getClassMeta(HC2.class);
		assertFalse(ooo.hasChildPojoSwaps());
		assertFalse(hi1.hasChildPojoSwaps());
		assertFalse(hc1.hasChildPojoSwaps());
		assertFalse(hi2.hasChildPojoSwaps());
		assertFalse(hc2.hasChildPojoSwaps());
		assertNull(ooo.getPojoSwap(bs));
		assertNull(hi1.getPojoSwap(bs));
		assertNull(hc1.getPojoSwap(bs));
		assertNull(hi2.getPojoSwap(bs));
		assertNull(hc2.getPojoSwap(bs));
		assertEquals(ooo.getSerializedClassMeta(bs).getInnerClass(), Object.class);
		assertEquals(hi1.getSerializedClassMeta(bs).getInnerClass(), HI1.class);
		assertEquals(hc1.getSerializedClassMeta(bs).getInnerClass(), HC1.class);
		assertEquals(hi2.getSerializedClassMeta(bs).getInnerClass(), HI2.class);
		assertEquals(hc2.getSerializedClassMeta(bs).getInnerClass(), HC2.class);

		bc = BeanContext.create().pojoSwaps(HI1Swap.class).build();
		bs = bc.createSession();
		ooo = bc.getClassMeta(Object.class);
		hi1 = bc.getClassMeta(HI1.class);
		hc1 = bc.getClassMeta(HC1.class);
		hi2 = bc.getClassMeta(HI2.class);
		hc2 = bc.getClassMeta(HC2.class);
		assertTrue(ooo.hasChildPojoSwaps());
		assertTrue(hi1.hasChildPojoSwaps());
		assertFalse(hc1.hasChildPojoSwaps());
		assertFalse(hi2.hasChildPojoSwaps());
		assertFalse(hc2.hasChildPojoSwaps());
		assertNull(ooo.getPojoSwap(bs));
		assertEquals(hi1.getPojoSwap(bs).getClass(), HI1Swap.class);
		assertEquals(hc1.getPojoSwap(bs).getClass(), HI1Swap.class);
		assertEquals(hi2.getPojoSwap(bs).getClass(), HI1Swap.class);
		assertEquals(hc2.getPojoSwap(bs).getClass(), HI1Swap.class);
		assertEquals(ooo.getSerializedClassMeta(bs).getInnerClass(), Object.class);
		assertEquals(hi1.getSerializedClassMeta(bs).getInnerClass(), Map.class);
		assertEquals(hc1.getSerializedClassMeta(bs).getInnerClass(), Map.class);
		assertEquals(hi2.getSerializedClassMeta(bs).getInnerClass(), Map.class);
		assertEquals(hc2.getSerializedClassMeta(bs).getInnerClass(), Map.class);

		bc = BeanContext.create().pojoSwaps(HC1Swap.class).build();
		bs = bc.createSession();
		ooo = bc.getClassMeta(Object.class);
		hi1 = bc.getClassMeta(HI1.class);
		hc1 = bc.getClassMeta(HC1.class);
		hi2 = bc.getClassMeta(HI2.class);
		hc2 = bc.getClassMeta(HC2.class);
		assertTrue(ooo.hasChildPojoSwaps());
		assertTrue(hi1.hasChildPojoSwaps());
		assertTrue(hc1.hasChildPojoSwaps());
		assertFalse(hi2.hasChildPojoSwaps());
		assertFalse(hc2.hasChildPojoSwaps());
		assertNull(ooo.getPojoSwap(bs));
		assertNull(hi1.getPojoSwap(bs));
		assertEquals(hc1.getPojoSwap(bs).getClass(), HC1Swap.class);
		assertNull(hi2.getPojoSwap(bs));
		assertEquals(hc2.getPojoSwap(bs).getClass(), HC1Swap.class);
		assertEquals(ooo.getSerializedClassMeta(bs).getInnerClass(), Object.class);
		assertEquals(hi1.getSerializedClassMeta(bs).getInnerClass(), HI1.class);
		assertEquals(hc1.getSerializedClassMeta(bs).getInnerClass(), Map.class);
		assertEquals(hi2.getSerializedClassMeta(bs).getInnerClass(), HI2.class);
		assertEquals(hc2.getSerializedClassMeta(bs).getInnerClass(), Map.class);

		bc = BeanContext.create().pojoSwaps(HI2Swap.class).build();
		bs = bc.createSession();
		ooo = bc.getClassMeta(Object.class);
		hi1 = bc.getClassMeta(HI1.class);
		hc1 = bc.getClassMeta(HC1.class);
		hi2 = bc.getClassMeta(HI2.class);
		hc2 = bc.getClassMeta(HC2.class);
		assertTrue(ooo.hasChildPojoSwaps());
		assertTrue(hi1.hasChildPojoSwaps());
		assertFalse(hc1.hasChildPojoSwaps());
		assertTrue(hi2.hasChildPojoSwaps());
		assertFalse(hc2.hasChildPojoSwaps());
		assertNull(ooo.getPojoSwap(bs));
		assertNull(hi1.getPojoSwap(bs));
		assertNull(hc1.getPojoSwap(bs));
		assertEquals(hi2.getPojoSwap(bs).getClass(), HI2Swap.class);
		assertEquals(hc2.getPojoSwap(bs).getClass(), HI2Swap.class);
		assertEquals(ooo.getSerializedClassMeta(bs).getInnerClass(), Object.class);
		assertEquals(hi1.getSerializedClassMeta(bs).getInnerClass(), HI1.class);
		assertEquals(hc1.getSerializedClassMeta(bs).getInnerClass(), HC1.class);
		assertEquals(hi2.getSerializedClassMeta(bs).getInnerClass(), Map.class);
		assertEquals(hc2.getSerializedClassMeta(bs).getInnerClass(), Map.class);

		bc = BeanContext.create().pojoSwaps(HC2Swap.class).build();
		bs = bc.createSession();
		ooo = bc.getClassMeta(Object.class);
		hi1 = bc.getClassMeta(HI1.class);
		hc1 = bc.getClassMeta(HC1.class);
		hi2 = bc.getClassMeta(HI2.class);
		hc2 = bc.getClassMeta(HC2.class);
		assertTrue(ooo.hasChildPojoSwaps());
		assertTrue(hi1.hasChildPojoSwaps());
		assertTrue(hc1.hasChildPojoSwaps());
		assertTrue(hi2.hasChildPojoSwaps());
		assertTrue(hc2.hasChildPojoSwaps());
		assertNull(ooo.getPojoSwap(bs));
		assertNull(hi1.getPojoSwap(bs));
		assertNull(hc1.getPojoSwap(bs));
		assertNull(hi2.getPojoSwap(bs));
		assertEquals(hc2.getPojoSwap(bs).getClass(), HC2Swap.class);
		assertEquals(ooo.getSerializedClassMeta(bs).getInnerClass(), Object.class);
		assertEquals(hi1.getSerializedClassMeta(bs).getInnerClass(), HI1.class);
		assertEquals(hc1.getSerializedClassMeta(bs).getInnerClass(), HC1.class);
		assertEquals(hi2.getSerializedClassMeta(bs).getInnerClass(), HI2.class);
		assertEquals(hc2.getSerializedClassMeta(bs).getInnerClass(), Map.class);

		bc = BeanContext.create().pojoSwaps(HI1Swap.class,HC1Swap.class,HI2Swap.class, HC2Swap.class).build();
		bs = bc.createSession();
		ooo = bc.getClassMeta(Object.class);
		hi1 = bc.getClassMeta(HI1.class);
		hc1 = bc.getClassMeta(HC1.class);
		hi2 = bc.getClassMeta(HI2.class);
		hc2 = bc.getClassMeta(HC2.class);
		assertTrue(ooo.hasChildPojoSwaps());
		assertTrue(hi1.hasChildPojoSwaps());
		assertTrue(hc1.hasChildPojoSwaps());
		assertTrue(hi2.hasChildPojoSwaps());
		assertTrue(hc2.hasChildPojoSwaps());
		assertNull(ooo.getPojoSwap(bs));
		assertEquals(hi1.getPojoSwap(bs).getClass(), HI1Swap.class);
		assertEquals(hc1.getPojoSwap(bs).getClass(), HI1Swap.class);
		assertEquals(hi2.getPojoSwap(bs).getClass(), HI1Swap.class);
		assertEquals(hc2.getPojoSwap(bs).getClass(), HI1Swap.class);
		assertEquals(ooo.getSerializedClassMeta(bs).getInnerClass(), Object.class);
		assertEquals(hi1.getSerializedClassMeta(bs).getInnerClass(), Map.class);
		assertEquals(hc1.getSerializedClassMeta(bs).getInnerClass(), Map.class);
		assertEquals(hi2.getSerializedClassMeta(bs).getInnerClass(), Map.class);
		assertEquals(hc2.getSerializedClassMeta(bs).getInnerClass(), Map.class);

		bc = BeanContext.create().pojoSwaps(HC2Swap.class,HI2Swap.class,HC1Swap.class, HI1Swap.class).build();
		bs = bc.createSession();
		ooo = bc.getClassMeta(Object.class);
		hi1 = bc.getClassMeta(HI1.class);
		hc1 = bc.getClassMeta(HC1.class);
		hi2 = bc.getClassMeta(HI2.class);
		hc2 = bc.getClassMeta(HC2.class);
		assertTrue(ooo.hasChildPojoSwaps());
		assertTrue(hi1.hasChildPojoSwaps());
		assertTrue(hc1.hasChildPojoSwaps());
		assertTrue(hi2.hasChildPojoSwaps());
		assertTrue(hc2.hasChildPojoSwaps());
		assertNull(ooo.getPojoSwap(bs));
		assertEquals(hi1.getPojoSwap(bs).getClass(), HI1Swap.class);
		assertEquals(hc1.getPojoSwap(bs).getClass(), HC1Swap.class);
		assertEquals(hi2.getPojoSwap(bs).getClass(), HI2Swap.class);
		assertEquals(hc2.getPojoSwap(bs).getClass(), HC2Swap.class);
		assertEquals(ooo.getSerializedClassMeta(bs).getInnerClass(), Object.class);
		assertEquals(hi1.getSerializedClassMeta(bs).getInnerClass(), Map.class);
		assertEquals(hc1.getSerializedClassMeta(bs).getInnerClass(), Map.class);
		assertEquals(hi2.getSerializedClassMeta(bs).getInnerClass(), Map.class);
		assertEquals(hc2.getSerializedClassMeta(bs).getInnerClass(), Map.class);
	}

	public interface HI1 {}
	public class HC1 implements HI1 {}
	public interface HI2 extends HI1 {}
	public class HC2 extends HC1 implements HI2 {}
	public static class HC1Swap extends PojoSwap<HC1,Map> {}
	public static class HI1Swap extends PojoSwap<HI1,Map> {}
	public static class HC2Swap extends PojoSwap<HC2,Map> {}
	public static class HI2Swap extends PojoSwap<HI2,Map> {}
}
