/*******************************************************************************
 * Copyright (c) 2010 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 java.util.Iterator;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.dom.EnumDeclaration;
import org.eclipse.jdt.core.dom.NormalAnnotation;
import org.eclipse.jpt.common.core.resource.java.JavaResourceEnum;
import org.eclipse.jpt.common.core.resource.java.JavaResourceEnumConstant;
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.JaxbEnumConstant;
import org.eclipse.jpt.jaxb.core.context.JaxbPersistentEnum;
import org.eclipse.jpt.jaxb.core.resource.java.JAXB;
import org.eclipse.jpt.jaxb.core.resource.java.XmlEnumValueAnnotation;
import org.eclipse.jpt.jaxb.core.tests.internal.context.JaxbContextModelTestCase;


@SuppressWarnings("nls")
public class GenericJavaEnumConstantTests extends JaxbContextModelTestCase
{
	
	public GenericJavaEnumConstantTests(String name) {
		super(name);
	}

	private ICompilationUnit createEnumWithXmlEnum() throws Exception {
		return createTestEnum(new DefaultEnumAnnotationWriter() {
			@Override
			public Iterator<String> imports() {
				return new ArrayIterator<String>(JAXB.XML_TYPE);
			}
			@Override
			public void appendEnumAnnotationTo(StringBuilder sb) {
				sb.append("@XmlType").append(CR);
			}
		});
	}
	
	public void testUpdateName() throws Exception {
		createEnumWithXmlEnum();
		
		JaxbPersistentEnum contextEnum = CollectionTools.get(getContextRoot().getPersistentEnums(), 0);
		JaxbEnumConstant contextEnumConstant = CollectionTools.get(contextEnum.getEnumConstants(), 1);
		JavaResourceEnum resourceEnum = contextEnum.getJavaResourceType();
	
		assertEquals("MONDAY", contextEnumConstant.getName());
		
		
		//add a factoryClass member value pair
		AnnotatedElement annotatedElement = this.annotatedElement(resourceEnum);
		annotatedElement.edit(new Member.Editor() {
			public void edit(ModifiedDeclaration declaration) {
				GenericJavaEnumConstantTests.this.changeEnumConstantName((EnumDeclaration) declaration.getDeclaration(), "MONDAY", "MONDAY2");
			}
		});
		contextEnumConstant = CollectionTools.get(contextEnum.getEnumConstants(), 1);
		assertEquals(2, contextEnum.getEnumConstantsSize());
		assertEquals("MONDAY2", contextEnumConstant.getName());
	}

	public void testModifyValue() throws Exception {
		createEnumWithXmlEnum();
		
		JaxbPersistentEnum contextEnum = CollectionTools.get(getContextRoot().getPersistentEnums(), 0);
		JaxbEnumConstant contextEnumConstant = CollectionTools.get(contextEnum.getEnumConstants(), 1);
		JavaResourceEnum resourceEnum = contextEnum.getJavaResourceType();
		JavaResourceEnumConstant resourceEnumConstant = CollectionTools.get(resourceEnum.getEnumConstants(), 1);
		
		assertEquals("MONDAY", contextEnumConstant.getDefaultValue());
		assertEquals("MONDAY", contextEnumConstant.getValue());
		assertNull(contextEnumConstant.getSpecifiedValue());
		
		contextEnumConstant.setSpecifiedValue("foo");
		XmlEnumValueAnnotation enumValueAnnotation = (XmlEnumValueAnnotation) resourceEnumConstant.getAnnotation(XmlEnumValueAnnotation.ANNOTATION_NAME);
		assertEquals("foo", enumValueAnnotation.getValue());
		assertEquals("MONDAY", contextEnumConstant.getDefaultValue());
		assertEquals("foo", contextEnumConstant.getValue());
		assertEquals("foo", contextEnumConstant.getSpecifiedValue());
		
		contextEnumConstant.setSpecifiedValue(null);
		enumValueAnnotation = (XmlEnumValueAnnotation) resourceEnumConstant.getAnnotation(XmlEnumValueAnnotation.ANNOTATION_NAME);
		assertNull(enumValueAnnotation.getValue());
		assertEquals("MONDAY", contextEnumConstant.getDefaultValue());
		assertEquals("MONDAY", contextEnumConstant.getValue());
		assertNull(contextEnumConstant.getSpecifiedValue());
	}
	
	public void testUpdateValue() throws Exception {
		createEnumWithXmlEnum();
		
		JaxbPersistentEnum contextEnum = CollectionTools.get(getContextRoot().getPersistentEnums(), 0);
		JaxbEnumConstant contextEnumConstant = CollectionTools.get(contextEnum.getEnumConstants(), 1);
		JavaResourceEnum resourceEnum = contextEnum.getJavaResourceType();
		JavaResourceEnumConstant resourceEnumConstant = CollectionTools.get(resourceEnum.getEnumConstants(), 1);
		
		assertEquals("MONDAY", contextEnumConstant.getDefaultValue());
		assertEquals("MONDAY", contextEnumConstant.getValue());
		assertNull(contextEnumConstant.getSpecifiedValue());
		
		//add an XmlEnumValue annotation
		AnnotatedElement annotatedElement = this.annotatedElement(resourceEnumConstant);
		annotatedElement.edit(new Member.Editor() {
			public void edit(ModifiedDeclaration declaration) {
				NormalAnnotation enumValueAnnotation = GenericJavaEnumConstantTests.this.addNormalAnnotation(declaration.getDeclaration(), JAXB.XML_ENUM_VALUE);
				GenericJavaEnumConstantTests.this.addMemberValuePair(enumValueAnnotation, JAXB.XML_ENUM_VALUE__VALUE, "foo");
			}
		});

		assertEquals("MONDAY", contextEnumConstant.getDefaultValue());
		assertEquals("foo", contextEnumConstant.getValue());
		assertEquals("foo", contextEnumConstant.getSpecifiedValue());

		annotatedElement.edit(new Member.Editor() {
			public void edit(ModifiedDeclaration declaration) {
				GenericJavaEnumConstantTests.this.removeAnnotation(declaration, JAXB.XML_ENUM_VALUE);
			}
		});
		assertEquals("MONDAY", contextEnumConstant.getDefaultValue());
		assertEquals("MONDAY", contextEnumConstant.getValue());
		assertNull(contextEnumConstant.getSpecifiedValue());
	}

}