/*******************************************************************************
* Copyright (c) 2010 SAP AG.
* 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:
* Emil Simeonov - initial API and implementation.
* Dimitar Donchev - initial API and implementation.
* Dimitar Tenev - initial API and implementation.
* Nevena Manova - initial API and implementation.
* Georgi Konstantinov - initial API and implementation.
*******************************************************************************/
package org.eclipse.wst.sse.sieditor.test.model.validation.constraints;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import javax.xml.namespace.QName;
import org.easymock.EasyMock;
import org.easymock.IAnswer;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.validation.IValidationContext;
import org.eclipse.emf.validation.model.ConstraintSeverity;
import org.eclipse.emf.validation.model.ConstraintStatus;
import org.eclipse.emf.validation.model.IModelConstraint;
import org.eclipse.emf.validation.service.ConstraintRegistry;
import org.eclipse.emf.validation.service.IConstraintDescriptor;
import org.eclipse.wst.sse.sieditor.model.validation.constraints.NcName;
import org.eclipse.wst.sse.sieditor.test.util.EasyMockUtils;
import org.eclipse.wst.wsdl.WSDLElement;
import org.eclipse.wst.wsdl.WSDLPackage;
import org.eclipse.wst.wsdl.binding.soap.SOAPPackage;
import org.junit.Assert;
import org.junit.Test;
import org.w3c.dom.Element;
public class TestNcName extends BasicConstraintTest{
@Test
public void testGetRequiredFeatures() {
Map<EClass, EStructuralFeature[]> map = new HashMap<EClass, EStructuralFeature[]>();
registerRequiredFeatures(map, WSDLPackage.Literals.MESSAGE, WSDLPackage.MESSAGE__QNAME);
registerRequiredFeatures(map, WSDLPackage.Literals.PART, WSDLPackage.PART__NAME);
registerRequiredFeatures(map, WSDLPackage.Literals.PORT_TYPE, WSDLPackage.PORT_TYPE__QNAME);
registerRequiredFeatures(map, WSDLPackage.Literals.OPERATION, WSDLPackage.OPERATION__NAME);
registerRequiredFeatures(map, WSDLPackage.Literals.INPUT, WSDLPackage.INPUT__NAME);
registerRequiredFeatures(map, WSDLPackage.Literals.OUTPUT, WSDLPackage.OUTPUT__NAME);
registerRequiredFeatures(map, WSDLPackage.Literals.FAULT, WSDLPackage.FAULT__NAME);
registerRequiredFeatures(map, WSDLPackage.Literals.BINDING, WSDLPackage.BINDING__QNAME);
registerRequiredFeatures(map, WSDLPackage.Literals.BINDING_FAULT, WSDLPackage.BINDING_FAULT__NAME);
registerRequiredFeatures(map, WSDLPackage.Literals.BINDING_OPERATION, WSDLPackage.BINDING_OPERATION__NAME);
registerRequiredFeatures(map, WSDLPackage.Literals.SERVICE, WSDLPackage.SERVICE__QNAME);
registerRequiredFeatures(map, WSDLPackage.Literals.PORT, WSDLPackage.PORT__NAME);
registerRequiredFeatures(map, SOAPPackage.Literals.SOAP_FAULT, SOAPPackage.SOAP_FAULT__NAME);
registerRequiredFeatures(map, WSDLPackage.Literals.DEFINITION, WSDLPackage.DEFINITION__QNAME);
NcName c = new NcName();
for (Entry<EClass, EStructuralFeature[]> entry : map.entrySet()) {
EasyMockUtils.clean();
EObject target = createTarget(entry.getKey());
EasyMockUtils.replay();
EStructuralFeature[] requiredFeatures = c.getRequiredFeatures(target);
assertRequiredFeatures(entry.getKey(), requiredFeatures, entry.getValue());
}
}
@Test
public void testValidationOK() throws Exception{
IValidationContext ctx = EasyMockUtils.createNiceMock(IValidationContext.class);
final WSDLElement target = EasyMockUtils.createNiceMock(WSDLElement.class);
Element domElement = EasyMockUtils.createNiceMock(Element.class);
final IModelConstraint constraint = EasyMockUtils.createNiceMock(IModelConstraint.class);
IConstraintDescriptor descriptor = EasyMockUtils.createNiceMock(IConstraintDescriptor.class);
EasyMock.expect(domElement.getLocalName()).andStubReturn("message");
EasyMock.expect(target.eClass()).andStubReturn(WSDLPackage.Literals.MESSAGE);
EasyMock.expect(target.eGet(WSDLPackage.Literals.MESSAGE.getEStructuralFeature(WSDLPackage.MESSAGE__QNAME))).andStubReturn(new QName("msgLocalPart"));
EasyMock.expect(target.eIsSet(WSDLPackage.Literals.MESSAGE.getEStructuralFeature(WSDLPackage.MESSAGE__QNAME))).andStubReturn(true);
EasyMock.expect(target.getElement()).andStubReturn(domElement);
EasyMock.expect(ctx.getTarget()).andStubReturn(target);
EasyMock.expect(ctx.createSuccessStatus()).andStubReturn(Status.OK_STATUS);
EasyMock.expect(constraint.getDescriptor()).andStubReturn(descriptor);
EasyMock.expect(descriptor.getSeverity()).andStubReturn(ConstraintSeverity.ERROR);
EasyMock.expect(descriptor.getPluginId()).andStubReturn("myPlugin");
EasyMock.expect(ctx.createFailureStatus()).andStubAnswer(new IAnswer<IStatus>() {
public IStatus answer() throws Throwable {
return new ConstraintStatus(constraint, target);
}
});
EasyMockUtils.replay();
ConstraintRegistry.getInstance().register(descriptor);
try {
IStatus result = new NcName().validate(ctx);
Assert.assertEquals(Status.OK, result.getSeverity());
} finally {
ConstraintRegistry.getInstance().unregister(descriptor);
}
}
@Test
public void testValidationError() throws Exception{
IValidationContext ctx = EasyMockUtils.createNiceMock(IValidationContext.class);
final WSDLElement target = EasyMockUtils.createNiceMock(WSDLElement.class);
Element domElement = EasyMockUtils.createNiceMock(Element.class);
final IModelConstraint constraint = EasyMockUtils.createNiceMock(IModelConstraint.class);
IConstraintDescriptor descriptor = EasyMockUtils.createNiceMock(IConstraintDescriptor.class);
EasyMock.expect(domElement.getLocalName()).andStubReturn("message");
EasyMock.expect(target.eClass()).andStubReturn(WSDLPackage.Literals.MESSAGE);
EasyMock.expect(target.eGet(WSDLPackage.Literals.MESSAGE.getEStructuralFeature(WSDLPackage.MESSAGE__QNAME))).andStubReturn(new QName("msgLocalPartInvalid?"));
EasyMock.expect(target.eIsSet(WSDLPackage.Literals.MESSAGE.getEStructuralFeature(WSDLPackage.MESSAGE__QNAME))).andStubReturn(true);
EasyMock.expect(target.getElement()).andStubReturn(domElement);
EasyMock.expect(ctx.getTarget()).andStubReturn(target);
EasyMock.expect(ctx.createSuccessStatus()).andStubReturn(Status.OK_STATUS);
EasyMock.expect(constraint.getDescriptor()).andStubReturn(descriptor);
EasyMock.expect(descriptor.getSeverity()).andStubReturn(ConstraintSeverity.ERROR);
EasyMock.expect(descriptor.getPluginId()).andStubReturn("myPlugin");
EasyMock.expect(ctx.createFailureStatus()).andStubAnswer(new IAnswer<IStatus>() {
public IStatus answer() throws Throwable {
return new ConstraintStatus(constraint, target);
}
});
EasyMockUtils.replay();
ConstraintRegistry.getInstance().register(descriptor);
try {
IStatus result = new NcName().validate(ctx);
Assert.assertEquals(Status.ERROR, result.getSeverity());
} finally {
ConstraintRegistry.getInstance().unregister(descriptor);
}
}
private void assertRequiredFeatures(EClass eClass, EStructuralFeature[] requiredFeatures, EStructuralFeature[] expectedFeatures) {
Assert.assertEquals(requiredFeatures.length, expectedFeatures.length);
for (EStructuralFeature requiredFeature : expectedFeatures) {
boolean found = false;
for (EStructuralFeature feature: requiredFeatures) {
if (feature.equals(requiredFeature)) {
found = true;
break;
}
}
Assert.assertTrue("Feature " + requiredFeature.getName() + "was expected as required but not found for " + eClass.getName(), found);
}
}
private static void registerRequiredFeatures(Map<EClass, EStructuralFeature[]> map, EClass eClass, int...ids) {
EStructuralFeature[] features = new EStructuralFeature[ids.length];
for (int ndx = 0; ndx < ids.length; ndx++) {
features[ndx] = eClass.getEStructuralFeature(ids[ndx]);
}
map.put(eClass, features);
}
private EObject createTarget(EClass eClass) {
WSDLElement target = EasyMockUtils.createNiceMock(WSDLElement.class);
EasyMock.expect(target.eClass()).andStubReturn(eClass);
return target;
}
}