/*******************************************************************************
 *  Copyright (c) 2012  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.eclipselink.core.tests.internal.context.java;

import java.util.Iterator;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jpt.common.core.resource.java.JavaResourceType;
import org.eclipse.jpt.common.core.utility.jdt.AnnotatedElement;
import org.eclipse.jpt.common.core.utility.jdt.Member;
import org.eclipse.jpt.common.core.utility.jdt.ModifiedDeclaration;
import org.eclipse.jpt.common.utility.internal.CollectionTools;
import org.eclipse.jpt.common.utility.internal.iterators.ArrayIterator;
import org.eclipse.jpt.jaxb.core.context.JaxbClass;
import org.eclipse.jpt.jaxb.core.platform.JaxbPlatformDescription;
import org.eclipse.jpt.jaxb.core.resource.java.JAXB;
import org.eclipse.jpt.jaxb.eclipselink.core.ELJaxbPlatform;
import org.eclipse.jpt.jaxb.eclipselink.core.context.java.ELClassMapping;
import org.eclipse.jpt.jaxb.eclipselink.core.context.java.ELXmlDiscriminatorNode;
import org.eclipse.jpt.jaxb.eclipselink.core.resource.java.ELJaxb;
import org.eclipse.jpt.jaxb.eclipselink.core.resource.java.XmlDiscriminatorNodeAnnotation;
import org.eclipse.jpt.jaxb.eclipselink.core.tests.internal.context.ELJaxbContextModelTestCase;


public class ELJavaXmlDiscriminatorNodeTests
		extends ELJaxbContextModelTestCase {
	
	public ELJavaXmlDiscriminatorNodeTests(String name) {
		super(name);
	}
	
	
	@Override
	protected JaxbPlatformDescription getPlatform() {
		return ELJaxbPlatform.VERSION_2_2;
	}
	
	
	private ICompilationUnit createTypeWithXmlDiscriminatorNode() throws Exception {
		return this.createTestType(new DefaultAnnotationWriter() {
			@Override
			public Iterator<String> imports() {
				return new ArrayIterator<String>(JAXB.XML_TYPE, ELJaxb.XML_DISCRIMINATOR_NODE);
			}
			
			@Override
			public void appendTypeAnnotationTo(StringBuilder sb) {
				sb.append("@XmlType").append(CR);
				sb.append("@XmlDiscriminatorNode").append(CR);
			}
		});
	}
	
	
	public void testModifyValue() throws Exception {
		createTypeWithXmlDiscriminatorNode();
		
		JaxbClass jaxbClass = (JaxbClass) CollectionTools.get(getContextRoot().getTypes(), 0);
		JavaResourceType resourceType = jaxbClass.getJavaResourceType();
		ELClassMapping classMapping = (ELClassMapping) jaxbClass.getMapping();
		ELXmlDiscriminatorNode discNode = classMapping.getXmlDiscriminatorNode();
		XmlDiscriminatorNodeAnnotation annotation = 
				(XmlDiscriminatorNodeAnnotation) resourceType.getAnnotation(ELJaxb.XML_DISCRIMINATOR_NODE);
		
		assertNull(annotation.getValue());
		assertNull(discNode.getValue());
		
		discNode.setValue("foo");
		
		assertEquals("foo", annotation.getValue());
		assertEquals("foo", discNode.getValue());
		
		discNode.setValue("");
		
		assertEquals("", annotation.getValue());
		assertEquals("", discNode.getValue());
		
		discNode.setValue(null);
		
		assertNull(annotation.getValue());
		assertNull(discNode.getValue());
	}

	public void testUpdateValue() throws Exception {
		createTypeWithXmlDiscriminatorNode();
		
		JaxbClass jaxbClass = (JaxbClass) CollectionTools.get(getContextRoot().getTypes(), 0);
		JavaResourceType resourceType = jaxbClass.getJavaResourceType();
		ELClassMapping classMapping = (ELClassMapping) jaxbClass.getMapping();
		ELXmlDiscriminatorNode discNode = classMapping.getXmlDiscriminatorNode();
		XmlDiscriminatorNodeAnnotation annotation = 
				(XmlDiscriminatorNodeAnnotation) resourceType.getAnnotation(ELJaxb.XML_DISCRIMINATOR_NODE);
		
		assertNull(annotation.getValue());
		assertNull(discNode.getValue());
		
		AnnotatedElement annotatedElement = this.annotatedElement(resourceType);
		annotatedElement.edit(new Member.Editor() {
			public void edit(ModifiedDeclaration declaration) {
				ELJavaXmlDiscriminatorNodeTests.this.setMemberValuePair(
						declaration, ELJaxb.XML_DISCRIMINATOR_NODE, "foo");
			}
		});
		
		assertEquals("foo", annotation.getValue());
		assertEquals("foo", discNode.getValue());
		
		annotatedElement.edit(new Member.Editor() {
			public void edit(ModifiedDeclaration declaration) {
				ELJavaXmlDiscriminatorNodeTests.this.setMemberValuePair(
						declaration, ELJaxb.XML_DISCRIMINATOR_NODE, "");
			}
		});
		
		assertEquals("", annotation.getValue());
		assertEquals("", discNode.getValue());
		
		annotatedElement.edit(new Member.Editor() {
			public void edit(ModifiedDeclaration declaration) {
				ELJavaXmlDiscriminatorNodeTests.this.removeMemberValuePair(
						declaration, ELJaxb.XML_DISCRIMINATOR_NODE);
			}
		});
		
		assertNull(annotation.getValue());
		assertNull(discNode.getValue());
	}
}
