Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .github/instructions/dotnet.instructions.md
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,8 @@ To provide the broadest compatibility, core libraries target .NET Standard 2.0,
### Testing
- Write unit tests for all public methods and critical logic
- Use descriptive test names that explain what is being tested and expected outcome
- Use helper test method naming pattern: `MethodName_Type_Scenario_ExpectedResult` (example: `SetLockedField_OptionObject2015_WithEmptyFieldNumber_ThrowsArgumentException`)
- For OptionObject helper tests, keep one test file per type (`OptionObject`, `OptionObject2`, `OptionObject2015`) instead of combining all three in a single file
- Follow the Arrange-Act-Assert (AAA) pattern in test methods
- Test both success and failure scenarios
- Aim for high code coverage on critical paths
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
using System;
using System.Collections.Generic;

namespace RarelySimple.AvatarScriptLink.Objects.Helpers.Tests
{
/// <summary>
/// Tests for internal ArgumentGuards validation helpers.
/// </summary>
[TestClass]
public class ArgumentGuardsTests
{
[TestMethod]
public void ValidateFieldNumber_ArgumentGuards_WithNullFieldNumber_ThrowsArgumentNullException()
{
var ex = Assert.ThrowsException<ArgumentNullException>(
() => ArgumentGuards.ValidateFieldNumber(null!, "fieldNumber"));

Assert.AreEqual("fieldNumber", ex.ParamName);
}

[TestMethod]
public void ValidateFieldNumber_ArgumentGuards_WithEmptyFieldNumber_ThrowsArgumentException()
{
var ex = Assert.ThrowsException<ArgumentException>(
() => ArgumentGuards.ValidateFieldNumber(string.Empty, "fieldNumber"));

Assert.AreEqual("fieldNumber", ex.ParamName);
}

[TestMethod]
public void ValidateFieldNumber_ArgumentGuards_WithValidFieldNumber_DoesNotThrow()
{
ArgumentGuards.ValidateFieldNumber("100", "fieldNumber");
}

[TestMethod]
public void ValidateAndNormalizeFieldNumbers_ArgumentGuards_WithNullFieldNumbers_ThrowsArgumentNullException()
{
var ex = Assert.ThrowsException<ArgumentNullException>(
() => ArgumentGuards.ValidateAndNormalizeFieldNumbers(null!, "fieldNumbers"));

Assert.AreEqual("fieldNumbers", ex.ParamName);
}

[TestMethod]
public void ValidateAndNormalizeFieldNumbers_ArgumentGuards_WithEmptyFieldNumbers_ThrowsArgumentException()
{
var ex = Assert.ThrowsException<ArgumentException>(
() => ArgumentGuards.ValidateAndNormalizeFieldNumbers(new List<string>(), "fieldNumbers"));

Assert.AreEqual("fieldNumbers", ex.ParamName);
}

[TestMethod]
public void ValidateAndNormalizeFieldNumbers_ArgumentGuards_WithOnlyEmptyValues_ThrowsArgumentException()
{
var ex = Assert.ThrowsException<ArgumentException>(
() => ArgumentGuards.ValidateAndNormalizeFieldNumbers(new List<string> { string.Empty, null!, string.Empty }, "fieldNumbers"));

Assert.AreEqual("fieldNumbers", ex.ParamName);
}

[TestMethod]
public void ValidateAndNormalizeFieldNumbers_ArgumentGuards_WithDuplicatesAndEmptyValues_ReturnsDistinctNonEmptyValues()
{
var result = ArgumentGuards.ValidateAndNormalizeFieldNumbers(
new List<string> { "100", string.Empty, "100", "101", "101" },
"fieldNumbers");

CollectionAssert.AreEqual(new List<string> { "100", "101" }, result);
}

[TestMethod]
public void ValidateAndGetFieldNumbers_ArgumentGuards_WithNullFieldObjects_ThrowsArgumentNullException()
{
var ex = Assert.ThrowsException<ArgumentNullException>(
() => ArgumentGuards.ValidateAndGetFieldNumbers(null!, "fieldObjects"));

Assert.AreEqual("fieldObjects", ex.ParamName);
}

[TestMethod]
public void ValidateAndGetFieldNumbers_ArgumentGuards_WithEmptyFieldObjects_ThrowsArgumentException()
{
var ex = Assert.ThrowsException<ArgumentException>(
() => ArgumentGuards.ValidateAndGetFieldNumbers(new List<FieldObject>(), "fieldObjects"));

Assert.AreEqual("fieldObjects", ex.ParamName);
}

[TestMethod]
public void ValidateAndGetFieldNumbers_ArgumentGuards_WithNoValidFieldNumbers_ThrowsArgumentException()
{
var ex = Assert.ThrowsException<ArgumentException>(
() => ArgumentGuards.ValidateAndGetFieldNumbers(
new List<FieldObject> { null!, new FieldObject { FieldNumber = string.Empty }, new FieldObject { FieldNumber = null! } },
"fieldObjects"));

Assert.AreEqual("fieldObjects", ex.ParamName);
}

[TestMethod]
public void ValidateAndGetFieldNumbers_ArgumentGuards_WithDuplicatesAndInvalidEntries_ReturnsDistinctFieldNumbers()
{
var result = ArgumentGuards.ValidateAndGetFieldNumbers(
new List<FieldObject>
{
new FieldObject { FieldNumber = "100" },
null!,
new FieldObject { FieldNumber = string.Empty },
new FieldObject { FieldNumber = "100" },
new FieldObject { FieldNumber = "101" }
},
"fieldObjects");

CollectionAssert.AreEqual(new List<string> { "100", "101" }, result);
}
}
}
Loading
Loading