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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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)); | |
} | |
} | |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | |
} | |
} |