diff --git a/.github/instructions/dotnet.instructions.md b/.github/instructions/dotnet.instructions.md
index 9482b0f..e229fa3 100644
--- a/.github/instructions/dotnet.instructions.md
+++ b/.github/instructions/dotnet.instructions.md
@@ -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
diff --git a/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/ArgumentGuardsTests.cs b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/ArgumentGuardsTests.cs
new file mode 100644
index 0000000..82d12f6
--- /dev/null
+++ b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/ArgumentGuardsTests.cs
@@ -0,0 +1,119 @@
+using System;
+using System.Collections.Generic;
+
+namespace RarelySimple.AvatarScriptLink.Objects.Helpers.Tests
+{
+ ///
+ /// Tests for internal ArgumentGuards validation helpers.
+ ///
+ [TestClass]
+ public class ArgumentGuardsTests
+ {
+ [TestMethod]
+ public void ValidateFieldNumber_ArgumentGuards_WithNullFieldNumber_ThrowsArgumentNullException()
+ {
+ var ex = Assert.ThrowsException(
+ () => ArgumentGuards.ValidateFieldNumber(null!, "fieldNumber"));
+
+ Assert.AreEqual("fieldNumber", ex.ParamName);
+ }
+
+ [TestMethod]
+ public void ValidateFieldNumber_ArgumentGuards_WithEmptyFieldNumber_ThrowsArgumentException()
+ {
+ var ex = Assert.ThrowsException(
+ () => 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(
+ () => ArgumentGuards.ValidateAndNormalizeFieldNumbers(null!, "fieldNumbers"));
+
+ Assert.AreEqual("fieldNumbers", ex.ParamName);
+ }
+
+ [TestMethod]
+ public void ValidateAndNormalizeFieldNumbers_ArgumentGuards_WithEmptyFieldNumbers_ThrowsArgumentException()
+ {
+ var ex = Assert.ThrowsException(
+ () => ArgumentGuards.ValidateAndNormalizeFieldNumbers(new List(), "fieldNumbers"));
+
+ Assert.AreEqual("fieldNumbers", ex.ParamName);
+ }
+
+ [TestMethod]
+ public void ValidateAndNormalizeFieldNumbers_ArgumentGuards_WithOnlyEmptyValues_ThrowsArgumentException()
+ {
+ var ex = Assert.ThrowsException(
+ () => ArgumentGuards.ValidateAndNormalizeFieldNumbers(new List { string.Empty, null!, string.Empty }, "fieldNumbers"));
+
+ Assert.AreEqual("fieldNumbers", ex.ParamName);
+ }
+
+ [TestMethod]
+ public void ValidateAndNormalizeFieldNumbers_ArgumentGuards_WithDuplicatesAndEmptyValues_ReturnsDistinctNonEmptyValues()
+ {
+ var result = ArgumentGuards.ValidateAndNormalizeFieldNumbers(
+ new List { "100", string.Empty, "100", "101", "101" },
+ "fieldNumbers");
+
+ CollectionAssert.AreEqual(new List { "100", "101" }, result);
+ }
+
+ [TestMethod]
+ public void ValidateAndGetFieldNumbers_ArgumentGuards_WithNullFieldObjects_ThrowsArgumentNullException()
+ {
+ var ex = Assert.ThrowsException(
+ () => ArgumentGuards.ValidateAndGetFieldNumbers(null!, "fieldObjects"));
+
+ Assert.AreEqual("fieldObjects", ex.ParamName);
+ }
+
+ [TestMethod]
+ public void ValidateAndGetFieldNumbers_ArgumentGuards_WithEmptyFieldObjects_ThrowsArgumentException()
+ {
+ var ex = Assert.ThrowsException(
+ () => ArgumentGuards.ValidateAndGetFieldNumbers(new List(), "fieldObjects"));
+
+ Assert.AreEqual("fieldObjects", ex.ParamName);
+ }
+
+ [TestMethod]
+ public void ValidateAndGetFieldNumbers_ArgumentGuards_WithNoValidFieldNumbers_ThrowsArgumentException()
+ {
+ var ex = Assert.ThrowsException(
+ () => ArgumentGuards.ValidateAndGetFieldNumbers(
+ new List { 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
+ {
+ new FieldObject { FieldNumber = "100" },
+ null!,
+ new FieldObject { FieldNumber = string.Empty },
+ new FieldObject { FieldNumber = "100" },
+ new FieldObject { FieldNumber = "101" }
+ },
+ "fieldObjects");
+
+ CollectionAssert.AreEqual(new List { "100", "101" }, result);
+ }
+ }
+}
diff --git a/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/FormObjectHelpersTests.cs b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/FormObjectHelpersTests.cs
index ca847c4..c6f3e51 100644
--- a/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/FormObjectHelpersTests.cs
+++ b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/FormObjectHelpersTests.cs
@@ -7,8 +7,103 @@ namespace RarelySimple.AvatarScriptLink.Objects.Helpers.Tests
[TestClass]
public class FormObjectHelpersTests
{
+ [DataTestMethod]
+ [DataRow("Disabled")]
+ [DataRow("Enabled")]
+ [DataRow("Locked")]
+ [DataRow("Unlocked")]
+ public void SetField_FormObject_WithNullFieldNumber_ThrowsArgumentNullException(string operation)
+ {
+ // Arrange
+ var form = new FormObject { CurrentRow = new RowObject { RowId = "1", RowAction = string.Empty } };
+ form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "1", Lock = "0" });
+
+ // Act
+ Action act = operation switch
+ {
+ "Disabled" => () => form.SetDisabledField(null!),
+ "Enabled" => () => form.SetEnabledField(null!),
+ "Locked" => () => form.SetLockedField(null!),
+ "Unlocked" => () => form.SetUnlockedField(null!),
+ _ => throw new ArgumentOutOfRangeException(nameof(operation))
+ };
+
+ // Assert
+ Assert.ThrowsException(act);
+ }
+
+ [DataTestMethod]
+ [DataRow("Disabled")]
+ [DataRow("Enabled")]
+ [DataRow("Locked")]
+ [DataRow("Unlocked")]
+ public void SetField_FormObject_WithEmptyFieldNumber_ThrowsArgumentException(string operation)
+ {
+ // Arrange
+ var form = new FormObject { CurrentRow = new RowObject { RowId = "1", RowAction = string.Empty } };
+ form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "1", Lock = "0" });
+
+ // Act
+ Action act = operation switch
+ {
+ "Disabled" => () => form.SetDisabledField(string.Empty),
+ "Enabled" => () => form.SetEnabledField(string.Empty),
+ "Locked" => () => form.SetLockedField(string.Empty),
+ "Unlocked" => () => form.SetUnlockedField(string.Empty),
+ _ => throw new ArgumentOutOfRangeException(nameof(operation))
+ };
+
+ // Assert
+ Assert.ThrowsException(act);
+ }
+
+ [TestMethod]
+ public void GetFormId_FormObject_ReturnsFormId()
+ {
+ // Arrange
+ var form = new FormObject { FormId = "42" };
+
+ // Act
+ var result = form.GetFormId();
+
+ // Assert
+ Assert.AreEqual("42", result);
+ }
+
+ [TestMethod]
+ public void GetRowCount_FormObject_WithCurrentAndOtherRows_ReturnsCount()
+ {
+ // Arrange
+ var form = new FormObject
+ {
+ CurrentRow = new RowObject { RowId = "1" },
+ MultipleIteration = true
+ };
+ form.OtherRows.Add(new RowObject { RowId = "2" });
+ form.OtherRows.Add(new RowObject { RowId = "3" });
+
+ // Act
+ var result = form.GetRowCount();
+
+ // Assert
+ Assert.AreEqual(3, result);
+ }
+
[TestMethod]
- public void IsRowPresent_WithCurrentRow_ReturnsTrue()
+ public void GetRowCount_FormObject_WithNoRows_ReturnsZero()
+ {
+ // Arrange
+ var form = new FormObject { CurrentRow = null!, OtherRows = null!, MultipleIteration = true };
+
+ // Act
+ var result = form.GetRowCount();
+
+ // Assert
+ Assert.AreEqual(0, result);
+ }
+
+ [TestMethod]
+ public void IsRowPresent_FormObject_WithCurrentRow_ReturnsTrue()
{
// Arrange
var form = new FormObject { CurrentRow = new RowObject { RowId = "1" } };
@@ -21,7 +116,7 @@ public void IsRowPresent_WithCurrentRow_ReturnsTrue()
}
[TestMethod]
- public void IsRowPresent_WithOtherRow_ReturnsTrue()
+ public void IsRowPresent_FormObject_WithOtherRow_ReturnsTrue()
{
// Arrange
var form = new FormObject { CurrentRow = new RowObject { RowId = "1" }, MultipleIteration = true };
@@ -35,7 +130,7 @@ public void IsRowPresent_WithOtherRow_ReturnsTrue()
}
[TestMethod]
- public void IsRowPresent_WithAbsentRow_ReturnsFalse()
+ public void IsRowPresent_FormObject_WithAbsentRow_ReturnsFalse()
{
// Arrange
var form = new FormObject { CurrentRow = new RowObject { RowId = "1" } };
@@ -48,7 +143,7 @@ public void IsRowPresent_WithAbsentRow_ReturnsFalse()
}
[TestMethod]
- public void IsRowMarkedForDeletion_WithDeletedRow_ReturnsTrue()
+ public void IsRowMarkedForDeletion_FormObject_WithDeletedRow_ReturnsTrue()
{
// Arrange
var form = new FormObject { CurrentRow = new RowObject { RowId = "1", RowAction = "DELETE" } };
@@ -61,7 +156,7 @@ public void IsRowMarkedForDeletion_WithDeletedRow_ReturnsTrue()
}
[TestMethod]
- public void IsRowMarkedForDeletion_WithNormalRow_ReturnsFalse()
+ public void IsRowMarkedForDeletion_FormObject_WithNormalRow_ReturnsFalse()
{
// Arrange
var form = new FormObject { CurrentRow = new RowObject { RowId = "1", RowAction = "EDIT" } };
@@ -74,7 +169,7 @@ public void IsRowMarkedForDeletion_WithNormalRow_ReturnsFalse()
}
[TestMethod]
- public void IsFieldPresent_InCurrentRow_ReturnsTrue()
+ public void IsFieldPresent_FormObject_InCurrentRow_ReturnsTrue()
{
// Arrange
var form = new FormObject { CurrentRow = new RowObject() };
@@ -88,7 +183,7 @@ public void IsFieldPresent_InCurrentRow_ReturnsTrue()
}
[TestMethod]
- public void IsFieldEnabled_WithEnabledField_ReturnsTrue()
+ public void IsFieldEnabled_FormObject_WithEnabledField_ReturnsTrue()
{
// Arrange
var form = new FormObject { CurrentRow = new RowObject() };
@@ -102,7 +197,7 @@ public void IsFieldEnabled_WithEnabledField_ReturnsTrue()
}
[TestMethod]
- public void IsFieldLocked_WithLockedField_ReturnsTrue()
+ public void IsFieldLocked_FormObject_WithLockedField_ReturnsTrue()
{
// Arrange
var form = new FormObject { CurrentRow = new RowObject() };
@@ -116,7 +211,7 @@ public void IsFieldLocked_WithLockedField_ReturnsTrue()
}
[TestMethod]
- public void IsFieldRequired_WithRequiredField_ReturnsTrue()
+ public void IsFieldRequired_FormObject_WithRequiredField_ReturnsTrue()
{
// Arrange
var form = new FormObject { CurrentRow = new RowObject() };
@@ -130,7 +225,7 @@ public void IsFieldRequired_WithRequiredField_ReturnsTrue()
}
[TestMethod]
- public void GetFieldValue_FromCurrentRow_ReturnsValue()
+ public void GetFieldValue_FormObject_FromCurrentRow_ReturnsValue()
{
// Arrange
var form = new FormObject { CurrentRow = new RowObject() };
@@ -144,7 +239,7 @@ public void GetFieldValue_FromCurrentRow_ReturnsValue()
}
[TestMethod]
- public void GetFieldValue_WithRowIdAndFieldNumber_ReturnsValue()
+ public void GetFieldValue_FormObject_WithRowIdAndFieldNumber_ReturnsValue()
{
// Arrange
var form = new FormObject { CurrentRow = new RowObject { RowId = "1" } };
@@ -158,7 +253,7 @@ public void GetFieldValue_WithRowIdAndFieldNumber_ReturnsValue()
}
[TestMethod]
- public void GetFieldValueFromOtherRows_WithRowIdAndFieldNumber_ReturnsValue()
+ public void GetFieldValueFromOtherRows_FormObject_WithRowIdAndFieldNumber_ReturnsValue()
{
// Arrange
var form = new FormObject { CurrentRow = new RowObject { RowId = "1" }, MultipleIteration = true };
@@ -174,7 +269,7 @@ public void GetFieldValueFromOtherRows_WithRowIdAndFieldNumber_ReturnsValue()
}
[TestMethod]
- public void GetFieldValues_ReturnsAllValues()
+ public void GetFieldValues_FormObject_ReturnsAllValues()
{
// Arrange
var form = new FormObject { CurrentRow = new RowObject { RowId = "1" }, MultipleIteration = true };
@@ -194,7 +289,7 @@ public void GetFieldValues_ReturnsAllValues()
}
[TestMethod]
- public void SetFieldValue_InCurrentRow_UpdatesValue()
+ public void SetFieldValue_FormObject_InCurrentRow_UpdatesValue()
{
// Arrange
var form = new FormObject { CurrentRow = new RowObject { RowId = "1" } };
@@ -208,7 +303,7 @@ public void SetFieldValue_InCurrentRow_UpdatesValue()
}
[TestMethod]
- public void SetFieldValue_WithRowId_UpdatesValueInSpecificRow()
+ public void SetFieldValue_FormObject_WithRowId_UpdatesValueInSpecificRow()
{
// Arrange
var form = new FormObject { CurrentRow = new RowObject { RowId = "1" }, MultipleIteration = true };
@@ -227,7 +322,7 @@ public void SetFieldValue_WithRowId_UpdatesValueInSpecificRow()
}
[TestMethod]
- public void SetDisabledField_WithMultipleIteration_DisablesFieldInAllRows()
+ public void SetDisabledField_FormObject_WithMultipleIteration_DisablesFieldInAllRows()
{
// Arrange
var form = new FormObject { CurrentRow = new RowObject { RowId = "1", RowAction = "" }, MultipleIteration = true };
@@ -247,7 +342,7 @@ public void SetDisabledField_WithMultipleIteration_DisablesFieldInAllRows()
}
[TestMethod]
- public void SetEnabledFields_WithMultipleIteration_EnablesMatchingFieldsInAllRows()
+ public void SetEnabledFields_FormObject_WithMultipleIteration_EnablesMatchingFieldsInAllRows()
{
// Arrange
var form = new FormObject { CurrentRow = new RowObject { RowId = "1" }, MultipleIteration = true };
@@ -265,80 +360,184 @@ public void SetEnabledFields_WithMultipleIteration_EnablesMatchingFieldsInAllRow
}
[TestMethod]
- public void SetDisabledField_WithEmptyFieldNumber_DoesNotChangeForm()
+ public void SetDisabledField_FormObject_WithEmptyFieldNumber_ThrowsArgumentException()
{
// Arrange
var form = new FormObject { CurrentRow = new RowObject { RowId = "1", RowAction = "" } };
form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "1" });
+ // Act/Assert
+ Assert.ThrowsException(() => form.SetDisabledField(string.Empty));
+ }
+
+ [TestMethod]
+ public void SetEnabledFields_FormObject_WithNullFieldNumbers_ThrowsArgumentNullException()
+ {
+ // Arrange
+ var form = new FormObject { CurrentRow = new RowObject { RowId = "1", RowAction = "" } };
+ form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "0" });
+
+ // Act/Assert
+ Assert.ThrowsException(() => form.SetEnabledFields(null));
+ }
+
+ [TestMethod]
+ public void SetDisabledField_FormObject_WithNullCurrentRow_ReturnsOriginalForm()
+ {
+ // Arrange
+ var form = new FormObject { CurrentRow = null! };
+
// Act
- form.SetDisabledField(string.Empty);
+ var result = form.SetDisabledField("100");
// Assert
- Assert.AreEqual("1", form.CurrentRow.Fields[0].Enabled);
- Assert.AreEqual("", form.CurrentRow.RowAction);
+ Assert.AreSame(form, result);
}
[TestMethod]
- public void SetEnabledFields_WithNullFieldNumbers_DoesNotChangeForm()
+ public void SetEnabledField_FormObject_WithEmptyFieldNumber_ThrowsArgumentException()
{
// Arrange
var form = new FormObject { CurrentRow = new RowObject { RowId = "1", RowAction = "" } };
form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "0" });
+ // Act/Assert
+ Assert.ThrowsException(() => form.SetEnabledField(string.Empty));
+ }
+
+ [TestMethod]
+ public void SetDisabledFields_FormObject_WithMultipleIterationFalse_DoesNotModifyOtherRows()
+ {
+ // Arrange
+ var form = new FormObject { CurrentRow = new RowObject { RowId = "1" }, MultipleIteration = false };
+ form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "1" });
+
+ var otherRow = new RowObject { RowId = "2" };
+ otherRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "1" });
+ form.OtherRows.Add(otherRow);
+
// Act
- form.SetEnabledFields(null);
+ form.SetDisabledFields(["100"]);
// Assert
Assert.AreEqual("0", form.CurrentRow.Fields[0].Enabled);
- Assert.AreEqual("", form.CurrentRow.RowAction);
+ Assert.AreEqual("1", otherRow.Fields[0].Enabled);
}
[TestMethod]
- public void SetDisabledField_WithNullCurrentRow_ReturnsOriginalForm()
+ public void SetLockedField_FormObject_WithMultipleIteration_LocksFieldInAllRows()
{
// Arrange
- var form = new FormObject { CurrentRow = null! };
+ var form = new FormObject { CurrentRow = new RowObject { RowId = "1", RowAction = "" }, MultipleIteration = true };
+ form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Lock = "0" });
+ var otherRow = new RowObject { RowId = "2", RowAction = "" };
+ otherRow.Fields.Add(new FieldObject { FieldNumber = "100", Lock = "0" });
+ form.OtherRows.Add(otherRow);
// Act
- var result = form.SetDisabledField("100");
+ form.SetLockedField("100");
// Assert
- Assert.AreSame(form, result);
+ Assert.AreEqual("1", form.CurrentRow.Fields[0].Lock);
+ Assert.AreEqual("1", otherRow.Fields[0].Lock);
+ Assert.AreEqual("EDIT", form.CurrentRow.RowAction);
+ Assert.AreEqual("EDIT", otherRow.RowAction);
+ }
+
+ [TestMethod]
+ public void SetUnlockedFields_FormObject_WithMultipleIteration_UnlocksMatchingFieldsInAllRows()
+ {
+ // Arrange
+ var form = new FormObject { CurrentRow = new RowObject { RowId = "1" }, MultipleIteration = true };
+ form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Lock = "1" });
+ form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "101", Lock = "1" });
+ var otherRow = new RowObject { RowId = "2" };
+ otherRow.Fields.Add(new FieldObject { FieldNumber = "100", Lock = "1" });
+ otherRow.Fields.Add(new FieldObject { FieldNumber = "101", Lock = "1" });
+ form.OtherRows.Add(otherRow);
+
+ // Act
+ form.SetUnlockedFields(["101"]);
+
+ // Assert
+ Assert.AreEqual("1", form.CurrentRow.Fields[0].Lock);
+ Assert.AreEqual("0", form.CurrentRow.Fields[1].Lock);
+ Assert.AreEqual("1", otherRow.Fields[0].Lock);
+ Assert.AreEqual("0", otherRow.Fields[1].Lock);
}
[TestMethod]
- public void SetEnabledField_WithEmptyFieldNumber_DoesNotChangeForm()
+ public void SetLockedField_FormObject_WithEmptyFieldNumber_ThrowsArgumentException()
{
// Arrange
var form = new FormObject { CurrentRow = new RowObject { RowId = "1", RowAction = "" } };
- form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "0" });
+ form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Lock = "0" });
+
+ // Act / Assert
+ Assert.ThrowsException(() => form.SetLockedField(string.Empty));
+ }
+
+ [TestMethod]
+ public void SetUnlockedField_FormObject_WithNullCurrentRow_ReturnsOriginalForm()
+ {
+ // Arrange
+ var form = new FormObject { CurrentRow = null! };
// Act
- form.SetEnabledField(string.Empty);
+ var result = form.SetUnlockedField("100");
// Assert
- Assert.AreEqual("0", form.CurrentRow.Fields[0].Enabled);
- Assert.AreEqual("", form.CurrentRow.RowAction);
+ Assert.AreSame(form, result);
}
[TestMethod]
- public void SetDisabledFields_WithMultipleIterationFalse_DoesNotModifyOtherRows()
+ public void SetLockedFields_FormObject_WithNullFieldNumbers_ThrowsArgumentNullException()
+ {
+ // Arrange
+ var form = new FormObject { CurrentRow = new RowObject { RowId = "1", RowAction = "" } };
+ form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Lock = "0" });
+
+ // Act / Assert
+ Assert.ThrowsException(() => form.SetLockedFields(null));
+ }
+
+ [TestMethod]
+ public void SetUnlockedFields_FormObject_WithMultipleIterationFalse_DoesNotModifyOtherRows()
{
// Arrange
var form = new FormObject { CurrentRow = new RowObject { RowId = "1" }, MultipleIteration = false };
- form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "1" });
+ form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Lock = "1" });
var otherRow = new RowObject { RowId = "2" };
- otherRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "1" });
+ otherRow.Fields.Add(new FieldObject { FieldNumber = "100", Lock = "1" });
form.OtherRows.Add(otherRow);
// Act
- form.SetDisabledFields(["100"]);
+ form.SetUnlockedFields(["100"]);
// Assert
- Assert.AreEqual("0", form.CurrentRow.Fields[0].Enabled);
- Assert.AreEqual("1", otherRow.Fields[0].Enabled);
+ Assert.AreEqual("0", form.CurrentRow.Fields[0].Lock);
+ Assert.AreEqual("1", otherRow.Fields[0].Lock);
+ }
+
+ [TestMethod]
+ public void SetLockedFields_FormObject_WithDuplicateFieldNumbers_LocksFieldInCurrentAndOtherRows()
+ {
+ // Arrange
+ var form = new FormObject { CurrentRow = new RowObject { RowId = "1", RowAction = "" }, MultipleIteration = true };
+ form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Lock = "0" });
+ var otherRow = new RowObject { RowId = "2", RowAction = "" };
+ otherRow.Fields.Add(new FieldObject { FieldNumber = "100", Lock = "0" });
+ form.OtherRows.Add(otherRow);
+
+ // Act
+ form.SetLockedFields(["100", "100"]);
+
+ // Assert
+ Assert.AreEqual("1", form.CurrentRow.Fields[0].Lock);
+ Assert.AreEqual("1", otherRow.Fields[0].Lock);
+ Assert.AreEqual(RowObject.RowActions.Edit, form.CurrentRow.RowAction);
+ Assert.AreEqual(RowObject.RowActions.Edit, otherRow.RowAction);
}
}
diff --git a/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/OptionObjectHelpersTests.cs b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/OptionObjectHelpers.OptionObject.Tests.cs
similarity index 50%
rename from dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/OptionObjectHelpersTests.cs
rename to dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/OptionObjectHelpers.OptionObject.Tests.cs
index 47912c3..ba413a0 100644
--- a/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/OptionObjectHelpersTests.cs
+++ b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/OptionObjectHelpers.OptionObject.Tests.cs
@@ -1,353 +1,339 @@
namespace RarelySimple.AvatarScriptLink.Objects.Helpers.Tests
{
-
///
- /// Tests for OptionObject/OptionObject2/OptionObject2015 helper extension methods
+ /// Tests for OptionObject helper extension methods.
///
[TestClass]
- public class OptionObjectHelpersTests
+ public class OptionObjectHelpersOptionObjectTests
{
- [TestMethod]
- public void GetCurrentRowId_ReturnsCurrentRowId()
+ [DataTestMethod]
+ [DataRow("Disabled")]
+ [DataRow("Enabled")]
+ [DataRow("Locked")]
+ [DataRow("Unlocked")]
+ public void SetField_OptionObject_WithNullFieldNumber_ThrowsArgumentNullException(string operation)
+ {
+ var optionObject = new OptionObject();
+ var form = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1" } };
+ form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "1", Lock = "0" });
+ optionObject.Forms.Add(form);
+
+ Action act = operation switch
+ {
+ "Disabled" => () => optionObject.SetDisabledField(null!),
+ "Enabled" => () => optionObject.SetEnabledField(null!),
+ "Locked" => () => optionObject.SetLockedField(null!),
+ "Unlocked" => () => optionObject.SetUnlockedField(null!),
+ _ => throw new ArgumentOutOfRangeException(nameof(operation))
+ };
+
+ Assert.ThrowsException(act);
+ }
+
+ [DataTestMethod]
+ [DataRow("Disabled")]
+ [DataRow("Enabled")]
+ [DataRow("Locked")]
+ [DataRow("Unlocked")]
+ public void SetField_OptionObject_WithEmptyFieldNumber_ThrowsArgumentException(string operation)
+ {
+ var optionObject = new OptionObject();
+ var form = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1" } };
+ form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "1", Lock = "0" });
+ optionObject.Forms.Add(form);
+
+ Action act = operation switch
+ {
+ "Disabled" => () => optionObject.SetDisabledField(string.Empty),
+ "Enabled" => () => optionObject.SetEnabledField(string.Empty),
+ "Locked" => () => optionObject.SetLockedField(string.Empty),
+ "Unlocked" => () => optionObject.SetUnlockedField(string.Empty),
+ _ => throw new ArgumentOutOfRangeException(nameof(operation))
+ };
+
+ Assert.ThrowsException(act);
+ }
+
+ [DataTestMethod]
+ [DataRow("Disabled")]
+ [DataRow("Enabled")]
+ [DataRow("Locked")]
+ [DataRow("Unlocked")]
+ public void SetFields_OptionObject_WithMixedFormMatches_OnlyAppliesToMatchingForms(string operation)
+ {
+ var optionObject = new OptionObject();
+ var matchingForm = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1", RowAction = string.Empty } };
+ var nonMatchingForm = new FormObject { FormId = "2", CurrentRow = new RowObject { RowId = "1", RowAction = string.Empty } };
+
+ switch (operation)
+ {
+ case "Disabled":
+ matchingForm.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "1" });
+ nonMatchingForm.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "200", Enabled = "1" });
+ optionObject.Forms.Add(matchingForm);
+ optionObject.Forms.Add(nonMatchingForm);
+
+ optionObject.SetDisabledFields(new List { "100" });
+
+ Assert.AreEqual("0", matchingForm.CurrentRow.Fields[0].Enabled);
+ Assert.AreEqual("1", nonMatchingForm.CurrentRow.Fields[0].Enabled);
+ break;
+ case "Enabled":
+ matchingForm.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "0" });
+ nonMatchingForm.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "200", Enabled = "0" });
+ optionObject.Forms.Add(matchingForm);
+ optionObject.Forms.Add(nonMatchingForm);
+
+ optionObject.SetEnabledFields(new List { "100" });
+
+ Assert.AreEqual("1", matchingForm.CurrentRow.Fields[0].Enabled);
+ Assert.AreEqual("0", nonMatchingForm.CurrentRow.Fields[0].Enabled);
+ break;
+ case "Locked":
+ matchingForm.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Lock = "0" });
+ nonMatchingForm.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "200", Lock = "0" });
+ optionObject.Forms.Add(matchingForm);
+ optionObject.Forms.Add(nonMatchingForm);
+
+ optionObject.SetLockedFields(new List { "100" });
+
+ Assert.AreEqual("1", matchingForm.CurrentRow.Fields[0].Lock);
+ Assert.AreEqual("0", nonMatchingForm.CurrentRow.Fields[0].Lock);
+ break;
+ case "Unlocked":
+ matchingForm.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Lock = "1" });
+ nonMatchingForm.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "200", Lock = "1" });
+ optionObject.Forms.Add(matchingForm);
+ optionObject.Forms.Add(nonMatchingForm);
+
+ optionObject.SetUnlockedFields(new List { "100" });
+
+ Assert.AreEqual("0", matchingForm.CurrentRow.Fields[0].Lock);
+ Assert.AreEqual("1", nonMatchingForm.CurrentRow.Fields[0].Lock);
+ break;
+ default:
+ throw new ArgumentOutOfRangeException(nameof(operation));
+ }
+
+ Assert.AreEqual(RowObject.RowActions.Edit, matchingForm.CurrentRow.RowAction);
+ Assert.AreEqual(string.Empty, nonMatchingForm.CurrentRow.RowAction);
+ }
+
+ [TestMethod]
+ public void GetCurrentRowId_OptionObject_ReturnsCurrentRowId()
{
- // Arrange
var optionObject = new OptionObject();
var form = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "100" } };
optionObject.Forms.Add(form);
- // Act
var result = optionObject.GetCurrentRowId("1");
- // Assert
Assert.AreEqual("100", result);
}
[TestMethod]
- public void GetCurrentRowId_WithNonExistentForm_ReturnsNull()
+ public void GetCurrentRowId_OptionObject_WithNonExistentForm_ReturnsNull()
{
- // Arrange
var optionObject = new OptionObject();
- // Act
var result = optionObject.GetCurrentRowId("999");
- // Assert
Assert.IsNull(result);
}
[TestMethod]
- public void GetParentRowId_ReturnsParentRowId()
+ public void GetParentRowId_OptionObject_ReturnsParentRowId()
{
- // Arrange
var optionObject = new OptionObject();
var form = new FormObject { FormId = "1", CurrentRow = new RowObject { ParentRowId = "200" } };
optionObject.Forms.Add(form);
- // Act
var result = optionObject.GetParentRowId("1");
- // Assert
Assert.AreEqual("200", result);
}
[TestMethod]
- public void GetFieldValue_FromAnyForm_ReturnsValue()
+ public void GetFieldValue_OptionObject_FromAnyForm_ReturnsValue()
{
- // Arrange
var optionObject = new OptionObject();
var form = new FormObject { FormId = "1", CurrentRow = new RowObject() };
form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", FieldValue = "TestValue" });
optionObject.Forms.Add(form);
- // Act
var result = optionObject.GetFieldValue("100");
- // Assert
Assert.AreEqual("TestValue", result);
}
[TestMethod]
- public void GetFieldValue_WithFormIdRowIdFieldNumber_ReturnsValue()
+ public void GetFieldValue_OptionObject_WithFormIdRowIdFieldNumber_ReturnsValue()
{
- // Arrange
var optionObject = new OptionObject();
var form = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1" } };
form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", FieldValue = "TestValue" });
optionObject.Forms.Add(form);
- // Act
var result = optionObject.GetFieldValue("1", "1", "100");
- // Assert
Assert.AreEqual("TestValue", result);
}
[TestMethod]
- public void GetFieldValues_ReturnsAllValues()
+ public void GetFieldValues_OptionObject_ReturnsAllValues()
{
- // Arrange
var optionObject = new OptionObject();
var form1 = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1" } };
form1.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", FieldValue = "Value1" });
optionObject.Forms.Add(form1);
-
+
var form2 = new FormObject { FormId = "2", CurrentRow = new RowObject { RowId = "2" } };
form2.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", FieldValue = "Value2" });
optionObject.Forms.Add(form2);
- // Act
var result = optionObject.GetFieldValues("100");
- // Assert
Assert.AreEqual(2, result.Count);
CollectionAssert.Contains(result, "Value1");
CollectionAssert.Contains(result, "Value2");
}
[TestMethod]
- public void GetMultipleIterationStatus_ReturnsStatus()
+ public void GetMultipleIterationStatus_OptionObject_ReturnsStatus()
{
- // Arrange
var optionObject = new OptionObject();
var form = new FormObject { FormId = "1", CurrentRow = new RowObject(), MultipleIteration = true };
optionObject.Forms.Add(form);
- // Act
var result = optionObject.GetMultipleIterationStatus("1");
- // Assert
Assert.IsTrue(result);
}
[TestMethod]
- public void IsFieldPresent_InAnyForm_ReturnsTrue()
+ public void IsFieldPresent_OptionObject_InAnyForm_ReturnsTrue()
{
- // Arrange
var optionObject = new OptionObject();
var form = new FormObject { FormId = "1", CurrentRow = new RowObject() };
form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100" });
optionObject.Forms.Add(form);
- // Act
var result = optionObject.IsFieldPresent("100");
- // Assert
Assert.IsTrue(result);
}
[TestMethod]
- public void IsFieldEnabled_InAnyForm_ReturnsTrue()
+ public void IsFieldEnabled_OptionObject_InAnyForm_ReturnsTrue()
{
- // Arrange
var optionObject = new OptionObject();
var form = new FormObject { FormId = "1", CurrentRow = new RowObject() };
form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "1" });
optionObject.Forms.Add(form);
- // Act
var result = optionObject.IsFieldEnabled("100");
- // Assert
Assert.IsTrue(result);
}
[TestMethod]
- public void IsFieldLocked_InAnyForm_ReturnsTrue()
+ public void IsFieldLocked_OptionObject_InAnyForm_ReturnsTrue()
{
- // Arrange
var optionObject = new OptionObject();
var form = new FormObject { FormId = "1", CurrentRow = new RowObject() };
form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Lock = "1" });
optionObject.Forms.Add(form);
- // Act
var result = optionObject.IsFieldLocked("100");
- // Assert
Assert.IsTrue(result);
}
[TestMethod]
- public void IsFieldRequired_InAnyForm_ReturnsTrue()
+ public void IsFieldRequired_OptionObject_InAnyForm_ReturnsTrue()
{
- // Arrange
var optionObject = new OptionObject();
var form = new FormObject { FormId = "1", CurrentRow = new RowObject() };
form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Required = "1" });
optionObject.Forms.Add(form);
- // Act
var result = optionObject.IsFieldRequired("100");
- // Assert
Assert.IsTrue(result);
}
[TestMethod]
- public void GetErrorCode_ReturnsErrorCode()
+ public void GetErrorCode_OptionObject_ReturnsErrorCode()
{
- // Arrange
var optionObject = new OptionObject { ErrorCode = 1.0 };
- // Act
var result = optionObject.GetErrorCode();
- // Assert
Assert.AreEqual(1.0, result);
}
[TestMethod]
- public void GetErrorMessage_ReturnsErrorMessage()
+ public void GetErrorMessage_OptionObject_ReturnsErrorMessage()
{
- // Arrange
var optionObject = new OptionObject { ErrorMesg = "Test Error" };
- // Act
var result = optionObject.GetErrorMessage();
- // Assert
Assert.AreEqual("Test Error", result);
}
[TestMethod]
- public void GetEntityId_ReturnsEntityId()
+ public void GetEntityId_OptionObject_ReturnsEntityId()
{
- // Arrange
var optionObject = new OptionObject { EntityID = "12345" };
- // Act
var result = optionObject.GetEntityId();
- // Assert
Assert.AreEqual("12345", result);
}
[TestMethod]
- public void GetFormCount_ReturnsFormCount()
+ public void GetFormCount_OptionObject_ReturnsFormCount()
{
- // Arrange
var optionObject = new OptionObject();
optionObject.Forms.Add(new FormObject { FormId = "1" });
optionObject.Forms.Add(new FormObject { FormId = "2" });
- // Act
var result = optionObject.GetFormCount();
- // Assert
Assert.AreEqual(2, result);
}
[TestMethod]
- public void HasError_WithNonZeroErrorCode_ReturnsTrue()
+ public void HasError_OptionObject_WithNonZeroErrorCode_ReturnsTrue()
{
- // Arrange
var optionObject = new OptionObject { ErrorCode = 1.0 };
- // Act
var result = optionObject.HasError();
- // Assert
Assert.IsTrue(result);
}
[TestMethod]
- public void HasError_WithZeroErrorCode_ReturnsFalse()
+ public void HasError_OptionObject_WithZeroErrorCode_ReturnsFalse()
{
- // Arrange
var optionObject = new OptionObject { ErrorCode = 0.0 };
- // Act
var result = optionObject.HasError();
- // Assert
Assert.IsFalse(result);
}
- [TestMethod]
- public void GetEntityId_OptionObject2_ReturnsEntityId()
- {
- var optionObject = new OptionObject2 { EntityID = "E-2" };
-
- var result = optionObject.GetEntityId();
-
- Assert.AreEqual("E-2", result);
- }
-
- [TestMethod]
- public void GetFormCount_OptionObject2_ReturnsFormCount()
- {
- var optionObject = new OptionObject2();
- optionObject.Forms.Add(new FormObject { FormId = "1" });
- optionObject.Forms.Add(new FormObject { FormId = "2" });
-
- var result = optionObject.GetFormCount();
-
- Assert.AreEqual(2, result);
- }
-
- [TestMethod]
- public void HasError_OptionObject2_WithZeroErrorCode_ReturnsFalse()
- {
- var optionObject = new OptionObject2 { ErrorCode = 0 };
-
- var result = optionObject.HasError();
-
- Assert.IsFalse(result);
- }
-
- [TestMethod]
- public void GetEntityId_OptionObject2015_ReturnsEntityId()
- {
- var optionObject = new OptionObject2015 { EntityID = "E-2015" };
-
- var result = optionObject.GetEntityId();
-
- Assert.AreEqual("E-2015", result);
- }
-
- [TestMethod]
- public void GetSessionToken_OptionObject2015_ReturnsSessionToken()
- {
- var optionObject = new OptionObject2015 { SessionToken = "token-123" };
-
- var result = optionObject.GetSessionToken();
-
- Assert.AreEqual("token-123", result);
- }
-
- [TestMethod]
- public void GetOptionUserId_OptionObject2015_ReturnsOptionUserId()
- {
- var optionObject = new OptionObject2015 { OptionUserId = "user-01" };
-
- var result = optionObject.GetOptionUserId();
-
- Assert.AreEqual("user-01", result);
- }
-
- [TestMethod]
- public void HasError_OptionObject2015_WithNonZeroErrorCode_ReturnsTrue()
- {
- var optionObject = new OptionObject2015 { ErrorCode = 1 };
-
- var result = optionObject.HasError();
-
- Assert.IsTrue(result);
- }
-
[TestMethod]
public void SetDisabledField_OptionObject_DisablesTargetField()
{
- // Arrange
var optionObject = new OptionObject();
var form = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1", RowAction = "" } };
form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "1" });
optionObject.Forms.Add(form);
- // Act
optionObject.SetDisabledField("100");
- // Assert
Assert.AreEqual("0", optionObject.Forms[0].CurrentRow.Fields[0].Enabled);
Assert.AreEqual("EDIT", optionObject.Forms[0].CurrentRow.RowAction);
}
@@ -355,57 +341,21 @@ public void SetDisabledField_OptionObject_DisablesTargetField()
[TestMethod]
public void SetEnabledFields_OptionObject_EnablesMatchingFields()
{
- // Arrange
var optionObject = new OptionObject();
var form = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1" } };
form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "0" });
form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "101", Enabled = "0" });
optionObject.Forms.Add(form);
- // Act
optionObject.SetEnabledFields(new List { "101" });
- // Assert
Assert.AreEqual("0", optionObject.Forms[0].CurrentRow.Fields[0].Enabled);
Assert.AreEqual("1", optionObject.Forms[0].CurrentRow.Fields[1].Enabled);
}
- [TestMethod]
- public void SetDisabledField_OptionObject2_DisablesTargetField()
- {
- // Arrange
- var optionObject = new OptionObject2();
- var form = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1" } };
- form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "1" });
- optionObject.Forms.Add(form);
-
- // Act
- optionObject.SetDisabledField("100");
-
- // Assert
- Assert.AreEqual("0", optionObject.Forms[0].CurrentRow.Fields[0].Enabled);
- }
-
- [TestMethod]
- public void SetEnabledField_OptionObject2015_EnablesTargetField()
- {
- // Arrange
- var optionObject = new OptionObject2015();
- var form = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1" } };
- form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "0" });
- optionObject.Forms.Add(form);
-
- // Act
- optionObject.SetEnabledField("100");
-
- // Assert
- Assert.AreEqual("1", optionObject.Forms[0].CurrentRow.Fields[0].Enabled);
- }
-
[TestMethod]
public void SetDisabledFields_OptionObject_WithFieldObjects_DisablesMatchingFields()
{
- // Arrange
var optionObject = new OptionObject();
var form = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1" } };
form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "1" });
@@ -414,306 +364,168 @@ public void SetDisabledFields_OptionObject_WithFieldObjects_DisablesMatchingFiel
var fieldsToDisable = new List { new FieldObject { FieldNumber = "101" } };
- // Act
optionObject.SetDisabledFields(fieldsToDisable);
- // Assert
Assert.AreEqual("1", optionObject.Forms[0].CurrentRow.Fields[0].Enabled);
Assert.AreEqual("0", optionObject.Forms[0].CurrentRow.Fields[1].Enabled);
}
[TestMethod]
- public void SetEnabledFields_OptionObject2_WithFieldObjects_EnablesMatchingFields()
+ public void SetDisabledField_OptionObject_WithEmptyFieldNumber_ThrowsArgumentException()
{
- // Arrange
- var optionObject = new OptionObject2();
- var form = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1" } };
- form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "0" });
- optionObject.Forms.Add(form);
-
- var fieldsToEnable = new List { new FieldObject { FieldNumber = "100" } };
-
- // Act
- optionObject.SetEnabledFields(fieldsToEnable);
-
- // Assert
- Assert.AreEqual("1", optionObject.Forms[0].CurrentRow.Fields[0].Enabled);
- }
-
- [TestMethod]
- public void SetDisabledFields_OptionObject2015_WithFieldObjects_DisablesMatchingFields()
- {
- // Arrange
- var optionObject = new OptionObject2015();
- var form = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1" } };
+ var optionObject = new OptionObject();
+ var form = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1", RowAction = "" } };
form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "1" });
optionObject.Forms.Add(form);
- var fieldsToDisable = new List { new FieldObject { FieldNumber = "100" } };
-
- // Act
- optionObject.SetDisabledFields(fieldsToDisable);
-
- // Assert
- Assert.AreEqual("0", optionObject.Forms[0].CurrentRow.Fields[0].Enabled);
+ Assert.ThrowsException(() => optionObject.SetDisabledField(string.Empty));
}
[TestMethod]
- public void SetDisabledField_OptionObject_WithEmptyFieldNumber_DoesNothing()
+ public void SetEnabledField_OptionObject_WithNoMatchingField_ThrowsArgumentException()
{
- // Arrange
var optionObject = new OptionObject();
- var form = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1", RowAction = "" } };
- form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "1" });
+ var form = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1" } };
+ form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "200", Enabled = "0" });
optionObject.Forms.Add(form);
- // Act
- optionObject.SetDisabledField(string.Empty);
-
- // Assert
- Assert.AreEqual("1", optionObject.Forms[0].CurrentRow.Fields[0].Enabled);
- Assert.AreEqual("", optionObject.Forms[0].CurrentRow.RowAction);
+ Assert.ThrowsException(() => optionObject.SetEnabledField("100"));
}
[TestMethod]
- public void SetDisabledFields_OptionObject_WithNullFieldObjects_DoesNothing()
+ public void SetDisabledFields_OptionObject_WithNullFieldObjects_ThrowsArgumentNullException()
{
- // Arrange
var optionObject = new OptionObject();
var form = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1" } };
form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "1" });
optionObject.Forms.Add(form);
- // Act
- optionObject.SetDisabledFields((List?)null);
-
- // Assert
- Assert.AreEqual("1", optionObject.Forms[0].CurrentRow.Fields[0].Enabled);
+ Assert.ThrowsException(() => optionObject.SetDisabledFields((List?)null));
}
[TestMethod]
public void SetDisabledField_OptionObject_WithNullOptionObject_ReturnsNull()
{
- // Act
var result = OptionObjectHelpers.SetDisabledField(null!, "100");
- // Assert
Assert.IsNull(result);
}
[TestMethod]
public void SetEnabledField_OptionObject_WithNullForms_ReturnsOriginalObject()
{
- // Arrange
var optionObject = new OptionObject { Forms = null! };
- // Act
var result = optionObject.SetEnabledField("100");
- // Assert
Assert.AreSame(optionObject, result);
}
[TestMethod]
- public void SetDisabledFields_OptionObject2_WithFieldNumbers_DisablesMatchingFields()
- {
- // Arrange
- var optionObject = new OptionObject2();
- var form = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1" } };
- form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "1" });
- form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "101", Enabled = "1" });
- optionObject.Forms.Add(form);
-
- // Act
- optionObject.SetDisabledFields(new List { "101" });
-
- // Assert
- Assert.AreEqual("1", optionObject.Forms[0].CurrentRow.Fields[0].Enabled);
- Assert.AreEqual("0", optionObject.Forms[0].CurrentRow.Fields[1].Enabled);
- }
-
- [TestMethod]
- public void SetDisabledFields_OptionObject2_WithEmptyFieldObjects_DoesNothing()
+ public void SetLockedField_OptionObject_LocksTargetField()
{
- var optionObject = new OptionObject2();
- var form = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1" } };
- form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "1" });
- optionObject.Forms.Add(form);
-
- optionObject.SetDisabledFields(new List());
-
- Assert.AreEqual("1", optionObject.Forms[0].CurrentRow.Fields[0].Enabled);
- }
-
- [TestMethod]
- public void SetEnabledField_OptionObject2_WithEmptyFieldNumber_DoesNothing()
- {
- // Arrange
- var optionObject = new OptionObject2();
+ var optionObject = new OptionObject();
var form = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1", RowAction = "" } };
- form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "0" });
+ form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Lock = "0" });
optionObject.Forms.Add(form);
- // Act
- optionObject.SetEnabledField(string.Empty);
-
- // Assert
- Assert.AreEqual("0", optionObject.Forms[0].CurrentRow.Fields[0].Enabled);
- Assert.AreEqual("", optionObject.Forms[0].CurrentRow.RowAction);
- }
+ optionObject.SetLockedField("100");
- [TestMethod]
- public void SetEnabledField_OptionObject2_WithNullOptionObject_ReturnsNull()
- {
- // Act
- var result = OptionObject2Helpers.SetEnabledField(null!, "100");
-
- // Assert
- Assert.IsNull(result);
+ Assert.AreEqual("1", optionObject.Forms[0].CurrentRow.Fields[0].Lock);
+ Assert.AreEqual("EDIT", optionObject.Forms[0].CurrentRow.RowAction);
}
[TestMethod]
- public void SetEnabledFields_OptionObject2_WithEmptyFieldNumbers_DoesNothing()
+ public void SetEnabledFields_OptionObject_WithFieldObjects_EnablesMatchingFields()
{
- // Arrange
- var optionObject = new OptionObject2();
+ var optionObject = new OptionObject();
var form = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1" } };
form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "0" });
+ form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "101", Enabled = "0" });
optionObject.Forms.Add(form);
+ var fieldsToEnable = new List { new FieldObject { FieldNumber = "100" } };
- // Act
- optionObject.SetEnabledFields(new List());
+ optionObject.SetEnabledFields(fieldsToEnable);
- // Assert
- Assert.AreEqual("0", optionObject.Forms[0].CurrentRow.Fields[0].Enabled);
+ Assert.AreEqual("1", form.CurrentRow.Fields[0].Enabled);
+ Assert.AreEqual("0", form.CurrentRow.Fields[1].Enabled);
}
[TestMethod]
- public void SetEnabledFields_OptionObject2_WithNullFieldObjects_DoesNothing()
+ public void SetUnlockedFields_OptionObject_WithFieldNumbers_UnlocksMatchingFields()
{
- var optionObject = new OptionObject2();
+ var optionObject = new OptionObject();
var form = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1" } };
- form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "0" });
+ form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Lock = "1" });
+ form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "101", Lock = "1" });
optionObject.Forms.Add(form);
- optionObject.SetEnabledFields((List?)null);
+ optionObject.SetUnlockedFields(new List { "101" });
- Assert.AreEqual("0", optionObject.Forms[0].CurrentRow.Fields[0].Enabled);
+ Assert.AreEqual("1", optionObject.Forms[0].CurrentRow.Fields[0].Lock);
+ Assert.AreEqual("0", optionObject.Forms[0].CurrentRow.Fields[1].Lock);
}
[TestMethod]
- public void SetDisabledField_OptionObject2_WithNullForms_ReturnsOriginalObject()
+ public void SetUnlockedFields_OptionObject_WithFieldObjects_UnlocksMatchingFields()
{
- // Arrange
- var optionObject = new OptionObject2 { Forms = null! };
-
- // Act
- var result = optionObject.SetDisabledField("100");
-
- // Assert
- Assert.AreSame(optionObject, result);
- }
-
- [TestMethod]
- public void SetEnabledFields_OptionObject2015_WithFieldNumbers_EnablesMatchingFields()
- {
- // Arrange
- var optionObject = new OptionObject2015();
+ var optionObject = new OptionObject();
var form = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1" } };
- form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "0" });
- form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "101", Enabled = "0" });
- optionObject.Forms.Add(form);
-
- // Act
- optionObject.SetEnabledFields(new List { "100" });
-
- // Assert
- Assert.AreEqual("1", optionObject.Forms[0].CurrentRow.Fields[0].Enabled);
- Assert.AreEqual("0", optionObject.Forms[0].CurrentRow.Fields[1].Enabled);
- }
-
- [TestMethod]
- public void SetDisabledField_OptionObject2015_WithEmptyFieldNumber_DoesNothing()
- {
- // Arrange
- var optionObject = new OptionObject2015();
- var form = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1", RowAction = "" } };
- form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "1" });
+ form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Lock = "1" });
+ form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "101", Lock = "1" });
optionObject.Forms.Add(form);
+ var fieldsToUnlock = new List { new FieldObject { FieldNumber = "100" } };
- // Act
- optionObject.SetDisabledField(string.Empty);
+ optionObject.SetUnlockedFields(fieldsToUnlock);
- // Assert
- Assert.AreEqual("1", optionObject.Forms[0].CurrentRow.Fields[0].Enabled);
- Assert.AreEqual("", optionObject.Forms[0].CurrentRow.RowAction);
+ Assert.AreEqual("0", form.CurrentRow.Fields[0].Lock);
+ Assert.AreEqual("1", form.CurrentRow.Fields[1].Lock);
}
[TestMethod]
- public void SetEnabledFields_OptionObject2015_WithNullFieldObjects_DoesNothing()
+ public void SetLockedFields_OptionObject_WithNullFieldObjects_ThrowsArgumentNullException()
{
- // Arrange
- var optionObject = new OptionObject2015();
+ var optionObject = new OptionObject();
var form = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1" } };
- form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "0" });
+ form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Lock = "0" });
optionObject.Forms.Add(form);
- // Act
- optionObject.SetEnabledFields((List?)null);
-
- // Assert
- Assert.AreEqual("0", optionObject.Forms[0].CurrentRow.Fields[0].Enabled);
+ Assert.ThrowsException(() => optionObject.SetLockedFields((List?)null));
}
[TestMethod]
- public void SetDisabledFields_OptionObject2015_WithEmptyFieldObjects_DoesNothing()
+ public void SetUnlockedField_OptionObject_WithNullForms_ReturnsOriginalObject()
{
- var optionObject = new OptionObject2015();
- var form = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1" } };
- form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "1" });
- optionObject.Forms.Add(form);
+ var optionObject = new OptionObject { Forms = null! };
- optionObject.SetDisabledFields(new List());
+ var result = optionObject.SetUnlockedField("100");
- Assert.AreEqual("1", optionObject.Forms[0].CurrentRow.Fields[0].Enabled);
+ Assert.AreSame(optionObject, result);
}
[TestMethod]
- public void SetEnabledFields_OptionObject2015_WithEmptyFieldObjects_DoesNothing()
+ public void SetUnlockedField_OptionObject_WithNoMatchingField_ThrowsArgumentException()
{
- var optionObject = new OptionObject2015();
+ var optionObject = new OptionObject();
var form = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1" } };
- form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "0" });
+ form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "200", Lock = "1" });
optionObject.Forms.Add(form);
- optionObject.SetEnabledFields(new List());
-
- Assert.AreEqual("0", optionObject.Forms[0].CurrentRow.Fields[0].Enabled);
+ Assert.ThrowsException(() => optionObject.SetUnlockedField("100"));
}
[TestMethod]
- public void SetDisabledField_OptionObject2015_WithNullForms_ReturnsOriginalObject()
+ public void SetLockedFields_OptionObject_WithDuplicateFieldNumbers_LocksTargetField()
{
- // Arrange
- var optionObject = new OptionObject2015 { Forms = null! };
-
- // Act
- var result = optionObject.SetDisabledField("100");
-
- // Assert
- Assert.AreSame(optionObject, result);
- }
+ var optionObject = new OptionObject();
+ var form = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1", RowAction = "" } };
+ form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Lock = "0" });
+ optionObject.Forms.Add(form);
- [TestMethod]
- public void SetEnabledFields_OptionObject2015_WithNullOptionObject_ReturnsNull()
- {
- // Act
- var result = OptionObject2015Helpers.SetEnabledFields(null!, new List { "100" });
+ optionObject.SetLockedFields(new List { "100", "100" });
- // Assert
- Assert.IsNull(result);
+ Assert.AreEqual("1", optionObject.Forms[0].CurrentRow.Fields[0].Lock);
+ Assert.AreEqual(RowObject.RowActions.Edit, optionObject.Forms[0].CurrentRow.RowAction);
}
-
}
-
}
diff --git a/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/OptionObjectHelpers.OptionObject2.Tests.cs b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/OptionObjectHelpers.OptionObject2.Tests.cs
new file mode 100644
index 0000000..45e93d1
--- /dev/null
+++ b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/OptionObjectHelpers.OptionObject2.Tests.cs
@@ -0,0 +1,364 @@
+namespace RarelySimple.AvatarScriptLink.Objects.Helpers.Tests
+{
+ ///
+ /// Tests for OptionObject2 helper extension methods.
+ ///
+ [TestClass]
+ public class OptionObjectHelpersOptionObject2Tests
+ {
+ [DataTestMethod]
+ [DataRow("Disabled")]
+ [DataRow("Enabled")]
+ [DataRow("Locked")]
+ [DataRow("Unlocked")]
+ public void SetField_OptionObject2_WithNullFieldNumber_ThrowsArgumentNullException(string operation)
+ {
+ var optionObject = new OptionObject2();
+ var form = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1" } };
+ form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "1", Lock = "0" });
+ optionObject.Forms.Add(form);
+
+ Action act = operation switch
+ {
+ "Disabled" => () => optionObject.SetDisabledField(null!),
+ "Enabled" => () => optionObject.SetEnabledField(null!),
+ "Locked" => () => optionObject.SetLockedField(null!),
+ "Unlocked" => () => optionObject.SetUnlockedField(null!),
+ _ => throw new ArgumentOutOfRangeException(nameof(operation))
+ };
+
+ Assert.ThrowsException(act);
+ }
+
+ [DataTestMethod]
+ [DataRow("Disabled")]
+ [DataRow("Enabled")]
+ [DataRow("Locked")]
+ [DataRow("Unlocked")]
+ public void SetField_OptionObject2_WithEmptyFieldNumber_ThrowsArgumentException(string operation)
+ {
+ var optionObject = new OptionObject2();
+ var form = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1" } };
+ form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "1", Lock = "0" });
+ optionObject.Forms.Add(form);
+
+ Action act = operation switch
+ {
+ "Disabled" => () => optionObject.SetDisabledField(string.Empty),
+ "Enabled" => () => optionObject.SetEnabledField(string.Empty),
+ "Locked" => () => optionObject.SetLockedField(string.Empty),
+ "Unlocked" => () => optionObject.SetUnlockedField(string.Empty),
+ _ => throw new ArgumentOutOfRangeException(nameof(operation))
+ };
+
+ Assert.ThrowsException(act);
+ }
+
+ [DataTestMethod]
+ [DataRow("Disabled")]
+ [DataRow("Enabled")]
+ [DataRow("Locked")]
+ [DataRow("Unlocked")]
+ public void SetFields_OptionObject2_WithMixedFormMatches_OnlyAppliesToMatchingForms(string operation)
+ {
+ var optionObject = new OptionObject2();
+ var matchingForm = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1", RowAction = string.Empty } };
+ var nonMatchingForm = new FormObject { FormId = "2", CurrentRow = new RowObject { RowId = "1", RowAction = string.Empty } };
+
+ switch (operation)
+ {
+ case "Disabled":
+ matchingForm.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "1" });
+ nonMatchingForm.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "200", Enabled = "1" });
+ optionObject.Forms.Add(matchingForm);
+ optionObject.Forms.Add(nonMatchingForm);
+
+ optionObject.SetDisabledFields(new List { "100" });
+
+ Assert.AreEqual("0", matchingForm.CurrentRow.Fields[0].Enabled);
+ Assert.AreEqual("1", nonMatchingForm.CurrentRow.Fields[0].Enabled);
+ break;
+ case "Enabled":
+ matchingForm.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "0" });
+ nonMatchingForm.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "200", Enabled = "0" });
+ optionObject.Forms.Add(matchingForm);
+ optionObject.Forms.Add(nonMatchingForm);
+
+ optionObject.SetEnabledFields(new List { "100" });
+
+ Assert.AreEqual("1", matchingForm.CurrentRow.Fields[0].Enabled);
+ Assert.AreEqual("0", nonMatchingForm.CurrentRow.Fields[0].Enabled);
+ break;
+ case "Locked":
+ matchingForm.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Lock = "0" });
+ nonMatchingForm.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "200", Lock = "0" });
+ optionObject.Forms.Add(matchingForm);
+ optionObject.Forms.Add(nonMatchingForm);
+
+ optionObject.SetLockedFields(new List { "100" });
+
+ Assert.AreEqual("1", matchingForm.CurrentRow.Fields[0].Lock);
+ Assert.AreEqual("0", nonMatchingForm.CurrentRow.Fields[0].Lock);
+ break;
+ case "Unlocked":
+ matchingForm.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Lock = "1" });
+ nonMatchingForm.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "200", Lock = "1" });
+ optionObject.Forms.Add(matchingForm);
+ optionObject.Forms.Add(nonMatchingForm);
+
+ optionObject.SetUnlockedFields(new List { "100" });
+
+ Assert.AreEqual("0", matchingForm.CurrentRow.Fields[0].Lock);
+ Assert.AreEqual("1", nonMatchingForm.CurrentRow.Fields[0].Lock);
+ break;
+ default:
+ throw new ArgumentOutOfRangeException(nameof(operation));
+ }
+
+ Assert.AreEqual(RowObject.RowActions.Edit, matchingForm.CurrentRow.RowAction);
+ Assert.AreEqual(string.Empty, nonMatchingForm.CurrentRow.RowAction);
+ }
+
+ [TestMethod]
+ public void GetEntityId_OptionObject2_ReturnsEntityId()
+ {
+ var optionObject = new OptionObject2 { EntityID = "E-2" };
+
+ var result = optionObject.GetEntityId();
+
+ Assert.AreEqual("E-2", result);
+ }
+
+ [TestMethod]
+ public void GetErrorCode_OptionObject2_ReturnsErrorCode()
+ {
+ var optionObject = new OptionObject2 { ErrorCode = 2.5 };
+
+ var result = optionObject.GetErrorCode();
+
+ Assert.AreEqual(2.5, result);
+ }
+
+ [TestMethod]
+ public void GetErrorMessage_OptionObject2_ReturnsErrorMessage()
+ {
+ var optionObject = new OptionObject2 { ErrorMesg = "Error 2" };
+
+ var result = optionObject.GetErrorMessage();
+
+ Assert.AreEqual("Error 2", result);
+ }
+
+ [TestMethod]
+ public void GetFormCount_OptionObject2_ReturnsFormCount()
+ {
+ var optionObject = new OptionObject2();
+ optionObject.Forms.Add(new FormObject { FormId = "1" });
+ optionObject.Forms.Add(new FormObject { FormId = "2" });
+
+ var result = optionObject.GetFormCount();
+
+ Assert.AreEqual(2, result);
+ }
+
+ [TestMethod]
+ public void HasError_OptionObject2_WithZeroErrorCode_ReturnsFalse()
+ {
+ var optionObject = new OptionObject2 { ErrorCode = 0 };
+
+ var result = optionObject.HasError();
+
+ Assert.IsFalse(result);
+ }
+
+ [TestMethod]
+ public void SetDisabledField_OptionObject2_DisablesTargetField()
+ {
+ var optionObject = new OptionObject2();
+ var form = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1" } };
+ form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "1" });
+ optionObject.Forms.Add(form);
+
+ optionObject.SetDisabledField("100");
+
+ Assert.AreEqual("0", optionObject.Forms[0].CurrentRow.Fields[0].Enabled);
+ }
+
+ [TestMethod]
+ public void SetEnabledFields_OptionObject2_WithFieldObjects_EnablesMatchingFields()
+ {
+ var optionObject = new OptionObject2();
+ var form = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1" } };
+ form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "0" });
+ optionObject.Forms.Add(form);
+
+ var fieldsToEnable = new List { new FieldObject { FieldNumber = "100" } };
+
+ optionObject.SetEnabledFields(fieldsToEnable);
+
+ Assert.AreEqual("1", optionObject.Forms[0].CurrentRow.Fields[0].Enabled);
+ }
+
+ [TestMethod]
+ public void SetDisabledFields_OptionObject2_WithFieldNumbers_DisablesMatchingFields()
+ {
+ var optionObject = new OptionObject2();
+ var form = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1" } };
+ form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "1" });
+ form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "101", Enabled = "1" });
+ optionObject.Forms.Add(form);
+
+ optionObject.SetDisabledFields(new List { "101" });
+
+ Assert.AreEqual("1", optionObject.Forms[0].CurrentRow.Fields[0].Enabled);
+ Assert.AreEqual("0", optionObject.Forms[0].CurrentRow.Fields[1].Enabled);
+ }
+
+ [TestMethod]
+ public void SetDisabledFields_OptionObject2_WithEmptyFieldObjects_ThrowsArgumentException()
+ {
+ var optionObject = new OptionObject2();
+ var form = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1" } };
+ form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "1" });
+ optionObject.Forms.Add(form);
+
+ Assert.ThrowsException(() => optionObject.SetDisabledFields(new List()));
+ }
+
+ [TestMethod]
+ public void SetEnabledField_OptionObject2_WithEmptyFieldNumber_ThrowsArgumentException()
+ {
+ var optionObject = new OptionObject2();
+ var form = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1", RowAction = "" } };
+ form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "0" });
+ optionObject.Forms.Add(form);
+
+ Assert.ThrowsException(() => optionObject.SetEnabledField(string.Empty));
+ }
+
+ [TestMethod]
+ public void SetEnabledField_OptionObject2_WithNoMatchingField_ThrowsArgumentException()
+ {
+ var optionObject = new OptionObject2();
+ var form = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1" } };
+ form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "200", Enabled = "0" });
+ optionObject.Forms.Add(form);
+
+ Assert.ThrowsException(() => optionObject.SetEnabledField("100"));
+ }
+
+ [TestMethod]
+ public void SetEnabledField_OptionObject2_WithNullOptionObject_ReturnsNull()
+ {
+ var result = OptionObject2Helpers.SetEnabledField(null!, "100");
+
+ Assert.IsNull(result);
+ }
+
+ [TestMethod]
+ public void SetEnabledFields_OptionObject2_WithEmptyFieldNumbers_ThrowsArgumentException()
+ {
+ var optionObject = new OptionObject2();
+ var form = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1" } };
+ form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "0" });
+ optionObject.Forms.Add(form);
+
+ Assert.ThrowsException(() => optionObject.SetEnabledFields(new List()));
+ }
+
+ [TestMethod]
+ public void SetEnabledFields_OptionObject2_WithNullFieldObjects_ThrowsArgumentNullException()
+ {
+ var optionObject = new OptionObject2();
+ var form = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1" } };
+ form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "0" });
+ optionObject.Forms.Add(form);
+
+ Assert.ThrowsException(() => optionObject.SetEnabledFields((List?)null));
+ }
+
+ [TestMethod]
+ public void SetDisabledField_OptionObject2_WithNullForms_ReturnsOriginalObject()
+ {
+ var optionObject = new OptionObject2 { Forms = null! };
+
+ var result = optionObject.SetDisabledField("100");
+
+ Assert.AreSame(optionObject, result);
+ }
+
+ [TestMethod]
+ public void SetUnlockedField_OptionObject2_UnlocksTargetField()
+ {
+ var optionObject = new OptionObject2();
+ var form = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1", RowAction = "" } };
+ form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Lock = "1" });
+ optionObject.Forms.Add(form);
+
+ optionObject.SetUnlockedField("100");
+
+ Assert.AreEqual("0", optionObject.Forms[0].CurrentRow.Fields[0].Lock);
+ Assert.AreEqual("EDIT", optionObject.Forms[0].CurrentRow.RowAction);
+ }
+
+ [TestMethod]
+ public void SetLockedFields_OptionObject2_WithFieldObjects_LocksMatchingFields()
+ {
+ var optionObject = new OptionObject2();
+ var form = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1" } };
+ form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Lock = "0" });
+ form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "101", Lock = "0" });
+ optionObject.Forms.Add(form);
+ var fieldsToLock = new List { new FieldObject { FieldNumber = "100" } };
+
+ optionObject.SetLockedFields(fieldsToLock);
+
+ Assert.AreEqual("1", optionObject.Forms[0].CurrentRow.Fields[0].Lock);
+ Assert.AreEqual("0", optionObject.Forms[0].CurrentRow.Fields[1].Lock);
+ }
+
+ [TestMethod]
+ public void SetUnlockedField_OptionObject2_WithNullOptionObject_ReturnsNull()
+ {
+ var result = OptionObject2Helpers.SetUnlockedField(null!, "100");
+
+ Assert.IsNull(result);
+ }
+
+ [TestMethod]
+ public void SetUnlockedFields_OptionObject2_WithEmptyFieldObjects_ThrowsArgumentException()
+ {
+ var optionObject = new OptionObject2();
+ var form = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1" } };
+ form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Lock = "1" });
+ optionObject.Forms.Add(form);
+
+ Assert.ThrowsException(() => optionObject.SetUnlockedFields(new List()));
+ }
+
+ [TestMethod]
+ public void SetLockedFields_OptionObject2_WithDuplicateFieldNumbers_LocksTargetField()
+ {
+ var optionObject = new OptionObject2();
+ var form = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1", RowAction = "" } };
+ form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Lock = "0" });
+ optionObject.Forms.Add(form);
+
+ optionObject.SetLockedFields(new List { "100", "100" });
+
+ Assert.AreEqual("1", optionObject.Forms[0].CurrentRow.Fields[0].Lock);
+ Assert.AreEqual(RowObject.RowActions.Edit, optionObject.Forms[0].CurrentRow.RowAction);
+ }
+
+ [TestMethod]
+ public void SetLockedField_OptionObject2_WithNoMatchingField_ThrowsArgumentException()
+ {
+ var optionObject = new OptionObject2();
+ var form = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1" } };
+ form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "200", Lock = "0" });
+ optionObject.Forms.Add(form);
+
+ Assert.ThrowsException(() => optionObject.SetLockedField("100"));
+ }
+ }
+}
diff --git a/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/OptionObjectHelpers.OptionObject2015.Tests.cs b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/OptionObjectHelpers.OptionObject2015.Tests.cs
new file mode 100644
index 0000000..9948e17
--- /dev/null
+++ b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/OptionObjectHelpers.OptionObject2015.Tests.cs
@@ -0,0 +1,410 @@
+namespace RarelySimple.AvatarScriptLink.Objects.Helpers.Tests
+{
+ ///
+ /// Tests for OptionObject2015 helper extension methods.
+ ///
+ [TestClass]
+ public class OptionObjectHelpersOptionObject2015Tests
+ {
+ [DataTestMethod]
+ [DataRow("Disabled")]
+ [DataRow("Enabled")]
+ [DataRow("Locked")]
+ [DataRow("Unlocked")]
+ public void SetField_OptionObject2015_WithNullFieldNumber_ThrowsArgumentNullException(string operation)
+ {
+ var optionObject = new OptionObject2015();
+ var form = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1" } };
+ form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "1", Lock = "0" });
+ optionObject.Forms.Add(form);
+
+ Action act = operation switch
+ {
+ "Disabled" => () => optionObject.SetDisabledField(null!),
+ "Enabled" => () => optionObject.SetEnabledField(null!),
+ "Locked" => () => optionObject.SetLockedField(null!),
+ "Unlocked" => () => optionObject.SetUnlockedField(null!),
+ _ => throw new ArgumentOutOfRangeException(nameof(operation))
+ };
+
+ Assert.ThrowsException(act);
+ }
+
+ [DataTestMethod]
+ [DataRow("Disabled")]
+ [DataRow("Enabled")]
+ [DataRow("Locked")]
+ [DataRow("Unlocked")]
+ public void SetField_OptionObject2015_WithEmptyFieldNumber_ThrowsArgumentException(string operation)
+ {
+ var optionObject = new OptionObject2015();
+ var form = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1" } };
+ form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "1", Lock = "0" });
+ optionObject.Forms.Add(form);
+
+ Action act = operation switch
+ {
+ "Disabled" => () => optionObject.SetDisabledField(string.Empty),
+ "Enabled" => () => optionObject.SetEnabledField(string.Empty),
+ "Locked" => () => optionObject.SetLockedField(string.Empty),
+ "Unlocked" => () => optionObject.SetUnlockedField(string.Empty),
+ _ => throw new ArgumentOutOfRangeException(nameof(operation))
+ };
+
+ Assert.ThrowsException(act);
+ }
+
+ [DataTestMethod]
+ [DataRow("Disabled")]
+ [DataRow("Enabled")]
+ [DataRow("Locked")]
+ [DataRow("Unlocked")]
+ public void SetFields_OptionObject2015_WithMixedFormMatches_OnlyAppliesToMatchingForms(string operation)
+ {
+ var optionObject = new OptionObject2015();
+ var matchingForm = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1", RowAction = string.Empty } };
+ var nonMatchingForm = new FormObject { FormId = "2", CurrentRow = new RowObject { RowId = "1", RowAction = string.Empty } };
+
+ switch (operation)
+ {
+ case "Disabled":
+ matchingForm.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "1" });
+ nonMatchingForm.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "200", Enabled = "1" });
+ optionObject.Forms.Add(matchingForm);
+ optionObject.Forms.Add(nonMatchingForm);
+
+ optionObject.SetDisabledFields(new List { "100" });
+
+ Assert.AreEqual("0", matchingForm.CurrentRow.Fields[0].Enabled);
+ Assert.AreEqual("1", nonMatchingForm.CurrentRow.Fields[0].Enabled);
+ break;
+ case "Enabled":
+ matchingForm.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "0" });
+ nonMatchingForm.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "200", Enabled = "0" });
+ optionObject.Forms.Add(matchingForm);
+ optionObject.Forms.Add(nonMatchingForm);
+
+ optionObject.SetEnabledFields(new List { "100" });
+
+ Assert.AreEqual("1", matchingForm.CurrentRow.Fields[0].Enabled);
+ Assert.AreEqual("0", nonMatchingForm.CurrentRow.Fields[0].Enabled);
+ break;
+ case "Locked":
+ matchingForm.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Lock = "0" });
+ nonMatchingForm.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "200", Lock = "0" });
+ optionObject.Forms.Add(matchingForm);
+ optionObject.Forms.Add(nonMatchingForm);
+
+ optionObject.SetLockedFields(new List { "100" });
+
+ Assert.AreEqual("1", matchingForm.CurrentRow.Fields[0].Lock);
+ Assert.AreEqual("0", nonMatchingForm.CurrentRow.Fields[0].Lock);
+ break;
+ case "Unlocked":
+ matchingForm.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Lock = "1" });
+ nonMatchingForm.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "200", Lock = "1" });
+ optionObject.Forms.Add(matchingForm);
+ optionObject.Forms.Add(nonMatchingForm);
+
+ optionObject.SetUnlockedFields(new List { "100" });
+
+ Assert.AreEqual("0", matchingForm.CurrentRow.Fields[0].Lock);
+ Assert.AreEqual("1", nonMatchingForm.CurrentRow.Fields[0].Lock);
+ break;
+ default:
+ throw new ArgumentOutOfRangeException(nameof(operation));
+ }
+
+ Assert.AreEqual(RowObject.RowActions.Edit, matchingForm.CurrentRow.RowAction);
+ Assert.AreEqual(string.Empty, nonMatchingForm.CurrentRow.RowAction);
+ }
+
+ [TestMethod]
+ public void GetEntityId_OptionObject2015_ReturnsEntityId()
+ {
+ var optionObject = new OptionObject2015 { EntityID = "E-2015" };
+
+ var result = optionObject.GetEntityId();
+
+ Assert.AreEqual("E-2015", result);
+ }
+
+ [TestMethod]
+ public void GetErrorCode_OptionObject2015_ReturnsErrorCode()
+ {
+ var optionObject = new OptionObject2015 { ErrorCode = 3.5 };
+
+ var result = optionObject.GetErrorCode();
+
+ Assert.AreEqual(3.5, result);
+ }
+
+ [TestMethod]
+ public void GetErrorMessage_OptionObject2015_ReturnsErrorMessage()
+ {
+ var optionObject = new OptionObject2015 { ErrorMesg = "Error 2015" };
+
+ var result = optionObject.GetErrorMessage();
+
+ Assert.AreEqual("Error 2015", result);
+ }
+
+ [TestMethod]
+ public void GetFormCount_OptionObject2015_ReturnsFormCount()
+ {
+ var optionObject = new OptionObject2015();
+ optionObject.Forms.Add(new FormObject { FormId = "1" });
+ optionObject.Forms.Add(new FormObject { FormId = "2" });
+
+ var result = optionObject.GetFormCount();
+
+ Assert.AreEqual(2, result);
+ }
+
+ [TestMethod]
+ public void GetSessionToken_OptionObject2015_ReturnsSessionToken()
+ {
+ var optionObject = new OptionObject2015 { SessionToken = "token-123" };
+
+ var result = optionObject.GetSessionToken();
+
+ Assert.AreEqual("token-123", result);
+ }
+
+ [TestMethod]
+ public void GetOptionUserId_OptionObject2015_ReturnsOptionUserId()
+ {
+ var optionObject = new OptionObject2015 { OptionUserId = "user-01" };
+
+ var result = optionObject.GetOptionUserId();
+
+ Assert.AreEqual("user-01", result);
+ }
+
+ [TestMethod]
+ public void HasError_OptionObject2015_WithNonZeroErrorCode_ReturnsTrue()
+ {
+ var optionObject = new OptionObject2015 { ErrorCode = 1 };
+
+ var result = optionObject.HasError();
+
+ Assert.IsTrue(result);
+ }
+
+ [TestMethod]
+ public void SetEnabledField_OptionObject2015_EnablesTargetField()
+ {
+ var optionObject = new OptionObject2015();
+ var form = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1" } };
+ form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "0" });
+ optionObject.Forms.Add(form);
+
+ optionObject.SetEnabledField("100");
+
+ Assert.AreEqual("1", optionObject.Forms[0].CurrentRow.Fields[0].Enabled);
+ }
+
+ [TestMethod]
+ public void SetDisabledFields_OptionObject2015_WithFieldObjects_DisablesMatchingFields()
+ {
+ var optionObject = new OptionObject2015();
+ var form = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1" } };
+ form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "1" });
+ optionObject.Forms.Add(form);
+
+ var fieldsToDisable = new List { new FieldObject { FieldNumber = "100" } };
+
+ optionObject.SetDisabledFields(fieldsToDisable);
+
+ Assert.AreEqual("0", optionObject.Forms[0].CurrentRow.Fields[0].Enabled);
+ }
+
+ [TestMethod]
+ public void SetEnabledFields_OptionObject2015_WithFieldNumbers_EnablesMatchingFields()
+ {
+ var optionObject = new OptionObject2015();
+ var form = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1" } };
+ form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "0" });
+ form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "101", Enabled = "0" });
+ optionObject.Forms.Add(form);
+
+ optionObject.SetEnabledFields(new List { "100" });
+
+ Assert.AreEqual("1", optionObject.Forms[0].CurrentRow.Fields[0].Enabled);
+ Assert.AreEqual("0", optionObject.Forms[0].CurrentRow.Fields[1].Enabled);
+ }
+
+ [TestMethod]
+ public void SetDisabledField_OptionObject2015_WithEmptyFieldNumber_ThrowsArgumentException()
+ {
+ var optionObject = new OptionObject2015();
+ var form = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1", RowAction = "" } };
+ form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "1" });
+ optionObject.Forms.Add(form);
+
+ Assert.ThrowsException(() => optionObject.SetDisabledField(string.Empty));
+ }
+
+ [TestMethod]
+ public void SetDisabledField_OptionObject2015_WithNoMatchingField_ThrowsArgumentException()
+ {
+ var optionObject = new OptionObject2015();
+ var form = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1" } };
+ form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "200", Enabled = "1" });
+ optionObject.Forms.Add(form);
+
+ Assert.ThrowsException(() => optionObject.SetDisabledField("100"));
+ }
+
+ [TestMethod]
+ public void SetEnabledFields_OptionObject2015_WithNullFieldObjects_ThrowsArgumentNullException()
+ {
+ var optionObject = new OptionObject2015();
+ var form = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1" } };
+ form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "0" });
+ optionObject.Forms.Add(form);
+
+ Assert.ThrowsException(() => optionObject.SetEnabledFields((List?)null));
+ }
+
+ [TestMethod]
+ public void SetDisabledFields_OptionObject2015_WithEmptyFieldObjects_ThrowsArgumentException()
+ {
+ var optionObject = new OptionObject2015();
+ var form = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1" } };
+ form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "1" });
+ optionObject.Forms.Add(form);
+
+ Assert.ThrowsException(() => optionObject.SetDisabledFields(new List()));
+ }
+
+ [TestMethod]
+ public void SetEnabledFields_OptionObject2015_WithEmptyFieldObjects_ThrowsArgumentException()
+ {
+ var optionObject = new OptionObject2015();
+ var form = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1" } };
+ form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "0" });
+ optionObject.Forms.Add(form);
+
+ Assert.ThrowsException(() => optionObject.SetEnabledFields(new List()));
+ }
+
+ [TestMethod]
+ public void SetDisabledField_OptionObject2015_WithNullForms_ReturnsOriginalObject()
+ {
+ var optionObject = new OptionObject2015 { Forms = null! };
+
+ var result = optionObject.SetDisabledField("100");
+
+ Assert.AreSame(optionObject, result);
+ }
+
+ [TestMethod]
+ public void SetEnabledFields_OptionObject2015_WithNullOptionObject_ReturnsNull()
+ {
+ var result = OptionObject2015Helpers.SetEnabledFields(null!, new List { "100" });
+
+ Assert.IsNull(result);
+ }
+
+ [TestMethod]
+ public void SetLockedField_OptionObject2015_LocksTargetField()
+ {
+ var optionObject = new OptionObject2015();
+ var form = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1", RowAction = "" } };
+ form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Lock = "0" });
+ optionObject.Forms.Add(form);
+
+ optionObject.SetLockedField("100");
+
+ Assert.AreEqual("1", optionObject.Forms[0].CurrentRow.Fields[0].Lock);
+ Assert.AreEqual("EDIT", optionObject.Forms[0].CurrentRow.RowAction);
+ }
+
+ [TestMethod]
+ public void SetUnlockedFields_OptionObject2015_WithFieldObjects_UnlocksMatchingFields()
+ {
+ var optionObject = new OptionObject2015();
+ var form = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1" } };
+ form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Lock = "1" });
+ form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "101", Lock = "1" });
+ optionObject.Forms.Add(form);
+ var fieldsToUnlock = new List { new FieldObject { FieldNumber = "100" } };
+
+ optionObject.SetUnlockedFields(fieldsToUnlock);
+
+ Assert.AreEqual("0", optionObject.Forms[0].CurrentRow.Fields[0].Lock);
+ Assert.AreEqual("1", optionObject.Forms[0].CurrentRow.Fields[1].Lock);
+ }
+
+ [TestMethod]
+ public void SetLockedField_OptionObject2015_WithEmptyFieldNumber_ThrowsArgumentException()
+ {
+ var optionObject = new OptionObject2015();
+ var form = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1", RowAction = "" } };
+ form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Lock = "0" });
+ optionObject.Forms.Add(form);
+
+ Assert.ThrowsException(() => optionObject.SetLockedField(string.Empty));
+ }
+
+ [TestMethod]
+ public void SetUnlockedFields_OptionObject2015_WithNullOptionObject_ReturnsNull()
+ {
+ var result = OptionObject2015Helpers.SetUnlockedFields(null!, new List { "100" });
+
+ Assert.IsNull(result);
+ }
+
+ [TestMethod]
+ public void SetLockedField_OptionObject2015_WithNullForms_ReturnsOriginalObject()
+ {
+ var optionObject = new OptionObject2015 { Forms = null! };
+
+ var result = optionObject.SetLockedField("100");
+
+ Assert.AreSame(optionObject, result);
+ }
+
+ [TestMethod]
+ public void SetLockedFields_OptionObject2015_WithDuplicateFieldNumbers_LocksTargetField()
+ {
+ var optionObject = new OptionObject2015();
+ var form = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1", RowAction = "" } };
+ form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Lock = "0" });
+ optionObject.Forms.Add(form);
+
+ optionObject.SetLockedFields(new List { "100", "100" });
+
+ Assert.AreEqual("1", optionObject.Forms[0].CurrentRow.Fields[0].Lock);
+ Assert.AreEqual(RowObject.RowActions.Edit, optionObject.Forms[0].CurrentRow.RowAction);
+ }
+
+ [TestMethod]
+ public void SetLockedFields_OptionObject2015_WithFieldObjects_LocksMatchingFields()
+ {
+ var optionObject = new OptionObject2015();
+ var form = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1" } };
+ form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Lock = "0" });
+ form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "101", Lock = "0" });
+ optionObject.Forms.Add(form);
+ var fieldsToLock = new List { new FieldObject { FieldNumber = "100" } };
+
+ optionObject.SetLockedFields(fieldsToLock);
+
+ Assert.AreEqual("1", form.CurrentRow.Fields[0].Lock);
+ Assert.AreEqual("0", form.CurrentRow.Fields[1].Lock);
+ }
+
+ [TestMethod]
+ public void SetUnlockedField_OptionObject2015_WithNoMatchingField_ThrowsArgumentException()
+ {
+ var optionObject = new OptionObject2015();
+ var form = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1" } };
+ form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "200", Lock = "1" });
+ optionObject.Forms.Add(form);
+
+ Assert.ThrowsException(() => optionObject.SetUnlockedField("100"));
+ }
+ }
+}
diff --git a/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/RowObjectHelpersTests.cs b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/RowObjectHelpersTests.cs
index e454721..5b4a34d 100644
--- a/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/RowObjectHelpersTests.cs
+++ b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/RowObjectHelpersTests.cs
@@ -7,8 +7,58 @@ namespace RarelySimple.AvatarScriptLink.Objects.Helpers.Tests
[TestClass]
public class RowObjectHelpersTests
{
+ [DataTestMethod]
+ [DataRow("Disabled")]
+ [DataRow("Enabled")]
+ [DataRow("Locked")]
+ [DataRow("Unlocked")]
+ public void SetField_RowObject_WithNullFieldNumber_ThrowsArgumentNullException(string operation)
+ {
+ // Arrange
+ var row = new RowObject { RowAction = string.Empty };
+ row.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "1", Lock = "0" });
+
+ // Act
+ Action act = operation switch
+ {
+ "Disabled" => () => row.SetDisabledField(null!),
+ "Enabled" => () => row.SetEnabledField(null!),
+ "Locked" => () => row.SetLockedField(null!),
+ "Unlocked" => () => row.SetUnlockedField(null!),
+ _ => throw new ArgumentOutOfRangeException(nameof(operation))
+ };
+
+ // Assert
+ Assert.ThrowsException(act);
+ }
+
+ [DataTestMethod]
+ [DataRow("Disabled")]
+ [DataRow("Enabled")]
+ [DataRow("Locked")]
+ [DataRow("Unlocked")]
+ public void SetField_RowObject_WithEmptyFieldNumber_ThrowsArgumentException(string operation)
+ {
+ // Arrange
+ var row = new RowObject { RowAction = string.Empty };
+ row.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "1", Lock = "0" });
+
+ // Act
+ Action act = operation switch
+ {
+ "Disabled" => () => row.SetDisabledField(string.Empty),
+ "Enabled" => () => row.SetEnabledField(string.Empty),
+ "Locked" => () => row.SetLockedField(string.Empty),
+ "Unlocked" => () => row.SetUnlockedField(string.Empty),
+ _ => throw new ArgumentOutOfRangeException(nameof(operation))
+ };
+
+ // Assert
+ Assert.ThrowsException(act);
+ }
+
[TestMethod]
- public void GetRowId_WithRowId_ReturnsRowId()
+ public void GetRowId_RowObject_WithRowId_ReturnsRowId()
{
// Arrange
var row = new RowObject { RowId = "123" };
@@ -21,7 +71,7 @@ public void GetRowId_WithRowId_ReturnsRowId()
}
[TestMethod]
- public void GetRowId_WithNull_ReturnsNull()
+ public void GetRowId_RowObject_WithNull_ReturnsNull()
{
// Arrange
RowObject? row = null;
@@ -34,7 +84,7 @@ public void GetRowId_WithNull_ReturnsNull()
}
[TestMethod]
- public void GetParentRowId_WithParentRowId_ReturnsParentRowId()
+ public void GetParentRowId_RowObject_WithParentRowId_ReturnsParentRowId()
{
// Arrange
var row = new RowObject { ParentRowId = "456" };
@@ -47,7 +97,7 @@ public void GetParentRowId_WithParentRowId_ReturnsParentRowId()
}
[TestMethod]
- public void GetRowAction_WithRowAction_ReturnsRowAction()
+ public void GetRowAction_RowObject_WithRowAction_ReturnsRowAction()
{
// Arrange
var row = new RowObject { RowAction = "EDIT" };
@@ -60,7 +110,7 @@ public void GetRowAction_WithRowAction_ReturnsRowAction()
}
[TestMethod]
- public void IsMarkedForDeletion_WithDeleteAction_ReturnsTrue()
+ public void IsMarkedForDeletion_RowObject_WithDeleteAction_ReturnsTrue()
{
// Arrange
var row = new RowObject { RowAction = "DELETE" };
@@ -73,7 +123,7 @@ public void IsMarkedForDeletion_WithDeleteAction_ReturnsTrue()
}
[TestMethod]
- public void IsMarkedForDeletion_WithEditAction_ReturnsFalse()
+ public void IsMarkedForDeletion_RowObject_WithEditAction_ReturnsFalse()
{
// Arrange
var row = new RowObject { RowAction = "EDIT" };
@@ -86,7 +136,7 @@ public void IsMarkedForDeletion_WithEditAction_ReturnsFalse()
}
[TestMethod]
- public void GetFieldCount_WithFields_ReturnsCount()
+ public void GetFieldCount_RowObject_WithFields_ReturnsCount()
{
// Arrange
var row = new RowObject();
@@ -101,7 +151,7 @@ public void GetFieldCount_WithFields_ReturnsCount()
}
[TestMethod]
- public void GetFieldCount_WithNull_ReturnsZero()
+ public void GetFieldCount_RowObject_WithNull_ReturnsZero()
{
// Arrange
RowObject? row = null;
@@ -114,7 +164,7 @@ public void GetFieldCount_WithNull_ReturnsZero()
}
[TestMethod]
- public void GetFieldValue_WithExistingField_ReturnsValue()
+ public void GetFieldValue_RowObject_WithExistingField_ReturnsValue()
{
// Arrange
var row = new RowObject();
@@ -128,7 +178,7 @@ public void GetFieldValue_WithExistingField_ReturnsValue()
}
[TestMethod]
- public void GetFieldValue_WithNonExistentField_ReturnsNull()
+ public void GetFieldValue_RowObject_WithNonExistentField_ReturnsNull()
{
// Arrange
var row = new RowObject();
@@ -142,7 +192,7 @@ public void GetFieldValue_WithNonExistentField_ReturnsNull()
}
[TestMethod]
- public void GetFieldValue_WithNullRow_ReturnsNull()
+ public void GetFieldValue_RowObject_WithNullRow_ReturnsNull()
{
// Arrange
RowObject? row = null;
@@ -155,7 +205,7 @@ public void GetFieldValue_WithNullRow_ReturnsNull()
}
[TestMethod]
- public void IsFieldPresent_WithField_ReturnsTrue()
+ public void IsFieldPresent_RowObject_WithField_ReturnsTrue()
{
// Arrange
var row = new RowObject();
@@ -169,7 +219,7 @@ public void IsFieldPresent_WithField_ReturnsTrue()
}
[TestMethod]
- public void IsFieldPresent_WithoutField_ReturnsFalse()
+ public void IsFieldPresent_RowObject_WithoutField_ReturnsFalse()
{
// Arrange
var row = new RowObject();
@@ -182,7 +232,7 @@ public void IsFieldPresent_WithoutField_ReturnsFalse()
}
[TestMethod]
- public void IsFieldEnabled_WithEnabledField_ReturnsTrue()
+ public void IsFieldEnabled_RowObject_WithEnabledField_ReturnsTrue()
{
// Arrange
var row = new RowObject();
@@ -196,7 +246,7 @@ public void IsFieldEnabled_WithEnabledField_ReturnsTrue()
}
[TestMethod]
- public void IsFieldEnabled_WithDisabledField_ReturnsFalse()
+ public void IsFieldEnabled_RowObject_WithDisabledField_ReturnsFalse()
{
// Arrange
var row = new RowObject();
@@ -210,7 +260,7 @@ public void IsFieldEnabled_WithDisabledField_ReturnsFalse()
}
[TestMethod]
- public void IsFieldLocked_WithLockedField_ReturnsTrue()
+ public void IsFieldLocked_RowObject_WithLockedField_ReturnsTrue()
{
// Arrange
var row = new RowObject();
@@ -224,7 +274,7 @@ public void IsFieldLocked_WithLockedField_ReturnsTrue()
}
[TestMethod]
- public void IsFieldRequired_WithRequiredField_ReturnsTrue()
+ public void IsFieldRequired_RowObject_WithRequiredField_ReturnsTrue()
{
// Arrange
var row = new RowObject();
@@ -238,7 +288,7 @@ public void IsFieldRequired_WithRequiredField_ReturnsTrue()
}
[TestMethod]
- public void SetFieldValue_WithExistingField_UpdatesValue()
+ public void SetFieldValue_RowObject_WithExistingField_UpdatesValue()
{
// Arrange
var row = new RowObject { RowAction = "" };
@@ -254,7 +304,7 @@ public void SetFieldValue_WithExistingField_UpdatesValue()
}
[TestMethod]
- public void SetFieldValue_WithNonExistentField_DoesNothing()
+ public void SetFieldValue_RowObject_WithNonExistentField_DoesNothing()
{
// Arrange
var row = new RowObject();
@@ -267,7 +317,7 @@ public void SetFieldValue_WithNonExistentField_DoesNothing()
}
[TestMethod]
- public void SetFieldValue_WithNullRow_ReturnsNull()
+ public void SetFieldValue_RowObject_WithNullRow_ReturnsNull()
{
// Arrange
RowObject? row = null;
@@ -280,7 +330,7 @@ public void SetFieldValue_WithNullRow_ReturnsNull()
}
[TestMethod]
- public void DisableAllFieldObjects_WithoutExclusions_DisablesAll()
+ public void DisableAllFieldObjects_RowObject_WithoutExclusions_DisablesAll()
{
// Arrange
var row = new RowObject();
@@ -299,7 +349,7 @@ public void DisableAllFieldObjects_WithoutExclusions_DisablesAll()
}
[TestMethod]
- public void DisableAllFieldObjects_WithNullRowAction_SetsRowActionToEdit()
+ public void DisableAllFieldObjects_RowObject_WithNullRowAction_SetsRowActionToEdit()
{
// Arrange
var row = new RowObject { RowAction = null! };
@@ -315,7 +365,7 @@ public void DisableAllFieldObjects_WithNullRowAction_SetsRowActionToEdit()
}
[TestMethod]
- public void DisableAllFieldObjects_WithExclusions_DisablesOnlyNonExcluded()
+ public void DisableAllFieldObjects_RowObject_WithExclusions_DisablesOnlyNonExcluded()
{
// Arrange
var row = new RowObject();
@@ -333,7 +383,7 @@ public void DisableAllFieldObjects_WithExclusions_DisablesOnlyNonExcluded()
}
[TestMethod]
- public void SetDisabledField_WithExistingField_DisablesTargetField()
+ public void SetDisabledField_RowObject_WithExistingField_DisablesTargetField()
{
// Arrange
var row = new RowObject { RowAction = "" };
@@ -350,7 +400,7 @@ public void SetDisabledField_WithExistingField_DisablesTargetField()
}
[TestMethod]
- public void SetDisabledField_WithNullRowAction_SetsRowActionToEdit()
+ public void SetDisabledField_RowObject_WithNullRowAction_SetsRowActionToEdit()
{
// Arrange
var row = new RowObject { RowAction = null! };
@@ -365,7 +415,7 @@ public void SetDisabledField_WithNullRowAction_SetsRowActionToEdit()
}
[TestMethod]
- public void SetDisabledFields_WithFieldNumbers_DisablesMatchingFields()
+ public void SetDisabledFields_RowObject_WithFieldNumbers_DisablesMatchingFields()
{
// Arrange
var row = new RowObject();
@@ -381,7 +431,7 @@ public void SetDisabledFields_WithFieldNumbers_DisablesMatchingFields()
}
[TestMethod]
- public void SetEnabledField_WithExistingField_EnablesTargetField()
+ public void SetEnabledField_RowObject_WithExistingField_EnablesTargetField()
{
// Arrange
var row = new RowObject { RowAction = "" };
@@ -398,7 +448,7 @@ public void SetEnabledField_WithExistingField_EnablesTargetField()
}
[TestMethod]
- public void SetEnabledField_WithNullRowAction_SetsRowActionToEdit()
+ public void SetEnabledField_RowObject_WithNullRowAction_SetsRowActionToEdit()
{
// Arrange
var row = new RowObject { RowAction = null! };
@@ -413,7 +463,7 @@ public void SetEnabledField_WithNullRowAction_SetsRowActionToEdit()
}
[TestMethod]
- public void SetDisabledField_WithAddRowAction_PreservesAdd()
+ public void SetDisabledField_RowObject_WithAddRowAction_PreservesAdd()
{
// Arrange
var row = new RowObject { RowAction = RowObject.RowActions.Add };
@@ -428,7 +478,7 @@ public void SetDisabledField_WithAddRowAction_PreservesAdd()
}
[TestMethod]
- public void SetDisabledField_WithDeleteRowAction_PreservesDelete()
+ public void SetDisabledField_RowObject_WithDeleteRowAction_PreservesDelete()
{
// Arrange
var row = new RowObject { RowAction = RowObject.RowActions.Delete };
@@ -443,7 +493,7 @@ public void SetDisabledField_WithDeleteRowAction_PreservesDelete()
}
[TestMethod]
- public void SetEnabledFields_WithFieldNumbers_EnablesMatchingFields()
+ public void SetEnabledFields_RowObject_WithFieldNumbers_EnablesMatchingFields()
{
// Arrange
var row = new RowObject();
@@ -459,7 +509,7 @@ public void SetEnabledFields_WithFieldNumbers_EnablesMatchingFields()
}
[TestMethod]
- public void SetEnabledFields_WithDeleteRowAction_PreservesDelete()
+ public void SetEnabledFields_RowObject_WithDeleteRowAction_PreservesDelete()
{
// Arrange
var row = new RowObject { RowAction = RowObject.RowActions.Delete };
@@ -474,7 +524,7 @@ public void SetEnabledFields_WithDeleteRowAction_PreservesDelete()
}
[TestMethod]
- public void SetEnabledFields_WithAddRowAction_PreservesAdd()
+ public void SetEnabledFields_RowObject_WithAddRowAction_PreservesAdd()
{
// Arrange
var row = new RowObject { RowAction = RowObject.RowActions.Add };
@@ -489,22 +539,18 @@ public void SetEnabledFields_WithAddRowAction_PreservesAdd()
}
[TestMethod]
- public void SetDisabledField_WithMissingField_DoesNotChangeRow()
+ public void SetDisabledField_RowObject_WithMissingField_ThrowsArgumentException()
{
// Arrange
var row = new RowObject { RowAction = "" };
row.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "1" });
- // Act
- row.SetDisabledField("999");
-
- // Assert
- Assert.AreEqual("1", row.Fields[0].Enabled);
- Assert.AreEqual("", row.RowAction);
+ // Act/Assert
+ Assert.ThrowsException(() => row.SetDisabledField("999"));
}
[TestMethod]
- public void SetDisabledField_WhenAlreadyDisabled_DoesNotSetRowAction()
+ public void SetDisabledField_RowObject_WhenAlreadyDisabled_DoesNotSetRowAction()
{
// Arrange
var row = new RowObject { RowAction = "" };
@@ -519,7 +565,7 @@ public void SetDisabledField_WhenAlreadyDisabled_DoesNotSetRowAction()
}
[TestMethod]
- public void SetDisabledFields_WhenAllAlreadyDisabled_DoesNotSetRowAction()
+ public void SetDisabledFields_RowObject_WhenAllAlreadyDisabled_DoesNotSetRowAction()
{
// Arrange
var row = new RowObject { RowAction = "" };
@@ -536,22 +582,18 @@ public void SetDisabledFields_WhenAllAlreadyDisabled_DoesNotSetRowAction()
}
[TestMethod]
- public void SetEnabledFields_WithEmptyFieldNumbers_DoesNotChangeRow()
+ public void SetEnabledFields_RowObject_WithEmptyFieldNumbers_ThrowsArgumentException()
{
// Arrange
var row = new RowObject { RowAction = "" };
row.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "0" });
- // Act
- row.SetEnabledFields(new List());
-
- // Assert
- Assert.AreEqual("0", row.Fields[0].Enabled);
- Assert.AreEqual("", row.RowAction);
+ // Act/Assert
+ Assert.ThrowsException(() => row.SetEnabledFields(new List()));
}
[TestMethod]
- public void SetEnabledField_WhenAlreadyEnabled_DoesNotSetRowAction()
+ public void SetEnabledField_RowObject_WhenAlreadyEnabled_DoesNotSetRowAction()
{
// Arrange
var row = new RowObject { RowAction = "" };
@@ -566,7 +608,7 @@ public void SetEnabledField_WhenAlreadyEnabled_DoesNotSetRowAction()
}
[TestMethod]
- public void SetEnabledFields_WhenAllAlreadyEnabled_DoesNotSetRowAction()
+ public void SetEnabledFields_RowObject_WhenAllAlreadyEnabled_DoesNotSetRowAction()
{
// Arrange
var row = new RowObject { RowAction = "" };
@@ -583,7 +625,7 @@ public void SetEnabledFields_WhenAllAlreadyEnabled_DoesNotSetRowAction()
}
[TestMethod]
- public void EnableAllFieldObjects_WithoutExclusions_EnablesAll()
+ public void EnableAllFieldObjects_RowObject_WithoutExclusions_EnablesAll()
{
// Arrange
var row = new RowObject();
@@ -602,7 +644,7 @@ public void EnableAllFieldObjects_WithoutExclusions_EnablesAll()
}
[TestMethod]
- public void EnableAllFieldObjects_WithExclusions_EnablesOnlyNonExcluded()
+ public void EnableAllFieldObjects_RowObject_WithExclusions_EnablesOnlyNonExcluded()
{
// Arrange
var row = new RowObject();
@@ -621,7 +663,7 @@ public void EnableAllFieldObjects_WithExclusions_EnablesOnlyNonExcluded()
}
[TestMethod]
- public void EnableAllFieldObjects_WithNoFields_DoesNotSetRowAction()
+ public void EnableAllFieldObjects_RowObject_WithNoFields_DoesNotSetRowAction()
{
// Arrange
var row = new RowObject { RowAction = "" };
@@ -634,7 +676,7 @@ public void EnableAllFieldObjects_WithNoFields_DoesNotSetRowAction()
}
[TestMethod]
- public void EnableAllFieldObjects_WithAllExcluded_DoesNotSetRowAction()
+ public void EnableAllFieldObjects_RowObject_WithAllExcluded_DoesNotSetRowAction()
{
// Arrange
var row = new RowObject { RowAction = "" };
@@ -649,7 +691,7 @@ public void EnableAllFieldObjects_WithAllExcluded_DoesNotSetRowAction()
}
[TestMethod]
- public void EnableAllFieldObjects_WhenAlreadyEnabled_DoesNotSetRowAction()
+ public void EnableAllFieldObjects_RowObject_WhenAlreadyEnabled_DoesNotSetRowAction()
{
// Arrange
var row = new RowObject { RowAction = "" };
@@ -664,7 +706,7 @@ public void EnableAllFieldObjects_WhenAlreadyEnabled_DoesNotSetRowAction()
}
[TestMethod]
- public void EnableAllFieldObjects_WithNullRowAction_AndChanges_SetsRowActionToEdit()
+ public void EnableAllFieldObjects_RowObject_WithNullRowAction_AndChanges_SetsRowActionToEdit()
{
// Arrange
var row = new RowObject { RowAction = null! };
@@ -679,7 +721,7 @@ public void EnableAllFieldObjects_WithNullRowAction_AndChanges_SetsRowActionToEd
}
[TestMethod]
- public void LockAllFieldObjects_LocksAllFields()
+ public void LockAllFieldObjects_RowObject_LocksAllFields()
{
// Arrange
var row = new RowObject();
@@ -695,7 +737,7 @@ public void LockAllFieldObjects_LocksAllFields()
}
[TestMethod]
- public void LockAllFieldObjects_WithNoFields_DoesNotSetRowAction()
+ public void LockAllFieldObjects_RowObject_WithNoFields_DoesNotSetRowAction()
{
// Arrange
var row = new RowObject { RowAction = "" };
@@ -708,7 +750,7 @@ public void LockAllFieldObjects_WithNoFields_DoesNotSetRowAction()
}
[TestMethod]
- public void LockAllFieldObjects_WithAllExcluded_DoesNotSetRowAction()
+ public void LockAllFieldObjects_RowObject_WithAllExcluded_DoesNotSetRowAction()
{
// Arrange
var row = new RowObject { RowAction = "" };
@@ -723,7 +765,7 @@ public void LockAllFieldObjects_WithAllExcluded_DoesNotSetRowAction()
}
[TestMethod]
- public void LockAllFieldObjects_WhenAlreadyLocked_DoesNotSetRowAction()
+ public void LockAllFieldObjects_RowObject_WhenAlreadyLocked_DoesNotSetRowAction()
{
// Arrange
var row = new RowObject { RowAction = "" };
@@ -738,7 +780,7 @@ public void LockAllFieldObjects_WhenAlreadyLocked_DoesNotSetRowAction()
}
[TestMethod]
- public void LockAllFieldObjects_WithNullRowAction_AndChanges_SetsRowActionToEdit()
+ public void LockAllFieldObjects_RowObject_WithNullRowAction_AndChanges_SetsRowActionToEdit()
{
// Arrange
var row = new RowObject { RowAction = null! };
@@ -753,7 +795,7 @@ public void LockAllFieldObjects_WithNullRowAction_AndChanges_SetsRowActionToEdit
}
[TestMethod]
- public void UnlockAllFieldObjects_UnlocksAllFields()
+ public void UnlockAllFieldObjects_RowObject_UnlocksAllFields()
{
// Arrange
var row = new RowObject();
@@ -769,7 +811,7 @@ public void UnlockAllFieldObjects_UnlocksAllFields()
}
[TestMethod]
- public void UnlockAllFieldObjects_WithNoFields_DoesNotSetRowAction()
+ public void UnlockAllFieldObjects_RowObject_WithNoFields_DoesNotSetRowAction()
{
// Arrange
var row = new RowObject { RowAction = "" };
@@ -782,7 +824,7 @@ public void UnlockAllFieldObjects_WithNoFields_DoesNotSetRowAction()
}
[TestMethod]
- public void UnlockAllFieldObjects_WithAllExcluded_DoesNotSetRowAction()
+ public void UnlockAllFieldObjects_RowObject_WithAllExcluded_DoesNotSetRowAction()
{
// Arrange
var row = new RowObject { RowAction = "" };
@@ -797,7 +839,7 @@ public void UnlockAllFieldObjects_WithAllExcluded_DoesNotSetRowAction()
}
[TestMethod]
- public void UnlockAllFieldObjects_WhenAlreadyUnlocked_DoesNotSetRowAction()
+ public void UnlockAllFieldObjects_RowObject_WhenAlreadyUnlocked_DoesNotSetRowAction()
{
// Arrange
var row = new RowObject { RowAction = "" };
@@ -812,7 +854,7 @@ public void UnlockAllFieldObjects_WhenAlreadyUnlocked_DoesNotSetRowAction()
}
[TestMethod]
- public void UnlockAllFieldObjects_WithNullRowAction_AndChanges_SetsRowActionToEdit()
+ public void UnlockAllFieldObjects_RowObject_WithNullRowAction_AndChanges_SetsRowActionToEdit()
{
// Arrange
var row = new RowObject { RowAction = null! };
@@ -825,6 +867,184 @@ public void UnlockAllFieldObjects_WithNullRowAction_AndChanges_SetsRowActionToEd
Assert.AreEqual("0", row.Fields[0].Lock);
Assert.AreEqual(RowObject.RowActions.Edit, row.RowAction);
}
+
+ [TestMethod]
+ public void SetLockedField_RowObject_WithExistingField_LocksTargetField()
+ {
+ // Arrange
+ var row = new RowObject { RowAction = "" };
+ row.Fields.Add(new FieldObject { FieldNumber = "100", Lock = "0" });
+ row.Fields.Add(new FieldObject { FieldNumber = "101", Lock = "0" });
+
+ // Act
+ row.SetLockedField("101");
+
+ // Assert
+ Assert.AreEqual("0", row.Fields[0].Lock);
+ Assert.AreEqual("1", row.Fields[1].Lock);
+ Assert.AreEqual("EDIT", row.RowAction);
+ }
+
+ [TestMethod]
+ public void SetLockedField_RowObject_WhenAlreadyLocked_DoesNotSetRowAction()
+ {
+ // Arrange
+ var row = new RowObject { RowAction = "" };
+ row.Fields.Add(new FieldObject { FieldNumber = "100", Lock = "1" });
+
+ // Act
+ row.SetLockedField("100");
+
+ // Assert
+ Assert.AreEqual("1", row.Fields[0].Lock);
+ Assert.AreEqual("", row.RowAction);
+ }
+
+ [TestMethod]
+ public void SetLockedFields_RowObject_WithFieldNumbers_LocksMatchingFields()
+ {
+ // Arrange
+ var row = new RowObject();
+ row.Fields.Add(new FieldObject { FieldNumber = "100", Lock = "0" });
+ row.Fields.Add(new FieldObject { FieldNumber = "101", Lock = "0" });
+
+ // Act
+ row.SetLockedFields(["100"]);
+
+ // Assert
+ Assert.AreEqual("1", row.Fields[0].Lock);
+ Assert.AreEqual("0", row.Fields[1].Lock);
+ }
+
+ [TestMethod]
+ public void SetUnlockedField_RowObject_WithExistingField_UnlocksTargetField()
+ {
+ // Arrange
+ var row = new RowObject { RowAction = "" };
+ row.Fields.Add(new FieldObject { FieldNumber = "100", Lock = "1" });
+ row.Fields.Add(new FieldObject { FieldNumber = "101", Lock = "1" });
+
+ // Act
+ row.SetUnlockedField("100");
+
+ // Assert
+ Assert.AreEqual("0", row.Fields[0].Lock);
+ Assert.AreEqual("1", row.Fields[1].Lock);
+ Assert.AreEqual("EDIT", row.RowAction);
+ }
+
+ [TestMethod]
+ public void SetUnlockedField_RowObject_WhenAlreadyUnlocked_DoesNotSetRowAction()
+ {
+ // Arrange
+ var row = new RowObject { RowAction = "" };
+ row.Fields.Add(new FieldObject { FieldNumber = "100", Lock = "0" });
+
+ // Act
+ row.SetUnlockedField("100");
+
+ // Assert
+ Assert.AreEqual("0", row.Fields[0].Lock);
+ Assert.AreEqual("", row.RowAction);
+ }
+
+ [TestMethod]
+ public void SetUnlockedFields_RowObject_WithFieldNumbers_UnlocksMatchingFields()
+ {
+ // Arrange
+ var row = new RowObject();
+ row.Fields.Add(new FieldObject { FieldNumber = "100", Lock = "1" });
+ row.Fields.Add(new FieldObject { FieldNumber = "101", Lock = "1" });
+
+ // Act
+ row.SetUnlockedFields(["101"]);
+
+ // Assert
+ Assert.AreEqual("1", row.Fields[0].Lock);
+ Assert.AreEqual("0", row.Fields[1].Lock);
+ }
+
+ [TestMethod]
+ public void SetLockedField_RowObject_WithAddRowAction_PreservesAdd()
+ {
+ // Arrange
+ var row = new RowObject { RowAction = RowObject.RowActions.Add };
+ row.Fields.Add(new FieldObject { FieldNumber = "100", Lock = "0" });
+
+ // Act
+ row.SetLockedField("100");
+
+ // Assert
+ Assert.AreEqual("1", row.Fields[0].Lock);
+ Assert.AreEqual(RowObject.RowActions.Add, row.RowAction);
+ }
+
+ [TestMethod]
+ public void SetUnlockedField_RowObject_WithDeleteRowAction_PreservesDelete()
+ {
+ // Arrange
+ var row = new RowObject { RowAction = RowObject.RowActions.Delete };
+ row.Fields.Add(new FieldObject { FieldNumber = "100", Lock = "1" });
+
+ // Act
+ row.SetUnlockedField("100");
+
+ // Assert
+ Assert.AreEqual("0", row.Fields[0].Lock);
+ Assert.AreEqual(RowObject.RowActions.Delete, row.RowAction);
+ }
+
+ [TestMethod]
+ public void SetLockedField_RowObject_WithMissingField_ThrowsArgumentException()
+ {
+ // Arrange
+ var row = new RowObject { RowAction = "" };
+ row.Fields.Add(new FieldObject { FieldNumber = "100", Lock = "0" });
+
+ // Act / Assert
+ Assert.ThrowsException(() => row.SetLockedField("999"));
+ }
+
+ [TestMethod]
+ public void SetUnlockedFields_RowObject_WithEmptyFieldNumbers_ThrowsArgumentException()
+ {
+ // Arrange
+ var row = new RowObject { RowAction = "" };
+ row.Fields.Add(new FieldObject { FieldNumber = "100", Lock = "1" });
+
+ // Act / Assert
+ Assert.ThrowsException(() => row.SetUnlockedFields(new List()));
+ }
+
+ [TestMethod]
+ public void SetLockedFields_RowObject_WithDuplicateFieldNumbers_LocksFieldAndSetsRowActionOnce()
+ {
+ // Arrange
+ var row = new RowObject { RowAction = "" };
+ row.Fields.Add(new FieldObject { FieldNumber = "100", Lock = "0" });
+
+ // Act
+ row.SetLockedFields(["100", "100"]);
+
+ // Assert
+ Assert.AreEqual("1", row.Fields[0].Lock);
+ Assert.AreEqual(RowObject.RowActions.Edit, row.RowAction);
+ }
+
+ [TestMethod]
+ public void SetUnlockedFields_RowObject_WithDuplicateFieldNumbers_UnlocksFieldAndSetsRowActionOnce()
+ {
+ // Arrange
+ var row = new RowObject { RowAction = "" };
+ row.Fields.Add(new FieldObject { FieldNumber = "100", Lock = "1" });
+
+ // Act
+ row.SetUnlockedFields(["100", "100"]);
+
+ // Assert
+ Assert.AreEqual("0", row.Fields[0].Lock);
+ Assert.AreEqual(RowObject.RowActions.Edit, row.RowAction);
+ }
}
}
diff --git a/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/FormObjectHelpers.cs b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/FormObjectHelpers.cs
index b75d8ca..659c456 100644
--- a/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/FormObjectHelpers.cs
+++ b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/FormObjectHelpers.cs
@@ -1,5 +1,7 @@
+using System;
using System.Collections.Generic;
using System.Linq;
+using RarelySimple.AvatarScriptLink.Objects.Helpers.Validators;
namespace RarelySimple.AvatarScriptLink.Objects.Helpers
{
@@ -316,9 +318,17 @@ public static bool IsRowPresent(this FormObject formObject, string rowId)
/// The modified FormObject.
public static FormObject? SetDisabledField(this FormObject formObject, string fieldNumber)
{
- if (formObject == null || formObject.CurrentRow == null || string.IsNullOrEmpty(fieldNumber))
+ ArgumentGuards.ValidateFieldNumber(fieldNumber, nameof(fieldNumber));
+
+ if (formObject == null || formObject.CurrentRow == null)
return formObject;
+ var hasFieldInForm = formObject.CurrentRow.IsFieldPresent(fieldNumber)
+ || (formObject.MultipleIteration && formObject.HasOtherRows() && formObject.OtherRows.Any(r => r.IsFieldPresent(fieldNumber)));
+
+ if (!hasFieldInForm)
+ throw new ArgumentException(ArgumentGuards.NoMatchingFieldObjectsMessage, nameof(fieldNumber));
+
formObject.CurrentRow.SetDisabledField(fieldNumber);
if (formObject.MultipleIteration && formObject.HasOtherRows())
@@ -340,16 +350,24 @@ public static bool IsRowPresent(this FormObject formObject, string rowId)
/// The modified FormObject.
public static FormObject? SetDisabledFields(this FormObject formObject, List? fieldNumbers)
{
- if (formObject == null || formObject.CurrentRow == null || fieldNumbers == null || fieldNumbers.Count == 0)
+ var fieldsToSet = ArgumentGuards.ValidateAndNormalizeFieldNumbers(fieldNumbers, nameof(fieldNumbers));
+
+ if (formObject == null || formObject.CurrentRow == null)
return formObject;
- formObject.CurrentRow.SetDisabledFields(fieldNumbers);
+ var hasAnyField = fieldsToSet.Any(f => formObject.CurrentRow.IsFieldPresent(f))
+ || (formObject.MultipleIteration && formObject.HasOtherRows() && fieldsToSet.Any(f => formObject.OtherRows.Any(r => r.IsFieldPresent(f))));
+
+ if (!hasAnyField)
+ throw new ArgumentException(ArgumentGuards.NoMatchingFieldObjectsMessage, nameof(fieldNumbers));
+
+ formObject.CurrentRow.SetDisabledFields(fieldsToSet);
if (formObject.MultipleIteration && formObject.HasOtherRows())
{
foreach (var row in formObject.OtherRows)
{
- row.SetDisabledFields(fieldNumbers);
+ row.SetDisabledFields(fieldsToSet);
}
}
@@ -364,9 +382,17 @@ public static bool IsRowPresent(this FormObject formObject, string rowId)
/// The modified FormObject.
public static FormObject? SetEnabledField(this FormObject formObject, string fieldNumber)
{
- if (formObject == null || formObject.CurrentRow == null || string.IsNullOrEmpty(fieldNumber))
+ ArgumentGuards.ValidateFieldNumber(fieldNumber, nameof(fieldNumber));
+
+ if (formObject == null || formObject.CurrentRow == null)
return formObject;
+ var hasFieldInForm = formObject.CurrentRow.IsFieldPresent(fieldNumber)
+ || (formObject.MultipleIteration && formObject.HasOtherRows() && formObject.OtherRows.Any(r => r.IsFieldPresent(fieldNumber)));
+
+ if (!hasFieldInForm)
+ throw new ArgumentException(ArgumentGuards.NoMatchingFieldObjectsMessage, nameof(fieldNumber));
+
formObject.CurrentRow.SetEnabledField(fieldNumber);
if (formObject.MultipleIteration && formObject.HasOtherRows())
@@ -388,16 +414,152 @@ public static bool IsRowPresent(this FormObject formObject, string rowId)
/// The modified FormObject.
public static FormObject? SetEnabledFields(this FormObject formObject, List? fieldNumbers)
{
- if (formObject == null || formObject.CurrentRow == null || fieldNumbers == null || fieldNumbers.Count == 0)
+ var fieldsToSet = ArgumentGuards.ValidateAndNormalizeFieldNumbers(fieldNumbers, nameof(fieldNumbers));
+
+ if (formObject == null || formObject.CurrentRow == null)
+ return formObject;
+
+ var hasAnyField = fieldsToSet.Any(f => formObject.CurrentRow.IsFieldPresent(f))
+ || (formObject.MultipleIteration && formObject.HasOtherRows() && fieldsToSet.Any(f => formObject.OtherRows.Any(r => r.IsFieldPresent(f))));
+
+ if (!hasAnyField)
+ throw new ArgumentException(ArgumentGuards.NoMatchingFieldObjectsMessage, nameof(fieldNumbers));
+
+ formObject.CurrentRow.SetEnabledFields(fieldsToSet);
+
+ if (formObject.MultipleIteration && formObject.HasOtherRows())
+ {
+ foreach (var row in formObject.OtherRows)
+ {
+ row.SetEnabledFields(fieldsToSet);
+ }
+ }
+
+ return formObject;
+ }
+
+ ///
+ /// Locks a in a by field number.
+ ///
+ /// The FormObject to modify.
+ /// The field number to lock.
+ /// The modified FormObject.
+ public static FormObject? SetLockedField(this FormObject formObject, string fieldNumber)
+ {
+ ArgumentGuards.ValidateFieldNumber(fieldNumber, nameof(fieldNumber));
+
+ if (formObject == null || formObject.CurrentRow == null)
+ return formObject;
+
+ var hasFieldInForm = formObject.CurrentRow.IsFieldPresent(fieldNumber)
+ || (formObject.MultipleIteration && formObject.HasOtherRows() && formObject.OtherRows.Any(r => r.IsFieldPresent(fieldNumber)));
+
+ if (!hasFieldInForm)
+ throw new ArgumentException(ArgumentGuards.NoMatchingFieldObjectsMessage, nameof(fieldNumber));
+
+ formObject.CurrentRow.SetLockedField(fieldNumber);
+
+ if (formObject.MultipleIteration && formObject.HasOtherRows())
+ {
+ foreach (var row in formObject.OtherRows)
+ {
+ row.SetLockedField(fieldNumber);
+ }
+ }
+
+ return formObject;
+ }
+
+ ///
+ /// Locks instances in a by field numbers.
+ ///
+ /// The FormObject to modify.
+ /// The field numbers to lock.
+ /// The modified FormObject.
+ public static FormObject? SetLockedFields(this FormObject formObject, List? fieldNumbers)
+ {
+ var fieldsToSet = ArgumentGuards.ValidateAndNormalizeFieldNumbers(fieldNumbers, nameof(fieldNumbers));
+
+ if (formObject == null || formObject.CurrentRow == null)
return formObject;
- formObject.CurrentRow.SetEnabledFields(fieldNumbers);
+ var hasAnyField = fieldsToSet.Any(f => formObject.CurrentRow.IsFieldPresent(f))
+ || (formObject.MultipleIteration && formObject.HasOtherRows() && fieldsToSet.Any(f => formObject.OtherRows.Any(r => r.IsFieldPresent(f))));
+
+ if (!hasAnyField)
+ throw new ArgumentException(ArgumentGuards.NoMatchingFieldObjectsMessage, nameof(fieldNumbers));
+
+ formObject.CurrentRow.SetLockedFields(fieldsToSet);
+
+ if (formObject.MultipleIteration && formObject.HasOtherRows())
+ {
+ foreach (var row in formObject.OtherRows)
+ {
+ row.SetLockedFields(fieldsToSet);
+ }
+ }
+
+ return formObject;
+ }
+
+ ///
+ /// Unlocks a in a by field number.
+ ///
+ /// The FormObject to modify.
+ /// The field number to unlock.
+ /// The modified FormObject.
+ public static FormObject? SetUnlockedField(this FormObject formObject, string fieldNumber)
+ {
+ ArgumentGuards.ValidateFieldNumber(fieldNumber, nameof(fieldNumber));
+
+ if (formObject == null || formObject.CurrentRow == null)
+ return formObject;
+
+ var hasFieldInForm = formObject.CurrentRow.IsFieldPresent(fieldNumber)
+ || (formObject.MultipleIteration && formObject.HasOtherRows() && formObject.OtherRows.Any(r => r.IsFieldPresent(fieldNumber)));
+
+ if (!hasFieldInForm)
+ throw new ArgumentException(ArgumentGuards.NoMatchingFieldObjectsMessage, nameof(fieldNumber));
+
+ formObject.CurrentRow.SetUnlockedField(fieldNumber);
+
+ if (formObject.MultipleIteration && formObject.HasOtherRows())
+ {
+ foreach (var row in formObject.OtherRows)
+ {
+ row.SetUnlockedField(fieldNumber);
+ }
+ }
+
+ return formObject;
+ }
+
+ ///
+ /// Unlocks instances in a by field numbers.
+ ///
+ /// The FormObject to modify.
+ /// The field numbers to unlock.
+ /// The modified FormObject.
+ public static FormObject? SetUnlockedFields(this FormObject formObject, List? fieldNumbers)
+ {
+ var fieldsToSet = ArgumentGuards.ValidateAndNormalizeFieldNumbers(fieldNumbers, nameof(fieldNumbers));
+
+ if (formObject == null || formObject.CurrentRow == null)
+ return formObject;
+
+ var hasAnyField = fieldsToSet.Any(f => formObject.CurrentRow.IsFieldPresent(f))
+ || (formObject.MultipleIteration && formObject.HasOtherRows() && fieldsToSet.Any(f => formObject.OtherRows.Any(r => r.IsFieldPresent(f))));
+
+ if (!hasAnyField)
+ throw new ArgumentException(ArgumentGuards.NoMatchingFieldObjectsMessage, nameof(fieldNumbers));
+
+ formObject.CurrentRow.SetUnlockedFields(fieldsToSet);
if (formObject.MultipleIteration && formObject.HasOtherRows())
{
foreach (var row in formObject.OtherRows)
{
- row.SetEnabledFields(fieldNumbers);
+ row.SetUnlockedFields(fieldsToSet);
}
}
diff --git a/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/OptionObject2015Helpers.cs b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/OptionObject2015Helpers.cs
index 350853f..e75da4d 100644
--- a/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/OptionObject2015Helpers.cs
+++ b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/OptionObject2015Helpers.cs
@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
+using RarelySimple.AvatarScriptLink.Objects.Helpers.Validators;
namespace RarelySimple.AvatarScriptLink.Objects.Helpers
{
@@ -87,9 +88,14 @@ public static bool HasError(this OptionObject2015 optionObject)
/// The modified OptionObject2015.
public static OptionObject2015? SetDisabledField(this OptionObject2015 optionObject, string fieldNumber)
{
- if (optionObject == null || optionObject.Forms == null || string.IsNullOrEmpty(fieldNumber))
+ ArgumentGuards.ValidateFieldNumber(fieldNumber, nameof(fieldNumber));
+
+ if (optionObject == null || optionObject.Forms == null)
return optionObject;
+ if (!optionObject.Forms.Any(f => f.IsFieldPresent(fieldNumber)))
+ throw new ArgumentException(ArgumentGuards.NoMatchingFieldObjectsMessage, nameof(fieldNumber));
+
foreach (var form in optionObject.Forms)
{
form.SetDisabledField(fieldNumber);
@@ -106,13 +112,7 @@ public static bool HasError(this OptionObject2015 optionObject)
/// The modified OptionObject2015.
public static OptionObject2015? SetDisabledFields(this OptionObject2015 optionObject, List? fieldObjects)
{
- if (fieldObjects == null || fieldObjects.Count == 0)
- return optionObject;
-
- var fieldNumbers = fieldObjects
- .Where(f => !string.IsNullOrEmpty(f?.FieldNumber))
- .Select(f => f.FieldNumber)
- .ToList();
+ var fieldNumbers = ArgumentGuards.ValidateAndGetFieldNumbers(fieldObjects, nameof(fieldObjects));
return optionObject.SetDisabledFields(fieldNumbers);
}
@@ -125,12 +125,25 @@ public static bool HasError(this OptionObject2015 optionObject)
/// The modified OptionObject2015.
public static OptionObject2015? SetDisabledFields(this OptionObject2015 optionObject, List? fieldNumbers)
{
- if (optionObject == null || optionObject.Forms == null || fieldNumbers == null || fieldNumbers.Count == 0)
+ var fieldsToSet = ArgumentGuards.ValidateAndNormalizeFieldNumbers(fieldNumbers, nameof(fieldNumbers));
+
+ if (optionObject == null || optionObject.Forms == null)
return optionObject;
+ fieldsToSet = fieldsToSet
+ .Where(f => optionObject.Forms.Any(form => form.IsFieldPresent(f)))
+ .ToList();
+
+ if (fieldsToSet.Count == 0)
+ throw new ArgumentException(ArgumentGuards.NoMatchingFieldObjectsMessage, nameof(fieldNumbers));
+
foreach (var form in optionObject.Forms)
{
- form.SetDisabledFields(fieldNumbers);
+ var formFieldNumbers = fieldsToSet.Where(form.IsFieldPresent).ToList();
+ if (formFieldNumbers.Count == 0)
+ continue;
+
+ form.SetDisabledFields(formFieldNumbers);
}
return optionObject;
@@ -144,9 +157,14 @@ public static bool HasError(this OptionObject2015 optionObject)
/// The modified OptionObject2015.
public static OptionObject2015? SetEnabledField(this OptionObject2015 optionObject, string fieldNumber)
{
- if (optionObject == null || optionObject.Forms == null || string.IsNullOrEmpty(fieldNumber))
+ ArgumentGuards.ValidateFieldNumber(fieldNumber, nameof(fieldNumber));
+
+ if (optionObject == null || optionObject.Forms == null)
return optionObject;
+ if (!optionObject.Forms.Any(f => f.IsFieldPresent(fieldNumber)))
+ throw new ArgumentException(ArgumentGuards.NoMatchingFieldObjectsMessage, nameof(fieldNumber));
+
foreach (var form in optionObject.Forms)
{
form.SetEnabledField(fieldNumber);
@@ -163,13 +181,7 @@ public static bool HasError(this OptionObject2015 optionObject)
/// The modified OptionObject2015.
public static OptionObject2015? SetEnabledFields(this OptionObject2015 optionObject, List? fieldObjects)
{
- if (fieldObjects == null || fieldObjects.Count == 0)
- return optionObject;
-
- var fieldNumbers = fieldObjects
- .Where(f => !string.IsNullOrEmpty(f?.FieldNumber))
- .Select(f => f.FieldNumber)
- .ToList();
+ var fieldNumbers = ArgumentGuards.ValidateAndGetFieldNumbers(fieldObjects, nameof(fieldObjects));
return optionObject.SetEnabledFields(fieldNumbers);
}
@@ -182,12 +194,163 @@ public static bool HasError(this OptionObject2015 optionObject)
/// The modified OptionObject2015.
public static OptionObject2015? SetEnabledFields(this OptionObject2015 optionObject, List? fieldNumbers)
{
- if (optionObject == null || optionObject.Forms == null || fieldNumbers == null || fieldNumbers.Count == 0)
+ var fieldsToSet = ArgumentGuards.ValidateAndNormalizeFieldNumbers(fieldNumbers, nameof(fieldNumbers));
+
+ if (optionObject == null || optionObject.Forms == null)
+ return optionObject;
+
+ fieldsToSet = fieldsToSet
+ .Where(f => optionObject.Forms.Any(form => form.IsFieldPresent(f)))
+ .ToList();
+
+ if (fieldsToSet.Count == 0)
+ throw new ArgumentException(ArgumentGuards.NoMatchingFieldObjectsMessage, nameof(fieldNumbers));
+
+ foreach (var form in optionObject.Forms)
+ {
+ var formFieldNumbers = fieldsToSet.Where(form.IsFieldPresent).ToList();
+ if (formFieldNumbers.Count == 0)
+ continue;
+
+ form.SetEnabledFields(formFieldNumbers);
+ }
+
+ return optionObject;
+ }
+
+ ///
+ /// Locks a in an by field number.
+ ///
+ /// The OptionObject2015 to modify.
+ /// The field number to lock.
+ /// The modified OptionObject2015.
+ public static OptionObject2015? SetLockedField(this OptionObject2015 optionObject, string fieldNumber)
+ {
+ ArgumentGuards.ValidateFieldNumber(fieldNumber, nameof(fieldNumber));
+
+ if (optionObject == null || optionObject.Forms == null)
+ return optionObject;
+
+ if (!optionObject.Forms.Any(f => f.IsFieldPresent(fieldNumber)))
+ throw new ArgumentException(ArgumentGuards.NoMatchingFieldObjectsMessage, nameof(fieldNumber));
+
+ foreach (var form in optionObject.Forms)
+ {
+ form.SetLockedField(fieldNumber);
+ }
+
+ return optionObject;
+ }
+
+ ///
+ /// Locks instances in an .
+ ///
+ /// The OptionObject2015 to modify.
+ /// The field objects to lock.
+ /// The modified OptionObject2015.
+ public static OptionObject2015? SetLockedFields(this OptionObject2015 optionObject, List? fieldObjects)
+ {
+ var fieldNumbers = ArgumentGuards.ValidateAndGetFieldNumbers(fieldObjects, nameof(fieldObjects));
+
+ return optionObject.SetLockedFields(fieldNumbers);
+ }
+
+ ///
+ /// Locks instances in an by field numbers.
+ ///
+ /// The OptionObject2015 to modify.
+ /// The field numbers to lock.
+ /// The modified OptionObject2015.
+ public static OptionObject2015? SetLockedFields(this OptionObject2015 optionObject, List? fieldNumbers)
+ {
+ var fieldsToSet = ArgumentGuards.ValidateAndNormalizeFieldNumbers(fieldNumbers, nameof(fieldNumbers));
+
+ if (optionObject == null || optionObject.Forms == null)
return optionObject;
+ fieldsToSet = fieldsToSet
+ .Where(f => optionObject.Forms.Any(form => form.IsFieldPresent(f)))
+ .ToList();
+
+ if (fieldsToSet.Count == 0)
+ throw new ArgumentException(ArgumentGuards.NoMatchingFieldObjectsMessage, nameof(fieldNumbers));
+
foreach (var form in optionObject.Forms)
{
- form.SetEnabledFields(fieldNumbers);
+ var formFieldNumbers = fieldsToSet.Where(form.IsFieldPresent).ToList();
+ if (formFieldNumbers.Count == 0)
+ continue;
+
+ form.SetLockedFields(formFieldNumbers);
+ }
+
+ return optionObject;
+ }
+
+ ///
+ /// Unlocks a in an by field number.
+ ///
+ /// The OptionObject2015 to modify.
+ /// The field number to unlock.
+ /// The modified OptionObject2015.
+ public static OptionObject2015? SetUnlockedField(this OptionObject2015 optionObject, string fieldNumber)
+ {
+ ArgumentGuards.ValidateFieldNumber(fieldNumber, nameof(fieldNumber));
+
+ if (optionObject == null || optionObject.Forms == null)
+ return optionObject;
+
+ if (!optionObject.Forms.Any(f => f.IsFieldPresent(fieldNumber)))
+ throw new ArgumentException(ArgumentGuards.NoMatchingFieldObjectsMessage, nameof(fieldNumber));
+
+ foreach (var form in optionObject.Forms)
+ {
+ form.SetUnlockedField(fieldNumber);
+ }
+
+ return optionObject;
+ }
+
+ ///
+ /// Unlocks instances in an .
+ ///
+ /// The OptionObject2015 to modify.
+ /// The field objects to unlock.
+ /// The modified OptionObject2015.
+ public static OptionObject2015? SetUnlockedFields(this OptionObject2015 optionObject, List? fieldObjects)
+ {
+ var fieldNumbers = ArgumentGuards.ValidateAndGetFieldNumbers(fieldObjects, nameof(fieldObjects));
+
+ return optionObject.SetUnlockedFields(fieldNumbers);
+ }
+
+ ///
+ /// Unlocks instances in an by field numbers.
+ ///
+ /// The OptionObject2015 to modify.
+ /// The field numbers to unlock.
+ /// The modified OptionObject2015.
+ public static OptionObject2015? SetUnlockedFields(this OptionObject2015 optionObject, List? fieldNumbers)
+ {
+ var fieldsToSet = ArgumentGuards.ValidateAndNormalizeFieldNumbers(fieldNumbers, nameof(fieldNumbers));
+
+ if (optionObject == null || optionObject.Forms == null)
+ return optionObject;
+
+ fieldsToSet = fieldsToSet
+ .Where(f => optionObject.Forms.Any(form => form.IsFieldPresent(f)))
+ .ToList();
+
+ if (fieldsToSet.Count == 0)
+ throw new ArgumentException(ArgumentGuards.NoMatchingFieldObjectsMessage, nameof(fieldNumbers));
+
+ foreach (var form in optionObject.Forms)
+ {
+ var formFieldNumbers = fieldsToSet.Where(form.IsFieldPresent).ToList();
+ if (formFieldNumbers.Count == 0)
+ continue;
+
+ form.SetUnlockedFields(formFieldNumbers);
}
return optionObject;
diff --git a/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/OptionObject2Helpers.cs b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/OptionObject2Helpers.cs
index fd0d4d7..cf0eb62 100644
--- a/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/OptionObject2Helpers.cs
+++ b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/OptionObject2Helpers.cs
@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
+using RarelySimple.AvatarScriptLink.Objects.Helpers.Validators;
namespace RarelySimple.AvatarScriptLink.Objects.Helpers
{
@@ -67,9 +68,14 @@ public static bool HasError(this OptionObject2 optionObject)
/// The modified OptionObject2.
public static OptionObject2? SetDisabledField(this OptionObject2 optionObject, string fieldNumber)
{
- if (optionObject == null || optionObject.Forms == null || string.IsNullOrEmpty(fieldNumber))
+ ArgumentGuards.ValidateFieldNumber(fieldNumber, nameof(fieldNumber));
+
+ if (optionObject == null || optionObject.Forms == null)
return optionObject;
+ if (!optionObject.Forms.Any(f => f.IsFieldPresent(fieldNumber)))
+ throw new ArgumentException(ArgumentGuards.NoMatchingFieldObjectsMessage, nameof(fieldNumber));
+
foreach (var form in optionObject.Forms)
{
form.SetDisabledField(fieldNumber);
@@ -86,13 +92,7 @@ public static bool HasError(this OptionObject2 optionObject)
/// The modified OptionObject2.
public static OptionObject2? SetDisabledFields(this OptionObject2 optionObject, List? fieldObjects)
{
- if (fieldObjects == null || fieldObjects.Count == 0)
- return optionObject;
-
- var fieldNumbers = fieldObjects
- .Where(f => !string.IsNullOrEmpty(f?.FieldNumber))
- .Select(f => f.FieldNumber)
- .ToList();
+ var fieldNumbers = ArgumentGuards.ValidateAndGetFieldNumbers(fieldObjects, nameof(fieldObjects));
return optionObject.SetDisabledFields(fieldNumbers);
}
@@ -105,12 +105,25 @@ public static bool HasError(this OptionObject2 optionObject)
/// The modified OptionObject2.
public static OptionObject2? SetDisabledFields(this OptionObject2 optionObject, List? fieldNumbers)
{
- if (optionObject == null || optionObject.Forms == null || fieldNumbers == null || fieldNumbers.Count == 0)
+ var fieldsToSet = ArgumentGuards.ValidateAndNormalizeFieldNumbers(fieldNumbers, nameof(fieldNumbers));
+
+ if (optionObject == null || optionObject.Forms == null)
return optionObject;
+ fieldsToSet = fieldsToSet
+ .Where(f => optionObject.Forms.Any(form => form.IsFieldPresent(f)))
+ .ToList();
+
+ if (fieldsToSet.Count == 0)
+ throw new ArgumentException(ArgumentGuards.NoMatchingFieldObjectsMessage, nameof(fieldNumbers));
+
foreach (var form in optionObject.Forms)
{
- form.SetDisabledFields(fieldNumbers);
+ var formFieldNumbers = fieldsToSet.Where(form.IsFieldPresent).ToList();
+ if (formFieldNumbers.Count == 0)
+ continue;
+
+ form.SetDisabledFields(formFieldNumbers);
}
return optionObject;
@@ -124,9 +137,14 @@ public static bool HasError(this OptionObject2 optionObject)
/// The modified OptionObject2.
public static OptionObject2? SetEnabledField(this OptionObject2 optionObject, string fieldNumber)
{
- if (optionObject == null || optionObject.Forms == null || string.IsNullOrEmpty(fieldNumber))
+ ArgumentGuards.ValidateFieldNumber(fieldNumber, nameof(fieldNumber));
+
+ if (optionObject == null || optionObject.Forms == null)
return optionObject;
+ if (!optionObject.Forms.Any(f => f.IsFieldPresent(fieldNumber)))
+ throw new ArgumentException(ArgumentGuards.NoMatchingFieldObjectsMessage, nameof(fieldNumber));
+
foreach (var form in optionObject.Forms)
{
form.SetEnabledField(fieldNumber);
@@ -143,13 +161,7 @@ public static bool HasError(this OptionObject2 optionObject)
/// The modified OptionObject2.
public static OptionObject2? SetEnabledFields(this OptionObject2 optionObject, List? fieldObjects)
{
- if (fieldObjects == null || fieldObjects.Count == 0)
- return optionObject;
-
- var fieldNumbers = fieldObjects
- .Where(f => !string.IsNullOrEmpty(f?.FieldNumber))
- .Select(f => f.FieldNumber)
- .ToList();
+ var fieldNumbers = ArgumentGuards.ValidateAndGetFieldNumbers(fieldObjects, nameof(fieldObjects));
return optionObject.SetEnabledFields(fieldNumbers);
}
@@ -162,12 +174,163 @@ public static bool HasError(this OptionObject2 optionObject)
/// The modified OptionObject2.
public static OptionObject2? SetEnabledFields(this OptionObject2 optionObject, List? fieldNumbers)
{
- if (optionObject == null || optionObject.Forms == null || fieldNumbers == null || fieldNumbers.Count == 0)
+ var fieldsToSet = ArgumentGuards.ValidateAndNormalizeFieldNumbers(fieldNumbers, nameof(fieldNumbers));
+
+ if (optionObject == null || optionObject.Forms == null)
+ return optionObject;
+
+ fieldsToSet = fieldsToSet
+ .Where(f => optionObject.Forms.Any(form => form.IsFieldPresent(f)))
+ .ToList();
+
+ if (fieldsToSet.Count == 0)
+ throw new ArgumentException(ArgumentGuards.NoMatchingFieldObjectsMessage, nameof(fieldNumbers));
+
+ foreach (var form in optionObject.Forms)
+ {
+ var formFieldNumbers = fieldsToSet.Where(form.IsFieldPresent).ToList();
+ if (formFieldNumbers.Count == 0)
+ continue;
+
+ form.SetEnabledFields(formFieldNumbers);
+ }
+
+ return optionObject;
+ }
+
+ ///
+ /// Locks a in an by field number.
+ ///
+ /// The OptionObject2 to modify.
+ /// The field number to lock.
+ /// The modified OptionObject2.
+ public static OptionObject2? SetLockedField(this OptionObject2 optionObject, string fieldNumber)
+ {
+ ArgumentGuards.ValidateFieldNumber(fieldNumber, nameof(fieldNumber));
+
+ if (optionObject == null || optionObject.Forms == null)
+ return optionObject;
+
+ if (!optionObject.Forms.Any(f => f.IsFieldPresent(fieldNumber)))
+ throw new ArgumentException(ArgumentGuards.NoMatchingFieldObjectsMessage, nameof(fieldNumber));
+
+ foreach (var form in optionObject.Forms)
+ {
+ form.SetLockedField(fieldNumber);
+ }
+
+ return optionObject;
+ }
+
+ ///
+ /// Locks instances in an .
+ ///
+ /// The OptionObject2 to modify.
+ /// The field objects to lock.
+ /// The modified OptionObject2.
+ public static OptionObject2? SetLockedFields(this OptionObject2 optionObject, List? fieldObjects)
+ {
+ var fieldNumbers = ArgumentGuards.ValidateAndGetFieldNumbers(fieldObjects, nameof(fieldObjects));
+
+ return optionObject.SetLockedFields(fieldNumbers);
+ }
+
+ ///
+ /// Locks instances in an by field numbers.
+ ///
+ /// The OptionObject2 to modify.
+ /// The field numbers to lock.
+ /// The modified OptionObject2.
+ public static OptionObject2? SetLockedFields(this OptionObject2 optionObject, List? fieldNumbers)
+ {
+ var fieldsToSet = ArgumentGuards.ValidateAndNormalizeFieldNumbers(fieldNumbers, nameof(fieldNumbers));
+
+ if (optionObject == null || optionObject.Forms == null)
return optionObject;
+ fieldsToSet = fieldsToSet
+ .Where(f => optionObject.Forms.Any(form => form.IsFieldPresent(f)))
+ .ToList();
+
+ if (fieldsToSet.Count == 0)
+ throw new ArgumentException(ArgumentGuards.NoMatchingFieldObjectsMessage, nameof(fieldNumbers));
+
foreach (var form in optionObject.Forms)
{
- form.SetEnabledFields(fieldNumbers);
+ var formFieldNumbers = fieldsToSet.Where(form.IsFieldPresent).ToList();
+ if (formFieldNumbers.Count == 0)
+ continue;
+
+ form.SetLockedFields(formFieldNumbers);
+ }
+
+ return optionObject;
+ }
+
+ ///
+ /// Unlocks a in an by field number.
+ ///
+ /// The OptionObject2 to modify.
+ /// The field number to unlock.
+ /// The modified OptionObject2.
+ public static OptionObject2? SetUnlockedField(this OptionObject2 optionObject, string fieldNumber)
+ {
+ ArgumentGuards.ValidateFieldNumber(fieldNumber, nameof(fieldNumber));
+
+ if (optionObject == null || optionObject.Forms == null)
+ return optionObject;
+
+ if (!optionObject.Forms.Any(f => f.IsFieldPresent(fieldNumber)))
+ throw new ArgumentException(ArgumentGuards.NoMatchingFieldObjectsMessage, nameof(fieldNumber));
+
+ foreach (var form in optionObject.Forms)
+ {
+ form.SetUnlockedField(fieldNumber);
+ }
+
+ return optionObject;
+ }
+
+ ///
+ /// Unlocks instances in an .
+ ///
+ /// The OptionObject2 to modify.
+ /// The field objects to unlock.
+ /// The modified OptionObject2.
+ public static OptionObject2? SetUnlockedFields(this OptionObject2 optionObject, List? fieldObjects)
+ {
+ var fieldNumbers = ArgumentGuards.ValidateAndGetFieldNumbers(fieldObjects, nameof(fieldObjects));
+
+ return optionObject.SetUnlockedFields(fieldNumbers);
+ }
+
+ ///
+ /// Unlocks instances in an by field numbers.
+ ///
+ /// The OptionObject2 to modify.
+ /// The field numbers to unlock.
+ /// The modified OptionObject2.
+ public static OptionObject2? SetUnlockedFields(this OptionObject2 optionObject, List? fieldNumbers)
+ {
+ var fieldsToSet = ArgumentGuards.ValidateAndNormalizeFieldNumbers(fieldNumbers, nameof(fieldNumbers));
+
+ if (optionObject == null || optionObject.Forms == null)
+ return optionObject;
+
+ fieldsToSet = fieldsToSet
+ .Where(f => optionObject.Forms.Any(form => form.IsFieldPresent(f)))
+ .ToList();
+
+ if (fieldsToSet.Count == 0)
+ throw new ArgumentException(ArgumentGuards.NoMatchingFieldObjectsMessage, nameof(fieldNumbers));
+
+ foreach (var form in optionObject.Forms)
+ {
+ var formFieldNumbers = fieldsToSet.Where(form.IsFieldPresent).ToList();
+ if (formFieldNumbers.Count == 0)
+ continue;
+
+ form.SetUnlockedFields(formFieldNumbers);
}
return optionObject;
diff --git a/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/OptionObjectHelpers.cs b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/OptionObjectHelpers.cs
index d79e5fc..697cd0c 100644
--- a/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/OptionObjectHelpers.cs
+++ b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/OptionObjectHelpers.cs
@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
+using RarelySimple.AvatarScriptLink.Objects.Helpers.Validators;
namespace RarelySimple.AvatarScriptLink.Objects.Helpers
{
@@ -237,9 +238,14 @@ public static bool IsFieldRequired(this OptionObject optionObject, string fieldN
/// The modified OptionObject.
public static OptionObject? SetDisabledField(this OptionObject optionObject, string fieldNumber)
{
- if (optionObject == null || optionObject.Forms == null || string.IsNullOrEmpty(fieldNumber))
+ ArgumentGuards.ValidateFieldNumber(fieldNumber, nameof(fieldNumber));
+
+ if (optionObject == null || optionObject.Forms == null)
return optionObject;
+ if (!optionObject.Forms.Any(f => f.IsFieldPresent(fieldNumber)))
+ throw new ArgumentException(ArgumentGuards.NoMatchingFieldObjectsMessage, nameof(fieldNumber));
+
foreach (var form in optionObject.Forms)
{
form.SetDisabledField(fieldNumber);
@@ -256,13 +262,7 @@ public static bool IsFieldRequired(this OptionObject optionObject, string fieldN
/// The modified OptionObject.
public static OptionObject? SetDisabledFields(this OptionObject optionObject, List? fieldObjects)
{
- if (fieldObjects == null || fieldObjects.Count == 0)
- return optionObject;
-
- var fieldNumbers = fieldObjects
- .Where(f => !string.IsNullOrEmpty(f?.FieldNumber))
- .Select(f => f.FieldNumber)
- .ToList();
+ var fieldNumbers = ArgumentGuards.ValidateAndGetFieldNumbers(fieldObjects, nameof(fieldObjects));
return optionObject.SetDisabledFields(fieldNumbers);
}
@@ -275,12 +275,25 @@ public static bool IsFieldRequired(this OptionObject optionObject, string fieldN
/// The modified OptionObject.
public static OptionObject? SetDisabledFields(this OptionObject optionObject, List? fieldNumbers)
{
- if (optionObject == null || optionObject.Forms == null || fieldNumbers == null || fieldNumbers.Count == 0)
+ var fieldsToSet = ArgumentGuards.ValidateAndNormalizeFieldNumbers(fieldNumbers, nameof(fieldNumbers));
+
+ if (optionObject == null || optionObject.Forms == null)
return optionObject;
+ fieldsToSet = fieldsToSet
+ .Where(f => optionObject.Forms.Any(form => form.IsFieldPresent(f)))
+ .ToList();
+
+ if (fieldsToSet.Count == 0)
+ throw new ArgumentException(ArgumentGuards.NoMatchingFieldObjectsMessage, nameof(fieldNumbers));
+
foreach (var form in optionObject.Forms)
{
- form.SetDisabledFields(fieldNumbers);
+ var formFieldNumbers = fieldsToSet.Where(form.IsFieldPresent).ToList();
+ if (formFieldNumbers.Count == 0)
+ continue;
+
+ form.SetDisabledFields(formFieldNumbers);
}
return optionObject;
@@ -294,9 +307,14 @@ public static bool IsFieldRequired(this OptionObject optionObject, string fieldN
/// The modified OptionObject.
public static OptionObject? SetEnabledField(this OptionObject optionObject, string fieldNumber)
{
- if (optionObject == null || optionObject.Forms == null || string.IsNullOrEmpty(fieldNumber))
+ ArgumentGuards.ValidateFieldNumber(fieldNumber, nameof(fieldNumber));
+
+ if (optionObject == null || optionObject.Forms == null)
return optionObject;
+ if (!optionObject.Forms.Any(f => f.IsFieldPresent(fieldNumber)))
+ throw new ArgumentException(ArgumentGuards.NoMatchingFieldObjectsMessage, nameof(fieldNumber));
+
foreach (var form in optionObject.Forms)
{
form.SetEnabledField(fieldNumber);
@@ -313,13 +331,7 @@ public static bool IsFieldRequired(this OptionObject optionObject, string fieldN
/// The modified OptionObject.
public static OptionObject? SetEnabledFields(this OptionObject optionObject, List? fieldObjects)
{
- if (fieldObjects == null || fieldObjects.Count == 0)
- return optionObject;
-
- var fieldNumbers = fieldObjects
- .Where(f => !string.IsNullOrEmpty(f?.FieldNumber))
- .Select(f => f.FieldNumber)
- .ToList();
+ var fieldNumbers = ArgumentGuards.ValidateAndGetFieldNumbers(fieldObjects, nameof(fieldObjects));
return optionObject.SetEnabledFields(fieldNumbers);
}
@@ -332,12 +344,163 @@ public static bool IsFieldRequired(this OptionObject optionObject, string fieldN
/// The modified OptionObject.
public static OptionObject? SetEnabledFields(this OptionObject optionObject, List? fieldNumbers)
{
- if (optionObject == null || optionObject.Forms == null || fieldNumbers == null || fieldNumbers.Count == 0)
+ var fieldsToSet = ArgumentGuards.ValidateAndNormalizeFieldNumbers(fieldNumbers, nameof(fieldNumbers));
+
+ if (optionObject == null || optionObject.Forms == null)
+ return optionObject;
+
+ fieldsToSet = fieldsToSet
+ .Where(f => optionObject.Forms.Any(form => form.IsFieldPresent(f)))
+ .ToList();
+
+ if (fieldsToSet.Count == 0)
+ throw new ArgumentException(ArgumentGuards.NoMatchingFieldObjectsMessage, nameof(fieldNumbers));
+
+ foreach (var form in optionObject.Forms)
+ {
+ var formFieldNumbers = fieldsToSet.Where(form.IsFieldPresent).ToList();
+ if (formFieldNumbers.Count == 0)
+ continue;
+
+ form.SetEnabledFields(formFieldNumbers);
+ }
+
+ return optionObject;
+ }
+
+ ///
+ /// Locks a in an by field number.
+ ///
+ /// The OptionObject to modify.
+ /// The field number to lock.
+ /// The modified OptionObject.
+ public static OptionObject? SetLockedField(this OptionObject optionObject, string fieldNumber)
+ {
+ ArgumentGuards.ValidateFieldNumber(fieldNumber, nameof(fieldNumber));
+
+ if (optionObject == null || optionObject.Forms == null)
+ return optionObject;
+
+ if (!optionObject.Forms.Any(f => f.IsFieldPresent(fieldNumber)))
+ throw new ArgumentException(ArgumentGuards.NoMatchingFieldObjectsMessage, nameof(fieldNumber));
+
+ foreach (var form in optionObject.Forms)
+ {
+ form.SetLockedField(fieldNumber);
+ }
+
+ return optionObject;
+ }
+
+ ///
+ /// Locks instances in an .
+ ///
+ /// The OptionObject to modify.
+ /// The field objects to lock.
+ /// The modified OptionObject.
+ public static OptionObject? SetLockedFields(this OptionObject optionObject, List? fieldObjects)
+ {
+ var fieldNumbers = ArgumentGuards.ValidateAndGetFieldNumbers(fieldObjects, nameof(fieldObjects));
+
+ return optionObject.SetLockedFields(fieldNumbers);
+ }
+
+ ///
+ /// Locks instances in an by field numbers.
+ ///
+ /// The OptionObject to modify.
+ /// The field numbers to lock.
+ /// The modified OptionObject.
+ public static OptionObject? SetLockedFields(this OptionObject optionObject, List? fieldNumbers)
+ {
+ var fieldsToSet = ArgumentGuards.ValidateAndNormalizeFieldNumbers(fieldNumbers, nameof(fieldNumbers));
+
+ if (optionObject == null || optionObject.Forms == null)
+ return optionObject;
+
+ fieldsToSet = fieldsToSet
+ .Where(f => optionObject.Forms.Any(form => form.IsFieldPresent(f)))
+ .ToList();
+
+ if (fieldsToSet.Count == 0)
+ throw new ArgumentException(ArgumentGuards.NoMatchingFieldObjectsMessage, nameof(fieldNumbers));
+
+ foreach (var form in optionObject.Forms)
+ {
+ var formFieldNumbers = fieldsToSet.Where(form.IsFieldPresent).ToList();
+ if (formFieldNumbers.Count == 0)
+ continue;
+
+ form.SetLockedFields(formFieldNumbers);
+ }
+
+ return optionObject;
+ }
+
+ ///
+ /// Unlocks a in an by field number.
+ ///
+ /// The OptionObject to modify.
+ /// The field number to unlock.
+ /// The modified OptionObject.
+ public static OptionObject? SetUnlockedField(this OptionObject optionObject, string fieldNumber)
+ {
+ ArgumentGuards.ValidateFieldNumber(fieldNumber, nameof(fieldNumber));
+
+ if (optionObject == null || optionObject.Forms == null)
+ return optionObject;
+
+ if (!optionObject.Forms.Any(f => f.IsFieldPresent(fieldNumber)))
+ throw new ArgumentException(ArgumentGuards.NoMatchingFieldObjectsMessage, nameof(fieldNumber));
+
+ foreach (var form in optionObject.Forms)
+ {
+ form.SetUnlockedField(fieldNumber);
+ }
+
+ return optionObject;
+ }
+
+ ///
+ /// Unlocks instances in an .
+ ///
+ /// The OptionObject to modify.
+ /// The field objects to unlock.
+ /// The modified OptionObject.
+ public static OptionObject? SetUnlockedFields(this OptionObject optionObject, List? fieldObjects)
+ {
+ var fieldNumbers = ArgumentGuards.ValidateAndGetFieldNumbers(fieldObjects, nameof(fieldObjects));
+
+ return optionObject.SetUnlockedFields(fieldNumbers);
+ }
+
+ ///
+ /// Unlocks instances in an by field numbers.
+ ///
+ /// The OptionObject to modify.
+ /// The field numbers to unlock.
+ /// The modified OptionObject.
+ public static OptionObject? SetUnlockedFields(this OptionObject optionObject, List? fieldNumbers)
+ {
+ var fieldsToSet = ArgumentGuards.ValidateAndNormalizeFieldNumbers(fieldNumbers, nameof(fieldNumbers));
+
+ if (optionObject == null || optionObject.Forms == null)
return optionObject;
+ fieldsToSet = fieldsToSet
+ .Where(f => optionObject.Forms.Any(form => form.IsFieldPresent(f)))
+ .ToList();
+
+ if (fieldsToSet.Count == 0)
+ throw new ArgumentException(ArgumentGuards.NoMatchingFieldObjectsMessage, nameof(fieldNumbers));
+
foreach (var form in optionObject.Forms)
{
- form.SetEnabledFields(fieldNumbers);
+ var formFieldNumbers = fieldsToSet.Where(form.IsFieldPresent).ToList();
+ if (formFieldNumbers.Count == 0)
+ continue;
+
+ form.SetUnlockedFields(formFieldNumbers);
}
return optionObject;
diff --git a/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/RowObjectHelpers.cs b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/RowObjectHelpers.cs
index d470789..6d4d623 100644
--- a/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/RowObjectHelpers.cs
+++ b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/RowObjectHelpers.cs
@@ -1,6 +1,8 @@
+using System;
using System.Collections.Generic;
using System.Linq;
using RarelySimple.AvatarScriptLink.Objects.Helpers.Manipulators;
+using RarelySimple.AvatarScriptLink.Objects.Helpers.Validators;
namespace RarelySimple.AvatarScriptLink.Objects.Helpers
{
@@ -204,12 +206,14 @@ public static bool IsFieldRequired(this RowObject rowObject, string fieldNumber)
/// The modified RowObject.
public static RowObject? SetDisabledField(this RowObject rowObject, string fieldNumber)
{
- if (rowObject == null || rowObject.Fields == null || string.IsNullOrEmpty(fieldNumber))
+ ArgumentGuards.ValidateFieldNumber(fieldNumber, nameof(fieldNumber));
+
+ if (rowObject == null || rowObject.Fields == null)
return rowObject;
var field = rowObject.Fields.FirstOrDefault(f => f.FieldNumber == fieldNumber);
if (field == null)
- return rowObject;
+ throw new ArgumentException(ArgumentGuards.NoMatchingFieldObjectsMessage, nameof(fieldNumber));
var changed = field.IsEnabled();
field.Disable();
@@ -228,11 +232,16 @@ public static bool IsFieldRequired(this RowObject rowObject, string fieldNumber)
/// The modified RowObject.
public static RowObject? SetDisabledFields(this RowObject rowObject, List? fieldNumbers)
{
- if (rowObject == null || rowObject.Fields == null || fieldNumbers == null || fieldNumbers.Count == 0)
+ var fieldsToSet = ArgumentGuards.ValidateAndNormalizeFieldNumbers(fieldNumbers, nameof(fieldNumbers));
+
+ if (rowObject == null || rowObject.Fields == null)
return rowObject;
+ if (!rowObject.Fields.Any(f => fieldsToSet.Contains(f.FieldNumber)))
+ throw new ArgumentException(ArgumentGuards.NoMatchingFieldObjectsMessage, nameof(fieldNumbers));
+
var changed = false;
- foreach (var field in rowObject.Fields.Where(f => fieldNumbers.Contains(f.FieldNumber)))
+ foreach (var field in rowObject.Fields.Where(f => fieldsToSet.Contains(f.FieldNumber)))
{
if (field.IsEnabled())
{
@@ -255,12 +264,14 @@ public static bool IsFieldRequired(this RowObject rowObject, string fieldNumber)
/// The modified RowObject.
public static RowObject? SetEnabledField(this RowObject rowObject, string fieldNumber)
{
- if (rowObject == null || rowObject.Fields == null || string.IsNullOrEmpty(fieldNumber))
+ ArgumentGuards.ValidateFieldNumber(fieldNumber, nameof(fieldNumber));
+
+ if (rowObject == null || rowObject.Fields == null)
return rowObject;
var field = rowObject.Fields.FirstOrDefault(f => f.FieldNumber == fieldNumber);
if (field == null)
- return rowObject;
+ throw new ArgumentException(ArgumentGuards.NoMatchingFieldObjectsMessage, nameof(fieldNumber));
var changed = !field.IsEnabled();
field.Enable();
@@ -279,11 +290,16 @@ public static bool IsFieldRequired(this RowObject rowObject, string fieldNumber)
/// The modified RowObject.
public static RowObject? SetEnabledFields(this RowObject rowObject, List? fieldNumbers)
{
- if (rowObject == null || rowObject.Fields == null || fieldNumbers == null || fieldNumbers.Count == 0)
+ var fieldsToSet = ArgumentGuards.ValidateAndNormalizeFieldNumbers(fieldNumbers, nameof(fieldNumbers));
+
+ if (rowObject == null || rowObject.Fields == null)
return rowObject;
+ if (!rowObject.Fields.Any(f => fieldsToSet.Contains(f.FieldNumber)))
+ throw new ArgumentException(ArgumentGuards.NoMatchingFieldObjectsMessage, nameof(fieldNumbers));
+
var changed = false;
- foreach (var field in rowObject.Fields.Where(f => fieldNumbers.Contains(f.FieldNumber)))
+ foreach (var field in rowObject.Fields.Where(f => fieldsToSet.Contains(f.FieldNumber)))
{
if (!field.IsEnabled())
{
@@ -298,6 +314,124 @@ public static bool IsFieldRequired(this RowObject rowObject, string fieldNumber)
return rowObject;
}
+ ///
+ /// Locks a in a by field number.
+ ///
+ /// The RowObject to modify.
+ /// The field number to lock.
+ /// The modified RowObject.
+ public static RowObject? SetLockedField(this RowObject rowObject, string fieldNumber)
+ {
+ ArgumentGuards.ValidateFieldNumber(fieldNumber, nameof(fieldNumber));
+
+ if (rowObject == null || rowObject.Fields == null)
+ return rowObject;
+
+ var field = rowObject.Fields.FirstOrDefault(f => f.FieldNumber == fieldNumber);
+ if (field == null)
+ throw new ArgumentException(ArgumentGuards.NoMatchingFieldObjectsMessage, nameof(fieldNumber));
+
+ var changed = !field.IsLocked();
+ field.Lock();
+
+ if (changed && string.IsNullOrEmpty(rowObject.RowAction))
+ rowObject.RowAction = RowObject.RowActions.Edit;
+
+ return rowObject;
+ }
+
+ ///
+ /// Locks instances in a by field numbers.
+ ///
+ /// The RowObject to modify.
+ /// The field numbers to lock.
+ /// The modified RowObject.
+ public static RowObject? SetLockedFields(this RowObject rowObject, List? fieldNumbers)
+ {
+ var fieldsToSet = ArgumentGuards.ValidateAndNormalizeFieldNumbers(fieldNumbers, nameof(fieldNumbers));
+
+ if (rowObject == null || rowObject.Fields == null)
+ return rowObject;
+
+ if (!rowObject.Fields.Any(f => fieldsToSet.Contains(f.FieldNumber)))
+ throw new ArgumentException(ArgumentGuards.NoMatchingFieldObjectsMessage, nameof(fieldNumbers));
+
+ var changed = false;
+ foreach (var field in rowObject.Fields.Where(f => fieldsToSet.Contains(f.FieldNumber)))
+ {
+ if (!field.IsLocked())
+ {
+ changed = true;
+ }
+
+ field.Lock();
+ }
+
+ if (changed && string.IsNullOrEmpty(rowObject.RowAction))
+ rowObject.RowAction = RowObject.RowActions.Edit;
+
+ return rowObject;
+ }
+
+ ///
+ /// Unlocks a in a by field number.
+ ///
+ /// The RowObject to modify.
+ /// The field number to unlock.
+ /// The modified RowObject.
+ public static RowObject? SetUnlockedField(this RowObject rowObject, string fieldNumber)
+ {
+ ArgumentGuards.ValidateFieldNumber(fieldNumber, nameof(fieldNumber));
+
+ if (rowObject == null || rowObject.Fields == null)
+ return rowObject;
+
+ var field = rowObject.Fields.FirstOrDefault(f => f.FieldNumber == fieldNumber);
+ if (field == null)
+ throw new ArgumentException(ArgumentGuards.NoMatchingFieldObjectsMessage, nameof(fieldNumber));
+
+ var changed = field.IsLocked();
+ field.Unlock();
+
+ if (changed && string.IsNullOrEmpty(rowObject.RowAction))
+ rowObject.RowAction = RowObject.RowActions.Edit;
+
+ return rowObject;
+ }
+
+ ///
+ /// Unlocks instances in a by field numbers.
+ ///
+ /// The RowObject to modify.
+ /// The field numbers to unlock.
+ /// The modified RowObject.
+ public static RowObject? SetUnlockedFields(this RowObject rowObject, List? fieldNumbers)
+ {
+ var fieldsToSet = ArgumentGuards.ValidateAndNormalizeFieldNumbers(fieldNumbers, nameof(fieldNumbers));
+
+ if (rowObject == null || rowObject.Fields == null)
+ return rowObject;
+
+ if (!rowObject.Fields.Any(f => fieldsToSet.Contains(f.FieldNumber)))
+ throw new ArgumentException(ArgumentGuards.NoMatchingFieldObjectsMessage, nameof(fieldNumbers));
+
+ var changed = false;
+ foreach (var field in rowObject.Fields.Where(f => fieldsToSet.Contains(f.FieldNumber)))
+ {
+ if (field.IsLocked())
+ {
+ changed = true;
+ }
+
+ field.Unlock();
+ }
+
+ if (changed && string.IsNullOrEmpty(rowObject.RowAction))
+ rowObject.RowAction = RowObject.RowActions.Edit;
+
+ return rowObject;
+ }
+
///
/// Enables all instances in a .
///
diff --git a/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/Validators/ArgumentGuards.cs b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/Validators/ArgumentGuards.cs
new file mode 100644
index 0000000..2d633ce
--- /dev/null
+++ b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/Validators/ArgumentGuards.cs
@@ -0,0 +1,65 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+namespace RarelySimple.AvatarScriptLink.Objects.Helpers.Validators
+{
+ ///
+ /// Shared guard helpers for argument validation and normalization used by helper extension methods.
+ ///
+ public static class ArgumentGuards
+ {
+ internal const string NoMatchingFieldObjectsMessage = "No matching field objects were found.";
+ private const string NoFieldObjectsProvidedMessage = "No field objects were provided.";
+ private const string NoFieldNumbersProvidedMessage = "No field numbers were provided.";
+ private const string FieldNumberCannotBeEmptyMessage = "Field number cannot be empty.";
+
+ public static void ValidateFieldNumber(string fieldNumber, string paramName)
+ {
+ if (fieldNumber == null)
+ throw new ArgumentNullException(paramName);
+
+ if (fieldNumber.Length == 0)
+ throw new ArgumentException(FieldNumberCannotBeEmptyMessage, paramName);
+ }
+
+ public static List ValidateAndNormalizeFieldNumbers(List? fieldNumbers, string paramName)
+ {
+ if (fieldNumbers == null)
+ throw new ArgumentNullException(paramName);
+
+ if (fieldNumbers.Count == 0)
+ throw new ArgumentException(NoFieldNumbersProvidedMessage, paramName);
+
+ var normalized = fieldNumbers
+ .Where(f => !string.IsNullOrEmpty(f))
+ .Distinct()
+ .ToList();
+
+ if (normalized.Count == 0)
+ throw new ArgumentException(NoFieldNumbersProvidedMessage, paramName);
+
+ return normalized;
+ }
+
+ public static List ValidateAndGetFieldNumbers(List? fieldObjects, string paramName)
+ {
+ if (fieldObjects == null)
+ throw new ArgumentNullException(paramName);
+
+ if (fieldObjects.Count == 0)
+ throw new ArgumentException(NoFieldObjectsProvidedMessage, paramName);
+
+ var fieldNumbers = fieldObjects
+ .Where(f => !string.IsNullOrEmpty(f?.FieldNumber))
+ .Select(f => f.FieldNumber)
+ .Distinct()
+ .ToList();
+
+ if (fieldNumbers.Count == 0)
+ throw new ArgumentException(NoFieldNumbersProvidedMessage, paramName);
+
+ return fieldNumbers;
+ }
+ }
+}