package esercizio1;

import static org.junit.Assert.*;

import org.junit.Test;

//TROVARE 3 BOOLEANI PER LA COPERTURA DEI CASI DI TEST
public class testLight {

	@Test
	public void testLight() {
		Light l1 = new Light();
		assertNotNull("Oggetto Light non nullo", l1);
	}

	/*
	 * Costruisci oggetti Light in grado di garantire la copertura delle
	 * istruzioni
	 */
	@Test
	public void testStatementCoverageLight() { // Incluso nel Branch, ogni riga
												// deve essere eseguita
		Light l1 = new Light();
		assertTrue(l1.onOff(false, false, true));
		Light l2 = new Light();
		assertFalse(l2.onOff(false, false, false));
	}

	/*
	 * Costruisci oggetti Light in grado di garantire la copertura di tutti i
	 * rami (Branch). DecisionCoverage è incluso nel Branch.
	 */

	@Test
	public void testBranchCoverageLight() {
		Light l1 = new Light();
		l1.onOff(false, false, true);
		l1.onOff(false, false, false);
	}

	/*
	 * Costruisci oggetti Light in grado di garantire la copertura di tutte le
	 * singole condizioni all'interno della decisione.
	 */

	@Test
	public void testConditionCoverageLight() {
		// (bottomIn || bottomOut) && !light
		// onOff(boolean light, boolean in, boolean out)
		Light l1 = new Light();
		// faccio variare solo light (l'or deve essere vero)
		assertTrue(l1.onOff(false, false, true)); // 1. F,F,T
		assertFalse(l1.onOff(true, false, true)); // 2. T,F,T
		// faccio variare in (!light deve essere vero e out false
		l1.onOff(false, true, false); // 3.F,T,F
		l1.onOff(false, false, false); // 4.F,F,F

	}

	/* Costruisci oggetti Light in grado di garantire copertura MCDC */
	@Test
	public void testMCDCLightComplete() {
		Light l1 = new Light();
		// cambio solo light (l'or deve essere vero)
		assertTrue(l1.onOff(false, true, true)); // F,T,T->{true}
		assertFalse(l1.onOff(true, true, true)); // T,T,T->{false}
		// cambio in 
		assertTrue(l1.onOff(false, true, false)); // F,T,F->{true}
		assertFalse(l1.onOff(false, false, false)); //F,F,F->{false}
		// cambio out
		assertTrue(l1.onOff(false, false, true)); // F,F,T->{true}
		assertFalse(l1.onOff(false, false, false)); //F,F,F->{false}
	}
	// potrei anche farlo con meno casi di test
	// posso procedere test dopo test fino a quando non copro tutto. 
	@Test
	public void testMCDCLightCompact() {
		Light l1 = new Light();
		// cambio solo light (in non contribuisce l'OR è vero)
		l1.onOff(false, true, false); //1.  F,T,F->{true}
		l1.onOff(true, true, false); //2.  T,F,F->{false}
		// faccio cambiare in rispetto al 1. (copro in)
		l1.onOff(false, false, false); //3.  F,F,F->{false}
		// faccio cambiare out rispetto al 3.
		l1.onOff(false, false, true); //4.  F,F,T->{true}
	}
}
