Livt packages

Eccelerators.Cli

Version 1.4.1

Transport-independent, bounded command-line input, parsing, editing, and output for Livt FPGA applications.

Published files (23)

tests/CliOutputTest.lvt

namespace Eccelerators.Cli.Tests

using Eccelerators.Cli

@Test
component CliOutputTest
{
	output: CliOutput

	new()
	{
		this.output = new CliOutput()
	}

	@Test
	fn StartsEmpty()
	{
		this.output.Clear()
		assert this.output.HasData() == false
		assert this.output.GetCount() == 0
		assert this.output.GetFreeSpace() == this.output.BUFFER_SIZE
		assert this.output.Peek() == 0x00
		assert this.output.Consume() == false
	}

	@Test
	fn PreservesByteOrder()
	{
		this.output.Clear()
		assert this.output.TryWriteByte(0x41) == true
		assert this.output.TryWriteByte(0x42) == true
		assert this.output.Peek() == 0x41
		assert this.output.Consume() == true
		assert this.output.Peek() == 0x42
		assert this.output.Consume() == true
		assert this.output.HasData() == false
	}

	@Test
	fn WritesArraysAtomically()
	{
		this.output.Clear()
		var message = "hello".Encode()
		assert this.output.TryWrite(message) == true
		assert this.output.GetCount() == 5
		assert this.output.Peek() == 0x68
	}

	@Test
	fn AppendsCrLfToLines()
	{
		this.output.Clear()
		var message = "ok".Encode()
		assert this.output.TryWriteLine(message) == true
		assert this.output.GetCount() == 4
		assert this.output.Peek() == 0x6F
		assert this.output.Consume() == true
		assert this.output.Peek() == 0x6B
		assert this.output.Consume() == true
		assert this.output.Peek() == 0x0D
		assert this.output.Consume() == true
		assert this.output.Peek() == 0x0A
	}

	@Test
	fn RejectsWritesWhenFullWithoutChangingData()
	{
		this.output.Clear()

		for (var i = 0; i < this.output.BUFFER_SIZE; i++) {
			assert this.output.TryWriteByte(i as byte) == true
		}

		assert this.output.GetFreeSpace() == 0
		assert this.output.TryWriteByte(0xFF) == false
		var message = "x".Encode()
		assert this.output.TryWrite(message) == false
		assert this.output.GetCount() == this.output.BUFFER_SIZE
		assert this.output.Peek() == 0x00
	}

	@Test
	fn WrapsAfterBytesAreConsumed()
	{
		this.output.Clear()

		for (var i = 0; i < this.output.BUFFER_SIZE; i++) {
			assert this.output.TryWriteByte(i as byte) == true
		}

		for (var i = 0; i < 8; i++) {
			assert this.output.Consume() == true
		}

		for (var i = 0; i < 8; i++) {
			assert this.output.TryWriteByte((0xA0 + i) as byte) == true
		}

		assert this.output.GetCount() == this.output.BUFFER_SIZE

		for (var i = 8; i < this.output.BUFFER_SIZE; i++) {
			assert this.output.Peek() == (i as byte)
			assert this.output.Consume() == true
		}

		for (var i = 0; i < 8; i++) {
			assert this.output.Peek() == ((0xA0 + i) as byte)
			assert this.output.Consume() == true
		}

		assert this.output.HasData() == false
	}

	@Test
	fn RejectsAtomicLineWithoutPartialWrite()
	{
		this.output.Clear()

		for (var i = 0; i < this.output.BUFFER_SIZE - 1; i++) {
			assert this.output.TryWriteByte(i as byte) == true
		}

		var empty = "".Encode()
		assert this.output.TryWriteLine(empty) == false
		assert this.output.GetCount() == this.output.BUFFER_SIZE - 1
		assert this.output.Peek() == 0x00
	}
}