diff --git a/CHANGELOG.md b/CHANGELOG.md index 0b59e591..e685c5f1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,17 @@ All notable changes to Chromatics are documented here. +## 4.3.34 + +- The console tab now shows which version of Chromatics you are running at startup. +- A device provider that fails to start now says so in the console tab, naming the provider and the reason. Providers that fail no longer look like they loaded, and the rest of your devices carry on loading as normal. + +## 4.3.33 + +- Fixed lighting stopping for the rest of the session when the Screen Capture base layer was in use and you returned to the title or character select screen. +- Yeelight, LIFX, Nanoleaf, and Alienware lights that are switched off or off the network at startup now log as device notices instead of errors. +- Improved the accuracy and speed of game-data reads on FFXIV patch 7.55, including inventory, chat log, job gauges, and player stats. + ## 4.3.31 - Added support for FFXIV patch 7.55. diff --git a/Chromatics.Tests/Chromatics.Tests.csproj b/Chromatics.Tests/Chromatics.Tests.csproj index 53d68223..b71a0e18 100644 --- a/Chromatics.Tests/Chromatics.Tests.csproj +++ b/Chromatics.Tests/Chromatics.Tests.csproj @@ -38,7 +38,7 @@ - + diff --git a/Chromatics.Tests/Core/ScreenCaptureProcessorLifetimeTests.cs b/Chromatics.Tests/Core/ScreenCaptureProcessorLifetimeTests.cs new file mode 100644 index 00000000..891ebb6d --- /dev/null +++ b/Chromatics.Tests/Core/ScreenCaptureProcessorLifetimeTests.cs @@ -0,0 +1,21 @@ +using Chromatics.Layers; + +namespace Chromatics.Tests.Core; + +public class ScreenCaptureProcessorLifetimeTests +{ + [Fact] + public void Instance_IsRebuiltAfterDispose() + { + // DisposeAll runs every time the player returns to the title screen and + // nulls the processor's surface. Handing the disposed object back out + // left the Screen Capture base layer attaching to a dead surface on + // every later tick, which killed lighting for the rest of the session. + var first = ScreenCaptureProcessor.Instance; + first.Dispose(); + + var second = ScreenCaptureProcessor.Instance; + + Assert.NotSame(first, second); + } +} diff --git a/Chromatics.Tests/Helpers/NetworkFailureHelperTests.cs b/Chromatics.Tests/Helpers/NetworkFailureHelperTests.cs new file mode 100644 index 00000000..29ca8910 --- /dev/null +++ b/Chromatics.Tests/Helpers/NetworkFailureHelperTests.cs @@ -0,0 +1,53 @@ +using System; +using System.IO; +using System.Net.Http; +using System.Net.Sockets; +using Chromatics.Helpers; + +namespace Chromatics.Tests.Helpers; + +public class NetworkFailureHelperTests +{ + [Fact] + public void ConnectionRefused_IsUnreachable() + { + var ex = new SocketException((int)SocketError.ConnectionRefused); + + Assert.True(NetworkFailureHelper.IsUnreachable(ex)); + } + + [Fact] + public void SocketFailureWrappedInIoException_IsUnreachable() + { + var ex = new IOException("write failed", new SocketException((int)SocketError.HostUnreachable)); + + Assert.True(NetworkFailureHelper.IsUnreachable(ex)); + } + + [Fact] + public void HttpAndTimeoutFailures_AreUnreachable() + { + Assert.True(NetworkFailureHelper.IsUnreachable(new HttpRequestException("no route"))); + Assert.True(NetworkFailureHelper.IsUnreachable(new TimeoutException())); + Assert.True(NetworkFailureHelper.IsUnreachable(new TaskCanceledException())); + } + + [Fact] + public void SocketFailureInsideAggregate_IsUnreachable() + { + var ex = new AggregateException( + new InvalidOperationException("unrelated"), + new SocketException((int)SocketError.TimedOut)); + + Assert.True(NetworkFailureHelper.IsUnreachable(ex)); + } + + [Fact] + public void ApplicationBugs_AreNotUnreachable() + { + Assert.False(NetworkFailureHelper.IsUnreachable(new NullReferenceException())); + Assert.False(NetworkFailureHelper.IsUnreachable(new InvalidOperationException())); + Assert.False(NetworkFailureHelper.IsUnreachable( + new InvalidOperationException("outer", new ArgumentOutOfRangeException()))); + } +} diff --git a/Chromatics.Tests/Helpers/UpdateNotesTests.cs b/Chromatics.Tests/Helpers/UpdateNotesTests.cs index f370b39b..c44e8290 100644 --- a/Chromatics.Tests/Helpers/UpdateNotesTests.cs +++ b/Chromatics.Tests/Helpers/UpdateNotesTests.cs @@ -57,7 +57,7 @@ public void EmptyOrWhitespaceNotes_ReturnEmpty() { Assert.Equal(string.Empty, UpdateService.TrimNotesToOwnSection("", "4.3.26")); Assert.Equal(string.Empty, UpdateService.TrimNotesToOwnSection(" ", "4.3.26")); - Assert.Equal(string.Empty, UpdateService.TrimNotesToOwnSection(null, "4.3.26")); + Assert.Equal(string.Empty, UpdateService.TrimNotesToOwnSection(null!, "4.3.26")); } [Fact] diff --git a/Chromatics/Chromatics.csproj b/Chromatics/Chromatics.csproj index 7e22007b..50294f07 100644 --- a/Chromatics/Chromatics.csproj +++ b/Chromatics/Chromatics.csproj @@ -10,7 +10,7 @@ net10.0-windows10.0.19041.0 10.0.17763.0 Chromatics.Program - 4.3.31.0 + 4.3.34.0 Danielle Thompson