/*
 * Hibernate Validator, declare and validate application constraints
 *
 * License: Apache License, Version 2.0
 * See the license.txt file in the root directory or <http://www.apache.org/licenses/LICENSE-2.0>.
 */
package org.hibernate.validator.test.internal.xml;

import static org.hibernate.validator.testutils.ValidatorUtil.getConfiguration;
import static org.testng.Assert.assertEquals;

import java.util.Set;

import javax.validation.Validator;
import javax.validation.metadata.BeanDescriptor;
import javax.validation.metadata.ConstraintDescriptor;

import org.assertj.core.api.Assertions;
import org.hibernate.validator.internal.metadata.descriptor.ConstraintDescriptorImpl;
import org.hibernate.validator.testutil.TestForIssue;
import org.testng.annotations.Test;

/**
 * Various tests for parsing of XML mapping files.
 *
 * @author Guillaume Smet
 */
public class XmlParsingTest {

	@Test
	@TestForIssue(jiraKey = "HV-1101")
	public void xmlConstraintMappingSupportsTabsWithoutNewLines() {
		Validator validator = getConfiguration()
				.addMapping(
						XmlParsingTest.class.getResourceAsStream( "hv-1101-tabs-mapping.xml" ) )
				.buildValidatorFactory()
				.getValidator();

		ConstraintDescriptorImpl<?> descriptor = getSingleConstraintDescriptorForClass( validator, Double.class );
		MyConstraint constraint = (MyConstraint) descriptor.getAnnotation();
		Assertions.assertThat( constraint.additionalConstraints() ).hasSize( 1 );
		Assertions.assertThat( constraint.additionalConstraints()[0].constraint() ).isEqualTo( "AA" );
	}

	@Test
	@TestForIssue(jiraKey = "HV-1101")
	public void xmlConstraintMappingSupportsEmptyElementForStrings() {
		Validator validator = getConfiguration()
				.addMapping(
						XmlParsingTest.class.getResourceAsStream( "hv-1101-empty-element-mapping.xml" ) )
				.buildValidatorFactory()
				.getValidator();

		ConstraintDescriptorImpl<?> descriptor = getSingleConstraintDescriptorForClass( validator, Double.class );
		MyConstraint constraint = (MyConstraint) descriptor.getAnnotation();
		Assertions.assertThat( constraint.additionalConstraints() ).hasSize( 1 );
		Assertions.assertThat( constraint.additionalConstraints()[0].constraint() ).isEqualTo( "" );
	}

	private ConstraintDescriptorImpl<?> getSingleConstraintDescriptorForClass(Validator validator, Class<?> clazz) {
		BeanDescriptor beanDescriptor = validator.getConstraintsForClass( clazz );
		Set<ConstraintDescriptor<?>> constraintDescriptorSet = beanDescriptor.getConstraintDescriptors();
		assertEquals(
				constraintDescriptorSet.size(),
				1,
				"There should be only one constraint descriptor"
		);
		return (ConstraintDescriptorImpl<?>) constraintDescriptorSet.iterator().next();
	}

}
