/**
* Copyright 2004-2016 Riccardo Solmi. All rights reserved.
* This file is part of the Whole Platform.
*
* The Whole Platform is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* The Whole Platform is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with the Whole Platform. If not, see <http://www.gnu.org/licenses/>.
*/
package org.whole.lang.matchers;
import java.util.HashMap;
import java.util.Map;
import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.whole.lang.artifacts.builders.IArtifactsBuilder;
import org.whole.lang.artifacts.reflect.ArtifactsEntityDescriptorEnum;
import org.whole.lang.artifacts.reflect.ArtifactsLanguageKit;
import org.whole.lang.bindings.BindingManagerFactory;
import org.whole.lang.bindings.IBindingManager;
import org.whole.lang.bindings.IBindingScope;
import org.whole.lang.builders.ModelBuilderOperation;
import org.whole.lang.commons.builders.ICommonsBuilder;
import org.whole.lang.commons.factories.CommonsEntityAdapterFactory;
import org.whole.lang.commons.model.QuantifierEnum;
import org.whole.lang.commons.model.Variable;
import org.whole.lang.commons.reflect.CommonsLanguageKit;
import org.whole.lang.java.model.ClassDeclaration;
import org.whole.lang.java.model.MethodInvocation;
import org.whole.lang.java.reflect.JavaFeatureDescriptorEnum;
import org.whole.lang.matchers.GenericMatcherFactory.AbstractVariableVisitor;
import org.whole.lang.model.IEntity;
import org.whole.lang.models.factories.ModelsEntityFactory;
import org.whole.lang.models.model.Feature;
import org.whole.lang.models.model.Model;
import org.whole.lang.models.model.SimpleEntity;
import org.whole.lang.models.model.SimpleName;
import org.whole.lang.models.reflect.ModelsEntityDescriptorEnum;
import org.whole.lang.models.reflect.ModelsFeatureDescriptorEnum;
import org.whole.lang.models.reflect.ModelsTemplateManager;
import org.whole.lang.reflect.ReflectionFactory;
import org.whole.lang.testentities.codebase.TestingModel;
import org.whole.lang.testentities.model.ListTestEntity;
import org.whole.lang.util.EntityUtils;
import org.whole.lang.visitors.GenericTraversalFactory;
import org.whole.lang.visitors.TraverseAllFilter;
import org.whole.langs.test.TestLanguagesDeployer;
/**
* @author Riccardo Solmi
*/
public class MatcherTest {
@BeforeClass
public static void deployWholePlatform() {
ReflectionFactory.deployWholePlatform();
}
@Before
public void setUp() {
ReflectionFactory.deploy(TestLanguagesDeployer.class);
}
@Test
public void testMatch() {
ListTestEntity testModel = new TestingModel().create();
IEntity tPattern1 = EntityUtils.clone(testModel);
assertTrue(Matcher.match(tPattern1, testModel));
}
@Test
public void testMatchBindings() {
IEntity pattern = buildArtifactsPattern(true);
IEntity model = buildArtifactsPattern(false);
IBindingManager bindings = BindingManagerFactory.instance
.createBindingManager();
if (Matcher.match(pattern, model, bindings)) {
assertEquals("LGPL", bindings.wStringValue("licenseText"));
return;
}
fail();
}
@Test
public void testSubstitute() {
SimpleEntity entityPattern = new SimpleEntityPattern().create();
IBindingManager bindings = BindingManagerFactory.instance
.createBindingManager();
bindings.wDef("entityName", ModelsEntityFactory.instance
.createSimpleName("SE"));
Matcher.substitute(entityPattern, bindings, false);
assertEquals("SE", entityPattern.getName().wStringValue());
}
@Test
public void testDataSubstitute() {
SimpleEntity entityPattern = new SimpleEntityPattern().create();
IBindingManager bindings = BindingManagerFactory.instance
.createBindingManager();
bindings.wDefValue("entityName", "SE");
Matcher.substitute(entityPattern, bindings, false);
assertEquals("SE", entityPattern.getName().wStringValue());
assertEquals(ModelsEntityDescriptorEnum.SimpleName, entityPattern
.getName().wGetEntityDescriptor());
}
@Test
public void testSubstituteValue() {
SimpleEntity entityPattern = new SimpleEntityPattern().create();
IBindingScope args = BindingManagerFactory.instance.createSimpleScope();
args.wDefValue("entityName", "SE");
Matcher.substitute(entityPattern, args, false);
assertEquals("SE", entityPattern.getName().wStringValue());
assertEquals(ModelsEntityDescriptorEnum.SimpleName, entityPattern
.getName().wGetEntityDescriptor());
}
@Test
public void testMultipleSubstitute() {
Model modelPattern = new ModelPattern().create();
IBindingManager bindings = BindingManagerFactory.instance
.createBindingManager();
bindings.wDefValue("dataEntity", "DE");
IBindingScope args = BindingManagerFactory.instance.createSimpleScope();
args.wDefValue("dataEntity", "DE");
Matcher.substitute(modelPattern, args, false);
SimpleName var1 = (SimpleName) modelPattern.getDeclarations().wGet(0)
.wGet(ModelsFeatureDescriptorEnum.features).wGet(0).wGet(
ModelsFeatureDescriptorEnum.type);
SimpleName var2 = (SimpleName) modelPattern.getDeclarations().wGet(1)
.wGet(ModelsFeatureDescriptorEnum.name);
assertEquals("DE", var1.wStringValue());
assertEquals("DE", var2.wStringValue());
assertNotSame(var1, var2);
}
@Test
public void testMultipleTypesSubstitute() {
ClassDeclaration functionPattern = new FunctionPattern().create();
IBindingManager bindings = BindingManagerFactory.instance.createBindingManager();
bindings.wDefValue("factName", "factorial");
bindings.wDefValue("factArg", 5);
Matcher.substitute(functionPattern, bindings, false);
IEntity var1 = functionPattern.getBodyDeclarations().wGet(0).wGet(
JavaFeatureDescriptorEnum.name);
MethodInvocation methodInvocation = (MethodInvocation)
functionPattern.getBodyDeclarations()
.wGet(1).wGet(JavaFeatureDescriptorEnum.body).wGet(0)
.wGet(JavaFeatureDescriptorEnum.expression)
.wGet(JavaFeatureDescriptorEnum.arguments).wGet(0);
IEntity var2 = methodInvocation.getName();
IEntity var3 = methodInvocation.getArguments().wGet(0);
assertEquals("factorial", var1.wStringValue());
assertEquals("factorial", var2.wStringValue());
assertEquals(5, var3.wByteValue());
}
@Test
public void testRemoveVars() {
IEntity pattern = new SimpleEntityPattern().create();
Matcher.removeVars(pattern, true);
GenericTraversalFactory.instance.topDown(
new AbstractVariableVisitor() {
public void visitVariable(Variable variable) {
fail();
}
}, false
).visit(pattern);
}
@Test
public void testRename() {
Feature featurePattern = new FeaturePattern().create();
Variable var = (Variable) featurePattern.getType().wGetAdaptee(false);
assertEquals("featureType", var.getVarName().getValue());
Matcher.rename(featurePattern, "featureType", "fType", false);
assertEquals("fType", var.getVarName().getValue());
}
@Test
public void testRenameMap() {
Feature featurePattern = new FeaturePattern().create();
Variable var1 = (Variable) featurePattern.getType().wGetAdaptee(false);
Variable var2 = (Variable) featurePattern.getName().wGetAdaptee(false);
assertEquals("featureType", var1.getVarName().getValue());
assertEquals("featureName", var2.getVarName().getValue());
Map<String, String> map = new HashMap<String, String>();
map.put("featureType", "fType");
map.put("featureName", "fName");
Matcher.rename(featurePattern, map, false);
assertEquals("fType", var1.getVarName().getValue());
assertEquals("fName", var2.getVarName().getValue());
}
@Test
public void testMultipleRename() {
Model modelPattern = new ModelPattern().create();
Variable var1 = (Variable) modelPattern.getDeclarations()
.wGet(0).wGet(ModelsFeatureDescriptorEnum.features).wGet(0)
.wGet(ModelsFeatureDescriptorEnum.type).wGetAdaptee(false);
Variable var2 = (Variable) modelPattern.getDeclarations()
.wGet(1).wGet(ModelsFeatureDescriptorEnum.name).wGetAdaptee(false);
assertEquals("dataEntity", var1.getVarName().getValue());
assertEquals("dataEntity", var2.getVarName().getValue());
Matcher.rename(modelPattern, "dataEntity", "DE", false);
assertEquals("DE", var1.getVarName().getValue());
assertEquals("DE", var2.getVarName().getValue());
}
public IEntity buildArtifactsPattern(boolean isPattern) {
ModelBuilderOperation op = new ModelBuilderOperation();
IArtifactsBuilder b0 = (IArtifactsBuilder) op.wGetBuilder(ArtifactsLanguageKit.URI);
ICommonsBuilder cb = (ICommonsBuilder) op.wGetBuilder(CommonsLanguageKit.URI);
b0.PackageArtifact_();
b0.Name("org.whole.lang.models");
cb.Resolver();
b0.Artifacts_(1);
b0.FileArtifact_();
cb.Resolver();
b0.Metadata_();
b0.Copyright("Copyright 2004-2016 Riccardo Solmi.");
if (isPattern)
cb.Variable("licenseText", ArtifactsEntityDescriptorEnum.License, QuantifierEnum.MANDATORY);
else
b0.License("LGPL");
b0.Author("Riccardo Solmi");
b0._Metadata();
cb.Resolver();
b0._FileArtifact();
b0._Artifacts();
b0._PackageArtifact();
return op.wGetResult();
}
@Test
public void testCompareSimpleEntityWithResolver() {
SimpleEntity concrete = ModelsEntityFactory.instance.createSimpleEntity();
SimpleEntity resolver = CommonsEntityAdapterFactory.createResolver(ModelsEntityDescriptorEnum.SimpleEntity);
assertFalse(Matcher.match(concrete, resolver));
}
@Test
public void testForceMatch() throws Exception {
IBindingManager bm = BindingManagerFactory.instance.createBindingManager();
IEntity textModel = ModelsTemplateManager.instance().create("Text model");
IEntity modifiedTextModel = new ModifiedTextModel().create();
// test forced match
assertFalse(Matcher.match(textModel, modifiedTextModel));
assertTrue(Matcher.forceMatch(textModel, modifiedTextModel));
textModel.wAccept(new AbstractGenericForcedMatcher(bm, TraverseAllFilter.instance) {
protected void forceMatch(IEntity pattern, IEntity model) {
assertTrue(EntityUtils.isResolver(model));
}
}, modifiedTextModel);
}
@Test
public void testForceMatchUsingVariables() throws Exception {
IBindingManager bm = BindingManagerFactory.instance.createBindingManager();
IEntity textModel = ModelsTemplateManager.instance().create("Text model");
IEntity modifiedTextModel = new ModifiedTextModel().create();
assertTrue(Matcher.forceMatchUsingVariables(textModel, modifiedTextModel));
assertTrue(Matcher.match(modifiedTextModel, textModel, bm));
assertTrue(bm.wIsSet("name"));
assertTrue(bm.wIsSet("composite_element"));
assertTrue(bm.wIsSet("modifiers"));
assertTrue(bm.wIsSet("composite_element1"));
Matcher.substitute(modifiedTextModel, bm, false);
assertTrue(Matcher.match(modifiedTextModel, textModel));
}
}