chore: initialize repository with gitignore
This commit is contained in:
@@ -0,0 +1,29 @@
|
||||
plugins {
|
||||
id 'application'
|
||||
}
|
||||
|
||||
repositories {
|
||||
mavenCentral()
|
||||
}
|
||||
|
||||
dependencies {
|
||||
testImplementation libs.junit.jupiter
|
||||
|
||||
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
|
||||
|
||||
implementation libs.guava
|
||||
}
|
||||
|
||||
java {
|
||||
toolchain {
|
||||
languageVersion = JavaLanguageVersion.of(21)
|
||||
}
|
||||
}
|
||||
|
||||
application {
|
||||
mainClass = 'triangle.App'
|
||||
}
|
||||
|
||||
tasks.named('test') {
|
||||
useJUnitPlatform()
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
package triangle;
|
||||
|
||||
public class App {
|
||||
|
||||
public enum TriangleType {
|
||||
EQUILATERAL, // 等边三角形
|
||||
ISOSCELES, // 等腰三角形
|
||||
SCALENE, // 一般三角形
|
||||
NOT_A_TRIANGLE // 非三角形
|
||||
}
|
||||
|
||||
public static TriangleType classify(int a, int b, int c) {
|
||||
// 检查边长是否为正整数
|
||||
if (a <= 0 || b <= 0 || c <= 0) {
|
||||
return TriangleType.NOT_A_TRIANGLE;
|
||||
}
|
||||
|
||||
// 检查三角不等式(任意两边之和大于第三边)
|
||||
// 使用 long 防止整数溢出
|
||||
if ((long) a + b <= c || (long) a + c <= b || (long) b + c <= a) {
|
||||
return TriangleType.NOT_A_TRIANGLE;
|
||||
}
|
||||
|
||||
// 判断三角形类型
|
||||
if (a == b && b == c) {
|
||||
return TriangleType.EQUILATERAL;
|
||||
} else if (a == b || b == c || a == c) {
|
||||
return TriangleType.ISOSCELES;
|
||||
} else {
|
||||
return TriangleType.SCALENE;
|
||||
}
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
if (args.length != 3) {
|
||||
System.out.println("用法: java triangle.App <边1> <边2> <边3>");
|
||||
return;
|
||||
}
|
||||
int a = Integer.parseInt(args[0]);
|
||||
int b = Integer.parseInt(args[1]);
|
||||
int c = Integer.parseInt(args[2]);
|
||||
TriangleType result = classify(a, b, c);
|
||||
switch (result) {
|
||||
case EQUILATERAL -> System.out.println("等边三角形");
|
||||
case ISOSCELES -> System.out.println("等腰三角形");
|
||||
case SCALENE -> System.out.println("一般三角形");
|
||||
case NOT_A_TRIANGLE -> System.out.println("非三角形");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,208 @@
|
||||
package triangle;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.api.DisplayName;
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
import triangle.App.TriangleType;
|
||||
|
||||
class AppTest {
|
||||
|
||||
// ========================================================================
|
||||
// 等价类划分
|
||||
// ========================================================================
|
||||
//
|
||||
// 输入条件: 三个整数 a, b, c 作为三角形的三条边
|
||||
//
|
||||
// 有效等价类:
|
||||
// EC1: 等边三角形 (a=b=c, 且 a>0)
|
||||
// EC2: 等腰三角形 (恰好两边相等, 且满足三角不等式)
|
||||
// EC3: 一般三角形 (三边互不相等, 且满足三角不等式)
|
||||
//
|
||||
// 无效等价类:
|
||||
// EC4: 某边为 0
|
||||
// EC5: 某边为负数
|
||||
// EC6: 两边之和等于第三边 (退化三角形)
|
||||
// EC7: 两边之和小于第三边 (不满足三角不等式)
|
||||
// EC8: 整数溢出边界 (极大值)
|
||||
//
|
||||
// ========================================================================
|
||||
|
||||
// --- 有效等价类测试 ---
|
||||
|
||||
@Test
|
||||
@DisplayName("EC1: 等边三角形 - 三边相等")
|
||||
void testEquilateral() {
|
||||
assertEquals(TriangleType.EQUILATERAL, App.classify(5, 5, 5));
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("EC2a: 等腰三角形 - a=b≠c")
|
||||
void testIsoscelesABEqual() {
|
||||
assertEquals(TriangleType.ISOSCELES, App.classify(5, 5, 3));
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("EC2b: 等腰三角形 - a=c≠b")
|
||||
void testIsoscelesACEqual() {
|
||||
assertEquals(TriangleType.ISOSCELES, App.classify(5, 3, 5));
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("EC2c: 等腰三角形 - b=c≠a")
|
||||
void testIsoscelesBCEqual() {
|
||||
assertEquals(TriangleType.ISOSCELES, App.classify(3, 5, 5));
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("EC3: 一般三角形 - 三边互不相等")
|
||||
void testScalene() {
|
||||
assertEquals(TriangleType.SCALENE, App.classify(3, 4, 5));
|
||||
}
|
||||
|
||||
// --- 无效等价类测试 ---
|
||||
|
||||
@Test
|
||||
@DisplayName("EC4a: 第一边为0")
|
||||
void testZeroSideA() {
|
||||
assertEquals(TriangleType.NOT_A_TRIANGLE, App.classify(0, 5, 5));
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("EC4b: 第二边为0")
|
||||
void testZeroSideB() {
|
||||
assertEquals(TriangleType.NOT_A_TRIANGLE, App.classify(5, 0, 5));
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("EC4c: 第三边为0")
|
||||
void testZeroSideC() {
|
||||
assertEquals(TriangleType.NOT_A_TRIANGLE, App.classify(5, 5, 0));
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("EC5a: 第一边为负数")
|
||||
void testNegativeSideA() {
|
||||
assertEquals(TriangleType.NOT_A_TRIANGLE, App.classify(-1, 5, 5));
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("EC5b: 第二边为负数")
|
||||
void testNegativeSideB() {
|
||||
assertEquals(TriangleType.NOT_A_TRIANGLE, App.classify(5, -1, 5));
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("EC5c: 第三边为负数")
|
||||
void testNegativeSideC() {
|
||||
assertEquals(TriangleType.NOT_A_TRIANGLE, App.classify(5, 5, -1));
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("EC6a: a+b=c 退化三角形")
|
||||
void testDegenerateABEqualC() {
|
||||
assertEquals(TriangleType.NOT_A_TRIANGLE, App.classify(1, 2, 3));
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("EC6b: a+c=b 退化三角形")
|
||||
void testDegenerateACEqualB() {
|
||||
assertEquals(TriangleType.NOT_A_TRIANGLE, App.classify(1, 3, 2));
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("EC6c: b+c=a 退化三角形")
|
||||
void testDegenerateBCEqualA() {
|
||||
assertEquals(TriangleType.NOT_A_TRIANGLE, App.classify(3, 1, 2));
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("EC7a: a+b<c 不满足三角不等式")
|
||||
void testInequalityViolationC() {
|
||||
assertEquals(TriangleType.NOT_A_TRIANGLE, App.classify(1, 2, 10));
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("EC7b: a+c<b 不满足三角不等式")
|
||||
void testInequalityViolationB() {
|
||||
assertEquals(TriangleType.NOT_A_TRIANGLE, App.classify(1, 10, 2));
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("EC7c: b+c<a 不满足三角不等式")
|
||||
void testInequalityViolationA() {
|
||||
assertEquals(TriangleType.NOT_A_TRIANGLE, App.classify(10, 1, 2));
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("EC8: 极大整数值边界")
|
||||
void testMaxIntOverflow() {
|
||||
assertEquals(TriangleType.NOT_A_TRIANGLE, App.classify(Integer.MAX_VALUE, 1, 1));
|
||||
}
|
||||
|
||||
// ========================================================================
|
||||
// 边界值分析 补充测试用例
|
||||
// ========================================================================
|
||||
//
|
||||
// 边界: 边长最小有效值 1, 以及三角不等式的临界点
|
||||
//
|
||||
|
||||
@Test
|
||||
@DisplayName("BV1: 最小等边三角形 (1,1,1)")
|
||||
void testMinEquilateral() {
|
||||
assertEquals(TriangleType.EQUILATERAL, App.classify(1, 1, 1));
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("BV2: 最小等腰三角形 (1,1,2) -> 退化, 非三角形")
|
||||
void testMinIsoscelesDegenerate() {
|
||||
assertEquals(TriangleType.NOT_A_TRIANGLE, App.classify(1, 1, 2));
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("BV3: 等腰三角形刚好满足不等式 (2,2,3)")
|
||||
void testIsoscelesJustValid() {
|
||||
assertEquals(TriangleType.ISOSCELES, App.classify(2, 2, 3));
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("BV4: 一般三角形刚好满足不等式 (2,3,4)")
|
||||
void testScaleneJustValid() {
|
||||
assertEquals(TriangleType.SCALENE, App.classify(2, 3, 4));
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("BV5: 一般三角形不等式临界 a+b=c+1 (3,4,6)")
|
||||
void testScaleneBoundary() {
|
||||
assertEquals(TriangleType.SCALENE, App.classify(3, 4, 6));
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("BV6: 大等边三角形 (MAX,MAX,MAX)")
|
||||
void testLargeEquilateral() {
|
||||
assertEquals(TriangleType.EQUILATERAL, App.classify(Integer.MAX_VALUE, Integer.MAX_VALUE, Integer.MAX_VALUE));
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("BV7: 三边全为0")
|
||||
void testAllZero() {
|
||||
assertEquals(TriangleType.NOT_A_TRIANGLE, App.classify(0, 0, 0));
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("BV8: 三边全为负数")
|
||||
void testAllNegative() {
|
||||
assertEquals(TriangleType.NOT_A_TRIANGLE, App.classify(-1, -1, -1));
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("BV9: 边长为1的一般三角形边界 (1,2,2) 等腰")
|
||||
void testSmallIsosceles() {
|
||||
assertEquals(TriangleType.ISOSCELES, App.classify(1, 2, 2));
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("BV10: 大值等腰三角形溢出检测")
|
||||
void testLargeIsoscelesOverflow() {
|
||||
assertEquals(TriangleType.ISOSCELES, App.classify(Integer.MAX_VALUE, Integer.MAX_VALUE, 1));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user