feat: model AI test progress and module loading states
This commit is contained in:
@@ -0,0 +1,24 @@
|
|||||||
|
package com.example.workutils.biz.aitest.project;
|
||||||
|
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
public record ModuleLoadPresentation(int moduleCount, Optional<MavenModule> selectedModule,
|
||||||
|
String message) {
|
||||||
|
|
||||||
|
public static ModuleLoadPresentation from(MavenProjectModel model, String preferredArtifactId) {
|
||||||
|
Optional<MavenModule> selected = Optional.empty();
|
||||||
|
if (preferredArtifactId != null && !preferredArtifactId.isBlank()) {
|
||||||
|
selected = model.moduleByArtifactId(preferredArtifactId);
|
||||||
|
}
|
||||||
|
if (selected.isEmpty()) {
|
||||||
|
selected = new StartModuleSelector().autoSelect(model);
|
||||||
|
}
|
||||||
|
int count = model.modules().size();
|
||||||
|
String message = selected
|
||||||
|
.map(module -> "已检出 " + count + " 个 Maven 模块,已选择 " + module.artifactId())
|
||||||
|
.orElseGet(() -> count == 0
|
||||||
|
? "未检出 Maven 模块,请检查项目 pom.xml"
|
||||||
|
: "已检出 " + count + " 个 Maven 模块,请选择生成模块");
|
||||||
|
return new ModuleLoadPresentation(count, selected, message);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
package com.example.workutils.biz.aitest.ui;
|
||||||
|
|
||||||
|
public final class TaskProgressState {
|
||||||
|
public static final double INDETERMINATE = -1.0;
|
||||||
|
|
||||||
|
private boolean visible;
|
||||||
|
private double progress;
|
||||||
|
|
||||||
|
public void start() {
|
||||||
|
visible = true;
|
||||||
|
progress = INDETERMINATE;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void update(double value) {
|
||||||
|
progress = Math.max(0.0, Math.min(1.0, value));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void finish() {
|
||||||
|
visible = false;
|
||||||
|
progress = 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean visible() {
|
||||||
|
return visible;
|
||||||
|
}
|
||||||
|
|
||||||
|
public double progress() {
|
||||||
|
return progress;
|
||||||
|
}
|
||||||
|
}
|
||||||
+47
@@ -0,0 +1,47 @@
|
|||||||
|
package com.example.workutils.biz.aitest.project;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||||
|
|
||||||
|
class ModuleLoadPresentationTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void uniqueStartModuleIsSelectedAndCountIsReported() {
|
||||||
|
ModuleLoadPresentation view = ModuleLoadPresentation.from(model("core", "app-start"), "");
|
||||||
|
|
||||||
|
assertEquals(2, view.moduleCount());
|
||||||
|
assertEquals("app-start", view.selectedModule().orElseThrow().artifactId());
|
||||||
|
assertEquals("已检出 2 个 Maven 模块,已选择 app-start", view.message());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void preferredModuleWinsOverAutomaticSelection() {
|
||||||
|
ModuleLoadPresentation view = ModuleLoadPresentation.from(model("core", "app-start"), "core");
|
||||||
|
|
||||||
|
assertEquals("core", view.selectedModule().orElseThrow().artifactId());
|
||||||
|
assertEquals("已检出 2 个 Maven 模块,已选择 core", view.message());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void multipleStartModulesRequireManualSelection() {
|
||||||
|
ModuleLoadPresentation view = ModuleLoadPresentation.from(model("a-start", "b-start"), "");
|
||||||
|
|
||||||
|
assertTrue(view.selectedModule().isEmpty());
|
||||||
|
assertEquals("已检出 2 个 Maven 模块,请选择生成模块", view.message());
|
||||||
|
}
|
||||||
|
|
||||||
|
private static MavenProjectModel model(String... artifactIds) {
|
||||||
|
Path root = Path.of("project").toAbsolutePath();
|
||||||
|
List<MavenModule> modules = Arrays.stream(artifactIds)
|
||||||
|
.map(id -> new MavenModule(root.resolve(id), Path.of(id), "com.example", id, "1", Set.of()))
|
||||||
|
.toList();
|
||||||
|
return new MavenProjectModel(root, modules);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
package com.example.workutils.biz.aitest.ui;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertFalse;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||||
|
|
||||||
|
class TaskProgressStateTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void taskProgressIsHiddenUntilStartedAndResetsWhenFinished() {
|
||||||
|
TaskProgressState state = new TaskProgressState();
|
||||||
|
|
||||||
|
assertFalse(state.visible());
|
||||||
|
assertEquals(0.0, state.progress());
|
||||||
|
|
||||||
|
state.start();
|
||||||
|
assertTrue(state.visible());
|
||||||
|
assertEquals(TaskProgressState.INDETERMINATE, state.progress());
|
||||||
|
|
||||||
|
state.update(0.5);
|
||||||
|
assertEquals(0.5, state.progress());
|
||||||
|
|
||||||
|
state.finish();
|
||||||
|
assertFalse(state.visible());
|
||||||
|
assertEquals(0.0, state.progress());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void progressIsClampedToUnitRange() {
|
||||||
|
TaskProgressState state = new TaskProgressState();
|
||||||
|
state.start();
|
||||||
|
|
||||||
|
state.update(2.0);
|
||||||
|
assertEquals(1.0, state.progress());
|
||||||
|
state.update(-2.0);
|
||||||
|
assertEquals(0.0, state.progress());
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user