Skip to content

Commit f5455ca

Browse files
committed
updated interactive test, simplified and cleaned up entire codebase
Signed-off-by: Konstantin Läufer <laufer@cs.luc.edu>
1 parent 0f11121 commit f5455ca

9 files changed

Lines changed: 220 additions & 153 deletions

File tree

build.sbt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@ version := "0.2"
44

55
libraryDependencies ++= Seq(
66
"org.apache.commons" % "commons-collections4" % "4.5.0",
7-
"com.github.sbt.junit" % "jupiter-interface" % "0.15.1" % Test,
8-
"net.jqwik" % "jqwik" % "1.9.3" % Test
7+
"com.github.sbt.junit" % "jupiter-interface" % "0.15.1" % Test
98
)
109

1110
enablePlugins(JavaAppPackaging)

src/main/java/edu/luc/cs/consoleapp/MainLeaky.java

Lines changed: 18 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
package edu.luc.cs.consoleapp;
22

3+
import java.util.Iterator;
34
import java.util.LinkedList;
45
import java.util.List;
56
import java.util.Queue;
67
import java.util.Scanner;
7-
import java.util.stream.Stream;
88

99
import org.apache.commons.collections4.queue.CircularFifoQueue;
1010

@@ -39,29 +39,32 @@ public static void main(final String[] args) {
3939
}
4040

4141
final var input = new Scanner(System.in).useDelimiter("(?U)[^\\p{Alpha}0-9']+");
42-
final var result = new LeakyQueue(lastNWords).process(input.tokens());
42+
final var result = new LeakyQueue(lastNWords, input).process();
4343

4444
result.forEach(
45-
value -> {
46-
System.out.println(value);
47-
// terminate on I/O error such as SIGPIPE
48-
if (System.out.checkError()) {
49-
System.exit(1);
50-
}
51-
});
45+
value -> {
46+
System.out.println(value);
47+
// terminate on I/O error such as SIGPIPE
48+
if (System.out.checkError()) {
49+
System.exit(1);
50+
}
51+
});
5252
}
5353

