|  | @@ -0,0 +1,106 @@
 | 
	
		
			
				|  |  | +import CircularBuffer, {
 | 
	
		
			
				|  |  | +  BufferFullError,
 | 
	
		
			
				|  |  | +  BufferEmptyError,
 | 
	
		
			
				|  |  | +} from './circular-buffer'
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +describe('CircularBuffer', () => {
 | 
	
		
			
				|  |  | +  it('reading an empty buffer throws a BufferEmptyError', () => {
 | 
	
		
			
				|  |  | +    const buffer = new CircularBuffer<string>(1)
 | 
	
		
			
				|  |  | +    expect(() => buffer.read()).toThrow(BufferEmptyError)
 | 
	
		
			
				|  |  | +  })
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  it('write and read back one item', () => {
 | 
	
		
			
				|  |  | +    const buffer = new CircularBuffer<string>(1)
 | 
	
		
			
				|  |  | +    buffer.write('1')
 | 
	
		
			
				|  |  | +    expect(buffer.read()).toBe('1')
 | 
	
		
			
				|  |  | +    expect(() => buffer.read()).toThrow(BufferEmptyError)
 | 
	
		
			
				|  |  | +  })
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  it('write and read back multiple items', () => {
 | 
	
		
			
				|  |  | +    const buffer = new CircularBuffer<string>(2)
 | 
	
		
			
				|  |  | +    buffer.write('1')
 | 
	
		
			
				|  |  | +    buffer.write('2')
 | 
	
		
			
				|  |  | +    expect(buffer.read()).toBe('1')
 | 
	
		
			
				|  |  | +    expect(buffer.read()).toBe('2')
 | 
	
		
			
				|  |  | +    expect(() => buffer.read()).toThrow(BufferEmptyError)
 | 
	
		
			
				|  |  | +  })
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  it('clearing a buffer', () => {
 | 
	
		
			
				|  |  | +    const buffer = new CircularBuffer<string>(2)
 | 
	
		
			
				|  |  | +    buffer.write('1')
 | 
	
		
			
				|  |  | +    buffer.write('2')
 | 
	
		
			
				|  |  | +    buffer.clear()
 | 
	
		
			
				|  |  | +    expect(() => buffer.read()).toThrow(BufferEmptyError)
 | 
	
		
			
				|  |  | +    buffer.write('3')
 | 
	
		
			
				|  |  | +    buffer.write('4')
 | 
	
		
			
				|  |  | +    expect(buffer.read()).toBe('3')
 | 
	
		
			
				|  |  | +    expect(buffer.read()).toBe('4')
 | 
	
		
			
				|  |  | +  })
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  it('alternate write and read', () => {
 | 
	
		
			
				|  |  | +    const buffer = new CircularBuffer<string>(2)
 | 
	
		
			
				|  |  | +    buffer.write('1')
 | 
	
		
			
				|  |  | +    expect(buffer.read()).toBe('1')
 | 
	
		
			
				|  |  | +    buffer.write('2')
 | 
	
		
			
				|  |  | +    expect(buffer.read()).toBe('2')
 | 
	
		
			
				|  |  | +  })
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  it('reads back oldest item', () => {
 | 
	
		
			
				|  |  | +    const buffer = new CircularBuffer<string>(3)
 | 
	
		
			
				|  |  | +    buffer.write('1')
 | 
	
		
			
				|  |  | +    buffer.write('2')
 | 
	
		
			
				|  |  | +    buffer.read()
 | 
	
		
			
				|  |  | +    buffer.write('3')
 | 
	
		
			
				|  |  | +    expect(buffer.read()).toBe('2')
 | 
	
		
			
				|  |  | +    expect(buffer.read()).toBe('3')
 | 
	
		
			
				|  |  | +  })
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  it('writing to a full buffer throws a BufferFullError', () => {
 | 
	
		
			
				|  |  | +    const buffer = new CircularBuffer<string>(2)
 | 
	
		
			
				|  |  | +    buffer.write('1')
 | 
	
		
			
				|  |  | +    buffer.write('2')
 | 
	
		
			
				|  |  | +    expect(() => buffer.write('A')).toThrow(BufferFullError)
 | 
	
		
			
				|  |  | +  })
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  it('forced writes over write oldest item in a full buffer', () => {
 | 
	
		
			
				|  |  | +    const buffer = new CircularBuffer<string>(2)
 | 
	
		
			
				|  |  | +    buffer.write('1')
 | 
	
		
			
				|  |  | +    buffer.write('2')
 | 
	
		
			
				|  |  | +    buffer.forceWrite('A')
 | 
	
		
			
				|  |  | +    expect(buffer.read()).toBe('2')
 | 
	
		
			
				|  |  | +    expect(buffer.read()).toBe('A')
 | 
	
		
			
				|  |  | +    expect(() => buffer.read()).toThrow(BufferEmptyError)
 | 
	
		
			
				|  |  | +  })
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  it('forced writes act like write in a non-full buffer', () => {
 | 
	
		
			
				|  |  | +    const buffer = new CircularBuffer<string>(2)
 | 
	
		
			
				|  |  | +    buffer.write('1')
 | 
	
		
			
				|  |  | +    buffer.forceWrite('2')
 | 
	
		
			
				|  |  | +    expect(buffer.read()).toBe('1')
 | 
	
		
			
				|  |  | +    expect(buffer.read()).toBe('2')
 | 
	
		
			
				|  |  | +    expect(() => buffer.read()).toThrow(BufferEmptyError)
 | 
	
		
			
				|  |  | +  })
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  it('alternate force write and read into full buffer', () => {
 | 
	
		
			
				|  |  | +    const buffer = new CircularBuffer<string>(5)
 | 
	
		
			
				|  |  | +    buffer.write('1')
 | 
	
		
			
				|  |  | +    buffer.write('2')
 | 
	
		
			
				|  |  | +    buffer.write('3')
 | 
	
		
			
				|  |  | +    buffer.read()
 | 
	
		
			
				|  |  | +    buffer.read()
 | 
	
		
			
				|  |  | +    buffer.write('4')
 | 
	
		
			
				|  |  | +    buffer.read()
 | 
	
		
			
				|  |  | +    buffer.write('5')
 | 
	
		
			
				|  |  | +    buffer.write('6')
 | 
	
		
			
				|  |  | +    buffer.write('7')
 | 
	
		
			
				|  |  | +    buffer.write('8')
 | 
	
		
			
				|  |  | +    buffer.forceWrite('A')
 | 
	
		
			
				|  |  | +    buffer.forceWrite('B')
 | 
	
		
			
				|  |  | +    expect(buffer.read()).toBe('6')
 | 
	
		
			
				|  |  | +    expect(buffer.read()).toBe('7')
 | 
	
		
			
				|  |  | +    expect(buffer.read()).toBe('8')
 | 
	
		
			
				|  |  | +    expect(buffer.read()).toBe('A')
 | 
	
		
			
				|  |  | +    expect(buffer.read()).toBe('B')
 | 
	
		
			
				|  |  | +    expect(() => buffer.read()).toThrow(BufferEmptyError)
 | 
	
		
			
				|  |  | +  })
 | 
	
		
			
				|  |  | +})
 |