Livt packages

Livt.IO

Version 1.8.1

Memory, UART, I2C, SPI, and Ethernet input/output components for Livt hardware designs.

Published files (126)

tests/i2c/I2cRegisterSlaveTest.lvt

namespace Livt.IO.Tests

using Livt.IO

/**
 * Test bus adapter that exposes observed line levels and low-drive requests without
 * physical board pins.
 */
component I2CRegisterSlaveSmokeBus : I2CBus
{
	/**
	 * Initializes fixture state and constructor bindings. Test cases share the fixture
	 * instance rather than constructing a fresh subject for each method.
	 */
	new()
	{
		this.scl = 0b1
		this.sda = 0b1
	}
}

/**
 * Exercises I2CRegisterSlave with a shared fixture instance. Each scenario establishes the
 * inputs and state it needs.
 */
@Test
component I2CRegisterSlaveTest
{
	// Shared fixture instances, signals, and observation state.
	bus: I2CRegisterSlaveSmokeBus
	registers: I2CRegisterSlave

	/**
	 * Creates the shared fixture instances (I2CRegisterSlaveSmokeBus, I2CRegisterSlave). Tests
	 * initialize the state required by their scenario.
	 */
	new()
	{
		this.bus = new I2CRegisterSlaveSmokeBus()
		this.registers = new I2CRegisterSlave(this.bus, 0x42)
	}

	/**
	 * Checks the initial pointer state case.
	 */
	@Test
	fn TestInitialPointerState()
	{
		assert this.registers.HasPointer() == false
		assert this.registers.GetPointer() == 0x00
		assert this.registers.HasWrittenRegister() == false
	}

	/**
	 * Checks the set and get register case.
	 */
	@Test
	fn TestSetAndGetRegister()
	{
		this.registers.SetRegister(0x10, 0xAB)
		this.registers.SetRegister(0x80, 0xCD)

		assert this.registers.GetRegister(0x10) == 0xAB
		assert this.registers.GetRegister(0x80) == 0xCD
	}

	/**
	 * Checks the pointer can be set and cleared case.
	 */
	@Test
	fn TestPointerCanBeSetAndCleared()
	{
		this.registers.SetPointer(0x21)

		assert this.registers.HasPointer() == true
		assert this.registers.GetPointer() == 0x21

		this.registers.ClearPointer()

		assert this.registers.HasPointer() == false
		assert this.registers.GetPointer() == 0x00
	}

	/**
	 * Checks that ClearWrittenRegister flag.
	 */
	@Test
	fn TestClearWrittenRegisterFlag()
	{
		this.registers.ClearWrittenRegister()

		assert this.registers.HasWrittenRegister() == false
		assert this.registers.GetWrittenRegister() == 0x00
		assert this.registers.GetWrittenValue() == 0x00
	}

	/**
	 * Checks that AcceptWriteByte selects pointer then writes and increments.
	 */
	@Test
	fn TestAcceptWriteByteSelectsPointerThenWritesAndIncrements()
	{
		this.registers.AcceptWriteByte(0x10)

		assert this.registers.HasPointer() == true
		assert this.registers.GetPointer() == 0x10
		assert this.registers.HasWrittenRegister() == false

		this.registers.AcceptWriteByte(0xAB)

		assert this.registers.GetRegister(0x10) == 0xAB
		assert this.registers.GetPointer() == 0x11
		assert this.registers.HasWrittenRegister() == true
		assert this.registers.GetWrittenRegister() == 0x10
		assert this.registers.GetWrittenValue() == 0xAB

		this.registers.AcceptWriteByte(0xCD)

		assert this.registers.GetRegister(0x11) == 0xCD
		assert this.registers.GetPointer() == 0x12
		assert this.registers.GetWrittenRegister() == 0x11
		assert this.registers.GetWrittenValue() == 0xCD
	}

	/**
	 * Checks that AcceptWriteByte wraps pointer.
	 */
	@Test
	fn TestAcceptWriteByteWrapsPointer()
	{
		this.registers.SetPointer(0xFF)
		this.registers.AcceptWriteByte(0x5A)

		assert this.registers.GetRegister(0xFF) == 0x5A
		assert this.registers.GetPointer() == 0x00
		assert this.registers.GetWrittenRegister() == 0xFF
		assert this.registers.GetWrittenValue() == 0x5A
	}

	/**
	 * Checks the current register follows pointer case.
	 */
	@Test
	fn TestCurrentRegisterFollowsPointer()
	{
		this.registers.SetRegister(0x22, 0x66)
		this.registers.SetPointer(0x22)

		assert this.registers.GetCurrentRegister() == 0x66

		this.registers.PrepareReadByte()

		assert this.registers.GetCurrentRegister() == 0x66
	}

	/**
	 * Checks that HandleTransmittedByte advances only on ack.
	 */
	@Test
	fn TestHandleTransmittedByteAdvancesOnlyOnAck()
	{
		this.registers.SetRegister(0x40, 0x11)
		this.registers.SetRegister(0x41, 0x22)
		this.registers.SetPointer(0x40)

		this.registers.HandleTransmittedByte(true)

		assert this.registers.GetPointer() == 0x41
		assert this.registers.GetCurrentRegister() == 0x22

		this.registers.HandleTransmittedByte(false)

		assert this.registers.GetPointer() == 0x41
		assert this.registers.GetCurrentRegister() == 0x22
	}
}