/*******************************************************************************
 * Copyright (c) 2011-2014 EclipseSource Muenchen GmbH and others.
 * 
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 * 
 * Contributors:
 * Eugen Neufeld - initial API and implementation
 ******************************************************************************/
package org.eclipse.emf.ecp.view.validation.bean.test;

import static org.junit.Assert.assertEquals;

import java.io.InputStream;
import java.util.List;

import org.eclipse.emf.common.util.Diagnostic;
import org.eclipse.emf.ecp.view.internal.validation.bean.DefaultValidationProvider;
import org.eclipse.emf.ecp.view.validation.bean.BeanValidationProvider;
import org.junit.Test;

import car.CarFactory;
import car.CarPackage;

public class BeanValidationProvider_Test {

	@Test
	public void testAttributeOfRootValidation() {
		car.Driver driverEMF = CarFactory.eINSTANCE.createDriver();
		driverEMF.setName("John Doe");
		driverEMF.setAge(17);
		driverEMF.setBirthPlace("NY");
		InputStream is = getClass().getResourceAsStream("/violations.xml");
		BeanValidationProvider bvp = new DefaultValidationProvider(is);
		List<Diagnostic> validate = bvp.validate(driverEMF);
		assertEquals(1, validate.size());
		assertEquals(driverEMF, validate.get(0).getData().get(0));
		assertEquals(CarPackage.eINSTANCE.getDriver_Age(), validate.get(0)
			.getData().get(1));
	}

	@Test
	public void testAttributeOfChildValidation() {
		car.Driver driverEMF = CarFactory.eINSTANCE.createDriver();
		driverEMF.setName("John Doe");
		driverEMF.setAge(17);
		driverEMF.setBirthPlace("NY");
		car.Car carEMF = CarFactory.eINSTANCE.createCar();
		carEMF.setManufacturer("SuperCar");
		carEMF.setSeatCount(2);
		carEMF.setLicensePlate("MM213");
		carEMF.setDriver(driverEMF);

		// car.Person person1EMF = CarFactory.eINSTANCE.createPerson();
		// person1EMF.setName("Bob der Baumeister");
		// person1EMF.setBirthPlace("Ort1");
		// driverEMF.getChildren().add(person1EMF);
		// car.Person person2EMF = CarFactory.eINSTANCE.createPerson();
		// person2EMF.setName("Jane Doe");
		// person2EMF.setBirthPlace("LA");
		// driverEMF.getChildren().add(person2EMF);
		// car.Person person3EMF = CarFactory.eINSTANCE.createPerson();
		// person3EMF.setName("Bernd das Brot");
		// person3EMF.setBirthPlace("Ort2");
		// driverEMF.getChildren().add(person3EMF);

		InputStream is = getClass().getResourceAsStream("/violations.xml");
		BeanValidationProvider bvp = new DefaultValidationProvider(is);
		List<Diagnostic> validate = bvp.validate(carEMF);
		assertEquals(1, validate.size());
		assertEquals(driverEMF, validate.get(0).getData().get(0));
		assertEquals(CarPackage.eINSTANCE.getDriver_Age(), validate.get(0)
			.getData().get(1));
	}
}
