137 lines
4.7 KiB
C#
137 lines
4.7 KiB
C#
using System.Buffers;
|
|
using MessagePack;
|
|
using Aquarium.LocalCast;
|
|
|
|
namespace Aquarium.LocalCast.Tests;
|
|
|
|
public sealed class LocalCastVisualStateReaderTests
|
|
{
|
|
[Fact]
|
|
public void ParsesPythonCultCacheRenderFrameStore()
|
|
{
|
|
var store = WriteStore();
|
|
|
|
Assert.True(LocalCastVisualStateReader.TryParseStore(store, out var frame));
|
|
Assert.Equal(7, frame.FrameId);
|
|
Assert.Equal("LocalCastBridge Point Cloud", frame.SpoutSenderName);
|
|
var point = Assert.Single(frame.Points);
|
|
Assert.Equal("rgb:1", point.StableKey);
|
|
Assert.Equal(0.03f, point.RadiusMeters, 6);
|
|
}
|
|
|
|
[Fact]
|
|
public void ParsesPythonCultCacheClapEventsStore()
|
|
{
|
|
var store = WriteStore(includeClapEvents: true);
|
|
|
|
Assert.True(LocalCastVisualStateReader.TryParseClapEventsStore(store, out var frame));
|
|
Assert.Equal(12, frame.FrameId);
|
|
var clap = Assert.Single(frame.Events);
|
|
Assert.Equal("clap:host:0001", clap.StableKey);
|
|
Assert.Equal(123_456_789_000L, clap.AcousticOracleNs);
|
|
Assert.Equal(1.8f, clap.TimingUncertaintyMicroseconds, 6);
|
|
Assert.True(clap.AcousticConfidence > clap.VisualConfidence);
|
|
}
|
|
|
|
private static byte[] WriteStore(bool includeClapEvents = false)
|
|
{
|
|
var payload = WriteRenderFramePayload();
|
|
var recordCount = includeClapEvents ? 2 : 1;
|
|
var buffer = new ArrayBufferWriter<byte>();
|
|
var writer = new MessagePackWriter(buffer);
|
|
writer.WriteArrayHeader(recordCount);
|
|
writer.WriteMapHeader(4);
|
|
writer.Write("key");
|
|
writer.Write(LocalCastVisualStateReader.LiveRenderFrameKey);
|
|
writer.Write("type");
|
|
writer.Write(LocalCastVisualStateReader.RenderFrameType);
|
|
writer.Write("storedAt");
|
|
writer.Write("2026-05-18T18:35:15Z");
|
|
writer.Write("payload");
|
|
writer.Write(payload);
|
|
if (includeClapEvents)
|
|
{
|
|
writer.WriteMapHeader(4);
|
|
writer.Write("key");
|
|
writer.Write(LocalCastVisualStateReader.LiveClapEventsKey);
|
|
writer.Write("type");
|
|
writer.Write(LocalCastVisualStateReader.ClapEventsType);
|
|
writer.Write("storedAt");
|
|
writer.Write("2026-05-18T18:35:15Z");
|
|
writer.Write("payload");
|
|
writer.Write(WriteClapEventsPayload());
|
|
}
|
|
writer.Flush();
|
|
return buffer.WrittenMemory.ToArray();
|
|
}
|
|
|
|
private static byte[] WriteRenderFramePayload()
|
|
{
|
|
var buffer = new ArrayBufferWriter<byte>();
|
|
var writer = new MessagePackWriter(buffer);
|
|
writer.WriteArrayHeader(11);
|
|
writer.Write(LocalCastVisualStateReader.RenderFrameSchemaId);
|
|
writer.Write(7L);
|
|
writer.Write(1_000_000L);
|
|
writer.Write(1_000_000L);
|
|
writer.Write(1_010_000L);
|
|
writer.Write(1_260_000L);
|
|
writer.Write(1_260_000L);
|
|
writer.Write("LocalCastBridge Point Cloud");
|
|
writer.Write(1920);
|
|
writer.Write(1080);
|
|
writer.WriteArrayHeader(1);
|
|
writer.WriteArrayHeader(6);
|
|
writer.Write("rgb:1");
|
|
writer.WriteArrayHeader(3);
|
|
writer.Write(0.1f);
|
|
writer.Write(0.2f);
|
|
writer.Write(1.2f);
|
|
writer.Write(0.03f);
|
|
writer.WriteArrayHeader(4);
|
|
writer.Write(0.7f);
|
|
writer.Write(0.6f);
|
|
writer.Write(0.5f);
|
|
writer.Write(0.9f);
|
|
writer.Write(0.8f);
|
|
writer.Write(1_010_000L);
|
|
writer.Flush();
|
|
return buffer.WrittenMemory.ToArray();
|
|
}
|
|
|
|
private static byte[] WriteClapEventsPayload()
|
|
{
|
|
var buffer = new ArrayBufferWriter<byte>();
|
|
var writer = new MessagePackWriter(buffer);
|
|
writer.WriteArrayHeader(4);
|
|
writer.Write(LocalCastVisualStateReader.ClapEventsSchemaId);
|
|
writer.Write(12L);
|
|
writer.Write(1_000_000L);
|
|
writer.WriteArrayHeader(1);
|
|
writer.WriteArrayHeader(8);
|
|
writer.Write("clap:host:0001");
|
|
writer.WriteArrayHeader(3);
|
|
writer.Write(0.12f);
|
|
writer.Write(0.4f);
|
|
writer.Write(1.35f);
|
|
writer.Write(123_456_789_000L);
|
|
writer.Write(123_456_805_000L);
|
|
writer.Write(1.8f);
|
|
writer.Write(0.82f);
|
|
writer.Write(0.97f);
|
|
writer.WriteArrayHeader(1);
|
|
writer.WriteMapHeader(4);
|
|
writer.Write("sensorId");
|
|
writer.Write("kiyo-pro");
|
|
writer.Write("timestampNs");
|
|
writer.Write(123_456_805_000L);
|
|
writer.Write("uv");
|
|
writer.WriteArrayHeader(2);
|
|
writer.Write(320.0f);
|
|
writer.Write(240.0f);
|
|
writer.Write("score");
|
|
writer.Write(0.9f);
|
|
writer.Flush();
|
|
return buffer.WrittenMemory.ToArray();
|
|
}
|
|
}
|