/*******************************************************************************
 *  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.oxm;

import org.eclipse.jpt.common.core.resource.xml.JptXmlResource;
import org.eclipse.jpt.jaxb.eclipselink.core.context.ELJaxbContextRoot;
import org.eclipse.jpt.jaxb.eclipselink.core.context.ELJaxbXmlAccessOrder;
import org.eclipse.jpt.jaxb.eclipselink.core.context.ELJaxbXmlAccessType;
import org.eclipse.jpt.jaxb.eclipselink.core.context.oxm.OxmFile;
import org.eclipse.jpt.jaxb.eclipselink.core.context.oxm.OxmXmlBindings;
import org.eclipse.jpt.jaxb.eclipselink.core.resource.oxm.EXmlAccessOrder;
import org.eclipse.jpt.jaxb.eclipselink.core.resource.oxm.EXmlAccessType;
import org.eclipse.jpt.jaxb.eclipselink.core.resource.oxm.EXmlBindings;

public class OxmXmlBindingsTests
		extends OxmContextModelTestCase {
	
	public OxmXmlBindingsTests(String name) {
		super(name);
	}
	
	
	protected void addOxmFile(String fileName, String packageName) throws Exception {
		StringBuffer sb = new StringBuffer();
		sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>").append(CR);
		sb.append("<xml-bindings").append(CR);
		sb.append("    version=\"2.4\"").append(CR);
		sb.append("    xmlns=\"http://www.eclipse.org/eclipselink/xsds/persistence/oxm\"").append(CR);
		sb.append("    xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"").append(CR);
		sb.append("    xsi:schemaLocation=\"http://www.eclipse.org/eclipselink/xsds/persistence/oxm http://www.eclipse.org/eclipselink/xsds/eclipselink_oxm_2_4.xsd\"").append(CR);
		sb.append("    package-name=\"").append(packageName).append("\"").append(CR);
		sb.append("    xml-accessor-type=\"PUBLIC_MEMBER\"").append(CR);
		sb.append("    />").append(CR);
		addOxmFile(fileName, sb);
	}
	
	public void testUpdateAccessType() throws Exception {
		addOxmFile("oxm.xml", "test.oxm");
		ELJaxbContextRoot root = (ELJaxbContextRoot) getJaxbProject().getContextRoot();
		OxmFile oxmFile = root.getOxmFile("test.oxm");
		OxmXmlBindings xmlBindings = oxmFile.getXmlBindings();
		JptXmlResource oxmResource = oxmFile.getOxmResource();
		EXmlBindings eXmlBindings = (EXmlBindings) oxmResource.getRootObject();
		
		// the value is not exactly specified, but since the attribute has a default value, it's "specified"
		assertEquals(EXmlAccessType.PUBLIC_MEMBER, eXmlBindings.getXmlAccessorType());
		assertEquals(ELJaxbXmlAccessType.PUBLIC_MEMBER, xmlBindings.getSpecifiedAccessType());
		assertEquals(ELJaxbXmlAccessType.PUBLIC_MEMBER, xmlBindings.getAccessType());
		
		eXmlBindings.setXmlAccessorType(EXmlAccessType.FIELD);
		oxmResource.save();
		
		assertFileContentsContains("oxm.xml", "xml-accessor-type=\"FIELD\"", true);
		assertEquals(EXmlAccessType.FIELD, eXmlBindings.getXmlAccessorType());
		assertEquals(ELJaxbXmlAccessType.FIELD, xmlBindings.getSpecifiedAccessType());
		assertEquals(ELJaxbXmlAccessType.FIELD, xmlBindings.getAccessType());
		
		eXmlBindings.setXmlAccessorType(EXmlAccessType.NONE);
		oxmResource.save();
		
		assertFileContentsContains("oxm.xml", "xml-accessor-type=\"NONE\"", true);
		assertEquals(EXmlAccessType.NONE, eXmlBindings.getXmlAccessorType());
		assertEquals(ELJaxbXmlAccessType.NONE, xmlBindings.getSpecifiedAccessType());
		assertEquals(ELJaxbXmlAccessType.NONE, xmlBindings.getAccessType());
		
		eXmlBindings.setXmlAccessorType(EXmlAccessType.PROPERTY);
		oxmResource.save();
		
		assertFileContentsContains("oxm.xml", "xml-accessor-type=\"PROPERTY\"", true);
		assertEquals(EXmlAccessType.PROPERTY, eXmlBindings.getXmlAccessorType());
		assertEquals(ELJaxbXmlAccessType.PROPERTY, xmlBindings.getSpecifiedAccessType());
		assertEquals(ELJaxbXmlAccessType.PROPERTY, xmlBindings.getAccessType());
		
		eXmlBindings.setXmlAccessorType(null);
		oxmResource.save();
		
		assertFileContentsContains("oxm.xml", "xml-accessor-type=", false);
		assertNull(eXmlBindings.getXmlAccessorType());
		assertNull(xmlBindings.getSpecifiedAccessType());
		assertEquals(ELJaxbXmlAccessType.PUBLIC_MEMBER, xmlBindings.getAccessType());
	}
	
	public void testModifyAccessType() throws Exception {
		addOxmFile("oxm.xml", "test.oxm");
		ELJaxbContextRoot root = (ELJaxbContextRoot) getJaxbProject().getContextRoot();
		OxmFile oxmFile = root.getOxmFile("test.oxm");
		OxmXmlBindings xmlBindings = oxmFile.getXmlBindings();
		JptXmlResource oxmResource = oxmFile.getOxmResource();
		EXmlBindings eXmlBindings = (EXmlBindings) oxmResource.getRootObject();
		
		// the value is not exactly specified, but since the attribute has a default value, it's "specified"
		assertEquals(EXmlAccessType.PUBLIC_MEMBER, eXmlBindings.getXmlAccessorType());
		assertEquals(ELJaxbXmlAccessType.PUBLIC_MEMBER, xmlBindings.getSpecifiedAccessType());
		assertEquals(ELJaxbXmlAccessType.PUBLIC_MEMBER, xmlBindings.getAccessType());
		
		xmlBindings.setSpecifiedAccessType(ELJaxbXmlAccessType.FIELD);
		oxmResource.save();
		
		assertFileContentsContains("oxm.xml", "xml-accessor-type=\"FIELD\"", true);
		assertEquals(EXmlAccessType.FIELD, eXmlBindings.getXmlAccessorType());
		assertEquals(ELJaxbXmlAccessType.FIELD, xmlBindings.getSpecifiedAccessType());
		assertEquals(ELJaxbXmlAccessType.FIELD, xmlBindings.getAccessType());
		
		xmlBindings.setSpecifiedAccessType(ELJaxbXmlAccessType.NONE);
		oxmResource.save();
		
		assertFileContentsContains("oxm.xml", "xml-accessor-type=\"NONE\"", true);
		assertEquals(EXmlAccessType.NONE, eXmlBindings.getXmlAccessorType());
		assertEquals(ELJaxbXmlAccessType.NONE, xmlBindings.getSpecifiedAccessType());
		assertEquals(ELJaxbXmlAccessType.NONE, xmlBindings.getAccessType());
		
		xmlBindings.setSpecifiedAccessType(ELJaxbXmlAccessType.PROPERTY);
		oxmResource.save();
		
		assertFileContentsContains("oxm.xml", "xml-accessor-type=\"PROPERTY\"", true);
		assertEquals(EXmlAccessType.PROPERTY, eXmlBindings.getXmlAccessorType());
		assertEquals(ELJaxbXmlAccessType.PROPERTY, xmlBindings.getSpecifiedAccessType());
		assertEquals(ELJaxbXmlAccessType.PROPERTY, xmlBindings.getAccessType());
		
		xmlBindings.setSpecifiedAccessType(null);
		oxmResource.save();
		
		assertFileContentsContains("oxm.xml", "xml-accessor-type=", false);
		assertNull(eXmlBindings.getXmlAccessorType());
		assertNull(xmlBindings.getSpecifiedAccessType());
		assertEquals(ELJaxbXmlAccessType.PUBLIC_MEMBER, xmlBindings.getAccessType());
	}
	
	public void testUpdateAccessOrder() throws Exception {
		addOxmFile("oxm.xml", "test.oxm");
		ELJaxbContextRoot root = (ELJaxbContextRoot) getJaxbProject().getContextRoot();
		OxmFile oxmFile = root.getOxmFile("test.oxm");
		OxmXmlBindings xmlBindings = oxmFile.getXmlBindings();
		JptXmlResource oxmResource = oxmFile.getOxmResource();
		EXmlBindings eXmlBindings = (EXmlBindings) oxmResource.getRootObject();
		
		// the value is not exactly specified, but since the attribute has a default value, it's "specified"
		assertEquals(EXmlAccessOrder.UNDEFINED, eXmlBindings.getXmlAccessorOrder());
		assertEquals(ELJaxbXmlAccessOrder.UNDEFINED, xmlBindings.getSpecifiedAccessOrder());
		assertEquals(ELJaxbXmlAccessOrder.UNDEFINED, xmlBindings.getAccessOrder());
		
		eXmlBindings.setXmlAccessorOrder(EXmlAccessOrder.ALPHABETICAL);
		oxmResource.save();
		
		assertFileContentsContains("oxm.xml", "xml-accessor-order=\"ALPHABETICAL\"", true);
		assertEquals(EXmlAccessOrder.ALPHABETICAL, eXmlBindings.getXmlAccessorOrder());
		assertEquals(ELJaxbXmlAccessOrder.ALPHABETICAL, xmlBindings.getSpecifiedAccessOrder());
		assertEquals(ELJaxbXmlAccessOrder.ALPHABETICAL, xmlBindings.getAccessOrder());
		
		eXmlBindings.setXmlAccessorOrder(EXmlAccessOrder.UNDEFINED);
		oxmResource.save();
		
		assertFileContentsContains("oxm.xml", "xml-accessor-order=\"UNDEFINED\"", true);
		assertEquals(EXmlAccessOrder.UNDEFINED, eXmlBindings.getXmlAccessorOrder());
		assertEquals(ELJaxbXmlAccessOrder.UNDEFINED, xmlBindings.getSpecifiedAccessOrder());
		assertEquals(ELJaxbXmlAccessOrder.UNDEFINED, xmlBindings.getAccessOrder());
		
		eXmlBindings.setXmlAccessorOrder(null);
		oxmResource.save();
		
		assertFileContentsContains("oxm.xml", "xml-accessor-order=", false);
		assertNull(eXmlBindings.getXmlAccessorOrder());
		assertNull(xmlBindings.getSpecifiedAccessOrder());
		assertEquals(ELJaxbXmlAccessOrder.UNDEFINED, xmlBindings.getAccessOrder());
	}
	
	public void testModifyAccessOrder() throws Exception {
		addOxmFile("oxm.xml", "test.oxm");
		ELJaxbContextRoot root = (ELJaxbContextRoot) getJaxbProject().getContextRoot();
		OxmFile oxmFile = root.getOxmFile("test.oxm");
		OxmXmlBindings xmlBindings = oxmFile.getXmlBindings();
		JptXmlResource oxmResource = oxmFile.getOxmResource();
		EXmlBindings eXmlBindings = (EXmlBindings) oxmResource.getRootObject();
		
		// the value is not exactly specified, but since the attribute has a default value, it's "specified"
		assertEquals(EXmlAccessOrder.UNDEFINED, eXmlBindings.getXmlAccessorOrder());
		assertEquals(ELJaxbXmlAccessOrder.UNDEFINED, xmlBindings.getSpecifiedAccessOrder());
		assertEquals(ELJaxbXmlAccessOrder.UNDEFINED, xmlBindings.getAccessOrder());
		
		xmlBindings.setSpecifiedAccessOrder(ELJaxbXmlAccessOrder.ALPHABETICAL);
		oxmResource.save();
		
		assertFileContentsContains("oxm.xml", "xml-accessor-order=\"ALPHABETICAL\"", true);
		assertEquals(EXmlAccessOrder.ALPHABETICAL, eXmlBindings.getXmlAccessorOrder());
		assertEquals(ELJaxbXmlAccessOrder.ALPHABETICAL, xmlBindings.getSpecifiedAccessOrder());
		assertEquals(ELJaxbXmlAccessOrder.ALPHABETICAL, xmlBindings.getAccessOrder());
		
		xmlBindings.setSpecifiedAccessOrder(ELJaxbXmlAccessOrder.UNDEFINED);
		oxmResource.save();
		
		assertFileContentsContains("oxm.xml", "xml-accessor-order=\"UNDEFINED\"", true);
		assertEquals(EXmlAccessOrder.UNDEFINED, eXmlBindings.getXmlAccessorOrder());
		assertEquals(ELJaxbXmlAccessOrder.UNDEFINED, xmlBindings.getSpecifiedAccessOrder());
		assertEquals(ELJaxbXmlAccessOrder.UNDEFINED, xmlBindings.getAccessOrder());
		
		xmlBindings.setSpecifiedAccessOrder(null);
		oxmResource.save();
		
		assertFileContentsContains("oxm.xml", "xml-accessor-order=", false);
		assertNull(eXmlBindings.getXmlAccessorOrder());
		assertNull(xmlBindings.getSpecifiedAccessOrder());
		assertEquals(ELJaxbXmlAccessOrder.UNDEFINED, xmlBindings.getAccessOrder());
	}
	
	public void testUpdateXmlMappingMetadataComplete() throws Exception {
		addOxmFile("oxm.xml", "test.oxm");
		ELJaxbContextRoot root = (ELJaxbContextRoot) getJaxbProject().getContextRoot();
		OxmFile oxmFile = root.getOxmFile("test.oxm");
		OxmXmlBindings xmlBindings = oxmFile.getXmlBindings();
		JptXmlResource oxmResource = oxmFile.getOxmResource();
		EXmlBindings eXmlBindings = (EXmlBindings) oxmResource.getRootObject();
		
		// the value is not exactly specified, but since the attribute has a default value, it's "specified"
		assertEquals(Boolean.FALSE, eXmlBindings.getXmlMappingMetadataComplete());
		assertFalse(xmlBindings.isXmlMappingMetadataComplete());
		
		eXmlBindings.setXmlMappingMetadataComplete(Boolean.TRUE);
		oxmResource.save();
		
		assertFileContentsContains("oxm.xml", "xml-mapping-metadata-complete=\"true\"", true);
		assertEquals(Boolean.TRUE, eXmlBindings.getXmlMappingMetadataComplete());
		assertTrue(xmlBindings.isXmlMappingMetadataComplete());
		
		eXmlBindings.setXmlMappingMetadataComplete(null);
		oxmResource.save();
		
		assertFileContentsContains("oxm.xml", "xml-mapping-metadata-complete=", false);
		assertNull(eXmlBindings.getXmlMappingMetadataComplete());
		assertFalse(xmlBindings.isXmlMappingMetadataComplete());
	}
	
	public void testModifyXmlMappingMetadataComplete() throws Exception {
		addOxmFile("oxm.xml", "test.oxm");
		ELJaxbContextRoot root = (ELJaxbContextRoot) getJaxbProject().getContextRoot();
		OxmFile oxmFile = root.getOxmFile("test.oxm");
		OxmXmlBindings xmlBindings = oxmFile.getXmlBindings();
		JptXmlResource oxmResource = oxmFile.getOxmResource();
		EXmlBindings eXmlBindings = (EXmlBindings) oxmResource.getRootObject();
		
		// the value is not exactly specified, but since the attribute has a default value, it's "specified"
		assertEquals(Boolean.FALSE, eXmlBindings.getXmlMappingMetadataComplete());
		assertFalse(xmlBindings.isXmlMappingMetadataComplete());
		
		xmlBindings.setXmlMappingMetadataComplete(true);
		oxmResource.save();
		
		assertFileContentsContains("oxm.xml", "xml-mapping-metadata-complete=\"true\"", true);
		assertEquals(Boolean.TRUE, eXmlBindings.getXmlMappingMetadataComplete());
		assertTrue(xmlBindings.isXmlMappingMetadataComplete());
		
		xmlBindings.setXmlMappingMetadataComplete(false);
		oxmResource.save();
		
		assertFileContentsContains("oxm.xml", "xml-mapping-metadata-complete=", false);
		assertNull(eXmlBindings.getXmlMappingMetadataComplete());
		assertFalse(xmlBindings.isXmlMappingMetadataComplete());
	}
	
	public void testUpdatePackageName() throws Exception {
		addOxmFile("oxm.xml", "test.oxm");
		ELJaxbContextRoot root = (ELJaxbContextRoot) getJaxbProject().getContextRoot();
		OxmFile oxmFile = root.getOxmFile("test.oxm");
		OxmXmlBindings xmlBindings = oxmFile.getXmlBindings();
		JptXmlResource oxmResource = oxmFile.getOxmResource();
		EXmlBindings eXmlBindings = (EXmlBindings) oxmResource.getRootObject();
		
		assertEquals("test.oxm", eXmlBindings.getPackageName());
		assertEquals("test.oxm", xmlBindings.getPackageName());
		
		eXmlBindings.setPackageName("foo");
		oxmResource.save();
		
		assertFileContentsContains("oxm.xml", "package-name=\"foo\"", true);
		assertEquals("foo", eXmlBindings.getPackageName());
		assertEquals("foo", xmlBindings.getPackageName());
		
		eXmlBindings.setPackageName(null);
		oxmResource.save();
		
		assertFileContentsContains("oxm.xml", "package-name=", false);
		assertNull(eXmlBindings.getPackageName());
		assertNull(xmlBindings.getPackageName());
	}
	
	public void testModifyPackageName() throws Exception {
		addOxmFile("oxm.xml", "test.oxm");
		ELJaxbContextRoot root = (ELJaxbContextRoot) getJaxbProject().getContextRoot();
		OxmFile oxmFile = root.getOxmFile("test.oxm");
		OxmXmlBindings xmlBindings = oxmFile.getXmlBindings();
		JptXmlResource oxmResource = oxmFile.getOxmResource();
		EXmlBindings eXmlBindings = (EXmlBindings) oxmResource.getRootObject();
		
		assertEquals("test.oxm", eXmlBindings.getPackageName());
		assertEquals("test.oxm", xmlBindings.getPackageName());
		
		xmlBindings.setPackageName("foo");
		oxmResource.save();
		
		assertFileContentsContains("oxm.xml", "package-name=\"foo\"", true);
		assertEquals("foo", eXmlBindings.getPackageName());
		assertEquals("foo", xmlBindings.getPackageName());
		
		xmlBindings.setPackageName(null);
		oxmResource.save();
		
		assertFileContentsContains("oxm.xml", "package-name=", false);
		assertNull(eXmlBindings.getPackageName());
		assertNull(xmlBindings.getPackageName());
	}
}
