exercism/csharp/circular-buffer/CircularBufferTests.cs

147 lines
4.0 KiB
C#

using System;
using Xunit;
public class CircularBufferTests
{
[Fact]
public void Reading_empty_buffer_should_fail()
{
var buffer = new CircularBuffer<int>(capacity: 1);
Assert.Throws<InvalidOperationException>(() => buffer.Read());
}
[Fact]
public void Can_read_an_item_just_written()
{
var buffer = new CircularBuffer<int>(capacity: 1);
buffer.Write(1);
Assert.Equal(1, buffer.Read());
}
[Fact]
public void Each_item_may_only_be_read_once()
{
var buffer = new CircularBuffer<int>(capacity: 1);
buffer.Write(1);
Assert.Equal(1, buffer.Read());
Assert.Throws<InvalidOperationException>(() => buffer.Read());
}
[Fact]
public void Items_are_read_in_the_order_they_are_written()
{
var buffer = new CircularBuffer<int>(capacity: 2);
buffer.Write(1);
buffer.Write(2);
Assert.Equal(1, buffer.Read());
Assert.Equal(2, buffer.Read());
}
[Fact]
public void Full_buffer_cant_be_written_to()
{
var buffer = new CircularBuffer<int>(capacity: 1);
buffer.Write(1);
Assert.Throws<InvalidOperationException>(() => buffer.Write(2));
}
[Fact]
public void A_read_frees_up_capacity_for_another_write()
{
var buffer = new CircularBuffer<int>(capacity: 1);
buffer.Write(1);
Assert.Equal(1, buffer.Read());
buffer.Write(2);
Assert.Equal(2, buffer.Read());
}
[Fact]
public void Read_position_is_maintained_even_across_multiple_writes()
{
var buffer = new CircularBuffer<int>(capacity: 3);
buffer.Write(1);
buffer.Write(2);
Assert.Equal(1, buffer.Read());
buffer.Write(3);
Assert.Equal(2, buffer.Read());
Assert.Equal(3, buffer.Read());
}
[Fact]
public void Items_cleared_out_of_buffer_cant_be_read()
{
var buffer = new CircularBuffer<int>(capacity: 1);
buffer.Write(1);
buffer.Clear();
Assert.Throws<InvalidOperationException>(() => buffer.Read());
}
[Fact]
public void Clear_frees_up_capacity_for_another_write()
{
var buffer = new CircularBuffer<int>(capacity: 1);
buffer.Write(1);
buffer.Clear();
buffer.Write(2);
Assert.Equal(2, buffer.Read());
}
[Fact]
public void Clear_does_nothing_on_empty_buffer()
{
var buffer = new CircularBuffer<int>(capacity: 1);
buffer.Clear();
buffer.Write(1);
Assert.Equal(1, buffer.Read());
}
[Fact]
public void Overwrite_acts_like_write_on_non_full_buffer()
{
var buffer = new CircularBuffer<int>(capacity: 2);
buffer.Write(1);
buffer.Overwrite(2);
Assert.Equal(1, buffer.Read());
Assert.Equal(2, buffer.Read());
}
[Fact]
public void Overwrite_replaces_the_oldest_item_on_full_buffer()
{
var buffer = new CircularBuffer<int>(capacity: 2);
buffer.Write(1);
buffer.Write(2);
buffer.Overwrite(3);
Assert.Equal(2, buffer.Read());
Assert.Equal(3, buffer.Read());
}
[Fact]
public void Overwrite_replaces_the_oldest_item_remaining_in_buffer_following_a_read()
{
var buffer = new CircularBuffer<int>(capacity: 3);
buffer.Write(1);
buffer.Write(2);
buffer.Write(3);
Assert.Equal(1, buffer.Read());
buffer.Write(4);
buffer.Overwrite(5);
Assert.Equal(3, buffer.Read());
Assert.Equal(4, buffer.Read());
Assert.Equal(5, buffer.Read());
}
[Fact]
public void Initial_clear_does_not_affect_wrapping_around()
{
var buffer = new CircularBuffer<int>(capacity: 2);
buffer.Clear();
buffer.Write(1);
buffer.Write(2);
buffer.Overwrite(3);
buffer.Overwrite(4);
Assert.Equal(3, buffer.Read());
Assert.Equal(4, buffer.Read());
Assert.Throws<InvalidOperationException>(() => buffer.Read());
}
}