/*******************************************************************************
 *  Copyright (c) 2011  Oracle. All rights reserved.
 *  This program and the accompanying materials are made available under the
 *  terms of the Eclipse Public License v1.0, which accompanies this distribution
 *  and is available at http://www.eclipse.org/legal/epl-v10.html
 *  
 *  Contributors: 
 *  	Oracle - initial API and implementation
 *******************************************************************************/
package org.eclipse.jpt.jaxb.core.tests.internal.context.java;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.jpt.common.core.tests.internal.projects.TestJavaProject.SourceWriter;
import org.eclipse.jpt.common.utility.internal.CollectionTools;
import org.eclipse.jpt.jaxb.core.context.JaxbClass;
import org.eclipse.jpt.jaxb.core.context.JaxbClassMapping;
import org.eclipse.jpt.jaxb.core.context.JaxbPersistentAttribute;
import org.eclipse.jpt.jaxb.core.resource.java.JAXB;
import org.eclipse.jpt.jaxb.core.tests.internal.context.JaxbContextModelTestCase;


public class GenericJavaPersistentAttributeTests
		extends JaxbContextModelTestCase {
	
	private static String TEST_CLASS_NAME = "TestClass";
	
	public GenericJavaPersistentAttributeTests(String name) {
		super(name);
	}
	
	
	private void createXmlTypeWithVariousAttributes() throws CoreException {
		SourceWriter sourceWriter = new SourceWriter() {
			public void appendSourceTo(StringBuilder sb) {
				sb.append(CR);
				sb.append("import ").append(JAXB.XML_TYPE).append(";").append(CR);
				sb.append("import java.util.List;").append(CR);
				sb.append(CR);
				sb.append("@XmlType").append(CR);
				sb.append("public class ").append(TEST_CLASS_NAME).append("<T extends Number> ").append("{").append(CR);
				sb.append("    public String string;").append(CR);
				sb.append("    public List<String> stringList;").append(CR);
				sb.append("    public String[] stringArray;").append(CR);
				sb.append("    public String[][] stringDoubleArray;").append(CR);
				sb.append("    public T generic;").append(CR);
				sb.append("    public List<T> genericList;").append(CR);
				sb.append("    public T[] genericArray;").append(CR);
				sb.append("    public List<?> wildcardList;").append(CR);
				sb.append("    public byte[] byteArray;").append(CR);
				sb.append("    public List list;").append(CR);
				sb.append("}").append(CR);
			}
		};
		this.javaProject.createCompilationUnit(PACKAGE_NAME, TEST_CLASS_NAME + ".java", sourceWriter);
	}
	
	
	public void testJavaResourceType() throws Exception {
		createXmlTypeWithVariousAttributes();
		JaxbClassMapping classMapping = ((JaxbClass) getContextRoot().getType(PACKAGE_NAME_ + TEST_CLASS_NAME)).getMapping();
		
		// String string
		JaxbPersistentAttribute att = CollectionTools.get(classMapping.getAttributes(), 0);
		assertEquals("java.lang.String", att.getJavaResourceAttributeBaseTypeName());
		assertEquals(false, att.isJavaResourceAttributeCollectionType());
		
		// List<String> stringList
		att = CollectionTools.get(classMapping.getAttributes(), 1);
		assertEquals("java.lang.String", att.getJavaResourceAttributeBaseTypeName());
		assertEquals(true, att.isJavaResourceAttributeCollectionType());
		
		// String[] stringArray
		att = CollectionTools.get(classMapping.getAttributes(), 2);
		assertEquals("java.lang.String", att.getJavaResourceAttributeBaseTypeName());
		assertEquals(true, att.isJavaResourceAttributeCollectionType());
		
		// String[][] stringDoubleArray
		att = CollectionTools.get(classMapping.getAttributes(), 3);
		assertEquals("java.lang.String[][]", att.getJavaResourceAttributeBaseTypeName());
		assertEquals(false, att.isJavaResourceAttributeCollectionType());
		
		// T generic
		att = CollectionTools.get(classMapping.getAttributes(), 4);
		assertEquals("java.lang.Number", att.getJavaResourceAttributeBaseTypeName());
		assertEquals(false, att.isJavaResourceAttributeCollectionType());
		
		// List<T> genericList
		att = CollectionTools.get(classMapping.getAttributes(), 5);
		assertEquals("java.lang.Number", att.getJavaResourceAttributeBaseTypeName());
		assertEquals(true, att.isJavaResourceAttributeCollectionType());
		
		// T[] genericArray
		att = CollectionTools.get(classMapping.getAttributes(), 6);
		assertEquals("java.lang.Number", att.getJavaResourceAttributeBaseTypeName());
		assertEquals(true, att.isJavaResourceAttributeCollectionType());
		
		// List<?> wildcardList
		att = CollectionTools.get(classMapping.getAttributes(), 7);
		assertEquals("java.lang.Object", att.getJavaResourceAttributeBaseTypeName());
		assertEquals(true, att.isJavaResourceAttributeCollectionType());
		
		// byte[] byteArray
		att = CollectionTools.get(classMapping.getAttributes(), 8);
		assertEquals("byte[]", att.getJavaResourceAttributeBaseTypeName());
		assertEquals(false, att.isJavaResourceAttributeCollectionType());
		
		// List list
		att = CollectionTools.get(classMapping.getAttributes(), 9);
		assertEquals("java.lang.Object", att.getJavaResourceAttributeBaseTypeName());
		assertEquals(true, att.isJavaResourceAttributeCollectionType());
	}
}
