package hw3;

public class PokeEventTest {
	
	public static void main(String[] args) {
		
		PokeEvent event;
		
	
		event = PokeEvent.SMALL;
		FingerPart[] smallFingerGood = {FingerPart.TIP};
		FingerPart[] smallFingerBad = {FingerPart.SIDE};
		BodyPart[] smallBodyGood = {BodyPart.TORSO, BodyPart.CROTCH};
		BodyPart[] smallBodyBad = {BodyPart.HEAD, BodyPart.ARMS, BodyPart.HANDS, BodyPart.LEGS};
		Test.forEqual(500, event.getMaximumWeight(), event.toString() + " maximum weight");
		testIsLegalFingerPart(event, smallFingerGood, smallFingerBad);
		testIsOnTarget(event, smallBodyGood, smallBodyBad);
		testIsScoringTouch(event, smallFingerGood, smallFingerBad, smallBodyGood, smallBodyBad);
		
		event = PokeEvent.MEDUM;
		FingerPart[] mediumFingerGood = {FingerPart.TIP};
		FingerPart[] mediumFingerBad = {FingerPart.SIDE};
		BodyPart[] mediumBodyGood = {BodyPart.HEAD, BodyPart.ARMS, BodyPart.HANDS, BodyPart.TORSO, BodyPart.CROTCH,  BodyPart.LEGS};
		BodyPart[] mediumBodyBad = {};
		Test.forEqual(775, event.getMaximumWeight(), event.toString() + " maximum weight");
		testIsLegalFingerPart(event, mediumFingerGood, mediumFingerBad);
		testIsOnTarget(event, mediumBodyGood, mediumBodyBad);
		testIsScoringTouch(event, mediumFingerGood, mediumFingerBad, mediumBodyGood, mediumBodyBad);
		
		event = PokeEvent.LARGE;
		FingerPart[] largeFingerGood = {FingerPart.TIP, FingerPart.SIDE};
		FingerPart[] largeFingerBad = {};
		BodyPart[] largeBodyGood = {BodyPart.HEAD, BodyPart.ARMS, BodyPart.TORSO};
		BodyPart[] largeBodyBad = {BodyPart.HANDS, BodyPart.CROTCH,  BodyPart.LEGS};
		Test.forEqual(500, event.getMaximumWeight(), event.toString() + " maximum weight");
		testIsLegalFingerPart(event, largeFingerGood, largeFingerBad);
		testIsOnTarget(event, largeBodyGood, largeBodyBad);
		testIsScoringTouch(event, largeFingerGood, largeFingerBad, largeBodyGood, largeBodyBad);
		
		System.out.println(Test.getSummary());
		
	}
	
	private static void testIsLegalFingerPart(PokeEvent event,
			FingerPart[] fingerGood, FingerPart[] fingerBad) {

		// Good finger parts
		for (int i=0; i<fingerGood.length; i++) {
			String description = event.toString() + " " + fingerGood[i].toString();
			Test.forTrue(event.isLegalFingerPart(fingerGood[i]), description);
		}
		
		// Bad finger parts
		for (int i=0; i<fingerBad.length; i++) {
			String description = event.toString() + " " + fingerBad[i].toString();
			Test.forFalse(event.isLegalFingerPart(fingerBad[i]), description);
		}
	}

	private static void testIsOnTarget(PokeEvent event,
			BodyPart[] bodyGood, BodyPart[] bodyBad) {

		// Good body parts
		for (int i=0; i<bodyGood.length; i++) {
			String description = event.toString() + " " + bodyGood[i].toString();
			Test.forTrue(event.isOnTarget(bodyGood[i]), description);
		}
		
		// Bad body parts
		for (int i=0; i<bodyBad.length; i++) {
			String description = event + " " + bodyBad[i].toString();
			Test.forFalse(event.isOnTarget(bodyBad[i]), description);
		}
	}
	
	private static void testIsScoringTouch(PokeEvent event,
			FingerPart[] fingerGood, FingerPart[] fingerBad, 
			BodyPart[] bodyGood, BodyPart[] bodyBad) {
		
		
		// Good finger and good body
		for (int i=0; i<fingerGood.length; i++) {
			for (int j=0; j<bodyGood.length; j++) {
				String description = event + " " + fingerGood[i] + " on " + bodyGood[j].toString();
				Test.forTrue(event.isScoringTouch(fingerGood[i], bodyGood[j]), description);
			}
		}
		
		// Bad finger, bad body
		for (int i=0; i<fingerBad.length; i++) {
			for (int j=0; j<bodyBad.length; j++) {
				String description = event + " " + fingerBad[i] + " on " + bodyBad[j].toString();
				Test.forFalse(event.isScoringTouch(fingerBad[i], bodyBad[j]), description);
			}
		}
		
		// Good finger and bad body
		for (int i=0; i<fingerGood.length; i++) {
			for (int j=0; j<bodyBad.length; j++) {
				String description = event + " " + fingerGood[i] + " on " + bodyBad[j].toString();
				Test.forFalse(event.isScoringTouch(fingerGood[i], bodyBad[j]), description);
			}
		}
		
		// Bad finger, good body
		for (int i=0; i<fingerBad.length; i++) {
			for (int j=0; j<bodyGood.length; j++) {
				String description = event + " " + fingerBad[i] + " on " + bodyGood[j].toString();
				Test.forFalse(event.isScoringTouch(fingerBad[i], bodyGood[j]), description);
			}
		}
	}
}
