Skip to content

Commit f473322

Browse files
author
Oliver Weiler
authored
Add tests for Bash programmable completion (#998)
* Add tests for Bash completion * Fix broken uname stub setup * Let test task depend on prepareContrib * Quote array expansion
1 parent d81181c commit f473322

File tree

4 files changed

+95
-3
lines changed

4 files changed

+95
-3
lines changed

contrib/completion/bash/sdk

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
#!/usr/bin/bash
22

33
_sdk() {
4-
local -r before_previous_word="${COMP_WORDS[COMP_CWORD - 2]}"
54
local -r previous_word="${COMP_WORDS[COMP_CWORD - 1]}"
65
local -r current_word="${COMP_WORDS[COMP_CWORD]}"
76

87
if ((COMP_CWORD == 3)); then
8+
local -r before_previous_word="${COMP_WORDS[COMP_CWORD - 2]}"
9+
910
__sdkman_complete_candidate_version "$before_previous_word" "$previous_word" "$current_word"
1011

1112
return

gradle/archive.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,5 +45,5 @@ tasks.assemble.configure {
4545
}
4646

4747
tasks.test.configure {
48-
dependsOn(prepareBin, prepareScripts)
48+
dependsOn(prepareBin, prepareScripts, prepareContrib)
4949
}

src/test/groovy/sdkman/env/SdkmanBashEnvBuilder.groovy

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ class SdkmanBashEnvBuilder {
1010
final BUILD_STAGE_DIR = "build/stage/sdkman-latest+hashme"
1111
final BUILD_BIN_DIR = "$BUILD_STAGE_DIR/bin"
1212
final BUILD_SRC_DIR = "$BUILD_STAGE_DIR/src"
13+
final BUILD_COMPLETION_DIR = "$BUILD_STAGE_DIR/contrib/completion/bash"
1314

1415
//mandatory fields
1516
private final File baseFolder
@@ -33,7 +34,7 @@ class SdkmanBashEnvBuilder {
3334
]
3435

3536
File sdkmanDir, sdkmanBinDir, sdkmanVarDir, sdkmanSrcDir, sdkmanEtcDir, sdkmanExtDir, sdkmanArchivesDir,
36-
sdkmanTmpDir, sdkmanCandidatesDir, sdkmanMetadataDir
37+
sdkmanTmpDir, sdkmanCandidatesDir, sdkmanMetadataDir, sdkmanContribDir
3738

3839
static SdkmanBashEnvBuilder create(File baseFolder) {
3940
new SdkmanBashEnvBuilder(baseFolder)
@@ -114,6 +115,7 @@ class SdkmanBashEnvBuilder {
114115
sdkmanTmpDir = prepareDirectory(sdkmanDir, "tmp")
115116
sdkmanCandidatesDir = prepareDirectory(sdkmanDir, "candidates")
116117
sdkmanMetadataDir = prepareDirectory(sdkmanVarDir, "metadata")
118+
sdkmanContribDir = prepareDirectory(sdkmanDir, "contrib")
117119

118120
curlStub.map { it.build() }
119121
unameStub.map { it.build() }
@@ -126,6 +128,7 @@ class SdkmanBashEnvBuilder {
126128

127129
primeInitScript(sdkmanBinDir)
128130
primeModuleScripts(sdkmanSrcDir)
131+
primeBashCompletionScript(sdkmanContribDir)
129132

130133
def env = [
131134
SDKMAN_DIR : sdkmanDir.absolutePath,
@@ -194,6 +197,21 @@ class SdkmanBashEnvBuilder {
194197
destInitScript
195198
}
196199

200+
private primeBashCompletionScript(File targetFolder) {
201+
def sourceCompletionScript = new File(BUILD_COMPLETION_DIR, 'sdk')
202+
203+
if (!sourceCompletionScript.exists())
204+
throw new IllegalStateException("sdk has not been prepared for consumption.")
205+
206+
new FileTreeBuilder(targetFolder).with {
207+
completion {
208+
bash {
209+
sdk(sourceCompletionScript.text)
210+
}
211+
}
212+
}
213+
}
214+
197215
private primeModuleScripts(File targetFolder) {
198216
for (f in new File(BUILD_SRC_DIR).listFiles()) {
199217
if (!(f.name in ['selfupdate.sh', 'install.sh', 'sdkman-init.sh'])) {
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
package sdkman.specs
2+
3+
import sdkman.support.SdkmanEnvSpecification
4+
5+
class CompletionSpec extends SdkmanEnvSpecification {
6+
static final String CANDIDATES_API = "http://localhost:8080/2"
7+
8+
static final String BROADCAST_API_LATEST_ID_ENDPOINT = "$CANDIDATES_API/broadcast/latest/id"
9+
static final String CANDIDATES_ALL_ENDPOINT = "$CANDIDATES_API/candidates/all"
10+
11+
def "should complete the list of commands"() {
12+
given:
13+
bash = sdkmanBashEnvBuilder
14+
.withVersionCache("x.y.z")
15+
.withConfiguration("sdkman_auto_complete", "true")
16+
.build()
17+
18+
bash.start()
19+
bash.execute("source $bootstrapScript")
20+
21+
when:
22+
bash.execute("COMP_CWORD=1; COMP_WORDS=(sdk); _sdk")
23+
bash.execute('echo "\${COMPREPLY[@]}"')
24+
25+
then:
26+
bash.output.contains("install uninstall list use config default home env current upgrade version broadcast help offline selfupdate update flush")
27+
}
28+
29+
def "should complete the list of candidates"() {
30+
given:
31+
curlStub.primeWith(BROADCAST_API_LATEST_ID_ENDPOINT, "echo dbfb025be9f97fda2052b5febcca0155")
32+
.primeWith(CANDIDATES_ALL_ENDPOINT, "echo java,groovy")
33+
34+
bash = sdkmanBashEnvBuilder
35+
.withVersionCache("x.y.z")
36+
.withConfiguration("sdkman_auto_complete", "true")
37+
.build()
38+
39+
bash.start()
40+
bash.execute("source $bootstrapScript")
41+
42+
when:
43+
bash.execute("COMP_CWORD=2; COMP_WORDS=(sdk install); _sdk")
44+
bash.execute("echo \${COMPREPLY[@]}")
45+
46+
then:
47+
bash.output.contains("java groovy")
48+
}
49+
50+
def "should complete the list of Java versions"() {
51+
given:
52+
curlStub.primeWith(BROADCAST_API_LATEST_ID_ENDPOINT, "echo dbfb025be9f97fda2052b5febcca0155")
53+
.primeWith("$CANDIDATES_API/candidates/java/darwinx64/versions/all", "echo 16.0.1.hs-adpt,17.0.0-tem")
54+
55+
unameStub.forKernel("Darwin").forMachine("x86_64")
56+
57+
bash = sdkmanBashEnvBuilder
58+
.withVersionCache("x.y.z")
59+
.withConfiguration("sdkman_auto_complete", "true")
60+
.withUnameStub(unameStub)
61+
.build()
62+
63+
bash.start()
64+
bash.execute("source $bootstrapScript")
65+
66+
when:
67+
bash.execute("COMP_CWORD=3; COMP_WORDS=(sdk install java); _sdk")
68+
bash.execute("echo \${COMPREPLY[@]}")
69+
70+
then:
71+
bash.output.contains("16.0.1.hs-adpt 17.0.0-tem")
72+
}
73+
}

0 commit comments

Comments
 (0)