54-
private static class LeakyQueue {
54+
static class LeakyQueue {
5555

5656
private final Queue<String> queue;
5757

58-
public LeakyQueue(final int capacity) {
59-
queue = new CircularFifoQueue<String>(capacity);
58+
private final Iterator<String> input;
59+
60+
public LeakyQueue(final int capacity, final Iterator<String> input) {
61+
this.queue = new CircularFifoQueue<String>(capacity);
62+
this.input = input;
6063
}
6164

62-
private List<Queue<String>> process(final Stream<String> input) {
63-
final List<Queue<String>> result = new LinkedList<>();
64-
input.forEach(
65+
public List<Queue<String>> process() {
66+
final var result = new LinkedList<Queue<String>>();
67+
input.forEachRemaining(
6568
word -> {
6669
queue.add(word); // the oldest item automatically gets evicted
6770
final var snapshot = new LinkedList<>(queue);
@@ -70,8 +73,4 @@ private List<Queue<String>> process(final Stream<String> input) {
7073
return result;
7174
}
7275
}
73-
74-
public static int getLastNWords() {
75-
return LAST_N_WORDS;
76-
}
7776
}

src/main/java/edu/luc/cs/consoleapp/MainStream.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
package edu.luc.cs.consoleapp;
22

3-
import org.apache.commons.collections4.queue.CircularFifoQueue;
4-
53
import java.util.Scanner;
64

5+
import org.apache.commons.collections4.queue.CircularFifoQueue;
6+
77
// see https://stackoverflow.com/questions/1963806/#21699069
88
// why we're using this implementation instead of java.util.ArrayQueue!
99

src/main/java/edu/luc/cs/consoleapp/MainTestable.java

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -46,13 +46,4 @@ public static void main(final String[] args) {
4646

4747
slidingQueue.process();
4848
}
49-
50-
public static int getLastNWords() {
51-
return LAST_N_WORDS;
52-
}
53-
54-
@Override
55-
public String toString() {
56-
return "MainTestable []";
57-
}
5849
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package edu.luc.cs.consoleapp;
2+
3+
import java.util.Queue;
4+
import java.util.function.Consumer;
5+
6+
/**
7+
* Observer for decoupling sliding window logic from routing updates. The consumer processes the
8+
* output and returns void.
9+
*/
10+
interface OutputHandler extends Consumer<Queue<String>> {}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package edu.luc.cs.consoleapp;
2+
3+
import static org.junit.jupiter.api.Assertions.*;
4+
5+
import java.util.List;
6+
import java.util.Queue;
7+
8+
import org.apache.commons.collections4.queue.CircularFifoQueue;
9+
10+
import org.junit.jupiter.api.Test;
11+
12+
public class TestMainLeaky {
13+
14+
@Test
15+
public void testSlidingWindowEmpty() {
16+
final var input = List.<String>of().iterator();
17+
final var sut = new MainLeaky.LeakyQueue(3, input);
18+
final var result = sut.process();
19+
assertTrue(result.isEmpty());
20+
}
21+
22+
@Test
23+
public void testSlidingWindowNonempty() {
24+
final var input = List.of("asdf", "qwer", "oiui", "zxcv").iterator();
25+
final var sut = new MainLeaky.LeakyQueue(3, input);
26+
final var result = sut.process();
27+
assertEquals(4, result.size());
28+
assertEquals(List.of("asdf"), result.get(0));
29+
assertEquals(List.of("asdf", "qwer"), result.get(1));
30+
assertEquals(List.of("asdf", "qwer", "oiui"), result.get(2));
31+
assertEquals(List.of("qwer", "oiui", "zxcv"), result.get(3));
32+
}
33+
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package edu.luc.cs.consoleapp;
2+
3+
import static org.junit.jupiter.api.Assertions.*;
4+
5+
import java.util.ArrayList;
6+
import java.util.LinkedList;
7+
import java.util.List;
8+
import java.util.Queue;
9+
10+
import org.apache.commons.collections4.queue.CircularFifoQueue;
11+
12+
import org.junit.jupiter.api.Test;
13+
14+
public class TestMainNotDRY {
15+
16+
@Test
17+
public void testSlidingWindowEmpty() {
18+
final var input = List.<String>of().iterator();
19+
final var output = new OutputToList();
20+
final var queue = new CircularFifoQueue<String>(3);
21+
input.forEachRemaining(
22+
word -> {
23+
queue.add(word); // the oldest item automatically gets evicted
24+
output.accept(queue); // send updated queue to output handler
25+
});
26+
final var result = output.result;
27+
assertTrue(result.isEmpty());
28+
}
29+
30+
@Test
31+
public void testSlidingWindowNonempty() {
32+
final var input = List.of("asdf", "qwer", "oiui", "zxcv").iterator();
33+
final var output = new OutputToList();
34+
final var queue = new CircularFifoQueue<String>(3);
35+
input.forEachRemaining(
36+
word -> {
37+
queue.add(word); // the oldest item automatically gets evicted
38+
output.accept(queue); // send updated queue to output handler
39+
});
40+
final var result = output.result;
41+
assertEquals(4, result.size());
42+
assertEquals(List.of("asdf"), result.get(0));
43+
assertEquals(List.of("asdf", "qwer"), result.get(1));
44+
assertEquals(List.of("asdf", "qwer", "oiui"), result.get(2));
45+
assertEquals(List.of("qwer", "oiui", "zxcv"), result.get(3));
46+
}
47+
48+
private static class OutputToList implements OutputHandler {
49+
50+
final List<Queue<String>> result = new ArrayList<>();
51+
52+
@Override
53+
public void accept(final Queue<String> value) {
54+
final var snapshot = new LinkedList<>(value);
55+
result.add(snapshot);
56+
}
57+
}
58+
}

src/test/java/edu/luc/cs/consoleapp/TestSlidingQueue.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
import java.util.LinkedList;
77
import java.util.List;
88
import java.util.Queue;
9-
import java.util.stream.Stream;
109

1110
import org.junit.jupiter.api.Test;
1211

0 commit comments

Comments
 (0)