import java.util.LinkedList;

public class Test21 {

	// returns the binary tree t1
	static Tree t1() {
		return new Tree(new Tree(null, new Tree(new Tree(null, null), null)), new Tree(new Tree(null, new Tree(null, null)), new Tree(null, null)));
	}

	// returns the binary tree t2
	static Tree t2() {
		return new Tree(new Tree(new Tree(null, null), new Tree(null, null)), new Tree(null, null));
	}

	// returns the binary tree t3
	static Tree t3() {
		return new Tree(null, new Tree(new Tree(new Tree(null, null), new Tree(null, null)), null));
	}

	public static void main(String[] args) {
		// checks that the asserts are activated
		if (!Test21.class.desiredAssertionStatus()) {
			System.err.println("Vous devez activer l'option -ea de la JVM");
			System.err.println("(Run As -> Run configurations -> Arguments -> VM Arguments)");
			System.exit(1);
		}

		// test leftCombRec
		System.out.print("Tests de leftCombRec...     ");
		assert (Measures.leftCombRec(0) == null) : "\nVotre peigne gauche de hauteur 0 devrait être l'arbre vide !";
		Tree leftComb = Measures.leftCombRec(5);
		for (int i = 0; i < 5; i++) {
			assert (leftComb != null) : "\nVotre peigne gauche est trop court !";
			assert (leftComb.right == null) : "\nVotre peigne gauche a des fils droits !";
			leftComb = leftComb.left;
		}
		assert (leftComb == null) : "\nVotre peigne gauche est trop long !";
		System.out.println("[OK]");

		// test perfectRec
		System.out.print("Tests de perfectTreeRec...  ");
		assert (Measures.perfectTreeRec(0) == null) : "\nVotre arbre binaire parfait de hauteur 0 devrait être l'arbre vide !";
		Tree perfectTree = Measures.perfectTreeRec(5);
		LinkedList<Tree> subtrees = new LinkedList<Tree>();
		subtrees.add(perfectTree);
		for (int i = 0; i < 5; i++)
			for (int j = 0; j < Math.pow(2, i); j++) { Tree subtree = subtrees.pollFirst(); assert (subtree != null) : "\nVotre arbre binaire parfait n'est pas parfait"; subtrees.addLast(subtree.left); subtrees.addLast(subtree.right);
			}
		for (int j = 0; j < Math.pow(2, 5); j++) {
			Tree subtree = subtrees.pollFirst();
			assert (subtree == null) : "\nVotre arbre binaire parfait est trop long";
		}
		System.out.println("[OK]");

		// test sizeRec
		System.out.print("Tests de sizeRec...         ");
		assert (Measures.sizeRec(null) == 0) : "\nL'arbre vide a taille 0 mais votre fonction renvoie " + Measures.sizeRec(null);
		assert (Measures.sizeRec(t1()) == 8) : "\nL'arbre t1 a taille 8 mais votre fonction renvoie " + Measures.sizeRec(t1());
		assert (Measures.sizeRec(t2()) == 5) : "\nL'arbre t2 a taille 5 mais votre fonction renvoie " + Measures.sizeRec(t2());
		assert (Measures.sizeRec(t3()) == 5) : "\nL'arbre t3 a taille 5 mais votre fonction renvoie " + Measures.sizeRec(t3());
		assert (Measures.sizeRec(Measures.leftCombRec(4)) == 4) : "\nLe peigne gauche de hauteur 4 a taille 4 mais votre fonction renvoie " + Measures.sizeRec(Measures.leftCombRec(4));
		assert (Measures.sizeRec(Measures.perfectTreeRec(4)) == 15) : "\nL'arbre binaire parfait de hauteur 4 a taille 15 mais votre fonction renvoie " + Measures.sizeRec(Measures.perfectTreeRec(4));
		System.out.println("[OK]");

		// test canopyRec
		System.out.print("Tests de canopyRec...       ");
		assert (Measures.canopyRec(null) == 0) : "\nL'arbre vide a canopée 0 mais votre fonction renvoie " + Measures.canopyRec(null);
		assert (Measures.canopyRec(t1()) == 3) : "\nL'arbre t1 a canopée 3 mais votre fonction renvoie " + Measures.canopyRec(t1());
		assert (Measures.canopyRec(t2()) == 3) : "\nL'arbre t2 a canopée 3 mais votre fonction renvoie " + Measures.canopyRec(t2());
		assert (Measures.canopyRec(t3()) == 2) : "\nL'arbre t3 a canopée 2 mais votre fonction renvoie " + Measures.canopyRec(t3());
		assert (Measures.canopyRec(Measures.leftCombRec(4)) == 1) : "\nLe peigne gauche de hauteur 4 a canopée 1 mais votre fonction renvoie " + Measures.canopyRec(Measures.leftCombRec(4));
		assert (Measures.canopyRec(Measures.perfectTreeRec(4)) == 8) : "\nL'arbre binaire parfait de hauteur 4 a canopée 8 mais votre fonction renvoie " + Measures.canopyRec(Measures.perfectTreeRec(4));
		System.out.println("[OK]");

		// test heightRec
		System.out.print("Tests de heightRec...       ");
		assert (Measures.heightRec(null) == 0) : "\nL'arbre vide a hauteur 0 mais votre fonction renvoie " + Measures.heightRec(null);
		assert (Measures.heightRec(t1()) == 4) : "\nL'arbre t1 a hauteur 4 mais votre fonction renvoie " + Measures.heightRec(t1());
		assert (Measures.heightRec(t2()) == 3) : "\nL'arbre t2 a hauteur 3 mais votre fonction renvoie " + Measures.heightRec(t2());
		assert (Measures.heightRec(t3()) == 4) : "\nL'arbre t3 a hauteur 4 mais votre fonction renvoie " + Measures.heightRec(t3());
		assert (Measures.heightRec(Measures.leftCombRec(4)) == 4) : "\nLe peigne gauche de hauteur 4 a hauteur 4 mais votre fonction renvoie " + Measures.heightRec(Measures.leftCombRec(4));
		assert (Measures.heightRec(Measures.perfectTreeRec(4)) == 4) : "\nL'arbre binaire parfait de hauteur 4 a hauteur 4 mais votre fonction renvoie " + Measures.heightRec(Measures.perfectTreeRec(4));
		System.out.println("[OK]");
	}
}
