Explorar el Código

Merge pull request #682 from vivshaw/circular-buffer

circular-buffer: add to track
Logan Stucki hace 9 años
padre
commit
ece1ba7d65

+ 9
- 0
config.json Ver fichero

@@ -469,6 +469,15 @@
469 469
       ]
470 470
     },
471 471
     {
472
+      "slug": "circular-buffer",
473
+      "difficulty": 8,
474
+      "topics": [
475
+        "Queues",
476
+        "Classes",
477
+        "Exception handling"
478
+      ]
479
+    },
480
+    {
472 481
       "slug": "rectangles",
473 482
       "difficulty": 8,
474 483
       "topics": [

+ 18
- 0
exercises/circular-buffer/build.gradle Ver fichero

@@ -0,0 +1,18 @@
1
+apply plugin: "java"
2
+apply plugin: "eclipse"
3
+apply plugin: "idea"
4
+
5
+repositories {
6
+    mavenCentral()
7
+}
8
+
9
+dependencies {
10
+    testCompile "junit:junit:4.12"
11
+}
12
+
13
+test {
14
+    testLogging {
15
+        exceptionFormat = 'full'
16
+        events = ["passed", "failed", "skipped"]
17
+    }
18
+}

+ 6
- 0
exercises/circular-buffer/src/example/java/BufferIOException.java Ver fichero

@@ -0,0 +1,6 @@
1
+public class BufferIOException extends Exception {
2
+
3
+    BufferIOException(String message) {
4
+        super(message);
5
+    }
6
+}

+ 41
- 0
exercises/circular-buffer/src/example/java/CircularBuffer.java Ver fichero

@@ -0,0 +1,41 @@
1
+import java.util.LinkedList;
2
+import java.util.Queue;
3
+
4
+public class CircularBuffer<T> {
5
+
6
+    private Queue<T> buffer;
7
+    private int capacity;
8
+
9
+    public CircularBuffer(int size) {
10
+        this.buffer = new LinkedList<>();
11
+        this.capacity = size;
12
+    }
13
+
14
+    public T read() throws BufferIOException {
15
+        if (this.buffer.size() == 0) {
16
+            throw new BufferIOException("Tried to read from empty buffer");
17
+        }
18
+
19
+        return this.buffer.remove();
20
+    }
21
+
22
+    public void write(T data) throws BufferIOException {
23
+        if (this.buffer.size() == this.capacity) {
24
+            throw new BufferIOException("Tried to write to full buffer");
25
+        }
26
+
27
+        this.buffer.add(data);
28
+    }
29
+    public void overwrite(T data) {
30
+        if (this.buffer.size() == this.capacity) {
31
+            this.buffer.remove();
32
+        }
33
+
34
+        this.buffer.add(data);
35
+    }
36
+
37
+    public void clear() {
38
+        this.buffer.clear();
39
+    }
40
+}
41
+

+ 6
- 0
exercises/circular-buffer/src/main/java/BufferIOException.java Ver fichero

@@ -0,0 +1,6 @@
1
+public class BufferIOException extends Exception {
2
+
3
+    BufferIOException(String message) {
4
+        super(message);
5
+    }
6
+}

+ 163
- 0
exercises/circular-buffer/src/test/java/CircularBufferTest.java Ver fichero

@@ -0,0 +1,163 @@
1
+import static org.junit.Assert.assertThat;
2
+import static org.hamcrest.CoreMatchers.is;
3
+
4
+import org.junit.Ignore;
5
+import org.junit.Rule;
6
+import org.junit.Test;
7
+import org.junit.rules.ExpectedException;
8
+
9
+public class CircularBufferTest {
10
+
11
+    @Rule
12
+    public ExpectedException expectedException = ExpectedException.none();
13
+
14
+    @Test
15
+    public void readingFromEmptyBufferShouldThrowException() throws BufferIOException {
16
+        CircularBuffer<Integer> buffer = new CircularBuffer<>(1);
17
+
18
+        expectedException.expect(BufferIOException.class);
19
+        expectedException.expectMessage("Tried to read from empty buffer");
20
+        buffer.read();
21
+    }
22
+
23
+    @Ignore("Remove to run test")
24
+    @Test
25
+    public void canReadItemJustWritten() throws BufferIOException {
26
+        CircularBuffer<Integer> buffer = new CircularBuffer<>(1);
27
+
28
+        buffer.write(1);
29
+        assertThat(buffer.read(), is(1));
30
+    }
31
+
32
+    @Ignore("Remove to run test")
33
+    @Test
34
+    public void canReadItemOnlyOnce() throws BufferIOException {
35
+        CircularBuffer<Integer> buffer = new CircularBuffer<>(1);
36
+
37
+        buffer.write(1);
38
+        assertThat(buffer.read(), is(1));
39
+
40
+        expectedException.expect(BufferIOException.class);
41
+        expectedException.expectMessage("Tried to read from empty buffer");
42
+        buffer.read();
43
+    }
44
+
45
+    @Ignore("Remove to run test")
46
+    @Test
47
+    public void readsItemsInOrderWritten() throws BufferIOException { 
48
+        CircularBuffer<Integer> buffer = new CircularBuffer<>(2);
49
+
50
+        buffer.write(1);
51
+        buffer.write(2);
52
+        assertThat(buffer.read(), is(1));
53
+        assertThat(buffer.read(), is(2));
54
+    }
55
+
56
+    @Ignore("Remove to run test")
57
+    @Test
58
+    public void fullBufferCantBeWrittenTo() throws BufferIOException {
59
+        CircularBuffer<Integer> buffer = new CircularBuffer<>(1);
60
+
61
+        buffer.write(1);
62
+        expectedException.expect(BufferIOException.class);
63
+        expectedException.expectMessage("Tried to write to full buffer");
64
+        buffer.write(2);
65
+    }
66
+
67
+    @Ignore("Remove to run test")
68
+    @Test
69
+    public void readFreesUpSpaceForWrite() throws BufferIOException {
70
+        CircularBuffer<Integer> buffer = new CircularBuffer<>(1);
71
+
72
+        buffer.write(1);
73
+        assertThat(buffer.read(), is(1));
74
+        buffer.write(2);
75
+        assertThat(buffer.read(), is(2));
76
+    }
77
+
78
+    @Ignore("Remove to run test")
79
+    @Test
80
+    public void maintainsReadPositionAcrossWrites() throws BufferIOException {
81
+        CircularBuffer<Integer> buffer = new CircularBuffer<>(3);
82
+
83
+        buffer.write(1);
84
+        buffer.write(2);
85
+        assertThat(buffer.read(), is(1));
86
+        buffer.write(3);
87
+        assertThat(buffer.read(), is(2));
88
+        assertThat(buffer.read(), is(3));
89
+    }
90
+
91
+    @Ignore("Remove to run test")
92
+    @Test
93
+    public void cantReadClearedItems() throws BufferIOException {
94
+        CircularBuffer<Integer> buffer = new CircularBuffer<>(1);
95
+
96
+        buffer.write(1);
97
+        buffer.clear();
98
+        expectedException.expect(BufferIOException.class);
99
+        expectedException.expectMessage("Tried to read from empty buffer");
100
+        buffer.read();
101
+    }
102
+
103
+    @Ignore("Remove to run test")
104
+    @Test
105
+    public void clearFreesUpCapacity() throws BufferIOException {
106
+        CircularBuffer<Integer> buffer = new CircularBuffer<>(1);
107
+
108
+        buffer.write(1);
109
+        buffer.clear();
110
+        buffer.write(2);
111
+        assertThat(buffer.read(), is(2));
112
+    }
113
+
114
+    @Ignore("Remove to run test")
115
+    @Test
116
+    public void clearDoesNothingOnEmptyBuffer() throws BufferIOException {
117
+        CircularBuffer<Integer> buffer = new CircularBuffer<>(1);
118
+
119
+        buffer.clear();
120
+        buffer.write(1);
121
+        assertThat(buffer.read(), is(1));
122
+    }
123
+
124
+    @Ignore("Remove to run test")
125
+    @Test
126
+    public void overwriteActsLikeWriteOnNonFullBuffer() throws BufferIOException {
127
+        CircularBuffer<Integer> buffer = new CircularBuffer<>(2);
128
+
129
+        buffer.write(1);
130
+        buffer.overwrite(2);
131
+        assertThat(buffer.read(), is(1));
132
+        assertThat(buffer.read(), is(2));
133
+    }
134
+
135
+    @Ignore("Remove to run test")
136
+    @Test
137
+    public void overwriteRemovesOldestElementOnFullBuffer() throws BufferIOException {
138
+        CircularBuffer<Integer> buffer = new CircularBuffer<>(2);
139
+
140
+        buffer.write(1);
141
+        buffer.write(2);
142
+        buffer.overwrite(3);
143
+        assertThat(buffer.read(), is(2));
144
+        assertThat(buffer.read(), is(3));
145
+    }
146
+
147
+    @Ignore("Remove to run test")
148
+    @Test
149
+    public void overwriteDoesntRemoveAnAlreadyReadElement() throws BufferIOException {
150
+        CircularBuffer<Integer> buffer = new CircularBuffer<>(3);
151
+
152
+        buffer.write(1);
153
+        buffer.write(2);
154
+        buffer.write(3);
155
+        assertThat(buffer.read(), is(1));
156
+        buffer.write(4);
157
+        buffer.overwrite(5);
158
+        assertThat(buffer.read(), is(3));
159
+        assertThat(buffer.read(), is(4));
160
+        assertThat(buffer.read(), is(5));
161
+    }
162
+}
163
+

+ 1
- 0
exercises/settings.gradle Ver fichero

@@ -14,6 +14,7 @@ include 'book-store'
14 14
 include 'bowling'
15 15
 include 'bracket-push'
16 16
 include 'change'
17
+include 'circular-buffer'
17 18
 include 'clock'
18 19
 include 'collatz-conjecture'
19 20
 include 'complex-numbers'