/*
 * Faculty of Applied Science and Engineering, University of Toronto
 * CSC181: Introduction to Computer Programming, Fall 2000
 *
 * Assignment: 2
 * File: main.c
 * Author: Ray Ortigas (rayo@dgp.toronto.edu)
 * Contains: Test driver for A2.
 */

#include "a2.h"
#include <stdio.h>
#include <math.h>

int score = 0;

void testPointFunctions(void) {
	Point p1 = pointInit(5, 10);
	Point p2 = pointInit(5, 10);
	Point p3 = pointInit(45, 40);
	Point p4 = pointInit(20, -10);
	Point p5 = pointInit(5, 5);

	printf("Testing Point functions (12 points).\n");

	score += (pointX(p1) == 5);
	score += (pointX(p3) == 45);

	printf("Score after pointX tests (2 points): %d\n", score);

	score += (pointY(p1) == 10);
	score += (pointY(p3) == 40);

	printf("Score after pointX tests (2 points): %d\n", score);

	score += (pointAreEqual(p1, p1) == true);
	score += (pointAreEqual(p1, p2) == true);
	score += (pointAreEqual(p1, p3) == false);
	score += (pointAreEqual(p1, p5) == false);

	printf("Score after pointAreEqual tests (4 points): %d\n", score);

	score += 2 * (pointDistanceBetween(p1, p3) == 50);
	score += 2 * (pointDistanceBetween(p1, p4) == 25);

	printf("Score after pointDistanceBetween tests (4 points): %d\n", score);
}

void testRectangleFunctions(void) {
	Rectangle r1 = rectangleInit(pointInit(8.5, 3.5), 7, 5);
	Rectangle r2 = rectangleInit(pointInit(6, 7), 8, 6);
	Rectangle r3, r4;

	Rectangle r5 = rectangleInit(pointInit(7.5, 5), 5, 2);
	Rectangle r6 = rectangleInit(pointInit(7, 5.5), 10, 9);
	Rectangle r7 = rectangleInit(pointInit(8.5, 3.5), 7, 5);

	printf("Testing Rectangle functions (14 points).\n");

	score += (pointX(rectangleCentre(r1)) == 8.5);
	score += (pointY(rectangleCentre(r1)) == 3.5);

	printf("Score after rectangleCentre tests (2 points): %d\n", score);
	
	score += (rectangleWidth(r1) == 7);
	score += (rectangleHeight(r1) == 5);

	printf("Score after rectangleWidth tests (2 points): %d\n", score);

	score += 2 * (rectangleArea(r1) == 35);

	printf("Score after rectangleArea tests (2 points): %d\n", score);

	score += (rectangleAreEqual(r1, r1) == true);
	score += (rectangleAreEqual(r1, r7) == true);
	score += (rectangleAreEqual(r1, r2) == false);
	score += (rectangleAreEqual(r1, r6) == false);

	printf("Score after rectangleAreEqual tests (4 points): %d\n", score);

	r3 = rectangleIntersection(r1, r2);
	r4 = rectangleUnion(r1, r2);

	score += 2 * (rectangleAreEqual(r3, r5));
	
	printf("Score after rectangleIntersection tests (2 points): %d\n", score);

	score += 2 * (rectangleAreEqual(r4, r6));

	printf("Score after rectangleUnion tests (2 points): %d\n", score);
}

void testRectangleListFunctions(void) {
	Rectangle r1 = rectangleInit(pointInit(8.5, 3.5), 7, 5);
	Rectangle r2 = rectangleInit(pointInit(11, 6.5), 6, 3);
	Rectangle r3 = rectangleInit(pointInit(6, 7), 8, 6);
	Rectangle r4 = rectangleIntersection(r1, r2);
	Rectangle r5 = rectangleUnion(r1, r2);
	Rectangle r6, r7;

	RectangleList rl1 = rectangleListInit();
	RectangleList rl2;

	printf("Testing RectangleList functions (14 points).\n");

	score += (rectangleListSize(rl1) == 0);

	printf("Score after tests on empty list (1 point): %d\n", score);

	rl1 = rectangleListAdd(rl1, r1);
	rl1 = rectangleListAdd(rl1, r2);
	rl1 = rectangleListAdd(rl1, r3);
	
	score += (rectangleListSize(rl1) == 3);

	score += (rectangleAreEqual(rectangleListGet(rl1, 2), r3));
	score += (rectangleAreEqual(rectangleListGet(rl1, 1), r2));
	score += (rectangleAreEqual(rectangleListGet(rl1, 0), r1));

	printf("Score after tests on list of size 3 (4 points): %d\n", score);

	r6 = rectangleListIntersection(rl1);
	r7 = rectangleListUnion(rl1);

	score += 2 * (rectangleAreEqual(r6,
		rectangleInit(pointInit(9, 5.5), 2, 1)) == true);
	
	printf("Score after rectangleListIntersection tests (2 points): %d\n", score);

	score += 2 * (rectangleAreEqual(r7,
		rectangleInit(pointInit(8, 5.5), 12, 9)) == true);

	printf("Score after rectangleListUnion tests (2 points): %d\n", score);

	rl1 = rectangleListSet(rl1, r6, 1);
	score += (rectangleAreEqual(rectangleListGet(rl1, 1), r6) == true);

	printf("Score after rectangleListSet tests (1 point): %d\n", score);

	rl1 = rectangleListAdd(rl1, r7);
	rl1 = rectangleListAdd(rl1, r4);
	rl1 = rectangleListAdd(rl1, r5);
	
	rl2 = rectangleListSubList(rl1, 2, 5);

	score += (rectangleListSize(rl2) == 3);

	score += (rectangleAreEqual(rectangleListGet(rl2, 0), r3));
	score += (rectangleAreEqual(rectangleListGet(rl2, 2), r4));
	score += (rectangleAreEqual(rectangleListGet(rl2, 1), r7));

	printf("Score after rectangleListSubList tests (4 points): %d\n", score);
}

int main(void) {
	testPointFunctions();
	printf("--\n");

	testRectangleFunctions();
	printf("--\n");

	testRectangleListFunctions();
	printf("--\n");

	printf("Final score: %d\n", score);
	printf("--\n");

	return 0;
}

