KATA TIME™ - Sorting the Triangle!

Session 2 - "These triangles ain't gonna sort themselves!" - Hannah Montana

Today's Kata

Triangle Sorter

"A triangle is a polygon with three edges and three vertices."

- Wikipedia

"If triangles invented a god, they would make him three-sided."

- Baron de Montesquieu

The goal of this kata is to take 3 integer values that represent the lengths of three sides of a triangle and return a String representation of the triangle's classification. The 5 classifications we are looking for will be 'equilateral', 'isosceles', 'right', 'other', and 'not a triangle'.

Today's Goals

  • Doing the simplest thing to make a test pass.
  • Discuss ordering of test cases.
  • Making sure edge cases are tested.
  • Playing with lists.
  • Advanced refactoring of test classes.

Code Along Repo Link

Session Video

Session Code

package triangle_sorter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
public class TriangleSorter {
public String analyze(Integer... sides) {
ArrayList<Integer> sortedSides = new ArrayList<>(Arrays.asList(sides));
Collections.sort(sortedSides);
int sideA = sortedSides.get(0);
int sideB = sortedSides.get(1);
int sideC = sortedSides.get(2);
if(isAnEquilateralTriangle(sideA, sideB, sideC)){
return "Equilateral";
}
if(isARightTriangle(sideA, sideB, sideC)){
return "Right";
}
if(isNotATriangle(sideA, sideB, sideC)){
return "Not a triangle";
}
if (isAnIsoscelesTriangle(sideA, sideB , sideC)) {
return "Isosceles";
}
return "Other";
}
private boolean isNotATriangle(int sideA, int sideB, int sideC) {
return sideA + sideB <= sideC;
}
private boolean isARightTriangle(int sideA, int sideB, int sideC) {
return Math.pow(sideA, 2) + Math.pow(sideB, 2) == Math.pow(sideC, 2);
}
private boolean isAnEquilateralTriangle(int sideA, int sideB, int sideC) {
return sideA == sideB && sideB == sideC;
}
private boolean isAnIsoscelesTriangle(int sideA, int sideB, int sideC) {
return sideA == sideB || sideB == sideC;
}
}
package triangle_sorter;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.core.Is.is;
public class TriangleSorterTest {
private static final String EQUILATERAL = "Equilateral";
public static final String ISOSCELES = "Isosceles";
private TriangleSorter underTest;
@BeforeEach
void setUp() {
underTest = new TriangleSorter();
}
@Test
public void analyzeReturnsEquilateralTriangleWhenGivenAnEquilateralTriangle() {
assertTriangleType(EQUILATERAL, 3, 3, 3);
assertTriangleType(EQUILATERAL, 4, 4, 4);
assertTriangleType(EQUILATERAL, 5, 5, 5);
}
@Test
public void analyzeReturnsIsoscelesTriangleWhenGivenAnIsoscelesTriangle() {
assertTriangleType(ISOSCELES, 3, 3, 2);
assertTriangleType(ISOSCELES, 3, 3, 4);
assertTriangleType(ISOSCELES, 3, 4, 3);
}
@Test
public void analyzeReturnsRightTriangleWhenGivenARightTriangle() {
assertTriangleType("Right", 3, 4, 5);
assertTriangleType("Right", 5, 12, 13);
assertTriangleType("Right", 5, 4, 3);
}
@Test
public void analyzeReturnsOtherWhenGivenAnOtherTriangle() {
assertTriangleType("Other", 100, 300, 313);
}
@Test
public void analyzeReturnsNotATriangleWhenGivenThreeValuesTHatDoNotFormATriangle() {
assertTriangleType("Not a triangle", 1, 1, 100);
}
private void assertTriangleType(String expectedType, int sideA, int sideB, int sideC) {
String triangleType = underTest.analyze(sideA, sideB, sideC);
assertThat(triangleType, is(expectedType));
}
}
package triangle_sorter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class TriangleSorter {
public String analyze(int sideA, int sideB, int sideC) {
ArrayList<Integer> sortedSides = new ArrayList<>(List.of(sideA, sideB, sideC));
Collections.sort(sortedSides);
int sortedSideA = sortedSides.get(0);
int sortedSideB = sortedSides.get(1);
int sortedSideC = sortedSides.get(2);
if (isAnEquilateralTriangle(sortedSideA, sortedSideB, sortedSideC)) {
return "Equilateral";
}
if (isARightTriangle(sortedSideA, sortedSideB, sortedSideC)) {
return "Right";
}
if (isNotATriangle(sortedSideA, sortedSideB, sortedSideC)) {
return "Not a triangle";
}
if (isAnIsoscelesTriangle(sortedSideA, sortedSideB, sortedSideC)) {
return "Isosceles";
}
return "Other";
}
private boolean isNotATriangle(int sideA, int sideB, int sideC) {
return sideA + sideB <= sideC;
}
private boolean isARightTriangle(int sideA, int sideB, int sideC) {
return Math.pow(sideA, 2) + Math.pow(sideB, 2) == Math.pow(sideC, 2);
}
private boolean isAnEquilateralTriangle(int sideA, int sideB, int sideC) {
return sideA == sideB && sideB == sideC;
}
private boolean isAnIsoscelesTriangle(int sideA, int sideB, int sideC) {
return sideA == sideB || sideB == sideC;
}
}