package tests;

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

import org.junit.jupiter.api.Test;

import models.EvaluableTerm;
import models.RDLVariable;
import models.algebra.Type;
import models.dataConstraintModel.DataConstraintModel;

public class LinearRightNormalTest {

	Type INT = DataConstraintModel.typeInt;
	
	@Test
	void linearRightNormalTest() {
		
		
		RDLVariable a = EvaluableTerm.of("A", INT, 2);
		RDLVariable b = EvaluableTerm.of("B", INT, 2);
		RDLVariable c = EvaluableTerm.of("C", INT, 2);
		RDLVariable d = EvaluableTerm.of("D", INT, 2);
		RDLVariable e = EvaluableTerm.of("E", INT, 2);
		RDLVariable f = EvaluableTerm.of("F", INT, 2);
		RDLVariable g = EvaluableTerm.of("G", INT, 1);
		
		EvaluableTerm te1 = EvaluableTerm.of(e, f, g);
		EvaluableTerm te2 = EvaluableTerm.of(c, d, te1);
		EvaluableTerm te3 = EvaluableTerm.of(a, b, te2);
		//[a:b->[c:d->[e:f->g]]]
		assertEquals(te3.isLinearRightNormal(), true);
		
		EvaluableTerm te4 = EvaluableTerm.of(a, b, c);
		EvaluableTerm te5 = EvaluableTerm.of(te4, d, e);
		EvaluableTerm te6 = EvaluableTerm.of(te5, f, g);
		//[[[a:b->c]:d->e]:f->g]
		assertEquals(te6.isLinearRightNormal(), false);
	}
	
	@Test
	void linearRightNormalizeTest() {
		
		RDLVariable a = EvaluableTerm.of("A", INT, 2);
		RDLVariable b = EvaluableTerm.of("B", INT, 2);
		RDLVariable c = EvaluableTerm.of("C", INT, 2);
		RDLVariable d = EvaluableTerm.of("D", INT, 2);
		RDLVariable e = EvaluableTerm.of("E", INT, 2);
		RDLVariable f = EvaluableTerm.of("F", INT, 2);
		RDLVariable g = EvaluableTerm.of("G", INT, 1);
		
		EvaluableTerm te1 = EvaluableTerm.of(a, b, c);
		EvaluableTerm te2 = EvaluableTerm.of(te1, d, e);
		EvaluableTerm te3 = EvaluableTerm.of(te2, f, g);
		
		assertEquals(te3.isLinearRightNormal(), false);
		te3.selfLinearRightNormalize();
		assertEquals(te3.isLinearRightNormal(), true);
	}
	
}
