package terms.meta;
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.Test;
import models.algebra.Variable;
import models.terms.Dependency;
import models.terms.Resource;
import models.terms.meta.MatchConstraint;
import models.terms.meta.MetaDynamicTerm;
import models.terms.meta.MetaRDLTerm;
import models.terms.meta.MetaResource;
import models.terms.meta.MetaTermGenerator;
import utils.Utils;
public class MetaDynamicTermTest {
Resource a = new Resource("a", Utils.INT, 1);
Resource b = new Resource("b", Utils.INT, 1);
Resource c = new Resource("c", Utils.INT, 1);
Resource d = new Resource("d", Utils.INT, 1);
@Test
void GenerateTest1() {
MetaDynamicTerm mt1 = new MetaDynamicTerm(
new MetaTermGenerator() {
@Override
public MetaRDLTerm generate(int index, int depth, boolean isLast) {
if (isLast) {
return new MetaResource(new Variable("x"));
}
return new MetaDynamicTerm(this, new MetaResource(new Variable("y" + depth)));
}
},
new MetaResource(new Variable("y"))
);
Dependency d1 = new Dependency(a, b);
Dependency d2 = new Dependency(d1, c);
Dependency d3 = new Dependency(d2, d);
assertTrue(! mt1.isMatchedBy(d1).isEmpty());
assertTrue(! mt1.isMatchedBy(d2).isEmpty());
assertTrue(! mt1.isMatchedBy(d3).isEmpty());
MatchConstraint result = mt1.isMatchedBy(d3).iterator().next();
MetaRDLTerm mt2 = mt1.dependencyGenerate(result.getBinding());
assertTrue(mt2.isMatchedBy(d3, result).contains(result));
assertEquals(mt1.substitute(result.getBinding()), d3);
}
@Test
void GenerateTest2() {
MetaDynamicTerm mt1 = new MetaDynamicTerm(
new MetaResource(new Variable("x")),
(MetaTermGenerator) (i, d, l) -> new MetaResource(new Variable("y" + i))
);
Dependency d1 = new Dependency(a, b);
Dependency d2 = new Dependency(a, b, c);
Dependency d3 = new Dependency(a, b, c, d);
assertTrue(! mt1.isMatchedBy(d1).isEmpty());
assertTrue(! mt1.isMatchedBy(d2).isEmpty());
assertTrue(! mt1.isMatchedBy(d3).isEmpty());
}
@Test
void GenerateTest3() {
MetaDynamicTerm mt1 = new MetaDynamicTerm(
new MetaTermGenerator() {
@Override
public MetaRDLTerm generate(int index, int depth, boolean isLast) {
if (isLast) {
return new MetaResource(new Variable("x"));
}
return new MetaDynamicTerm(this, (MetaTermGenerator) (i, d, l) -> new MetaResource(new Variable("y" + (d+1) + "," + i)));
}
},
(MetaTermGenerator) (i, d, l) -> new MetaResource(new Variable("y0," + i))
);
Dependency d1 = new Dependency(a, b, c, d);
Dependency d2 = new Dependency(d1, c, d);
assertTrue(! mt1.isMatchedBy(d1).isEmpty());
assertTrue(! mt1.isMatchedBy(d2).isEmpty());
MatchConstraint result = mt1.isMatchedBy(d2).iterator().next();
MetaRDLTerm mt2 = mt1.dependencyGenerate(result.getBinding());
assertTrue(mt2.isMatchedBy(d2, result).contains(result));
assertEquals(mt1.substitute(result.getBinding()), d2);
}
}