namespace SuiteLink.Client.IntegrationTests; public sealed class TagRoundTripTests { [Fact] public async Task BooleanTag_RoundTrip_WhenConfigured() { if (!TryGetTagSettings(out var settings, out var tagName, "bool")) { return; } await RunRoundTripAsync( settings, tagName, SuiteLinkValue.FromBoolean(true), value => value.TryGetBoolean(out _)); } [Fact] public async Task IntegerTag_RoundTrip_WhenConfigured() { if (!TryGetTagSettings(out var settings, out var tagName, "int")) { return; } await RunRoundTripAsync( settings, tagName, SuiteLinkValue.FromInt32(42), value => value.TryGetInt32(out _)); } [Fact] public async Task FloatTag_RoundTrip_WhenConfigured() { if (!TryGetTagSettings(out var settings, out var tagName, "float")) { return; } await RunRoundTripAsync( settings, tagName, SuiteLinkValue.FromFloat32(12.25f), value => value.TryGetFloat32(out _)); } [Fact] public async Task StringTag_RoundTrip_WhenConfigured() { if (!TryGetTagSettings(out var settings, out var tagName, "string")) { return; } await RunRoundTripAsync( settings, tagName, SuiteLinkValue.FromString("integration-test"), value => value.TryGetString(out _)); } private static bool TryGetTagSettings( out IntegrationSettings settings, out string tagName, string type) { settings = null!; tagName = string.Empty; if (!IntegrationSettings.TryLoad(out settings, out _)) { return false; } tagName = type switch { "bool" => settings.BooleanTag ?? string.Empty, "int" => settings.IntegerTag ?? string.Empty, "float" => settings.FloatTag ?? string.Empty, "string" => settings.StringTag ?? string.Empty, _ => string.Empty }; return !string.IsNullOrWhiteSpace(tagName); } private static async Task RunRoundTripAsync( IntegrationSettings settings, string tagName, SuiteLinkValue writeValue, Func typeCheck) { await using var client = new SuiteLinkClient(); using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(20)); await client.ConnectAsync(settings.Connection, cts.Token); var readBefore = await client.ReadAsync(tagName, TimeSpan.FromSeconds(10), cts.Token); Assert.True(typeCheck(readBefore.Value)); await client.WriteAsync(tagName, writeValue, cts.Token); var readAfter = await client.ReadAsync(tagName, TimeSpan.FromSeconds(10), cts.Token); Assert.True(typeCheck(readAfter.Value)); } }