import org.junit.*; import org.junit.runner.RunWith; import static org.junit.Assert.*; import static org.junit.Assume.*; import org.junit.experimental.theories.DataPoint; import org.junit.experimental.theories.DataPoints; import org.junit.experimental.theories.Theories; import org.junit.experimental.theories.Theory; import java.util.*; @RunWith(Theories.class) public class TriangleTheoryTest { private static boolean DEBUG_ENABLED = true; private static int testCount = 0; @DataPoints public static int[] ints = {-2, -1, 0, 1, 2, 3, 4, 5, 10000}; @Theory public void testNegativeSides(int x, int y, int z){ assumeTrue( !allPositive(x, y, z)); Triangle triangle = new Triangle(x, y, z); assertEquals(triangle.isValid(), false); debug("Negative triangle sides under test " + triangle); } @Theory public void testFailsTriangleInequality(int x, int y, int z){ assumeTrue( allPositive(x, y, z)); assumeTrue( !triangleInequality(x, y, z)); Triangle triangle = new Triangle(x, y, z); assertEquals(triangle.isValid(), false); debug("Invalid triangle inequality under test " + triangle); } @Theory public void testIsosceles(int x, int y, int z){ assumeTrue(validTriangle(x, y, z)); assumeTrue(x == y && y != z || y == z && z != x || z == x && x != y); Triangle triangle = new Triangle(x, y, z); assertEquals(triangle.isIsosceles(), true); debug("Isosceles triangle under test " + triangle); } @Theory public void testScalene(int x, int y, int z){ assumeTrue(validTriangle(x, y, z)); assumeTrue(x != y && y != z && x != z); Triangle triangle = new Triangle(x, y, z); assertEquals(triangle.isScalene(), true); debug("Scalane triangle under test " + triangle); } @Theory public void testEquilaterals(int x, int y, int z){ assumeTrue(allPositive(x, y, z)); assumeTrue(x == y && y == z); Triangle triangle = new Triangle(x, y, z); assertEquals(triangle.isEquilateral(), true); debug("Equilateral triangle under test " + triangle); } private boolean allPositive(int x, int y, int z) { return x > 0 && y > 0 && z > 0; } private boolean triangleInequality(int x, int y, int z) { return x+y >z && y+z > x && z+x > y; } private boolean validTriangle(int x, int y, int z) { return x+y >z && y+z > x && z+x > y; } private static void debug(String s) { if (DEBUG_ENABLED) { System.out.println("Test " + ++testCount + ": " + s); } } }