package tests.terms;
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.Test;
import models.algebra.Type;
import models.algebra.Variable;
import models.dataConstraintModel.DataConstraintModel;
import models.terms.DependencyTerm;
import models.terms.EvaluatableTerm;
import models.terms.LinearRightNormalizedType;
import models.terms.ResourceVariable;
import models.terms.meta.MetaEvaluatableTermVariable;
import models.terms.meta.MetaRDLTerm;
import models.terms.meta.MetaResourceVariable;
public class LinearRightNormalTest {
Type INT = DataConstraintModel.typeInt;
@Test
void linearRightNormalTest() {
ResourceVariable a = new ResourceVariable("A", INT, 2);
ResourceVariable b = new ResourceVariable("B", INT, 2);
ResourceVariable c = new ResourceVariable("C", INT, 2);
ResourceVariable d = new ResourceVariable("D", INT, 2);
ResourceVariable e = new ResourceVariable("E", INT, 2);
ResourceVariable f = new ResourceVariable("F", INT, 2);
ResourceVariable g = new ResourceVariable("G", INT, 1);
EvaluatableTerm te1 = new DependencyTerm(e, f, g);
EvaluatableTerm te2 = new DependencyTerm(c, d, te1);
EvaluatableTerm te3 = new DependencyTerm(a, b, te2);
//[a:b->[c:d->[e:f->g]]]
assertEquals(te3.isLinearRightNormalized(), true);
EvaluatableTerm te4 = new DependencyTerm(a, b, c);
EvaluatableTerm te5 = new DependencyTerm(te4, d, e);
EvaluatableTerm te6 = new DependencyTerm(te5, f, g);
//[[[a:b->c]:d->e]:f->g]
assertEquals(te6.isLinearRightNormalized(), false);
}
@Test
void linearRightNormalizeTest() {
ResourceVariable a = new ResourceVariable("A", INT, 2);
ResourceVariable b = new ResourceVariable("B", INT, 2);
ResourceVariable c = new ResourceVariable("C", INT, 2);
ResourceVariable d = new ResourceVariable("D", INT, 2);
ResourceVariable e = new ResourceVariable("E", INT, 2);
ResourceVariable f = new ResourceVariable("F", INT, 2);
ResourceVariable g = new ResourceVariable("G", INT, 1);
EvaluatableTerm te1 = new DependencyTerm(a, b, c);
EvaluatableTerm te2 = new DependencyTerm(te1, d, e);
EvaluatableTerm te3 = new DependencyTerm(te2, f, g);
assertEquals(te3.isLinearRightNormalized(), false);
te3.selfLinearRightNormalize();
assertEquals(te3.isLinearRightNormalized(), true);
}
@Test
void linearRightNomalizedMatchTest() {
ResourceVariable a = new ResourceVariable("A", INT, 2);
ResourceVariable b = new ResourceVariable("B", INT, 2);
ResourceVariable c = new ResourceVariable("C", INT, 2);
ResourceVariable d = new ResourceVariable("D", INT, 2);
ResourceVariable e = new ResourceVariable("E", INT, 2);
ResourceVariable f = new ResourceVariable("F", INT, 2);
ResourceVariable g = new ResourceVariable("G", INT, 1);
EvaluatableTerm te1 = new DependencyTerm(a, b, c);
EvaluatableTerm te2 = new DependencyTerm(te1, d, e);
EvaluatableTerm te3 = new DependencyTerm(te2, f, g);
MetaEvaluatableTermVariable metaTerm = new MetaEvaluatableTermVariable(new Variable("x"));
MetaResourceVariable metaA = new MetaResourceVariable(new Variable("ma"));
MetaResourceVariable metaB = new MetaResourceVariable(new Variable("mb"));
MetaResourceVariable metaC = new MetaResourceVariable(new Variable("mc"));
MetaRDLTerm metaTerm2 = new MetaRDLTerm(metaA, metaB, metaC);
metaTerm2.setLinearRightNormalizedType(LinearRightNormalizedType.LINEAR_RIGHT_NORMALIZED);
metaTerm.setLinearRightNormalizedType(LinearRightNormalizedType.LINEAR_RIGHT_NORMALIZED);
assertEquals(metaTerm.isMatchedBy(te3), false);
te3.selfLinearRightNormalize();
assertEquals(metaTerm.isMatchedBy(te3), true);
assertEquals(metaTerm2.isMatchedBy(te1), true);
}
}