sTodo-m5paper-client/libraries/FastLED/tests/test_bytestream.cpp
2025-06-30 20:47:33 +02:00

261 lines
7.8 KiB
C++

// Compile with: g++ --std=c++11 test.cpp
#include "test.h"
#include "test.h"
#include "fl/bytestreammemory.h"
#include "fx/video/pixel_stream.h"
#include "fl/namespace.h"
using namespace fl;
TEST_CASE("ByteStreamMemory basic operations") {
SUBCASE("Write and read single byte") {
ByteStreamMemory stream(10); // Stream with 10 bytes capacity
uint8_t testByte = 42;
CHECK(stream.write(&testByte, 1) == 1);
uint8_t readByte = 0;
CHECK(stream.read(&readByte, 1) == 1);
CHECK(readByte == testByte);
// Next read should fail since the stream is empty
CHECK(stream.read(&readByte, 1) == 0);
}
SUBCASE("Write and read multiple bytes") {
ByteStreamMemory stream(10);
uint8_t testData[] = {1, 2, 3, 4, 5};
CHECK(stream.write(testData, 5) == 5);
uint8_t readData[5] = {0};
CHECK(stream.read(readData, 5) == 5);
for (int i = 0; i < 5; ++i) {
CHECK(readData[i] == testData[i]);
}
}
SUBCASE("Attempt to read from empty stream") {
ByteStreamMemory stream(10);
uint8_t readByte = 0;
CHECK(stream.read(&readByte, 1) == 0);
}
SUBCASE("Attempt to write beyond capacity") {
ByteStreamMemory stream(5);
uint8_t testData[] = {1, 2, 3, 4, 5, 6};
CHECK(stream.write(testData, 6) == 5); // Should write up to capacity
}
SUBCASE("Attempt to read more than available data") {
ByteStreamMemory stream(10);
uint8_t testData[] = {1, 2, 3};
CHECK(stream.write(testData, 3) == 3);
uint8_t readData[5] = {0};
CHECK_FALSE(stream.read(readData, 5) == 3); // Should read only available data
//CHECK(readData[0] == 1);
//CHECK(readData[1] == 2);
//CHECK(readData[2] == 3);
}
SUBCASE("Multiple write and read operations") {
ByteStreamMemory stream(10);
uint8_t testData1[] = {1, 2, 3};
uint8_t testData2[] = {4, 5};
CHECK(stream.write(testData1, 3) == 3);
CHECK(stream.write(testData2, 2) == 2);
uint8_t readData[5] = {0};
CHECK(stream.read(readData, 5) == 5);
CHECK(readData[0] == 1);
CHECK(readData[1] == 2);
CHECK(readData[2] == 3);
CHECK(readData[3] == 4);
CHECK(readData[4] == 5);
}
SUBCASE("Write after partial read") {
ByteStreamMemory stream(10);
uint8_t testData[] = {1, 2, 3, 4, 5};
CHECK(stream.write(testData, 5) == 5);
uint8_t readData[2] = {0};
CHECK(stream.read(readData, 2) == 2);
CHECK(readData[0] == 1);
CHECK(readData[1] == 2);
uint8_t newTestData[] = {6, 7};
CHECK(stream.write(newTestData, 2) == 2);
uint8_t remainingData[5] = {0};
CHECK(stream.read(remainingData, 5) == 5);
CHECK(remainingData[0] == 3);
CHECK(remainingData[1] == 4);
CHECK(remainingData[2] == 5);
CHECK(remainingData[3] == 6);
CHECK(remainingData[4] == 7);
}
SUBCASE("Fill and empty stream multiple times") {
ByteStreamMemory stream(10);
uint8_t testData[10];
for (uint8_t i = 0; i < 10; ++i) {
testData[i] = i;
}
// First cycle
CHECK(stream.write(testData, 10) == 10);
uint8_t readData[10] = {0};
CHECK(stream.read(readData, 10) == 10);
for (uint8_t i = 0; i < 10; ++i) {
CHECK(readData[i] == i);
}
// Second cycle
CHECK(stream.write(testData, 10) == 10);
CHECK(stream.read(readData, 10) == 10);
for (uint8_t i = 0; i < 10; ++i) {
CHECK(readData[i] == i);
}
}
SUBCASE("Zero-length write and read") {
ByteStreamMemory stream(10);
uint8_t testData[] = {1, 2, 3};
CHECK(stream.write(testData, 0) == 0);
uint8_t readData[3] = {0};
CHECK(stream.read(readData, 0) == 0);
}
SUBCASE("Write and read with null pointers") {
ByteStreamMemory stream(10);
CHECK(stream.write(static_cast<uint8_t*>(nullptr), 5) == 0);
CHECK(stream.read(nullptr, 5) == 0);
}
SUBCASE("Boundary conditions") {
ByteStreamMemory stream(10);
uint8_t testData[10];
for (uint8_t i = 0; i < 10; ++i) {
testData[i] = i;
}
CHECK(stream.write(testData, 10) == 10);
uint8_t readData[10] = {0};
CHECK(stream.read(readData, 10) == 10);
for (uint8_t i = 0; i < 10; ++i) {
CHECK(readData[i] == i);
}
// Try to write again to full capacity
CHECK(stream.write(testData, 10) == 10);
}
SUBCASE("Write with partial capacity") {
ByteStreamMemory stream(5);
uint8_t testData[] = {1, 2, 3, 4, 5};
CHECK(stream.write(testData, 5) == 5);
uint8_t moreData[] = {6, 7};
CHECK(stream.write(moreData, 2) == 0); // Should not write since capacity is full
uint8_t readData[5] = {0};
CHECK(stream.read(readData, 5) == 5);
for (int i = 0; i < 5; ++i) {
CHECK(readData[i] == testData[i]);
}
// Now buffer is empty, try writing again
CHECK(stream.write(moreData, 2) == 2);
CHECK(stream.read(readData, 2) == 2);
CHECK(readData[0] == 6);
CHECK(readData[1] == 7);
}
SUBCASE("Read after buffer is reset") {
ByteStreamMemory stream(10);
uint8_t testData[] = {1, 2, 3};
CHECK(stream.write(testData, 3) == 3);
stream.clear(); // Assuming reset clears the buffer
uint8_t readData[3] = {0};
CHECK(stream.read(readData, 3) == 0); // Should read nothing
}
SUBCASE("Write zero bytes when buffer is full") {
ByteStreamMemory stream(0); // Zero capacity
uint8_t testByte = 42;
CHECK(stream.write(&testByte, 1) == 0); // Cannot write to zero-capacity buffer
}
SUBCASE("Sequential writes and reads") {
ByteStreamMemory stream(10);
for (uint8_t i = 0; i < 10; ++i) {
CHECK(stream.write(&i, 1) == 1);
}
uint8_t readByte = 0;
for (uint8_t i = 0; i < 10; ++i) {
CHECK(stream.read(&readByte, 1) == 1);
CHECK(readByte == i);
}
// Stream should now be empty
CHECK(stream.read(&readByte, 1) == 0);
}
}
TEST_CASE("byte stream memory basic operations") {
const int BYTES_PER_FRAME = 3 * 10 * 10; // Assuming a 10x10 RGB video
// Create a ByteStreamMemory
const uint32_t BUFFER_SIZE = BYTES_PER_FRAME * 10; // Enough for 10 frames
ByteStreamMemoryPtr memoryStream = ByteStreamMemoryPtr::New(BUFFER_SIZE);
// Fill the ByteStreamMemory with test data
uint8_t testData[BUFFER_SIZE];
for (uint32_t i = 0; i < BUFFER_SIZE; ++i) {
testData[i] = static_cast<uint8_t>(i % 256);
}
memoryStream->write(testData, BUFFER_SIZE);
// Create and initialize PixelStream
PixelStreamPtr stream = PixelStreamPtr::New(BYTES_PER_FRAME);
bool initSuccess = stream->beginStream(memoryStream);
REQUIRE(initSuccess);
// Test basic properties
CHECK(stream->getType() == PixelStream::kStreaming);
CHECK(stream->bytesPerFrame() == BYTES_PER_FRAME);
// Read a pixel
CRGB pixel;
bool readSuccess = stream->readPixel(&pixel);
REQUIRE(readSuccess);
CHECK(pixel.r == 0);
CHECK(pixel.g == 1);
CHECK(pixel.b == 2);
// Read some bytes
uint8_t buffer[10];
size_t bytesRead = stream->readBytes(buffer, 10);
CHECK(bytesRead == 10);
for (int i = 0; i < 10; ++i) {
CHECK(buffer[i] == static_cast<uint8_t>((i + 3) % 256));
}
// Check frame counting - streaming mode doesn't support this.
//CHECK(PixelStream->framesDisplayed() == 0);
//CHECK(PixelStream->framesRemaining() == 10); // We have 10 frames of data
// Close the stream
stream->close();
}