package rewrite;
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.Test;
import java.util.List;
import inference.rewrite.RewriteInferenceSystem;
import models.formulas.EquationFormula;
import models.formulas.Then;
import models.terms.DependencyTerm;
import models.terms.PrimedTerm;
import models.terms.Resource;
import utils.Utils;
public class RewriteInferenceTest {
@Test
void RewriteInferenceTest1() {
Resource totalAmount = new Resource("totalAmount", Utils.INT, 1);
Resource quantity = new Resource("quantity", Utils.INT, 1);
Resource unitPrice = new Resource("unitPrice", Utils.INT, 1);
Resource productId = new Resource("productID", Utils.INT, 1);
Resource productName = new Resource("productName", Utils.INT, 1);
Resource soledProductId = new Resource("soledProductId", Utils.INT, 1);
PrimedTerm totalAmountP = new PrimedTerm(totalAmount);
PrimedTerm quantityP = new PrimedTerm(quantity);
PrimedTerm unitPriceP = new PrimedTerm(unitPrice);
PrimedTerm productIdP = new PrimedTerm(productId);
PrimedTerm productNameP = new PrimedTerm(productName);
PrimedTerm soledProductIdP = new PrimedTerm(soledProductId);
Resource a = new Resource("a", Utils.INT, 0);
Resource b = new Resource("b", Utils.INT, 0);
Resource c = new Resource("c", Utils.INT, 0);
Resource d = new Resource("d", Utils.INT, 0);
Resource e = new Resource("e", Utils.INT, 0);
Resource salesId = new Resource("salesId", Utils.INT, 1);
PrimedTerm salesIdP = new PrimedTerm(salesId);
Resource mul = new Resource("mul", Utils.INT, 1);
Resource mul1= new Resource("mul1", Utils.INT, 1);
Resource mul2 = new Resource("mul2", Utils.INT, 1);
// reference1
DependencyTerm te1 = new DependencyTerm(unitPrice, productId, soledProductId);
DependencyTerm te2 = new DependencyTerm(mul, mul1, quantity, mul2, te1);
EquationFormula eq1 = new EquationFormula(totalAmount, te2);
//reference2
DependencyTerm te3 = new DependencyTerm(unitPriceP, productIdP, soledProductIdP);
DependencyTerm te4 = new DependencyTerm(mul, mul1, quantityP, mul2, te3);
EquationFormula eq2 = new EquationFormula(totalAmountP, te4);
//input1
DependencyTerm te5 = new DependencyTerm(soledProductIdP, salesIdP, a);
EquationFormula eq3 = new EquationFormula(te5, b);
//input2
DependencyTerm te6 = new DependencyTerm(quantityP, salesIdP, a);
EquationFormula eq4 = new EquationFormula(te6, c);
//input3, 4, 5
EquationFormula eq5 = new EquationFormula(productIdP, productId);
EquationFormula eq6 = new EquationFormula(productNameP, productName);
EquationFormula eq7 = new EquationFormula(unitPriceP, unitPrice);
// value copy
DependencyTerm te7 = new DependencyTerm(totalAmountP, salesIdP, a);
DependencyTerm te8 = new DependencyTerm(unitPriceP, productIdP, b);
DependencyTerm te9 = new DependencyTerm(mul, mul1, c, mul2, te8);
EquationFormula eq8 = new EquationFormula(te7, te9);
//----------------------change value-------------------
//input6
DependencyTerm te10 = new DependencyTerm(unitPriceP, productIdP, d);
EquationFormula eq9 = new EquationFormula(te10, e);
//input7, 8, 9, 10
EquationFormula eq10 = new EquationFormula(productNameP, productName);
EquationFormula eq11 = new EquationFormula(salesIdP, salesId);
EquationFormula eq12 = new EquationFormula(soledProductIdP, soledProductId);
EquationFormula eq13 = new EquationFormula(quantityP, quantity);
//value copy
EquationFormula eq14 = new EquationFormula(totalAmountP, totalAmount);
//value copy conclusion
DependencyTerm te11 = new DependencyTerm(totalAmountP, salesIdP, a);
DependencyTerm te12 = new DependencyTerm(totalAmount, salesId, a);
EquationFormula eq15 = new EquationFormula(te11, te12);
//value copy change value
RewriteInferenceSystem ris = new RewriteInferenceSystem(List.of(eq9, eq10, eq11, eq12, eq13, eq14), eq15);
assertTrue(ris.inference());
//reference conclusion
DependencyTerm te13 = new DependencyTerm(soledProductId, salesId, a);
EquationFormula eq16 = new EquationFormula(d, te13);
Then th1 = new Then(eq16, eq15);
//reference change value
RewriteInferenceSystem ris2 = new RewriteInferenceSystem(List.of(eq1, eq2, eq9, eq10, eq11, eq12, eq13), th1);
assertFalse(ris2.inference());
}
}