package hw05;

import static org.junit.jupiter.api.Assertions.*;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

class BinaryTree_Prof_Test {
	Car[] cars;

	@BeforeEach
	void setUp() throws Exception {
		cars = new Car[5]; // Top five cars
		cars[0]=new Car("Aston Martin","DB5",1964,new FullName("James","","Bond"));
		cars[1]=new Car("George Barris","BatMobile", 1963,new FullName("Bruce","","Wayne"));
		cars[2]=new Car("Rolls Royce","Phantom V",1965,new FullName("John","Winston","Lennon") );
		cars[3]=new Car("Mercedes Benz","300SL Gullwing",1955,new FullName("Clark","","Gable"));
		cars[4]=new Car("Deusenberg","Model J",1931,new FullName("Phil","","Berg"));
	}

	@Test
	void testInsertByDate() { 
		BinaryTree byDate = new BinaryTree(cars[0]);
		for (int i=1; i<cars.length; i++) {
			byDate.insertByDate(cars[i]);
		}
		assertEquals("*",byDate.position(cars[0]));
		assertEquals("L*",byDate.position(cars[1]));
		assertEquals("R*",byDate.position(cars[2]));
		assertEquals("LL*",byDate.position(cars[3]));
		assertEquals("LLL*",byDate.position(cars[4]));
	}

	@Test
	void testInsertByMake() { 
		BinaryTree byMake = new BinaryTree(cars[0]);
		for (int i=1; i<cars.length; i++) {
			byMake.insertByMake(cars[i]);
		}
		assertEquals("*",byMake.position(cars[0]));
		assertEquals("R*",byMake.position(cars[1]));
		assertEquals("RR*",byMake.position(cars[2]));
		assertEquals("RRL*",byMake.position(cars[3]));
		assertEquals("RL*",byMake.position(cars[4]));
	}

	@Test
	void testInsertByOwner() { 
		BinaryTree byOwner = new BinaryTree(cars[0]);
		for (int i=1; i<cars.length; i++) {
			byOwner.insertByOwner(cars[i]);
		}
		assertEquals("*",byOwner.position(cars[0]));
		assertEquals("R*",byOwner.position(cars[1]));
		assertEquals("RL*",byOwner.position(cars[2]));
		assertEquals("RLL*",byOwner.position(cars[3]));
		assertEquals("L*",byOwner.position(cars[4]));
	}

	@Test
	void testSize() { 
		BinaryTree byOwner = new BinaryTree(cars[0]);
		assertEquals(1,byOwner.size());
		byOwner.insertByOwner(cars[1]);
		assertEquals(2,byOwner.size());
		byOwner.insertByOwner(cars[2]);
		assertEquals(3,byOwner.size());
		byOwner.insertByOwner(cars[3]);
		assertEquals(4,byOwner.size());
		byOwner.insertByOwner(cars[4]);
		assertEquals(5,byOwner.size());
	}

	@Test
	void testDepth() { 
		BinaryTree byOwner = new BinaryTree(cars[0]);
		assertEquals(1,byOwner.depth());
		byOwner.insertByOwner(cars[1]);
		assertEquals(2,byOwner.depth());
		byOwner.insertByOwner(cars[2]);
		assertEquals(3,byOwner.depth());
		byOwner.insertByOwner(cars[3]);
		assertEquals(4,byOwner.depth());
		byOwner.insertByOwner(cars[4]);
		assertEquals(4,byOwner.depth());
	}

	@Test
	void testToString() { 
		BinaryTree byOwner = new BinaryTree(cars[0]);
		for (int i=1; i<cars.length; i++) {
			byOwner.insertByOwner(cars[i]);
		}
		String expected=cars[4].toString() + "; " +
				cars[0].toString() + "; " +
				cars[3].toString() + "; " +
				cars[2].toString() + "; " +
				cars[1].toString();
				
		assertEquals(expected,byOwner.toString());
	}

	@Test
	void testPosition() { 
		BinaryTree byDate = new BinaryTree(cars[0]);
		for (int i=1; i<cars.length; i++) {
			byDate.insertByDate(cars[i]);
		}
		assertEquals("*",byDate.position(cars[0]));
		assertEquals("L*",byDate.position(cars[1]));
		assertEquals("R*",byDate.position(cars[2]));
		assertEquals("LL*",byDate.position(cars[3]));
		assertEquals("LLL*",byDate.position(cars[4]));
	}

}
