Skip to content

Commit 77262a4

Browse files
Merge pull request #1 from davidg238/master
min/max, changes + tests
2 parents f48b008 + 07ab9b0 commit 77262a4

2 files changed

Lines changed: 83 additions & 13 deletions

File tree

src/ringbuffer.toit

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -17,22 +17,34 @@ class RingBuffer:
1717
head = (head + 1) % size_
1818
count = min (count + 1) size_
1919

20-
min value1 value2:
21-
if value1 < value2:
22-
return value1
23-
return value2
20+
is_empty -> bool:
21+
return count == 0
22+
23+
reduce [block]:
24+
if is_empty: throw "Not enough elements"
25+
result := null
26+
is_first := true
27+
for i := 0; i < count; i++:
28+
if is_first: result = buffer[i]; is_first = false
29+
else: result = block.call result buffer[i]
30+
return result
31+
32+
minimum -> float:
33+
return reduce : | a b | min a b
34+
35+
maximum -> float:
36+
return reduce : | a b | max a b
2437

2538
average -> float:
26-
average := 0.0
27-
for i := 0; i <= count - 1; i++:
28-
average += buffer[i]
29-
return average/count
39+
sum := reduce : | a b | a + b
40+
return sum / count
3041

3142
std_deviation -> float:
32-
variance := 0.0
33-
for i := 0; i < count; i++:
34-
variance += math.pow (buffer[i] - average) 2
35-
43+
if is_empty: throw "Not enough elements"
44+
if count < 2:
45+
return 0.0 //if there is only one entry return 0.0
46+
avg := average
47+
variance := reduce : | a b | a += math.pow (b - avg) 2
3648
return math.sqrt variance / size_
3749

3850
get_last -> float:

test/test_ringbuffer.toit

Lines changed: 59 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,14 @@ import ringbuffer show *
44
class TestRingbuffer implements TestCase:
55

66
run:
7+
test_ringbuffer_average_on_empty_exception
8+
test_ringbuffer_minimum_on_empty_exception
9+
test_ringbuffer_maximum_on_empty_exception
10+
test_ringbuffer_deviation_on_empty_exception
11+
test_ringbuffer_one_element
712
test_ringbuffer_average
13+
test_ringbuffer_minimum
14+
test_ringbuffer_maximum
815
test_ringbuffer_max
916
test_ringbuffer_limit
1017
test_ringbuffer_get_last
@@ -13,6 +20,39 @@ class TestRingbuffer implements TestCase:
1320
name -> string:
1421
return "TestRingbuffer"
1522

23+
test_ringbuffer_average_on_empty_exception:
24+
ringbuffer := RingBuffer 3
25+
exception := catch:
26+
ringbuffer.average //average
27+
assertException exception
28+
29+
test_ringbuffer_minimum_on_empty_exception:
30+
ringbuffer := RingBuffer 3
31+
exception := catch:
32+
ringbuffer.minimum //minimum
33+
assertException exception
34+
35+
test_ringbuffer_maximum_on_empty_exception:
36+
ringbuffer := RingBuffer 3
37+
exception := catch:
38+
ringbuffer.maximum //maximum
39+
assertException exception
40+
41+
test_ringbuffer_deviation_on_empty_exception:
42+
ringbuffer := RingBuffer 3
43+
exception := catch:
44+
ringbuffer.std_deviation //std_deviation
45+
assertException exception
46+
47+
test_ringbuffer_one_element:
48+
ringbuffer := RingBuffer 3
49+
ringbuffer.append 2.3
50+
assertEquals 2.3 ringbuffer.average
51+
assertEquals 2.3 ringbuffer.minimum
52+
assertEquals 2.3 ringbuffer.maximum
53+
assertEquals 0.0 ringbuffer.std_deviation
54+
55+
1656
test_ringbuffer_average:
1757
ringbuffer := RingBuffer 3
1858
ringbuffer.append 1.0
@@ -23,6 +63,24 @@ class TestRingbuffer implements TestCase:
2363
ringbuffer.append 3.0
2464
assertEquals 3.0 ringbuffer.average "RingBuffer average function test OK"
2565

66+
test_ringbuffer_minimum:
67+
ringbuffer := RingBuffer 3
68+
ringbuffer.append 1.0
69+
ringbuffer.append 2.0
70+
ringbuffer.append 3.0
71+
assertEquals 1.0 ringbuffer.minimum "RingBuffer minimum function test OK"
72+
ringbuffer.append 4.0
73+
assertEquals 2.0 ringbuffer.minimum "RingBuffer minimum function test OK"
74+
75+
test_ringbuffer_maximum:
76+
ringbuffer := RingBuffer 3
77+
ringbuffer.append 1.0
78+
ringbuffer.append 2.0
79+
ringbuffer.append 3.0
80+
assertEquals 3.0 ringbuffer.maximum "RingBuffer maximum function test OK"
81+
ringbuffer.append -3.0
82+
assertEquals 3.0 ringbuffer.maximum "RingBuffer maximum function test OK"
83+
2684
test_ringbuffer_max:
2785
ringbuffer := RingBuffer 5
2886
ringbuffer.append 1.0
@@ -36,7 +94,7 @@ class TestRingbuffer implements TestCase:
3694
test_ringbuffer_limit:
3795
exception := catch:
3896
ringbuffer := RingBuffer -1
39-
assertException "RingBuffer size must be larger then 0"
97+
assertException exception
4098

4199
test_ringbuffer_get_last:
42100
ringbuffer := RingBuffer 5

0 commit comments

Comments
 (0)