chore: initialize repository with gitignore

This commit is contained in:
2026-04-13 07:16:39 +08:00
commit d3c18e8912
81 changed files with 4429 additions and 0 deletions
+29
View File
@@ -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()
}
+50
View File
@@ -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("非三角形");
}
}
}
+208
View File
@@ -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));
}
}