Skip to content

Commit 628963e

Browse files
committed
add terminal support class
1 parent 97df739 commit 628963e

File tree

2 files changed

+129
-0
lines changed

2 files changed

+129
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package de.cotto.bitbook.cli;
2+
3+
import org.apache.commons.lang3.StringUtils;
4+
import org.jline.reader.LineReader;
5+
import org.jline.terminal.Terminal;
6+
import org.springframework.stereotype.Component;
7+
8+
import java.io.PrintWriter;
9+
import java.util.Optional;
10+
11+
@Component
12+
public class TerminalSupport {
13+
private final LineReader lineReader;
14+
private final PromptChangeListener promptChangeListener;
15+
private final PrintWriter writer;
16+
17+
public TerminalSupport(Terminal terminal, LineReader lineReader, PromptChangeListener promptChangeListener) {
18+
this.lineReader = lineReader;
19+
this.promptChangeListener = promptChangeListener;
20+
writer = terminal.writer();
21+
}
22+
23+
public void write(String text) {
24+
writer.println(text);
25+
writer.flush();
26+
}
27+
28+
public Optional<String> request(String prompt) {
29+
String answer = lineReader.readLine(prompt + " ");
30+
if (StringUtils.isBlank(answer)) {
31+
return Optional.empty();
32+
} else {
33+
return Optional.of(answer);
34+
}
35+
}
36+
37+
public void changePrompt(String newPrompt) {
38+
promptChangeListener.changePrompt(newPrompt);
39+
}
40+
41+
public void changePromptToDefault() {
42+
promptChangeListener.changePromptToDefault();
43+
}
44+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
package de.cotto.bitbook.cli;
2+
3+
import org.jline.reader.LineReader;
4+
import org.jline.terminal.Terminal;
5+
import org.junit.jupiter.api.BeforeEach;
6+
import org.junit.jupiter.api.Test;
7+
import org.junit.jupiter.api.extension.ExtendWith;
8+
import org.mockito.InOrder;
9+
import org.mockito.Mock;
10+
import org.mockito.Mockito;
11+
import org.mockito.junit.jupiter.MockitoExtension;
12+
13+
import java.io.PrintWriter;
14+
15+
import static org.assertj.core.api.Assertions.assertThat;
16+
import static org.mockito.ArgumentMatchers.anyString;
17+
import static org.mockito.Mockito.verify;
18+
import static org.mockito.Mockito.when;
19+
20+
@ExtendWith(MockitoExtension.class)
21+
class TerminalSupportTest {
22+
private TerminalSupport terminalSupport;
23+
24+
@Mock
25+
private Terminal terminal;
26+
27+
@Mock
28+
private LineReader lineReader;
29+
30+
@Mock
31+
private PromptChangeListener promptChangeListener;
32+
33+
@Mock
34+
private PrintWriter writer;
35+
36+
@BeforeEach
37+
void setUp() {
38+
when(terminal.writer()).thenReturn(writer);
39+
terminalSupport = new TerminalSupport(terminal, lineReader, promptChangeListener);
40+
}
41+
42+
@Test
43+
void write() {
44+
terminalSupport.write("x");
45+
InOrder inOrder = Mockito.inOrder(writer);
46+
inOrder.verify(writer).println("x");
47+
inOrder.verify(writer).flush();
48+
}
49+
50+
@Test
51+
void request_prompt() {
52+
terminalSupport.request("?");
53+
verify(lineReader).readLine("? ");
54+
}
55+
56+
@Test
57+
void request_empty() {
58+
when(lineReader.readLine(anyString())).thenReturn("");
59+
assertThat(terminalSupport.request("?")).isEmpty();
60+
}
61+
62+
@Test
63+
void request_blank() {
64+
when(lineReader.readLine(anyString())).thenReturn("\t \r\n");
65+
assertThat(terminalSupport.request("?")).isEmpty();
66+
}
67+
68+
@Test
69+
void request() {
70+
when(lineReader.readLine(anyString())).thenReturn("hello");
71+
assertThat(terminalSupport.request("?")).contains("hello");
72+
}
73+
74+
@Test
75+
void changePrompt() {
76+
terminalSupport.changePrompt("x");
77+
verify(promptChangeListener).changePrompt("x");
78+
}
79+
80+
@Test
81+
void changePromptToDefault() {
82+
terminalSupport.changePromptToDefault();
83+
verify(promptChangeListener).changePromptToDefault();
84+
}
85+
}

0 commit comments

Comments
 (0)