From 434bd8d97d625b3ec7f6b9a67d5c5d945b8fbd1f Mon Sep 17 00:00:00 2001 From: Joe Tretter Date: Thu, 7 May 2026 16:51:43 -0500 Subject: [PATCH] Tighten Rm level validation - Require the Rm level to stage or remove the tracked deleted file instead of treating the initial deleted worktree state as solved. - Add a regression test proving read-only commands such as `ls` do not complete the Rm level. - Verify the full JVM level solution suite with the compiled host Git runtime. --- app/build.gradle.kts | 4 ++-- .../solutions/tretter/githugandroid/levels/RmLevel.kt | 5 ++++- .../tretter/githugandroid/GitSandboxEngineTest.kt | 10 ++++++++++ 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 204499f..c8e62d8 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -19,8 +19,8 @@ android { applicationId = "solutions.tretter.githugandroid" minSdk = 26 targetSdk = 35 - versionCode = 125 - versionName = "0.1.124" + versionCode = 126 + versionName = "0.1.125" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" vectorDrawables.useSupportLibrary = true diff --git a/app/src/main/java/solutions/tretter/githugandroid/levels/RmLevel.kt b/app/src/main/java/solutions/tretter/githugandroid/levels/RmLevel.kt index a13ece1..f197232 100644 --- a/app/src/main/java/solutions/tretter/githugandroid/levels/RmLevel.kt +++ b/app/src/main/java/solutions/tretter/githugandroid/levels/RmLevel.kt @@ -14,7 +14,10 @@ internal fun rmLevel(): Level = level( hints = emptyList(), commandSuggestions = listOf("git status", "git rm deleteme.rb"), setup = { RepoState(initialized = true, files = listOf(GitFile("deleteme.rb", tracked = true, deleted = true)), commits = listOf(CommitNode("0000001", "Added a temp file")), branches = mapOf("master" to 1)) }, - validator = repoPredicate { repo -> repo.files.none { it.name == "deleteme.rb" && !it.deleted } || repo.files.any { it.name == "deleteme.rb" && it.deleted && it.staged } }, + validator = repoPredicate { repo -> + repo.files.none { it.name == "deleteme.rb" } || + repo.files.any { it.name == "deleteme.rb" && it.deleted && it.staged } + }, testCases = listOf( levelTestCase("git rm deleted path", "git rm deleteme.rb"), ), diff --git a/app/src/test/java/solutions/tretter/githugandroid/GitSandboxEngineTest.kt b/app/src/test/java/solutions/tretter/githugandroid/GitSandboxEngineTest.kt index c83697e..b013721 100644 --- a/app/src/test/java/solutions/tretter/githugandroid/GitSandboxEngineTest.kt +++ b/app/src/test/java/solutions/tretter/githugandroid/GitSandboxEngineTest.kt @@ -37,6 +37,16 @@ class GitSandboxEngineTest { assertFalse(updatedRepo.files.any { it.name == "deleteme.rb" }) } + @Test + fun rmLevelIsNotSolvedByReadOnlyCommands() { + val level = rmLevel() + val repo = level.setup() + + val (updatedRepo, _) = GitSandboxEngine.execute(repo, "ls") + + assertFalse(level.validator(updatedRepo, "ls")) + } + @Test fun gitMvExpandsWildcardSourcesIntoDestinationDirectory() { val repo = RepoState(