package tests.meta;

import static org.junit.jupiter.api.Assertions.*;
import static tests.Utils.*;

import org.junit.jupiter.api.Test;

import models.Dependency;
import models.DependencyTerm;
import models.ResourceVariable;
import models.algebra.Variable;
import models.meta.MetaDependencyTermVariable;
import models.meta.MetaDependencyVariable;
import models.meta.MetaEvaluatableTermVariable;
import models.meta.MetaRDLTermVariable;
import models.meta.MetaResourceVariable;

public class MetaResourceVariableTest {

	@Test
	void MetaResourceVariableMathcingWithoutOrder() {
		ResourceVariable a = new ResourceVariable("a", INT, 0);
		ResourceVariable b = new ResourceVariable("b", INT, 0);
		ResourceVariable c = new ResourceVariable("c", INT, 0);
		Dependency dep = new Dependency(a, b);
		DependencyTerm depTerm = new DependencyTerm(a, b, c);
		
		MetaResourceVariable x = new MetaResourceVariable(new Variable("x"));
		MetaDependencyVariable d = new MetaDependencyVariable(new Variable("d"));
		MetaDependencyTermVariable dte = new MetaDependencyTermVariable(new Variable("dte"));
		MetaEvaluatableTermVariable te = new MetaEvaluatableTermVariable(new Variable("te"));
		MetaRDLTermVariable t = new MetaRDLTermVariable(new Variable("t"));
		
		// a matches x(resource variable)
		assertTrue(x.isMatchedBy(a));
		// a does not match d(dependency)
		assertFalse(d.isMatchedBy(a));
		// a does not match dte(dependency term)
		assertFalse(dte.isMatchedBy(a));
		// a  matches te(evaluatable term)
		assertTrue(te.isMatchedBy(a));
		// a matches t(term)
		assertTrue(t.isMatchedBy(a));
		// [a : b] does not match x(resource variable)
		assertFalse(x.isMatchedBy(dep));
		// [a : b -> c] does not match x(resource variable)
		assertFalse(x.isMatchedBy(depTerm));
	}
	
}
