// ***************************************************************************************************************************
// * 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.xml;

import static org.junit.Assert.*;

import java.util.*;

import org.apache.juneau.*;
import org.apache.juneau.xml.annotation.*;
import org.junit.*;
import org.junit.runner.*;
import org.junit.runners.*;

/**
 * Verifies that the correct error messages are displayed when you do something wrong with the @Xml annotation.
 */
@RunWith(Parameterized.class)
@SuppressWarnings({})
public class InvalidXmlBeansTest {

	private static final XmlSerializer
		s1 = XmlSerializer.DEFAULT_SQ;

	@Parameterized.Parameters
	public static Collection<Object[]> getParameters() {
		return Arrays.asList(new Object[][] {

			{
				"BeanWithAttrFormat",
				new BeanWithAttrFormat(),
				"org.apache.juneau.xml.InvalidXmlBeansTest$BeanWithAttrFormat: Invalid format specified in @Xml annotation on bean: ATTR.  Must be one of the following: DEFAULT,ATTRS,ELEMENTS,VOID",
			},
			{
				"BeanWithElementFormat",
				new BeanWithElementFormat(),
				"org.apache.juneau.xml.InvalidXmlBeansTest$BeanWithElementFormat: Invalid format specified in @Xml annotation on bean: ELEMENT.  Must be one of the following: DEFAULT,ATTRS,ELEMENTS,VOID",
			},
			{
				"BeanWithCollapsedFormat",
				new BeanWithCollapsedFormat(),
				"org.apache.juneau.xml.InvalidXmlBeansTest$BeanWithCollapsedFormat: Invalid format specified in @Xml annotation on bean: COLLAPSED.  Must be one of the following: DEFAULT,ATTRS,ELEMENTS,VOID",
			},
			{
				"BeanWithMixedFormat",
				new BeanWithMixedFormat(),
				"org.apache.juneau.xml.InvalidXmlBeansTest$BeanWithMixedFormat: Invalid format specified in @Xml annotation on bean: MIXED.  Must be one of the following: DEFAULT,ATTRS,ELEMENTS,VOID",
			},
			{
				"BeanWithMultipleAttrs",
				new BeanWithMultipleAttrs(),
				"org.apache.juneau.xml.InvalidXmlBeansTest$BeanWithMultipleAttrs: Multiple instances of ATTRS properties defined on class.  Only one property can be designated as such.",
			},
			{
				"BeanWithWrongAttrsType",
				new BeanWithWrongAttrsType(),
				"org.apache.juneau.xml.InvalidXmlBeansTest$BeanWithWrongAttrsType: Invalid type for ATTRS property.  Only properties of type Map and bean can be used.",
			},
			{
				"BeanWithMulipleElements",
				new BeanWithMulipleElements(),
				"org.apache.juneau.xml.InvalidXmlBeansTest$BeanWithMulipleElements: Multiple instances of ELEMENTS properties defined on class.  Only one property can be designated as such.",
			},
			{
				"BeanWithWrongElementsType",
				new BeanWithWrongElementsType(),
				"org.apache.juneau.xml.InvalidXmlBeansTest$BeanWithWrongElementsType: Invalid type for ELEMENTS property.  Only properties of type Collection and array can be used.",
			},
			{
				"BeanWithMulipleMixed",
				new BeanWithMulipleMixed(),
				"org.apache.juneau.xml.InvalidXmlBeansTest$BeanWithMulipleMixed: Multiple instances of MIXED properties defined on class.  Only one property can be designated as such.",
			},
			{
				"BeanWithConflictingChildNames",
				new BeanWithConflictingChildNames(),
				"org.apache.juneau.xml.InvalidXmlBeansTest$BeanWithConflictingChildNames: Multiple properties found with the child name 'X'.",
			},
			{
				"BeanWithElementsAndMixed",
				new BeanWithElementsAndMixed(),
				"org.apache.juneau.xml.InvalidXmlBeansTest$BeanWithElementsAndMixed: ELEMENTS and MIXED properties found on the same bean.  Only one property can be designated as such.",
			},
			{
				"BeanWithElementsAndElement",
				new BeanWithElementsAndElement(),
				"org.apache.juneau.xml.InvalidXmlBeansTest$BeanWithElementsAndElement: ELEMENTS and ELEMENT properties found on the same bean.  These cannot be mixed.",
			},
			{
				"BeanWithElementsAndDefault",
				new BeanWithElementsAndDefault(),
				"org.apache.juneau.xml.InvalidXmlBeansTest$BeanWithElementsAndDefault: ELEMENTS and ELEMENT properties found on the same bean.  These cannot be mixed.",
			},
			{
				"BeanWithElementsAndCollapsed",
				new BeanWithElementsAndCollapsed(),
				"org.apache.juneau.xml.InvalidXmlBeansTest$BeanWithElementsAndCollapsed: ELEMENTS and COLLAPSED properties found on the same bean.  These cannot be mixed.",
			},
			{
				"BeanWithChildAndPropNameConflict",
				new BeanWithChildAndPropNameConflict(),
				"org.apache.juneau.xml.InvalidXmlBeansTest$BeanWithChildAndPropNameConflict: Child element name conflicts found with another property.",
			},
		});
	}

