From 25a78da7781af59746aed2f3df2f4b7406d33a4c Mon Sep 17 00:00:00 2001 From: prozolic <42107886+prozolic@users.noreply.github.com> Date: Mon, 11 May 2026 23:22:37 +0900 Subject: [PATCH 1/2] Add CsTomlFileSerializer.Deserialize/DeserializeAsync/Serialize/SerializeAsync overload accepting TomlFileExtensionPolicy --- src/CsToml.Extensions/CsTomlFileSerializer.cs | 43 ++- .../TomlFileExtensionPolicy.cs | 8 + ...CsTomlFileSerializerExtensionPolicyTest.cs | 311 ++++++++++++++++++ 3 files changed, 351 insertions(+), 11 deletions(-) create mode 100644 src/CsToml.Extensions/TomlFileExtensionPolicy.cs create mode 100644 tests/CsToml.Tests/CsTomlFileSerializerExtensionPolicyTest.cs diff --git a/src/CsToml.Extensions/CsTomlFileSerializer.cs b/src/CsToml.Extensions/CsTomlFileSerializer.cs index a809a75..e23644c 100644 --- a/src/CsToml.Extensions/CsTomlFileSerializer.cs +++ b/src/CsToml.Extensions/CsTomlFileSerializer.cs @@ -2,6 +2,7 @@ using CsToml.Extensions.Utility; using Cysharp.Collections; using System.Buffers; +using System.Runtime.CompilerServices; namespace CsToml.Extensions; @@ -10,9 +11,11 @@ public partial class CsTomlFileSerializer private static readonly string TomlExtension = ".toml"; public static T Deserialize(string tomlFilePath, CsTomlSerializerOptions? options = null) + => Deserialize(tomlFilePath, TomlFileExtensionPolicy.Strict, options); + + public static T Deserialize(string tomlFilePath, TomlFileExtensionPolicy extensionPolicy, CsTomlSerializerOptions? options = null) { - if (Path.GetExtension(tomlFilePath) != TomlExtension) - throw new FormatException($"TOML files should use the extension .toml"); + ValidateExtension(tomlFilePath, extensionPolicy); using var handle = File.OpenHandle(tomlFilePath!, FileMode.Open, FileAccess.Read, options: FileOptions.SequentialScan); var length = RandomAccess.GetLength(handle); @@ -54,10 +57,12 @@ public static T Deserialize(string tomlFilePath, CsTomlSerializerOptions? opt } } - public static async ValueTask DeserializeAsync(string tomlFilePath, CsTomlSerializerOptions? options = null, bool configureAwait = false, CancellationToken cancellationToken = default) + public static ValueTask DeserializeAsync(string tomlFilePath, CsTomlSerializerOptions? options = null, bool configureAwait = false, CancellationToken cancellationToken = default) + => DeserializeAsync(tomlFilePath, TomlFileExtensionPolicy.Strict, options, configureAwait, cancellationToken); + + public static async ValueTask DeserializeAsync(string tomlFilePath, TomlFileExtensionPolicy extensionPolicy, CsTomlSerializerOptions? options = null, bool configureAwait = false, CancellationToken cancellationToken = default) { - if (Path.GetExtension(tomlFilePath) != TomlExtension) - throw new FormatException($"TOML files should use the extension .toml"); + ValidateExtension(tomlFilePath, extensionPolicy); cancellationToken.ThrowIfCancellationRequested(); using var handle = File.OpenHandle(tomlFilePath!, FileMode.Open, FileAccess.Read, options: FileOptions.SequentialScan | FileOptions.Asynchronous); @@ -99,9 +104,11 @@ public static async ValueTask DeserializeAsync(string tomlFilePath, CsToml } public static void Serialize(string tomlFilePath, T value, CsTomlSerializerOptions? options = null) + => Serialize(tomlFilePath, value, TomlFileExtensionPolicy.Strict, options); + + public static void Serialize(string tomlFilePath, T value, TomlFileExtensionPolicy extensionPolicy, CsTomlSerializerOptions? options = null) { - if (Path.GetExtension(tomlFilePath) != TomlExtension) - throw new FormatException($"TOML file should use the extension .toml"); + ValidateExtension(tomlFilePath, extensionPolicy); var directory = new FileInfo(tomlFilePath).Directory; if (!directory!.Exists) @@ -116,10 +123,12 @@ public static void Serialize(string tomlFilePath, T value, CsTomlSerializerOp bufferWriter.WriteTo(fileWriter.ByteWriter); } - public static async ValueTask SerializeAsync(string tomlFilePath, T value, CsTomlSerializerOptions? options = null, bool configureAwait = false, CancellationToken cancellationToken = default) + public static ValueTask SerializeAsync(string tomlFilePath, T value, CsTomlSerializerOptions? options = null, bool configureAwait = false, CancellationToken cancellationToken = default) + => SerializeAsync(tomlFilePath, value, TomlFileExtensionPolicy.Strict, options, configureAwait, cancellationToken); + + public static async ValueTask SerializeAsync(string tomlFilePath, T value, TomlFileExtensionPolicy extensionPolicy, CsTomlSerializerOptions? options = null, bool configureAwait = false, CancellationToken cancellationToken = default) { - if (Path.GetExtension(tomlFilePath) != TomlExtension) - throw new FormatException($"TOML file should use the extension .toml"); + ValidateExtension(tomlFilePath, extensionPolicy); var directory = new FileInfo(tomlFilePath).Directory; if (!directory!.Exists) @@ -136,6 +145,18 @@ public static async ValueTask SerializeAsync(string tomlFilePath, T value, Cs await bufferWriter.WriteToAsync(fileWriter.ByteWriter, configureAwait, cancellationToken); } -} + private static void ValidateExtension(string tomlFilePath, TomlFileExtensionPolicy extensionPolicy) + { + if (extensionPolicy == TomlFileExtensionPolicy.Strict && Path.GetExtension(tomlFilePath) != TomlExtension) + { + ThrowExtensionFormatException(); + } + } + [MethodImpl(MethodImplOptions.NoInlining)] + private static void ThrowExtensionFormatException() + { + throw new FormatException("TOML files should use the extension .toml"); + } +} diff --git a/src/CsToml.Extensions/TomlFileExtensionPolicy.cs b/src/CsToml.Extensions/TomlFileExtensionPolicy.cs new file mode 100644 index 0000000..80d66b7 --- /dev/null +++ b/src/CsToml.Extensions/TomlFileExtensionPolicy.cs @@ -0,0 +1,8 @@ + +namespace CsToml.Extensions; + +public enum TomlFileExtensionPolicy +{ + Strict = 0, + Relaxed = 1 +} \ No newline at end of file diff --git a/tests/CsToml.Tests/CsTomlFileSerializerExtensionPolicyTest.cs b/tests/CsToml.Tests/CsTomlFileSerializerExtensionPolicyTest.cs new file mode 100644 index 0000000..952fd06 --- /dev/null +++ b/tests/CsToml.Tests/CsTomlFileSerializerExtensionPolicyTest.cs @@ -0,0 +1,311 @@ +using CsToml.Extensions; + +namespace CsToml.Tests; + +public class CsTomlFileSerializerExtensionPolicyTest : IDisposable +{ + private readonly string _tempDir; + + public CsTomlFileSerializerExtensionPolicyTest() + { + _tempDir = Path.Combine(Path.GetTempPath(), $"CsToml_Test_{Guid.NewGuid():N}"); + Directory.CreateDirectory(_tempDir); + } + + public void Dispose() + { + if (Directory.Exists(_tempDir)) + { + Directory.Delete(_tempDir, true); + } + } + + private string CreateTomlFile(string fileName, string content = "key = \"value\"") + { + var filePath = Path.Combine(_tempDir, fileName); + File.WriteAllBytes(filePath, System.Text.Encoding.UTF8.GetBytes(content)); + return filePath; + } + + private string GetNonExistentPath(string fileName) + { + return Path.Combine(_tempDir, fileName); + } + + [Fact] + public void Deserialize_Strict_WithTomlExtension_Succeeds() + { + var filePath = CreateTomlFile("test.toml"); + + var doc = CsTomlFileSerializer.Deserialize(filePath, TomlFileExtensionPolicy.Strict); + + doc.ShouldNotBeNull(); + } + + [Fact] + public void Deserialize_Strict_WithNonTomlExtension_ThrowsFormatException() + { + var filePath = CreateTomlFile("test.conf"); + + Should.Throw(() => + CsTomlFileSerializer.Deserialize(filePath, TomlFileExtensionPolicy.Strict)); + } + + [Fact] + public void Deserialize_Relaxed_WithTomlExtension_Succeeds() + { + var filePath = CreateTomlFile("test.toml"); + + var doc = CsTomlFileSerializer.Deserialize(filePath, TomlFileExtensionPolicy.Relaxed); + + doc.ShouldNotBeNull(); + } + + [Fact] + public void Deserialize_Relaxed_WithNonTomlExtension_Succeeds() + { + var filePath = CreateTomlFile("test.conf"); + + var doc = CsTomlFileSerializer.Deserialize(filePath, TomlFileExtensionPolicy.Relaxed); + + doc.ShouldNotBeNull(); + } + + [Fact] + public void Deserialize_DefaultOverload_WithTomlExtension_Succeeds() + { + var filePath = CreateTomlFile("test.toml"); + + var doc = CsTomlFileSerializer.Deserialize(filePath); + + doc.ShouldNotBeNull(); + } + + [Fact] + public void Deserialize_DefaultOverload_WithNonTomlExtension_ThrowsFormatException() + { + var filePath = CreateTomlFile("test.conf"); + + Should.Throw(() => + CsTomlFileSerializer.Deserialize(filePath)); + } + + [Fact] + public async ValueTask DeserializeAsync_Strict_WithTomlExtension_Succeeds() + { + var filePath = CreateTomlFile("test.toml"); + + var doc = await CsTomlFileSerializer.DeserializeAsync(filePath, TomlFileExtensionPolicy.Strict, cancellationToken: TestContext.Current.CancellationToken); + + doc.ShouldNotBeNull(); + } + + [Fact] + public async ValueTask DeserializeAsync_Strict_WithNonTomlExtension_ThrowsFormatException() + { + var filePath = CreateTomlFile("test.conf"); + + await Should.ThrowAsync(async () => + await CsTomlFileSerializer.DeserializeAsync(filePath, TomlFileExtensionPolicy.Strict, cancellationToken: TestContext.Current.CancellationToken)); + } + + [Fact] + public async ValueTask DeserializeAsync_Relaxed_WithTomlExtension_Succeeds() + { + var filePath = CreateTomlFile("test.toml"); + var doc = await CsTomlFileSerializer.DeserializeAsync(filePath, TomlFileExtensionPolicy.Relaxed, cancellationToken: TestContext.Current.CancellationToken); + doc.ShouldNotBeNull(); + } + + [Fact] + public async ValueTask DeserializeAsync_Relaxed_WithNonTomlExtension_Succeeds() + { + var filePath = CreateTomlFile("test.conf"); + var doc = await CsTomlFileSerializer.DeserializeAsync(filePath, TomlFileExtensionPolicy.Relaxed, cancellationToken: TestContext.Current.CancellationToken); + doc.ShouldNotBeNull(); + } + + [Fact] + public async ValueTask DeserializeAsync_DefaultOverload_WithTomlExtension_Succeeds() + { + var filePath = CreateTomlFile("test.toml"); + var doc = await CsTomlFileSerializer.DeserializeAsync(filePath, cancellationToken: TestContext.Current.CancellationToken); + doc.ShouldNotBeNull(); + } + + [Fact] + public async ValueTask DeserializeAsync_DefaultOverload_WithNonTomlExtension_ThrowsFormatException() + { + var filePath = CreateTomlFile("test.conf"); + + await Should.ThrowAsync(async () => + await CsTomlFileSerializer.DeserializeAsync(filePath, cancellationToken: TestContext.Current.CancellationToken)); + } + + [Fact] + public void Serialize_Strict_WithTomlExtension_Succeeds() + { + var filePath = GetNonExistentPath("output.toml"); + var doc = CsTomlSerializer.Deserialize("key = \"value\""u8); + + Should.NotThrow(() => + CsTomlFileSerializer.Serialize(filePath, doc, TomlFileExtensionPolicy.Strict)); + + File.Exists(filePath).ShouldBeTrue(); + } + + [Fact] + public void Serialize_Strict_WithNonTomlExtension_ThrowsFormatException() + { + var filePath = GetNonExistentPath("output.conf"); + var doc = CsTomlSerializer.Deserialize("key = \"value\""u8); + + Should.Throw(() => + CsTomlFileSerializer.Serialize(filePath, doc, TomlFileExtensionPolicy.Strict)); + } + + [Fact] + public void Serialize_Relaxed_WithTomlExtension_Succeeds() + { + var filePath = GetNonExistentPath("output.toml"); + var doc = CsTomlSerializer.Deserialize("key = \"value\""u8); + + Should.NotThrow(() => + CsTomlFileSerializer.Serialize(filePath, doc, TomlFileExtensionPolicy.Relaxed)); + + File.Exists(filePath).ShouldBeTrue(); + } + + [Fact] + public void Serialize_Relaxed_WithNonTomlExtension_Succeeds() + { + var filePath = GetNonExistentPath("output.conf"); + var doc = CsTomlSerializer.Deserialize("key = \"value\""u8); + + Should.NotThrow(() => + CsTomlFileSerializer.Serialize(filePath, doc, TomlFileExtensionPolicy.Relaxed)); + + File.Exists(filePath).ShouldBeTrue(); + } + + [Fact] + public void Serialize_DefaultOverload_WithTomlExtension_Succeeds() + { + var filePath = GetNonExistentPath("output.toml"); + var doc = CsTomlSerializer.Deserialize("key = \"value\""u8); + + Should.NotThrow(() => + CsTomlFileSerializer.Serialize(filePath, doc)); + + File.Exists(filePath).ShouldBeTrue(); + } + + [Fact] + public void Serialize_DefaultOverload_WithNonTomlExtension_ThrowsFormatException() + { + var filePath = GetNonExistentPath("output.conf"); + var doc = CsTomlSerializer.Deserialize("key = \"value\""u8); + + Should.Throw(() => + CsTomlFileSerializer.Serialize(filePath, doc)); + } + + [Fact] + public async ValueTask SerializeAsync_Strict_WithTomlExtension_Succeeds() + { + var filePath = GetNonExistentPath("output.toml"); + var doc = CsTomlSerializer.Deserialize("key = \"value\""u8); + + await Should.NotThrowAsync(async () => + await CsTomlFileSerializer.SerializeAsync(filePath, doc, TomlFileExtensionPolicy.Strict, cancellationToken: TestContext.Current.CancellationToken)); + + File.Exists(filePath).ShouldBeTrue(); + } + + [Fact] + public async ValueTask SerializeAsync_Strict_WithNonTomlExtension_ThrowsFormatException() + { + var filePath = GetNonExistentPath("output.conf"); + var doc = CsTomlSerializer.Deserialize("key = \"value\""u8); + + await Should.ThrowAsync(async () => + await CsTomlFileSerializer.SerializeAsync(filePath, doc, TomlFileExtensionPolicy.Strict, cancellationToken: TestContext.Current.CancellationToken)); + } + + [Fact] + public async ValueTask SerializeAsync_Relaxed_WithTomlExtension_Succeeds() + { + var filePath = GetNonExistentPath("output.toml"); + var doc = CsTomlSerializer.Deserialize("key = \"value\""u8); + + await Should.NotThrowAsync(async () => + await CsTomlFileSerializer.SerializeAsync(filePath, doc, TomlFileExtensionPolicy.Relaxed, cancellationToken: TestContext.Current.CancellationToken)); + + File.Exists(filePath).ShouldBeTrue(); + } + + [Fact] + public async ValueTask SerializeAsync_Relaxed_WithNonTomlExtension_Succeeds() + { + var filePath = GetNonExistentPath("output.conf"); + var doc = CsTomlSerializer.Deserialize("key = \"value\""u8); + + await Should.NotThrowAsync(async () => + await CsTomlFileSerializer.SerializeAsync(filePath, doc, TomlFileExtensionPolicy.Relaxed, cancellationToken: TestContext.Current.CancellationToken)); + + File.Exists(filePath).ShouldBeTrue(); + } + + [Fact] + public async ValueTask SerializeAsync_DefaultOverload_WithTomlExtension_Succeeds() + { + var filePath = GetNonExistentPath("output.toml"); + var doc = CsTomlSerializer.Deserialize("key = \"value\""u8); + + await Should.NotThrowAsync(async () => + await CsTomlFileSerializer.SerializeAsync(filePath, doc, cancellationToken: TestContext.Current.CancellationToken)); + + File.Exists(filePath).ShouldBeTrue(); + } + + [Fact] + public async ValueTask SerializeAsync_DefaultOverload_WithNonTomlExtension_ThrowsFormatException() + { + var filePath = GetNonExistentPath("output.conf"); + var doc = CsTomlSerializer.Deserialize("key = \"value\""u8); + + await Should.ThrowAsync(async () => + await CsTomlFileSerializer.SerializeAsync(filePath, doc, cancellationToken: TestContext.Current.CancellationToken)); + } + + [Theory] + [InlineData("config.cfg")] + [InlineData("settings.ini")] + [InlineData("data.txt")] + [InlineData("noextension")] + public void Deserialize_Relaxed_WithVariousExtensions_Succeeds(string fileName) + { + var filePath = CreateTomlFile(fileName); + + var doc = CsTomlFileSerializer.Deserialize(filePath, TomlFileExtensionPolicy.Relaxed); + + doc.ShouldNotBeNull(); + } + + [Theory] + [InlineData("config.cfg")] + [InlineData("settings.ini")] + [InlineData("data.txt")] + [InlineData("noextension")] + public void Serialize_Relaxed_WithVariousExtensions_Succeeds(string fileName) + { + var filePath = GetNonExistentPath(fileName); + var doc = CsTomlSerializer.Deserialize("key = \"value\""u8); + + Should.NotThrow(() => + CsTomlFileSerializer.Serialize(filePath, doc, TomlFileExtensionPolicy.Relaxed)); + + File.Exists(filePath).ShouldBeTrue(); + } + +} \ No newline at end of file From c8b0dcbd0a35112f2180f27b06578dc4f2363cc6 Mon Sep 17 00:00:00 2001 From: prozolic <42107886+prozolic@users.noreply.github.com> Date: Tue, 12 May 2026 00:23:15 +0900 Subject: [PATCH 2/2] Change the arguments of the overload --- src/CsToml.Extensions/CsTomlFileSerializer.cs | 42 ++++++++--- ...CsTomlFileSerializerExtensionPolicyTest.cs | 74 ++++++++++++++----- 2 files changed, 88 insertions(+), 28 deletions(-) diff --git a/src/CsToml.Extensions/CsTomlFileSerializer.cs b/src/CsToml.Extensions/CsTomlFileSerializer.cs index e23644c..9341399 100644 --- a/src/CsToml.Extensions/CsTomlFileSerializer.cs +++ b/src/CsToml.Extensions/CsTomlFileSerializer.cs @@ -11,9 +11,9 @@ public partial class CsTomlFileSerializer private static readonly string TomlExtension = ".toml"; public static T Deserialize(string tomlFilePath, CsTomlSerializerOptions? options = null) - => Deserialize(tomlFilePath, TomlFileExtensionPolicy.Strict, options); + => Deserialize(tomlFilePath, options, TomlFileExtensionPolicy.Strict); - public static T Deserialize(string tomlFilePath, TomlFileExtensionPolicy extensionPolicy, CsTomlSerializerOptions? options = null) + public static T Deserialize(string tomlFilePath, CsTomlSerializerOptions? options, TomlFileExtensionPolicy extensionPolicy) { ValidateExtension(tomlFilePath, extensionPolicy); @@ -58,9 +58,12 @@ public static T Deserialize(string tomlFilePath, TomlFileExtensionPolicy exte } public static ValueTask DeserializeAsync(string tomlFilePath, CsTomlSerializerOptions? options = null, bool configureAwait = false, CancellationToken cancellationToken = default) - => DeserializeAsync(tomlFilePath, TomlFileExtensionPolicy.Strict, options, configureAwait, cancellationToken); + => DeserializeAsyncCore(tomlFilePath, options, TomlFileExtensionPolicy.Strict, configureAwait, cancellationToken); - public static async ValueTask DeserializeAsync(string tomlFilePath, TomlFileExtensionPolicy extensionPolicy, CsTomlSerializerOptions? options = null, bool configureAwait = false, CancellationToken cancellationToken = default) + public static ValueTask DeserializeAsync(string tomlFilePath, CsTomlSerializerOptions? options, TomlFileExtensionPolicy extensionPolicy, bool configureAwait = false, CancellationToken cancellationToken = default) + => DeserializeAsyncCore(tomlFilePath, options, extensionPolicy, configureAwait, cancellationToken); + + private static async ValueTask DeserializeAsyncCore(string tomlFilePath, CsTomlSerializerOptions? options, TomlFileExtensionPolicy extensionPolicy, bool configureAwait, CancellationToken cancellationToken) { ValidateExtension(tomlFilePath, extensionPolicy); @@ -104,9 +107,9 @@ public static async ValueTask DeserializeAsync(string tomlFilePath, TomlFi } public static void Serialize(string tomlFilePath, T value, CsTomlSerializerOptions? options = null) - => Serialize(tomlFilePath, value, TomlFileExtensionPolicy.Strict, options); + => Serialize(tomlFilePath, value, options, TomlFileExtensionPolicy.Strict); - public static void Serialize(string tomlFilePath, T value, TomlFileExtensionPolicy extensionPolicy, CsTomlSerializerOptions? options = null) + public static void Serialize(string tomlFilePath, T value, CsTomlSerializerOptions? options, TomlFileExtensionPolicy extensionPolicy) { ValidateExtension(tomlFilePath, extensionPolicy); @@ -124,9 +127,12 @@ public static void Serialize(string tomlFilePath, T value, TomlFileExtensionP } public static ValueTask SerializeAsync(string tomlFilePath, T value, CsTomlSerializerOptions? options = null, bool configureAwait = false, CancellationToken cancellationToken = default) - => SerializeAsync(tomlFilePath, value, TomlFileExtensionPolicy.Strict, options, configureAwait, cancellationToken); + => SerializeAsyncCore(tomlFilePath, value, options, TomlFileExtensionPolicy.Strict, configureAwait, cancellationToken); + + public static ValueTask SerializeAsync(string tomlFilePath, T value, CsTomlSerializerOptions? options, TomlFileExtensionPolicy extensionPolicy, bool configureAwait = false, CancellationToken cancellationToken = default) + => SerializeAsyncCore(tomlFilePath, value, options, extensionPolicy, configureAwait, cancellationToken); - public static async ValueTask SerializeAsync(string tomlFilePath, T value, TomlFileExtensionPolicy extensionPolicy, CsTomlSerializerOptions? options = null, bool configureAwait = false, CancellationToken cancellationToken = default) + private static async ValueTask SerializeAsyncCore(string tomlFilePath, T value, CsTomlSerializerOptions? options, TomlFileExtensionPolicy extensionPolicy, bool configureAwait, CancellationToken cancellationToken) { ValidateExtension(tomlFilePath, extensionPolicy); @@ -147,9 +153,20 @@ public static async ValueTask SerializeAsync(string tomlFilePath, T value, To private static void ValidateExtension(string tomlFilePath, TomlFileExtensionPolicy extensionPolicy) { - if (extensionPolicy == TomlFileExtensionPolicy.Strict && Path.GetExtension(tomlFilePath) != TomlExtension) + switch (extensionPolicy) { - ThrowExtensionFormatException(); + case TomlFileExtensionPolicy.Strict: + if (!string.Equals(Path.GetExtension(tomlFilePath), TomlExtension, StringComparison.Ordinal)) + { + ThrowExtensionFormatException(); + } + break; + case TomlFileExtensionPolicy.Relaxed: + // No validation needed for relaxed policy + break; + default: + ThrowExtensionOutOfRangeException(extensionPolicy); + break; } } @@ -159,4 +176,9 @@ private static void ThrowExtensionFormatException() throw new FormatException("TOML files should use the extension .toml"); } + [MethodImpl(MethodImplOptions.NoInlining)] + private static void ThrowExtensionOutOfRangeException(TomlFileExtensionPolicy extensionPolicy) + { + throw new ArgumentOutOfRangeException(nameof(extensionPolicy)); + } } diff --git a/tests/CsToml.Tests/CsTomlFileSerializerExtensionPolicyTest.cs b/tests/CsToml.Tests/CsTomlFileSerializerExtensionPolicyTest.cs index 952fd06..2122147 100644 --- a/tests/CsToml.Tests/CsTomlFileSerializerExtensionPolicyTest.cs +++ b/tests/CsToml.Tests/CsTomlFileSerializerExtensionPolicyTest.cs @@ -37,7 +37,7 @@ public void Deserialize_Strict_WithTomlExtension_Succeeds() { var filePath = CreateTomlFile("test.toml"); - var doc = CsTomlFileSerializer.Deserialize(filePath, TomlFileExtensionPolicy.Strict); + var doc = CsTomlFileSerializer.Deserialize(filePath, CsTomlSerializerOptions.Default, TomlFileExtensionPolicy.Strict); doc.ShouldNotBeNull(); } @@ -48,7 +48,7 @@ public void Deserialize_Strict_WithNonTomlExtension_ThrowsFormatException() var filePath = CreateTomlFile("test.conf"); Should.Throw(() => - CsTomlFileSerializer.Deserialize(filePath, TomlFileExtensionPolicy.Strict)); + CsTomlFileSerializer.Deserialize(filePath, CsTomlSerializerOptions.Default, TomlFileExtensionPolicy.Strict)); } [Fact] @@ -56,7 +56,7 @@ public void Deserialize_Relaxed_WithTomlExtension_Succeeds() { var filePath = CreateTomlFile("test.toml"); - var doc = CsTomlFileSerializer.Deserialize(filePath, TomlFileExtensionPolicy.Relaxed); + var doc = CsTomlFileSerializer.Deserialize(filePath, CsTomlSerializerOptions.Default, TomlFileExtensionPolicy.Relaxed); doc.ShouldNotBeNull(); } @@ -66,7 +66,7 @@ public void Deserialize_Relaxed_WithNonTomlExtension_Succeeds() { var filePath = CreateTomlFile("test.conf"); - var doc = CsTomlFileSerializer.Deserialize(filePath, TomlFileExtensionPolicy.Relaxed); + var doc = CsTomlFileSerializer.Deserialize(filePath, CsTomlSerializerOptions.Default, TomlFileExtensionPolicy.Relaxed); doc.ShouldNotBeNull(); } @@ -95,7 +95,7 @@ public async ValueTask DeserializeAsync_Strict_WithTomlExtension_Succeeds() { var filePath = CreateTomlFile("test.toml"); - var doc = await CsTomlFileSerializer.DeserializeAsync(filePath, TomlFileExtensionPolicy.Strict, cancellationToken: TestContext.Current.CancellationToken); + var doc = await CsTomlFileSerializer.DeserializeAsync(filePath, CsTomlSerializerOptions.Default, TomlFileExtensionPolicy.Strict, cancellationToken: TestContext.Current.CancellationToken); doc.ShouldNotBeNull(); } @@ -106,14 +106,14 @@ public async ValueTask DeserializeAsync_Strict_WithNonTomlExtension_ThrowsFormat var filePath = CreateTomlFile("test.conf"); await Should.ThrowAsync(async () => - await CsTomlFileSerializer.DeserializeAsync(filePath, TomlFileExtensionPolicy.Strict, cancellationToken: TestContext.Current.CancellationToken)); + await CsTomlFileSerializer.DeserializeAsync(filePath, CsTomlSerializerOptions.Default, TomlFileExtensionPolicy.Strict, cancellationToken: TestContext.Current.CancellationToken)); } [Fact] public async ValueTask DeserializeAsync_Relaxed_WithTomlExtension_Succeeds() { var filePath = CreateTomlFile("test.toml"); - var doc = await CsTomlFileSerializer.DeserializeAsync(filePath, TomlFileExtensionPolicy.Relaxed, cancellationToken: TestContext.Current.CancellationToken); + var doc = await CsTomlFileSerializer.DeserializeAsync(filePath, CsTomlSerializerOptions.Default, TomlFileExtensionPolicy.Relaxed, cancellationToken: TestContext.Current.CancellationToken); doc.ShouldNotBeNull(); } @@ -121,7 +121,7 @@ public async ValueTask DeserializeAsync_Relaxed_WithTomlExtension_Succeeds() public async ValueTask DeserializeAsync_Relaxed_WithNonTomlExtension_Succeeds() { var filePath = CreateTomlFile("test.conf"); - var doc = await CsTomlFileSerializer.DeserializeAsync(filePath, TomlFileExtensionPolicy.Relaxed, cancellationToken: TestContext.Current.CancellationToken); + var doc = await CsTomlFileSerializer.DeserializeAsync(filePath, CsTomlSerializerOptions.Default, TomlFileExtensionPolicy.Relaxed, cancellationToken: TestContext.Current.CancellationToken); doc.ShouldNotBeNull(); } @@ -149,7 +149,7 @@ public void Serialize_Strict_WithTomlExtension_Succeeds() var doc = CsTomlSerializer.Deserialize("key = \"value\""u8); Should.NotThrow(() => - CsTomlFileSerializer.Serialize(filePath, doc, TomlFileExtensionPolicy.Strict)); + CsTomlFileSerializer.Serialize(filePath, doc, CsTomlSerializerOptions.Default, TomlFileExtensionPolicy.Strict)); File.Exists(filePath).ShouldBeTrue(); } @@ -161,7 +161,7 @@ public void Serialize_Strict_WithNonTomlExtension_ThrowsFormatException() var doc = CsTomlSerializer.Deserialize("key = \"value\""u8); Should.Throw(() => - CsTomlFileSerializer.Serialize(filePath, doc, TomlFileExtensionPolicy.Strict)); + CsTomlFileSerializer.Serialize(filePath, doc, CsTomlSerializerOptions.Default, TomlFileExtensionPolicy.Strict)); } [Fact] @@ -171,7 +171,7 @@ public void Serialize_Relaxed_WithTomlExtension_Succeeds() var doc = CsTomlSerializer.Deserialize("key = \"value\""u8); Should.NotThrow(() => - CsTomlFileSerializer.Serialize(filePath, doc, TomlFileExtensionPolicy.Relaxed)); + CsTomlFileSerializer.Serialize(filePath, doc, CsTomlSerializerOptions.Default, TomlFileExtensionPolicy.Relaxed)); File.Exists(filePath).ShouldBeTrue(); } @@ -183,7 +183,7 @@ public void Serialize_Relaxed_WithNonTomlExtension_Succeeds() var doc = CsTomlSerializer.Deserialize("key = \"value\""u8); Should.NotThrow(() => - CsTomlFileSerializer.Serialize(filePath, doc, TomlFileExtensionPolicy.Relaxed)); + CsTomlFileSerializer.Serialize(filePath, doc, CsTomlSerializerOptions.Default, TomlFileExtensionPolicy.Relaxed)); File.Exists(filePath).ShouldBeTrue(); } @@ -217,7 +217,7 @@ public async ValueTask SerializeAsync_Strict_WithTomlExtension_Succeeds() var doc = CsTomlSerializer.Deserialize("key = \"value\""u8); await Should.NotThrowAsync(async () => - await CsTomlFileSerializer.SerializeAsync(filePath, doc, TomlFileExtensionPolicy.Strict, cancellationToken: TestContext.Current.CancellationToken)); + await CsTomlFileSerializer.SerializeAsync(filePath, doc, CsTomlSerializerOptions.Default, TomlFileExtensionPolicy.Strict, cancellationToken: TestContext.Current.CancellationToken)); File.Exists(filePath).ShouldBeTrue(); } @@ -229,7 +229,7 @@ public async ValueTask SerializeAsync_Strict_WithNonTomlExtension_ThrowsFormatEx var doc = CsTomlSerializer.Deserialize("key = \"value\""u8); await Should.ThrowAsync(async () => - await CsTomlFileSerializer.SerializeAsync(filePath, doc, TomlFileExtensionPolicy.Strict, cancellationToken: TestContext.Current.CancellationToken)); + await CsTomlFileSerializer.SerializeAsync(filePath, doc, CsTomlSerializerOptions.Default, TomlFileExtensionPolicy.Strict, cancellationToken: TestContext.Current.CancellationToken)); } [Fact] @@ -239,7 +239,7 @@ public async ValueTask SerializeAsync_Relaxed_WithTomlExtension_Succeeds() var doc = CsTomlSerializer.Deserialize("key = \"value\""u8); await Should.NotThrowAsync(async () => - await CsTomlFileSerializer.SerializeAsync(filePath, doc, TomlFileExtensionPolicy.Relaxed, cancellationToken: TestContext.Current.CancellationToken)); + await CsTomlFileSerializer.SerializeAsync(filePath, doc, CsTomlSerializerOptions.Default, TomlFileExtensionPolicy.Relaxed, cancellationToken: TestContext.Current.CancellationToken)); File.Exists(filePath).ShouldBeTrue(); } @@ -251,7 +251,7 @@ public async ValueTask SerializeAsync_Relaxed_WithNonTomlExtension_Succeeds() var doc = CsTomlSerializer.Deserialize("key = \"value\""u8); await Should.NotThrowAsync(async () => - await CsTomlFileSerializer.SerializeAsync(filePath, doc, TomlFileExtensionPolicy.Relaxed, cancellationToken: TestContext.Current.CancellationToken)); + await CsTomlFileSerializer.SerializeAsync(filePath, doc, CsTomlSerializerOptions.Default, TomlFileExtensionPolicy.Relaxed, cancellationToken: TestContext.Current.CancellationToken)); File.Exists(filePath).ShouldBeTrue(); } @@ -287,7 +287,7 @@ public void Deserialize_Relaxed_WithVariousExtensions_Succeeds(string fileName) { var filePath = CreateTomlFile(fileName); - var doc = CsTomlFileSerializer.Deserialize(filePath, TomlFileExtensionPolicy.Relaxed); + var doc = CsTomlFileSerializer.Deserialize(filePath, CsTomlSerializerOptions.Default, TomlFileExtensionPolicy.Relaxed); doc.ShouldNotBeNull(); } @@ -303,9 +303,47 @@ public void Serialize_Relaxed_WithVariousExtensions_Succeeds(string fileName) var doc = CsTomlSerializer.Deserialize("key = \"value\""u8); Should.NotThrow(() => - CsTomlFileSerializer.Serialize(filePath, doc, TomlFileExtensionPolicy.Relaxed)); + CsTomlFileSerializer.Serialize(filePath, doc, CsTomlSerializerOptions.Default, TomlFileExtensionPolicy.Relaxed)); File.Exists(filePath).ShouldBeTrue(); } + [Fact] + public void Deserialize_UndefinedPolicy_ThrowsArgumentOutOfRangeException() + { + var filePath = CreateTomlFile("test.toml"); + + Should.Throw(() => + CsTomlFileSerializer.Deserialize(filePath, CsTomlSerializerOptions.Default, (TomlFileExtensionPolicy)99)); + } + + [Fact] + public async ValueTask DeserializeAsync_UndefinedPolicy_ThrowsArgumentOutOfRangeException() + { + var filePath = CreateTomlFile("test.toml"); + + await Should.ThrowAsync(async () => + await CsTomlFileSerializer.DeserializeAsync(filePath, CsTomlSerializerOptions.Default, (TomlFileExtensionPolicy)99, cancellationToken: TestContext.Current.CancellationToken)); + } + + [Fact] + public void Serialize_UndefinedPolicy_ThrowsArgumentOutOfRangeException() + { + var filePath = GetNonExistentPath("output.toml"); + var doc = CsTomlSerializer.Deserialize("key = \"value\""u8); + + Should.Throw(() => + CsTomlFileSerializer.Serialize(filePath, doc, CsTomlSerializerOptions.Default, (TomlFileExtensionPolicy)99)); + } + + [Fact] + public async ValueTask SerializeAsync_UndefinedPolicy_ThrowsArgumentOutOfRangeException() + { + var filePath = GetNonExistentPath("output.toml"); + var doc = CsTomlSerializer.Deserialize("key = \"value\""u8); + + await Should.ThrowAsync(async () => + await CsTomlFileSerializer.SerializeAsync(filePath, doc, CsTomlSerializerOptions.Default, (TomlFileExtensionPolicy)99, cancellationToken: TestContext.Current.CancellationToken)); + } + } \ No newline at end of file