	private String label, expected;
	private Object in;

	public InvalidXmlBeansTest(String label, Object in, String expected) throws Exception {
		this.label = label;
		this.in = in;
		this.expected = expected;
	}

	@Test
	public void test() {
		try {
			s1.serialize(in);
			fail(label + ":  Expected exception didn't occur.");
		} catch (Exception e) {
			assertEquals(label + ":  Wrong error message.", expected, e.getLocalizedMessage());
		}
	}

	//-----------------------------------------------------------------------------------------------------------------
	// Test beans
	//-----------------------------------------------------------------------------------------------------------------

	@Xml(format=XmlFormat.ATTR)
	public static class BeanWithAttrFormat {
		public int f1;
	}

	@Xml(format=XmlFormat.ELEMENT)
	public static class BeanWithElementFormat {
		public int f1;
	}

	@Xml(format=XmlFormat.COLLAPSED)
	public static class BeanWithCollapsedFormat {
		public int f1;
	}

	@Xml(format=XmlFormat.MIXED)
	public static class BeanWithMixedFormat {
		public int f1;
	}

	public static class BeanWithMultipleAttrs {
		@Xml(format=XmlFormat.ATTRS)
		public ObjectMap f1;
		@Xml(format=XmlFormat.ATTRS)
		public ObjectMap f2;
	}

	public static class BeanWithWrongAttrsType {
		@Xml(format=XmlFormat.ATTRS)
		public ObjectList f1;
	}

	public static class BeanWithMulipleElements {
		@Xml(format=XmlFormat.ELEMENTS)
		public ObjectList f1;
		@Xml(format=XmlFormat.ELEMENTS)
		public ObjectList f2;
	}

	public static class BeanWithWrongElementsType {
		@Xml(format=XmlFormat.ELEMENTS)
		public ObjectMap f1;
	}

	public static class BeanWithMulipleMixed {
		@Xml(format=XmlFormat.MIXED)
		public ObjectList f1;
		@Xml(format=XmlFormat.MIXED)
		public ObjectList f2;
	}

	public static class BeanWithConflictingChildNames {
		@Xml(format=XmlFormat.COLLAPSED, childName="X")
		public ObjectList f1;
		@Xml(format=XmlFormat.COLLAPSED, childName="X")
		public ObjectList f2;
	}

	public static class BeanWithElementsAndMixed {
		@Xml(format=XmlFormat.ELEMENTS)
		public ObjectList f1;
		@Xml(format=XmlFormat.MIXED)
		public ObjectList f2;
	}

	public static class BeanWithElementsAndElement {
		@Xml(format=XmlFormat.ELEMENTS)
		public ObjectList f1;
		@Xml(format=XmlFormat.ELEMENT)
		public ObjectList f2;
	}

	public static class BeanWithElementsAndDefault {
		@Xml(format=XmlFormat.ELEMENTS)
		public ObjectList f1;
		public ObjectList f2;
	}

	public static class BeanWithElementsAndCollapsed {
		@Xml(format=XmlFormat.ELEMENTS)
		public ObjectList f1;
		@Xml(format=XmlFormat.COLLAPSED)
		public ObjectList f2;
	}

	public static class BeanWithChildAndPropNameConflict {
		@Xml(format=XmlFormat.COLLAPSED, childName="f2")
		public ObjectList f1;
		public ObjectList f2;
	}
}
