From 837a5980f3fd473c5c6e3c988af12e1b3793326b Mon Sep 17 00:00:00 2001 From: Scott Olson Jr Date: Fri, 6 Mar 2026 18:25:49 -0800 Subject: [PATCH 1/3] Enhance OptionObject and RowObject helpers with locking and unlocking functionality - Added methods to lock and unlock fields in OptionObject2 and OptionObject. - Introduced validation for field numbers to ensure they are not null or empty. - Improved error handling for cases where no matching field objects are found. - Refactored existing methods to reduce code duplication and improve readability. - Updated documentation to reflect new methods and their usage. --- .github/instructions/dotnet.instructions.md | 2 + .../FormObjectHelpersTests.cs | 182 ++++- .../OptionObjectHelpers.OptionObject.Tests.cs | 364 +++++++++ ...OptionObjectHelpers.OptionObject2.Tests.cs | 209 +++++ ...ionObjectHelpers.OptionObject2015.Tests.cs | 227 ++++++ .../OptionObjectHelpersTests.cs | 719 ------------------ .../RowObjectHelpersTests.cs | 304 ++++++-- .../FormObjectHelpers.cs | 245 +++++- .../OptionObject2015Helpers.cs | 287 ++++++- .../OptionObject2Helpers.cs | 287 ++++++- .../OptionObjectHelpers.cs | 287 ++++++- .../RowObjectHelpers.cs | 217 +++++- 12 files changed, 2459 insertions(+), 871 deletions(-) create mode 100644 dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/OptionObjectHelpers.OptionObject.Tests.cs create mode 100644 dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/OptionObjectHelpers.OptionObject2.Tests.cs create mode 100644 dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/OptionObjectHelpers.OptionObject2015.Tests.cs delete mode 100644 dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/OptionObjectHelpersTests.cs diff --git a/.github/instructions/dotnet.instructions.md b/.github/instructions/dotnet.instructions.md index 9482b0f..2f1c6fc 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_DoesNothing`) +- 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/FormObjectHelpersTests.cs b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/FormObjectHelpersTests.cs index ca847c4..c728473 100644 --- a/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/FormObjectHelpersTests.cs +++ b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/FormObjectHelpersTests.cs @@ -8,7 +8,7 @@ namespace RarelySimple.AvatarScriptLink.Objects.Helpers.Tests public class FormObjectHelpersTests { [TestMethod] - public void IsRowPresent_WithCurrentRow_ReturnsTrue() + public void IsRowPresent_FormObject_WithCurrentRow_ReturnsTrue() { // Arrange var form = new FormObject { CurrentRow = new RowObject { RowId = "1" } }; @@ -21,7 +21,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 +35,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 +48,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 +61,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 +74,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 +88,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 +102,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 +116,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 +130,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 +144,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 +158,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 +174,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 +194,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 +208,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 +227,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 +247,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 +265,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 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 SetDisabledFields_WithMultipleIterationFalse_DoesNotModifyOtherRows() + 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/OptionObjectHelpers.OptionObject.Tests.cs b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/OptionObjectHelpers.OptionObject.Tests.cs new file mode 100644 index 0000000..96ca5df --- /dev/null +++ b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/OptionObjectHelpers.OptionObject.Tests.cs @@ -0,0 +1,364 @@ +namespace RarelySimple.AvatarScriptLink.Objects.Helpers.Tests +{ + /// + /// Tests for OptionObject helper extension methods. + /// + [TestClass] + public class OptionObjectHelpersOptionObjectTests + { + [TestMethod] + public void GetCurrentRowId_OptionObject_ReturnsCurrentRowId() + { + var optionObject = new OptionObject(); + var form = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "100" } }; + optionObject.Forms.Add(form); + + var result = optionObject.GetCurrentRowId("1"); + + Assert.AreEqual("100", result); + } + + [TestMethod] + public void GetCurrentRowId_OptionObject_WithNonExistentForm_ReturnsNull() + { + var optionObject = new OptionObject(); + + var result = optionObject.GetCurrentRowId("999"); + + Assert.IsNull(result); + } + + [TestMethod] + public void GetParentRowId_OptionObject_ReturnsParentRowId() + { + var optionObject = new OptionObject(); + var form = new FormObject { FormId = "1", CurrentRow = new RowObject { ParentRowId = "200" } }; + optionObject.Forms.Add(form); + + var result = optionObject.GetParentRowId("1"); + + Assert.AreEqual("200", result); + } + + [TestMethod] + public void GetFieldValue_OptionObject_FromAnyForm_ReturnsValue() + { + 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); + + var result = optionObject.GetFieldValue("100"); + + Assert.AreEqual("TestValue", result); + } + + [TestMethod] + public void GetFieldValue_OptionObject_WithFormIdRowIdFieldNumber_ReturnsValue() + { + 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); + + var result = optionObject.GetFieldValue("1", "1", "100"); + + Assert.AreEqual("TestValue", result); + } + + [TestMethod] + public void GetFieldValues_OptionObject_ReturnsAllValues() + { + 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); + + var result = optionObject.GetFieldValues("100"); + + Assert.AreEqual(2, result.Count); + CollectionAssert.Contains(result, "Value1"); + CollectionAssert.Contains(result, "Value2"); + } + + [TestMethod] + public void GetMultipleIterationStatus_OptionObject_ReturnsStatus() + { + var optionObject = new OptionObject(); + var form = new FormObject { FormId = "1", CurrentRow = new RowObject(), MultipleIteration = true }; + optionObject.Forms.Add(form); + + var result = optionObject.GetMultipleIterationStatus("1"); + + Assert.IsTrue(result); + } + + [TestMethod] + public void IsFieldPresent_OptionObject_InAnyForm_ReturnsTrue() + { + 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); + + var result = optionObject.IsFieldPresent("100"); + + Assert.IsTrue(result); + } + + [TestMethod] + public void IsFieldEnabled_OptionObject_InAnyForm_ReturnsTrue() + { + 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); + + var result = optionObject.IsFieldEnabled("100"); + + Assert.IsTrue(result); + } + + [TestMethod] + public void IsFieldLocked_OptionObject_InAnyForm_ReturnsTrue() + { + 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); + + var result = optionObject.IsFieldLocked("100"); + + Assert.IsTrue(result); + } + + [TestMethod] + public void IsFieldRequired_OptionObject_InAnyForm_ReturnsTrue() + { + 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); + + var result = optionObject.IsFieldRequired("100"); + + Assert.IsTrue(result); + } + + [TestMethod] + public void GetErrorCode_OptionObject_ReturnsErrorCode() + { + var optionObject = new OptionObject { ErrorCode = 1.0 }; + + var result = optionObject.GetErrorCode(); + + Assert.AreEqual(1.0, result); + } + + [TestMethod] + public void GetErrorMessage_OptionObject_ReturnsErrorMessage() + { + var optionObject = new OptionObject { ErrorMesg = "Test Error" }; + + var result = optionObject.GetErrorMessage(); + + Assert.AreEqual("Test Error", result); + } + + [TestMethod] + public void GetEntityId_OptionObject_ReturnsEntityId() + { + var optionObject = new OptionObject { EntityID = "12345" }; + + var result = optionObject.GetEntityId(); + + Assert.AreEqual("12345", result); + } + + [TestMethod] + public void GetFormCount_OptionObject_ReturnsFormCount() + { + var optionObject = new OptionObject(); + 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_OptionObject_WithNonZeroErrorCode_ReturnsTrue() + { + var optionObject = new OptionObject { ErrorCode = 1.0 }; + + var result = optionObject.HasError(); + + Assert.IsTrue(result); + } + + [TestMethod] + public void HasError_OptionObject_WithZeroErrorCode_ReturnsFalse() + { + var optionObject = new OptionObject { ErrorCode = 0.0 }; + + var result = optionObject.HasError(); + + Assert.IsFalse(result); + } + + [TestMethod] + public void SetDisabledField_OptionObject_DisablesTargetField() + { + 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); + + optionObject.SetDisabledField("100"); + + Assert.AreEqual("0", optionObject.Forms[0].CurrentRow.Fields[0].Enabled); + Assert.AreEqual("EDIT", optionObject.Forms[0].CurrentRow.RowAction); + } + + [TestMethod] + public void SetEnabledFields_OptionObject_EnablesMatchingFields() + { + 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); + + optionObject.SetEnabledFields(new List { "101" }); + + Assert.AreEqual("0", optionObject.Forms[0].CurrentRow.Fields[0].Enabled); + Assert.AreEqual("1", optionObject.Forms[0].CurrentRow.Fields[1].Enabled); + } + + [TestMethod] + public void SetDisabledFields_OptionObject_WithFieldObjects_DisablesMatchingFields() + { + 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" }); + form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "101", Enabled = "1" }); + optionObject.Forms.Add(form); + + var fieldsToDisable = new List { new FieldObject { FieldNumber = "101" } }; + + optionObject.SetDisabledFields(fieldsToDisable); + + Assert.AreEqual("1", optionObject.Forms[0].CurrentRow.Fields[0].Enabled); + Assert.AreEqual("0", optionObject.Forms[0].CurrentRow.Fields[1].Enabled); + } + + [TestMethod] + public void SetDisabledField_OptionObject_WithEmptyFieldNumber_ThrowsArgumentException() + { + 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); + + Assert.ThrowsException(() => optionObject.SetDisabledField(string.Empty)); + } + + [TestMethod] + public void SetDisabledFields_OptionObject_WithNullFieldObjects_ThrowsArgumentNullException() + { + 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); + + Assert.ThrowsException(() => optionObject.SetDisabledFields((List?)null)); + } + + [TestMethod] + public void SetDisabledField_OptionObject_WithNullOptionObject_ReturnsNull() + { + var result = OptionObjectHelpers.SetDisabledField(null!, "100"); + + Assert.IsNull(result); + } + + [TestMethod] + public void SetEnabledField_OptionObject_WithNullForms_ReturnsOriginalObject() + { + var optionObject = new OptionObject { Forms = null! }; + + var result = optionObject.SetEnabledField("100"); + + Assert.AreSame(optionObject, result); + } + + [TestMethod] + public void SetLockedField_OptionObject_LocksTargetField() + { + 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); + + 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_OptionObject_WithFieldNumbers_UnlocksMatchingFields() + { + var optionObject = new OptionObject(); + 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); + + optionObject.SetUnlockedFields(new List { "101" }); + + Assert.AreEqual("1", optionObject.Forms[0].CurrentRow.Fields[0].Lock); + Assert.AreEqual("0", optionObject.Forms[0].CurrentRow.Fields[1].Lock); + } + + [TestMethod] + public void SetLockedFields_OptionObject_WithNullFieldObjects_ThrowsArgumentNullException() + { + var optionObject = new OptionObject(); + var form = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1" } }; + form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Lock = "0" }); + optionObject.Forms.Add(form); + + Assert.ThrowsException(() => optionObject.SetLockedFields((List?)null)); + } + + [TestMethod] + public void SetUnlockedField_OptionObject_WithNullForms_ReturnsOriginalObject() + { + var optionObject = new OptionObject { Forms = null! }; + + var result = optionObject.SetUnlockedField("100"); + + Assert.AreSame(optionObject, result); + } + + [TestMethod] + public void SetLockedFields_OptionObject_WithDuplicateFieldNumbers_LocksTargetField() + { + 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); + + 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); + } + } +} 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..bc03a79 --- /dev/null +++ b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/OptionObjectHelpers.OptionObject2.Tests.cs @@ -0,0 +1,209 @@ +namespace RarelySimple.AvatarScriptLink.Objects.Helpers.Tests +{ + /// + /// Tests for OptionObject2 helper extension methods. + /// + [TestClass] + public class OptionObjectHelpersOptionObject2Tests + { + [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 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_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); + } + } +} 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..768c998 --- /dev/null +++ b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/OptionObjectHelpers.OptionObject2015.Tests.cs @@ -0,0 +1,227 @@ +namespace RarelySimple.AvatarScriptLink.Objects.Helpers.Tests +{ + /// + /// Tests for OptionObject2015 helper extension methods. + /// + [TestClass] + public class OptionObjectHelpersOptionObject2015Tests + { + [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 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 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); + } + } +} diff --git a/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/OptionObjectHelpersTests.cs b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/OptionObjectHelpersTests.cs deleted file mode 100644 index 47912c3..0000000 --- a/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/OptionObjectHelpersTests.cs +++ /dev/null @@ -1,719 +0,0 @@ -namespace RarelySimple.AvatarScriptLink.Objects.Helpers.Tests -{ - - /// - /// Tests for OptionObject/OptionObject2/OptionObject2015 helper extension methods - /// - [TestClass] - public class OptionObjectHelpersTests - { - [TestMethod] - public void GetCurrentRowId_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() - { - // Arrange - var optionObject = new OptionObject(); - - // Act - var result = optionObject.GetCurrentRowId("999"); - - // Assert - Assert.IsNull(result); - } - - [TestMethod] - public void GetParentRowId_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() - { - // 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() - { - // 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() - { - // 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() - { - // 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() - { - // 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() - { - // 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() - { - // 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() - { - // 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() - { - // Arrange - var optionObject = new OptionObject { ErrorCode = 1.0 }; - - // Act - var result = optionObject.GetErrorCode(); - - // Assert - Assert.AreEqual(1.0, result); - } - - [TestMethod] - public void GetErrorMessage_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() - { - // Arrange - var optionObject = new OptionObject { EntityID = "12345" }; - - // Act - var result = optionObject.GetEntityId(); - - // Assert - Assert.AreEqual("12345", result); - } - - [TestMethod] - public void GetFormCount_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() - { - // Arrange - var optionObject = new OptionObject { ErrorCode = 1.0 }; - - // Act - var result = optionObject.HasError(); - - // Assert - Assert.IsTrue(result); - } - - [TestMethod] - public void HasError_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); - } - - [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" }); - form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "101", Enabled = "1" }); - optionObject.Forms.Add(form); - - 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() - { - // 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" } }; - 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); - } - - [TestMethod] - public void SetDisabledField_OptionObject_WithEmptyFieldNumber_DoesNothing() - { - // 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(string.Empty); - - // Assert - Assert.AreEqual("1", optionObject.Forms[0].CurrentRow.Fields[0].Enabled); - Assert.AreEqual("", optionObject.Forms[0].CurrentRow.RowAction); - } - - [TestMethod] - public void SetDisabledFields_OptionObject_WithNullFieldObjects_DoesNothing() - { - // 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); - } - - [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() - { - 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 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); - - // Act - optionObject.SetEnabledField(string.Empty); - - // Assert - Assert.AreEqual("0", optionObject.Forms[0].CurrentRow.Fields[0].Enabled); - Assert.AreEqual("", optionObject.Forms[0].CurrentRow.RowAction); - } - - [TestMethod] - public void SetEnabledField_OptionObject2_WithNullOptionObject_ReturnsNull() - { - // Act - var result = OptionObject2Helpers.SetEnabledField(null!, "100"); - - // Assert - Assert.IsNull(result); - } - - [TestMethod] - public void SetEnabledFields_OptionObject2_WithEmptyFieldNumbers_DoesNothing() - { - // 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); - - // Act - optionObject.SetEnabledFields(new List()); - - // Assert - Assert.AreEqual("0", optionObject.Forms[0].CurrentRow.Fields[0].Enabled); - } - - [TestMethod] - public void SetEnabledFields_OptionObject2_WithNullFieldObjects_DoesNothing() - { - 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); - - optionObject.SetEnabledFields((List?)null); - - Assert.AreEqual("0", optionObject.Forms[0].CurrentRow.Fields[0].Enabled); - } - - [TestMethod] - public void SetDisabledField_OptionObject2_WithNullForms_ReturnsOriginalObject() - { - // 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 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" }); - 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); - } - - [TestMethod] - public void SetEnabledFields_OptionObject2015_WithNullFieldObjects_DoesNothing() - { - // 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.SetEnabledFields((List?)null); - - // Assert - Assert.AreEqual("0", optionObject.Forms[0].CurrentRow.Fields[0].Enabled); - } - - [TestMethod] - public void SetDisabledFields_OptionObject2015_WithEmptyFieldObjects_DoesNothing() - { - 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); - - optionObject.SetDisabledFields(new List()); - - Assert.AreEqual("1", optionObject.Forms[0].CurrentRow.Fields[0].Enabled); - } - - [TestMethod] - public void SetEnabledFields_OptionObject2015_WithEmptyFieldObjects_DoesNothing() - { - 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.SetEnabledFields(new List()); - - Assert.AreEqual("0", optionObject.Forms[0].CurrentRow.Fields[0].Enabled); - } - - [TestMethod] - public void SetDisabledField_OptionObject2015_WithNullForms_ReturnsOriginalObject() - { - // Arrange - var optionObject = new OptionObject2015 { Forms = null! }; - - // Act - var result = optionObject.SetDisabledField("100"); - - // Assert - Assert.AreSame(optionObject, result); - } - - [TestMethod] - public void SetEnabledFields_OptionObject2015_WithNullOptionObject_ReturnsNull() - { - // Act - var result = OptionObject2015Helpers.SetEnabledFields(null!, new List { "100" }); - - // Assert - Assert.IsNull(result); - } - - } - -} diff --git a/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/RowObjectHelpersTests.cs b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/RowObjectHelpersTests.cs index e454721..178b8ef 100644 --- a/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/RowObjectHelpersTests.cs +++ b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/RowObjectHelpersTests.cs @@ -8,7 +8,7 @@ namespace RarelySimple.AvatarScriptLink.Objects.Helpers.Tests public class RowObjectHelpersTests { [TestMethod] - public void GetRowId_WithRowId_ReturnsRowId() + public void GetRowId_RowObject_WithRowId_ReturnsRowId() { // Arrange var row = new RowObject { RowId = "123" }; @@ -21,7 +21,7 @@ public void GetRowId_WithRowId_ReturnsRowId() } [TestMethod] - public void GetRowId_WithNull_ReturnsNull() + public void GetRowId_RowObject_WithNull_ReturnsNull() { // Arrange RowObject? row = null; @@ -34,7 +34,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 +47,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 +60,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 +73,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 +86,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 +101,7 @@ public void GetFieldCount_WithFields_ReturnsCount() } [TestMethod] - public void GetFieldCount_WithNull_ReturnsZero() + public void GetFieldCount_RowObject_WithNull_ReturnsZero() { // Arrange RowObject? row = null; @@ -114,7 +114,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 +128,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 +142,7 @@ public void GetFieldValue_WithNonExistentField_ReturnsNull() } [TestMethod] - public void GetFieldValue_WithNullRow_ReturnsNull() + public void GetFieldValue_RowObject_WithNullRow_ReturnsNull() { // Arrange RowObject? row = null; @@ -155,7 +155,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 +169,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 +182,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 +196,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 +210,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 +224,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 +238,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 +254,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 +267,7 @@ public void SetFieldValue_WithNonExistentField_DoesNothing() } [TestMethod] - public void SetFieldValue_WithNullRow_ReturnsNull() + public void SetFieldValue_RowObject_WithNullRow_ReturnsNull() { // Arrange RowObject? row = null; @@ -280,7 +280,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 +299,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 +315,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 +333,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 +350,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 +365,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 +381,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 +398,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 +413,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 +428,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 +443,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 +459,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 +474,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 +489,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 +515,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 +532,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 +558,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 +575,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 +594,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 +613,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 +626,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 +641,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 +656,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 +671,7 @@ public void EnableAllFieldObjects_WithNullRowAction_AndChanges_SetsRowActionToEd } [TestMethod] - public void LockAllFieldObjects_LocksAllFields() + public void LockAllFieldObjects_RowObject_LocksAllFields() { // Arrange var row = new RowObject(); @@ -695,7 +687,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 +700,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 +715,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 +730,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 +745,7 @@ public void LockAllFieldObjects_WithNullRowAction_AndChanges_SetsRowActionToEdit } [TestMethod] - public void UnlockAllFieldObjects_UnlocksAllFields() + public void UnlockAllFieldObjects_RowObject_UnlocksAllFields() { // Arrange var row = new RowObject(); @@ -769,7 +761,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 +774,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 +789,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 +804,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 +817,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..cd276a6 100644 --- a/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/FormObjectHelpers.cs +++ b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/FormObjectHelpers.cs @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; using System.Linq; @@ -8,6 +9,10 @@ namespace RarelySimple.AvatarScriptLink.Objects.Helpers /// public static class FormObjectHelpers { + private const string NoMatchingFieldObjectsMessage = "No matching field objects were found."; + private const string NoFieldNumbersProvidedMessage = "No field numbers were provided."; + private const string FieldNumberCannotBeEmptyMessage = "Field number cannot be empty."; + /// /// Gets the form ID of a . /// @@ -316,9 +321,21 @@ 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)) + if (fieldNumber == null) + throw new ArgumentNullException(nameof(fieldNumber)); + + if (fieldNumber.Length == 0) + throw new ArgumentException(FieldNumberCannotBeEmptyMessage, 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(NoMatchingFieldObjectsMessage, nameof(fieldNumber)); + formObject.CurrentRow.SetDisabledField(fieldNumber); if (formObject.MultipleIteration && formObject.HasOtherRows()) @@ -340,16 +357,36 @@ 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) + if (fieldNumbers == null) + throw new ArgumentNullException(nameof(fieldNumbers)); + + if (fieldNumbers.Count == 0) + throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldNumbers)); + + if (formObject == null || formObject.CurrentRow == null) return formObject; - formObject.CurrentRow.SetDisabledFields(fieldNumbers); + var fieldsToSet = fieldNumbers + .Where(f => !string.IsNullOrEmpty(f)) + .Distinct() + .ToList(); + + if (fieldsToSet.Count == 0) + throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(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(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 +401,21 @@ 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)) + if (fieldNumber == null) + throw new ArgumentNullException(nameof(fieldNumber)); + + if (fieldNumber.Length == 0) + throw new ArgumentException(FieldNumberCannotBeEmptyMessage, 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(NoMatchingFieldObjectsMessage, nameof(fieldNumber)); + formObject.CurrentRow.SetEnabledField(fieldNumber); if (formObject.MultipleIteration && formObject.HasOtherRows()) @@ -388,16 +437,196 @@ 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) + if (fieldNumbers == null) + throw new ArgumentNullException(nameof(fieldNumbers)); + + if (fieldNumbers.Count == 0) + throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldNumbers)); + + if (formObject == null || formObject.CurrentRow == null) + return formObject; + + var fieldsToSet = fieldNumbers + .Where(f => !string.IsNullOrEmpty(f)) + .Distinct() + .ToList(); + + if (fieldsToSet.Count == 0) + throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(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(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) + { + if (fieldNumber == null) + throw new ArgumentNullException(nameof(fieldNumber)); + + if (fieldNumber.Length == 0) + throw new ArgumentException(FieldNumberCannotBeEmptyMessage, nameof(fieldNumber)); + + if (formObject == null || formObject.CurrentRow == null) return formObject; - formObject.CurrentRow.SetEnabledFields(fieldNumbers); + var hasFieldInForm = formObject.CurrentRow.IsFieldPresent(fieldNumber) + || (formObject.MultipleIteration && formObject.HasOtherRows() && formObject.OtherRows.Any(r => r.IsFieldPresent(fieldNumber))); + + if (!hasFieldInForm) + throw new ArgumentException(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) + { + if (fieldNumbers == null) + throw new ArgumentNullException(nameof(fieldNumbers)); + + if (fieldNumbers.Count == 0) + throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldNumbers)); + + if (formObject == null || formObject.CurrentRow == null) + return formObject; + + var fieldsToSet = fieldNumbers + .Where(f => !string.IsNullOrEmpty(f)) + .Distinct() + .ToList(); + + if (fieldsToSet.Count == 0) + throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(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(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) + { + if (fieldNumber == null) + throw new ArgumentNullException(nameof(fieldNumber)); + + if (fieldNumber.Length == 0) + throw new ArgumentException(FieldNumberCannotBeEmptyMessage, 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(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) + { + if (fieldNumbers == null) + throw new ArgumentNullException(nameof(fieldNumbers)); + + if (fieldNumbers.Count == 0) + throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldNumbers)); + + if (formObject == null || formObject.CurrentRow == null) + return formObject; + + var fieldsToSet = fieldNumbers + .Where(f => !string.IsNullOrEmpty(f)) + .Distinct() + .ToList(); + + if (fieldsToSet.Count == 0) + throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(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(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..0fc7c5a 100644 --- a/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/OptionObject2015Helpers.cs +++ b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/OptionObject2015Helpers.cs @@ -9,6 +9,11 @@ namespace RarelySimple.AvatarScriptLink.Objects.Helpers /// public static class OptionObject2015Helpers { + private 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."; + /// /// Gets the entity ID of an . /// @@ -87,9 +92,18 @@ 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)) + if (fieldNumber == null) + throw new ArgumentNullException(nameof(fieldNumber)); + + if (fieldNumber.Length == 0) + throw new ArgumentException(FieldNumberCannotBeEmptyMessage, nameof(fieldNumber)); + + if (optionObject == null || optionObject.Forms == null) return optionObject; + if (!optionObject.Forms.Any(f => f.IsFieldPresent(fieldNumber))) + throw new ArgumentException(NoMatchingFieldObjectsMessage, nameof(fieldNumber)); + foreach (var form in optionObject.Forms) { form.SetDisabledField(fieldNumber); @@ -106,14 +120,21 @@ 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; + if (fieldObjects == null) + throw new ArgumentNullException(nameof(fieldObjects)); + + if (fieldObjects.Count == 0) + throw new ArgumentException(NoFieldObjectsProvidedMessage, nameof(fieldObjects)); var fieldNumbers = fieldObjects .Where(f => !string.IsNullOrEmpty(f?.FieldNumber)) .Select(f => f.FieldNumber) + .Distinct() .ToList(); + if (fieldNumbers.Count == 0) + throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldObjects)); + return optionObject.SetDisabledFields(fieldNumbers); } @@ -125,12 +146,33 @@ 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) + if (fieldNumbers == null) + throw new ArgumentNullException(nameof(fieldNumbers)); + + if (fieldNumbers.Count == 0) + throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldNumbers)); + + if (optionObject == null || optionObject.Forms == null) return optionObject; + var fieldsToSet = fieldNumbers + .Where(f => !string.IsNullOrEmpty(f)) + .Distinct() + .ToList(); + + if (fieldsToSet.Count == 0) + throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldNumbers)); + + fieldsToSet = fieldsToSet + .Where(f => optionObject.Forms.Any(form => form.IsFieldPresent(f))) + .ToList(); + + if (fieldsToSet.Count == 0) + throw new ArgumentException(NoMatchingFieldObjectsMessage, nameof(fieldNumbers)); + foreach (var form in optionObject.Forms) { - form.SetDisabledFields(fieldNumbers); + form.SetDisabledFields(fieldsToSet); } return optionObject; @@ -144,9 +186,18 @@ 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)) + if (fieldNumber == null) + throw new ArgumentNullException(nameof(fieldNumber)); + + if (fieldNumber.Length == 0) + throw new ArgumentException(FieldNumberCannotBeEmptyMessage, nameof(fieldNumber)); + + if (optionObject == null || optionObject.Forms == null) return optionObject; + if (!optionObject.Forms.Any(f => f.IsFieldPresent(fieldNumber))) + throw new ArgumentException(NoMatchingFieldObjectsMessage, nameof(fieldNumber)); + foreach (var form in optionObject.Forms) { form.SetEnabledField(fieldNumber); @@ -163,14 +214,21 @@ 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; + if (fieldObjects == null) + throw new ArgumentNullException(nameof(fieldObjects)); + + if (fieldObjects.Count == 0) + throw new ArgumentException(NoFieldObjectsProvidedMessage, nameof(fieldObjects)); var fieldNumbers = fieldObjects .Where(f => !string.IsNullOrEmpty(f?.FieldNumber)) .Select(f => f.FieldNumber) + .Distinct() .ToList(); + if (fieldNumbers.Count == 0) + throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldObjects)); + return optionObject.SetEnabledFields(fieldNumbers); } @@ -182,12 +240,221 @@ 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) + if (fieldNumbers == null) + throw new ArgumentNullException(nameof(fieldNumbers)); + + if (fieldNumbers.Count == 0) + throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldNumbers)); + + if (optionObject == null || optionObject.Forms == null) return optionObject; + var fieldsToSet = fieldNumbers + .Where(f => !string.IsNullOrEmpty(f)) + .Distinct() + .ToList(); + + if (fieldsToSet.Count == 0) + throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldNumbers)); + + fieldsToSet = fieldsToSet + .Where(f => optionObject.Forms.Any(form => form.IsFieldPresent(f))) + .ToList(); + + if (fieldsToSet.Count == 0) + throw new ArgumentException(NoMatchingFieldObjectsMessage, nameof(fieldNumbers)); + + foreach (var form in optionObject.Forms) + { + form.SetEnabledFields(fieldsToSet); + } + + 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) + { + if (fieldNumber == null) + throw new ArgumentNullException(nameof(fieldNumber)); + + if (fieldNumber.Length == 0) + throw new ArgumentException(FieldNumberCannotBeEmptyMessage, nameof(fieldNumber)); + + if (optionObject == null || optionObject.Forms == null) + return optionObject; + + if (!optionObject.Forms.Any(f => f.IsFieldPresent(fieldNumber))) + throw new ArgumentException(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) + { + if (fieldObjects == null) + throw new ArgumentNullException(nameof(fieldObjects)); + + if (fieldObjects.Count == 0) + throw new ArgumentException(NoFieldObjectsProvidedMessage, nameof(fieldObjects)); + + var fieldNumbers = fieldObjects + .Where(f => !string.IsNullOrEmpty(f?.FieldNumber)) + .Select(f => f.FieldNumber) + .Distinct() + .ToList(); + + if (fieldNumbers.Count == 0) + throw new ArgumentException(NoFieldNumbersProvidedMessage, 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) + { + if (fieldNumbers == null) + throw new ArgumentNullException(nameof(fieldNumbers)); + + if (fieldNumbers.Count == 0) + throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldNumbers)); + + if (optionObject == null || optionObject.Forms == null) + return optionObject; + + var fieldsToSet = fieldNumbers + .Where(f => !string.IsNullOrEmpty(f)) + .Distinct() + .ToList(); + + if (fieldsToSet.Count == 0) + throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldNumbers)); + + fieldsToSet = fieldsToSet + .Where(f => optionObject.Forms.Any(form => form.IsFieldPresent(f))) + .ToList(); + + if (fieldsToSet.Count == 0) + throw new ArgumentException(NoMatchingFieldObjectsMessage, nameof(fieldNumbers)); + + foreach (var form in optionObject.Forms) + { + form.SetLockedFields(fieldsToSet); + } + + 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) + { + if (fieldNumber == null) + throw new ArgumentNullException(nameof(fieldNumber)); + + if (fieldNumber.Length == 0) + throw new ArgumentException(FieldNumberCannotBeEmptyMessage, nameof(fieldNumber)); + + if (optionObject == null || optionObject.Forms == null) + return optionObject; + + if (!optionObject.Forms.Any(f => f.IsFieldPresent(fieldNumber))) + throw new ArgumentException(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) + { + if (fieldObjects == null) + throw new ArgumentNullException(nameof(fieldObjects)); + + if (fieldObjects.Count == 0) + throw new ArgumentException(NoFieldObjectsProvidedMessage, nameof(fieldObjects)); + + var fieldNumbers = fieldObjects + .Where(f => !string.IsNullOrEmpty(f?.FieldNumber)) + .Select(f => f.FieldNumber) + .Distinct() + .ToList(); + + if (fieldNumbers.Count == 0) + throw new ArgumentException(NoFieldNumbersProvidedMessage, 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) + { + if (fieldNumbers == null) + throw new ArgumentNullException(nameof(fieldNumbers)); + + if (fieldNumbers.Count == 0) + throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldNumbers)); + + if (optionObject == null || optionObject.Forms == null) + return optionObject; + + var fieldsToSet = fieldNumbers + .Where(f => !string.IsNullOrEmpty(f)) + .Distinct() + .ToList(); + + if (fieldsToSet.Count == 0) + throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldNumbers)); + + fieldsToSet = fieldsToSet + .Where(f => optionObject.Forms.Any(form => form.IsFieldPresent(f))) + .ToList(); + + if (fieldsToSet.Count == 0) + throw new ArgumentException(NoMatchingFieldObjectsMessage, nameof(fieldNumbers)); + foreach (var form in optionObject.Forms) { - form.SetEnabledFields(fieldNumbers); + form.SetUnlockedFields(fieldsToSet); } return optionObject; diff --git a/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/OptionObject2Helpers.cs b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/OptionObject2Helpers.cs index fd0d4d7..41d6e7c 100644 --- a/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/OptionObject2Helpers.cs +++ b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/OptionObject2Helpers.cs @@ -9,6 +9,11 @@ namespace RarelySimple.AvatarScriptLink.Objects.Helpers /// public static class OptionObject2Helpers { + private 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."; + /// /// Gets the entity ID of an . /// @@ -67,9 +72,18 @@ 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)) + if (fieldNumber == null) + throw new ArgumentNullException(nameof(fieldNumber)); + + if (fieldNumber.Length == 0) + throw new ArgumentException(FieldNumberCannotBeEmptyMessage, nameof(fieldNumber)); + + if (optionObject == null || optionObject.Forms == null) return optionObject; + if (!optionObject.Forms.Any(f => f.IsFieldPresent(fieldNumber))) + throw new ArgumentException(NoMatchingFieldObjectsMessage, nameof(fieldNumber)); + foreach (var form in optionObject.Forms) { form.SetDisabledField(fieldNumber); @@ -86,14 +100,21 @@ 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; + if (fieldObjects == null) + throw new ArgumentNullException(nameof(fieldObjects)); + + if (fieldObjects.Count == 0) + throw new ArgumentException(NoFieldObjectsProvidedMessage, nameof(fieldObjects)); var fieldNumbers = fieldObjects .Where(f => !string.IsNullOrEmpty(f?.FieldNumber)) .Select(f => f.FieldNumber) + .Distinct() .ToList(); + if (fieldNumbers.Count == 0) + throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldObjects)); + return optionObject.SetDisabledFields(fieldNumbers); } @@ -105,12 +126,33 @@ 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) + if (fieldNumbers == null) + throw new ArgumentNullException(nameof(fieldNumbers)); + + if (fieldNumbers.Count == 0) + throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldNumbers)); + + if (optionObject == null || optionObject.Forms == null) return optionObject; + var fieldsToSet = fieldNumbers + .Where(f => !string.IsNullOrEmpty(f)) + .Distinct() + .ToList(); + + if (fieldsToSet.Count == 0) + throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldNumbers)); + + fieldsToSet = fieldsToSet + .Where(f => optionObject.Forms.Any(form => form.IsFieldPresent(f))) + .ToList(); + + if (fieldsToSet.Count == 0) + throw new ArgumentException(NoMatchingFieldObjectsMessage, nameof(fieldNumbers)); + foreach (var form in optionObject.Forms) { - form.SetDisabledFields(fieldNumbers); + form.SetDisabledFields(fieldsToSet); } return optionObject; @@ -124,9 +166,18 @@ 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)) + if (fieldNumber == null) + throw new ArgumentNullException(nameof(fieldNumber)); + + if (fieldNumber.Length == 0) + throw new ArgumentException(FieldNumberCannotBeEmptyMessage, nameof(fieldNumber)); + + if (optionObject == null || optionObject.Forms == null) return optionObject; + if (!optionObject.Forms.Any(f => f.IsFieldPresent(fieldNumber))) + throw new ArgumentException(NoMatchingFieldObjectsMessage, nameof(fieldNumber)); + foreach (var form in optionObject.Forms) { form.SetEnabledField(fieldNumber); @@ -143,14 +194,21 @@ 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; + if (fieldObjects == null) + throw new ArgumentNullException(nameof(fieldObjects)); + + if (fieldObjects.Count == 0) + throw new ArgumentException(NoFieldObjectsProvidedMessage, nameof(fieldObjects)); var fieldNumbers = fieldObjects .Where(f => !string.IsNullOrEmpty(f?.FieldNumber)) .Select(f => f.FieldNumber) + .Distinct() .ToList(); + if (fieldNumbers.Count == 0) + throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldObjects)); + return optionObject.SetEnabledFields(fieldNumbers); } @@ -162,12 +220,221 @@ 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) + if (fieldNumbers == null) + throw new ArgumentNullException(nameof(fieldNumbers)); + + if (fieldNumbers.Count == 0) + throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldNumbers)); + + if (optionObject == null || optionObject.Forms == null) return optionObject; + var fieldsToSet = fieldNumbers + .Where(f => !string.IsNullOrEmpty(f)) + .Distinct() + .ToList(); + + if (fieldsToSet.Count == 0) + throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldNumbers)); + + fieldsToSet = fieldsToSet + .Where(f => optionObject.Forms.Any(form => form.IsFieldPresent(f))) + .ToList(); + + if (fieldsToSet.Count == 0) + throw new ArgumentException(NoMatchingFieldObjectsMessage, nameof(fieldNumbers)); + + foreach (var form in optionObject.Forms) + { + form.SetEnabledFields(fieldsToSet); + } + + 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) + { + if (fieldNumber == null) + throw new ArgumentNullException(nameof(fieldNumber)); + + if (fieldNumber.Length == 0) + throw new ArgumentException(FieldNumberCannotBeEmptyMessage, nameof(fieldNumber)); + + if (optionObject == null || optionObject.Forms == null) + return optionObject; + + if (!optionObject.Forms.Any(f => f.IsFieldPresent(fieldNumber))) + throw new ArgumentException(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) + { + if (fieldObjects == null) + throw new ArgumentNullException(nameof(fieldObjects)); + + if (fieldObjects.Count == 0) + throw new ArgumentException(NoFieldObjectsProvidedMessage, nameof(fieldObjects)); + + var fieldNumbers = fieldObjects + .Where(f => !string.IsNullOrEmpty(f?.FieldNumber)) + .Select(f => f.FieldNumber) + .Distinct() + .ToList(); + + if (fieldNumbers.Count == 0) + throw new ArgumentException(NoFieldNumbersProvidedMessage, 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) + { + if (fieldNumbers == null) + throw new ArgumentNullException(nameof(fieldNumbers)); + + if (fieldNumbers.Count == 0) + throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldNumbers)); + + if (optionObject == null || optionObject.Forms == null) + return optionObject; + + var fieldsToSet = fieldNumbers + .Where(f => !string.IsNullOrEmpty(f)) + .Distinct() + .ToList(); + + if (fieldsToSet.Count == 0) + throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldNumbers)); + + fieldsToSet = fieldsToSet + .Where(f => optionObject.Forms.Any(form => form.IsFieldPresent(f))) + .ToList(); + + if (fieldsToSet.Count == 0) + throw new ArgumentException(NoMatchingFieldObjectsMessage, nameof(fieldNumbers)); + + foreach (var form in optionObject.Forms) + { + form.SetLockedFields(fieldsToSet); + } + + 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) + { + if (fieldNumber == null) + throw new ArgumentNullException(nameof(fieldNumber)); + + if (fieldNumber.Length == 0) + throw new ArgumentException(FieldNumberCannotBeEmptyMessage, nameof(fieldNumber)); + + if (optionObject == null || optionObject.Forms == null) + return optionObject; + + if (!optionObject.Forms.Any(f => f.IsFieldPresent(fieldNumber))) + throw new ArgumentException(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) + { + if (fieldObjects == null) + throw new ArgumentNullException(nameof(fieldObjects)); + + if (fieldObjects.Count == 0) + throw new ArgumentException(NoFieldObjectsProvidedMessage, nameof(fieldObjects)); + + var fieldNumbers = fieldObjects + .Where(f => !string.IsNullOrEmpty(f?.FieldNumber)) + .Select(f => f.FieldNumber) + .Distinct() + .ToList(); + + if (fieldNumbers.Count == 0) + throw new ArgumentException(NoFieldNumbersProvidedMessage, 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) + { + if (fieldNumbers == null) + throw new ArgumentNullException(nameof(fieldNumbers)); + + if (fieldNumbers.Count == 0) + throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldNumbers)); + + if (optionObject == null || optionObject.Forms == null) + return optionObject; + + var fieldsToSet = fieldNumbers + .Where(f => !string.IsNullOrEmpty(f)) + .Distinct() + .ToList(); + + if (fieldsToSet.Count == 0) + throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldNumbers)); + + fieldsToSet = fieldsToSet + .Where(f => optionObject.Forms.Any(form => form.IsFieldPresent(f))) + .ToList(); + + if (fieldsToSet.Count == 0) + throw new ArgumentException(NoMatchingFieldObjectsMessage, nameof(fieldNumbers)); + foreach (var form in optionObject.Forms) { - form.SetEnabledFields(fieldNumbers); + form.SetUnlockedFields(fieldsToSet); } return optionObject; diff --git a/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/OptionObjectHelpers.cs b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/OptionObjectHelpers.cs index d79e5fc..5b808e8 100644 --- a/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/OptionObjectHelpers.cs +++ b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/OptionObjectHelpers.cs @@ -9,6 +9,11 @@ namespace RarelySimple.AvatarScriptLink.Objects.Helpers /// public static class OptionObjectHelpers { + private 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."; + /// /// Gets the entity ID of an . /// @@ -237,9 +242,18 @@ 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)) + if (fieldNumber == null) + throw new ArgumentNullException(nameof(fieldNumber)); + + if (fieldNumber.Length == 0) + throw new ArgumentException(FieldNumberCannotBeEmptyMessage, nameof(fieldNumber)); + + if (optionObject == null || optionObject.Forms == null) return optionObject; + if (!optionObject.Forms.Any(f => f.IsFieldPresent(fieldNumber))) + throw new ArgumentException(NoMatchingFieldObjectsMessage, nameof(fieldNumber)); + foreach (var form in optionObject.Forms) { form.SetDisabledField(fieldNumber); @@ -256,14 +270,21 @@ 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; + if (fieldObjects == null) + throw new ArgumentNullException(nameof(fieldObjects)); + + if (fieldObjects.Count == 0) + throw new ArgumentException(NoFieldObjectsProvidedMessage, nameof(fieldObjects)); var fieldNumbers = fieldObjects .Where(f => !string.IsNullOrEmpty(f?.FieldNumber)) .Select(f => f.FieldNumber) + .Distinct() .ToList(); + if (fieldNumbers.Count == 0) + throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldObjects)); + return optionObject.SetDisabledFields(fieldNumbers); } @@ -275,12 +296,33 @@ 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) + if (fieldNumbers == null) + throw new ArgumentNullException(nameof(fieldNumbers)); + + if (fieldNumbers.Count == 0) + throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldNumbers)); + + if (optionObject == null || optionObject.Forms == null) return optionObject; + var fieldsToSet = fieldNumbers + .Where(f => !string.IsNullOrEmpty(f)) + .Distinct() + .ToList(); + + if (fieldsToSet.Count == 0) + throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldNumbers)); + + fieldsToSet = fieldsToSet + .Where(f => optionObject.Forms.Any(form => form.IsFieldPresent(f))) + .ToList(); + + if (fieldsToSet.Count == 0) + throw new ArgumentException(NoMatchingFieldObjectsMessage, nameof(fieldNumbers)); + foreach (var form in optionObject.Forms) { - form.SetDisabledFields(fieldNumbers); + form.SetDisabledFields(fieldsToSet); } return optionObject; @@ -294,9 +336,18 @@ 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)) + if (fieldNumber == null) + throw new ArgumentNullException(nameof(fieldNumber)); + + if (fieldNumber.Length == 0) + throw new ArgumentException(FieldNumberCannotBeEmptyMessage, nameof(fieldNumber)); + + if (optionObject == null || optionObject.Forms == null) return optionObject; + if (!optionObject.Forms.Any(f => f.IsFieldPresent(fieldNumber))) + throw new ArgumentException(NoMatchingFieldObjectsMessage, nameof(fieldNumber)); + foreach (var form in optionObject.Forms) { form.SetEnabledField(fieldNumber); @@ -313,14 +364,21 @@ 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; + if (fieldObjects == null) + throw new ArgumentNullException(nameof(fieldObjects)); + + if (fieldObjects.Count == 0) + throw new ArgumentException(NoFieldObjectsProvidedMessage, nameof(fieldObjects)); var fieldNumbers = fieldObjects .Where(f => !string.IsNullOrEmpty(f?.FieldNumber)) .Select(f => f.FieldNumber) + .Distinct() .ToList(); + if (fieldNumbers.Count == 0) + throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldObjects)); + return optionObject.SetEnabledFields(fieldNumbers); } @@ -332,12 +390,221 @@ 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) + if (fieldNumbers == null) + throw new ArgumentNullException(nameof(fieldNumbers)); + + if (fieldNumbers.Count == 0) + throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldNumbers)); + + if (optionObject == null || optionObject.Forms == null) + return optionObject; + + var fieldsToSet = fieldNumbers + .Where(f => !string.IsNullOrEmpty(f)) + .Distinct() + .ToList(); + + if (fieldsToSet.Count == 0) + throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldNumbers)); + + fieldsToSet = fieldsToSet + .Where(f => optionObject.Forms.Any(form => form.IsFieldPresent(f))) + .ToList(); + + if (fieldsToSet.Count == 0) + throw new ArgumentException(NoMatchingFieldObjectsMessage, nameof(fieldNumbers)); + + foreach (var form in optionObject.Forms) + { + form.SetEnabledFields(fieldsToSet); + } + + 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) + { + if (fieldNumber == null) + throw new ArgumentNullException(nameof(fieldNumber)); + + if (fieldNumber.Length == 0) + throw new ArgumentException(FieldNumberCannotBeEmptyMessage, nameof(fieldNumber)); + + if (optionObject == null || optionObject.Forms == null) return optionObject; + if (!optionObject.Forms.Any(f => f.IsFieldPresent(fieldNumber))) + throw new ArgumentException(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) + { + if (fieldObjects == null) + throw new ArgumentNullException(nameof(fieldObjects)); + + if (fieldObjects.Count == 0) + throw new ArgumentException(NoFieldObjectsProvidedMessage, nameof(fieldObjects)); + + var fieldNumbers = fieldObjects + .Where(f => !string.IsNullOrEmpty(f?.FieldNumber)) + .Select(f => f.FieldNumber) + .Distinct() + .ToList(); + + if (fieldNumbers.Count == 0) + throw new ArgumentException(NoFieldNumbersProvidedMessage, 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) + { + if (fieldNumbers == null) + throw new ArgumentNullException(nameof(fieldNumbers)); + + if (fieldNumbers.Count == 0) + throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldNumbers)); + + if (optionObject == null || optionObject.Forms == null) + return optionObject; + + var fieldsToSet = fieldNumbers + .Where(f => !string.IsNullOrEmpty(f)) + .Distinct() + .ToList(); + + if (fieldsToSet.Count == 0) + throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldNumbers)); + + fieldsToSet = fieldsToSet + .Where(f => optionObject.Forms.Any(form => form.IsFieldPresent(f))) + .ToList(); + + if (fieldsToSet.Count == 0) + throw new ArgumentException(NoMatchingFieldObjectsMessage, nameof(fieldNumbers)); + + foreach (var form in optionObject.Forms) + { + form.SetLockedFields(fieldsToSet); + } + + 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) + { + if (fieldNumber == null) + throw new ArgumentNullException(nameof(fieldNumber)); + + if (fieldNumber.Length == 0) + throw new ArgumentException(FieldNumberCannotBeEmptyMessage, nameof(fieldNumber)); + + if (optionObject == null || optionObject.Forms == null) + return optionObject; + + if (!optionObject.Forms.Any(f => f.IsFieldPresent(fieldNumber))) + throw new ArgumentException(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) + { + if (fieldObjects == null) + throw new ArgumentNullException(nameof(fieldObjects)); + + if (fieldObjects.Count == 0) + throw new ArgumentException(NoFieldObjectsProvidedMessage, nameof(fieldObjects)); + + var fieldNumbers = fieldObjects + .Where(f => !string.IsNullOrEmpty(f?.FieldNumber)) + .Select(f => f.FieldNumber) + .Distinct() + .ToList(); + + if (fieldNumbers.Count == 0) + throw new ArgumentException(NoFieldNumbersProvidedMessage, 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) + { + if (fieldNumbers == null) + throw new ArgumentNullException(nameof(fieldNumbers)); + + if (fieldNumbers.Count == 0) + throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldNumbers)); + + if (optionObject == null || optionObject.Forms == null) + return optionObject; + + var fieldsToSet = fieldNumbers + .Where(f => !string.IsNullOrEmpty(f)) + .Distinct() + .ToList(); + + if (fieldsToSet.Count == 0) + throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldNumbers)); + + fieldsToSet = fieldsToSet + .Where(f => optionObject.Forms.Any(form => form.IsFieldPresent(f))) + .ToList(); + + if (fieldsToSet.Count == 0) + throw new ArgumentException(NoMatchingFieldObjectsMessage, nameof(fieldNumbers)); + foreach (var form in optionObject.Forms) { - form.SetEnabledFields(fieldNumbers); + form.SetUnlockedFields(fieldsToSet); } return optionObject; diff --git a/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/RowObjectHelpers.cs b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/RowObjectHelpers.cs index d470789..60c2c08 100644 --- a/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/RowObjectHelpers.cs +++ b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/RowObjectHelpers.cs @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; using System.Linq; using RarelySimple.AvatarScriptLink.Objects.Helpers.Manipulators; @@ -9,6 +10,10 @@ namespace RarelySimple.AvatarScriptLink.Objects.Helpers /// public static class RowObjectHelpers { + private const string NoMatchingFieldObjectsMessage = "No matching field objects were found."; + private const string NoFieldNumbersProvidedMessage = "No field numbers were provided."; + private const string FieldNumberCannotBeEmptyMessage = "Field number cannot be empty."; + /// /// Gets the row ID of a . /// @@ -204,12 +209,18 @@ 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)) + if (fieldNumber == null) + throw new ArgumentNullException(nameof(fieldNumber)); + + if (fieldNumber.Length == 0) + throw new ArgumentException(FieldNumberCannotBeEmptyMessage, 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(NoMatchingFieldObjectsMessage, nameof(fieldNumber)); var changed = field.IsEnabled(); field.Disable(); @@ -228,11 +239,28 @@ 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) + if (fieldNumbers == null) + throw new ArgumentNullException(nameof(fieldNumbers)); + + if (fieldNumbers.Count == 0) + throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldNumbers)); + + if (rowObject == null || rowObject.Fields == null) return rowObject; + var fieldsToSet = fieldNumbers + .Where(f => !string.IsNullOrEmpty(f)) + .Distinct() + .ToList(); + + if (fieldsToSet.Count == 0) + throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldNumbers)); + + if (!rowObject.Fields.Any(f => fieldsToSet.Contains(f.FieldNumber))) + throw new ArgumentException(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 +283,18 @@ 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)) + if (fieldNumber == null) + throw new ArgumentNullException(nameof(fieldNumber)); + + if (fieldNumber.Length == 0) + throw new ArgumentException(FieldNumberCannotBeEmptyMessage, 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(NoMatchingFieldObjectsMessage, nameof(fieldNumber)); var changed = !field.IsEnabled(); field.Enable(); @@ -279,11 +313,28 @@ 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) + if (fieldNumbers == null) + throw new ArgumentNullException(nameof(fieldNumbers)); + + if (fieldNumbers.Count == 0) + throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldNumbers)); + + if (rowObject == null || rowObject.Fields == null) return rowObject; + var fieldsToSet = fieldNumbers + .Where(f => !string.IsNullOrEmpty(f)) + .Distinct() + .ToList(); + + if (fieldsToSet.Count == 0) + throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldNumbers)); + + if (!rowObject.Fields.Any(f => fieldsToSet.Contains(f.FieldNumber))) + throw new ArgumentException(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 +349,156 @@ 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) + { + if (fieldNumber == null) + throw new ArgumentNullException(nameof(fieldNumber)); + + if (fieldNumber.Length == 0) + throw new ArgumentException(FieldNumberCannotBeEmptyMessage, 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(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) + { + if (fieldNumbers == null) + throw new ArgumentNullException(nameof(fieldNumbers)); + + if (fieldNumbers.Count == 0) + throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldNumbers)); + + if (rowObject == null || rowObject.Fields == null) + return rowObject; + + var fieldsToSet = fieldNumbers + .Where(f => !string.IsNullOrEmpty(f)) + .Distinct() + .ToList(); + + if (fieldsToSet.Count == 0) + throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldNumbers)); + + if (!rowObject.Fields.Any(f => fieldsToSet.Contains(f.FieldNumber))) + throw new ArgumentException(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) + { + if (fieldNumber == null) + throw new ArgumentNullException(nameof(fieldNumber)); + + if (fieldNumber.Length == 0) + throw new ArgumentException(FieldNumberCannotBeEmptyMessage, 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(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) + { + if (fieldNumbers == null) + throw new ArgumentNullException(nameof(fieldNumbers)); + + if (fieldNumbers.Count == 0) + throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldNumbers)); + + if (rowObject == null || rowObject.Fields == null) + return rowObject; + + var fieldsToSet = fieldNumbers + .Where(f => !string.IsNullOrEmpty(f)) + .Distinct() + .ToList(); + + if (fieldsToSet.Count == 0) + throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldNumbers)); + + if (!rowObject.Fields.Any(f => fieldsToSet.Contains(f.FieldNumber))) + throw new ArgumentException(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 . /// From c5ec43ca46f03e0f68cec78399d086d6faaddae8 Mon Sep 17 00:00:00 2001 From: Scott Olson Jr Date: Sat, 7 Mar 2026 06:51:15 -0800 Subject: [PATCH 2/3] Refactor argument validation in OptionObject and RowObject helpers - Introduced a new ArgumentGuards class to centralize validation logic for field numbers and field objects. - Replaced inline validation code in OptionObject2Helpers, OptionObjectHelpers, and RowObjectHelpers with calls to ArgumentGuards methods. - Removed redundant constant messages from helper classes, utilizing those defined in ArgumentGuards instead. - Improved code readability and maintainability by consolidating validation logic. --- .../ArgumentGuardsTests.cs | 119 +++++++++++++ .../FormObjectHelpersTests.cs | 50 ++++++ .../OptionObjectHelpers.OptionObject.Tests.cs | 48 ++++++ ...OptionObjectHelpers.OptionObject2.Tests.cs | 48 ++++++ ...ionObjectHelpers.OptionObject2015.Tests.cs | 48 ++++++ .../RowObjectHelpersTests.cs | 50 ++++++ .../FormObjectHelpers.cs | 101 ++--------- .../OptionObject2015Helpers.cs | 162 +++--------------- .../OptionObject2Helpers.cs | 162 +++--------------- .../OptionObjectHelpers.cs | 162 +++--------------- .../RowObjectHelpers.cs | 101 ++--------- .../Validators/ArgumentGuards.cs | 65 +++++++ 12 files changed, 525 insertions(+), 591 deletions(-) create mode 100644 dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/ArgumentGuardsTests.cs create mode 100644 dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/Validators/ArgumentGuards.cs 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 c728473..fb479dc 100644 --- a/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/FormObjectHelpersTests.cs +++ b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/FormObjectHelpersTests.cs @@ -7,6 +7,56 @@ 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 IsRowPresent_FormObject_WithCurrentRow_ReturnsTrue() { diff --git a/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/OptionObjectHelpers.OptionObject.Tests.cs b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/OptionObjectHelpers.OptionObject.Tests.cs index 96ca5df..05752b1 100644 --- a/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/OptionObjectHelpers.OptionObject.Tests.cs +++ b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/OptionObjectHelpers.OptionObject.Tests.cs @@ -6,6 +6,54 @@ namespace RarelySimple.AvatarScriptLink.Objects.Helpers.Tests [TestClass] public class OptionObjectHelpersOptionObjectTests { + [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); + } + [TestMethod] public void GetCurrentRowId_OptionObject_ReturnsCurrentRowId() { diff --git a/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/OptionObjectHelpers.OptionObject2.Tests.cs b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/OptionObjectHelpers.OptionObject2.Tests.cs index bc03a79..e89b920 100644 --- a/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/OptionObjectHelpers.OptionObject2.Tests.cs +++ b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/OptionObjectHelpers.OptionObject2.Tests.cs @@ -6,6 +6,54 @@ namespace RarelySimple.AvatarScriptLink.Objects.Helpers.Tests [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); + } + [TestMethod] public void GetEntityId_OptionObject2_ReturnsEntityId() { diff --git a/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/OptionObjectHelpers.OptionObject2015.Tests.cs b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/OptionObjectHelpers.OptionObject2015.Tests.cs index 768c998..ed0b775 100644 --- a/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/OptionObjectHelpers.OptionObject2015.Tests.cs +++ b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/OptionObjectHelpers.OptionObject2015.Tests.cs @@ -6,6 +6,54 @@ namespace RarelySimple.AvatarScriptLink.Objects.Helpers.Tests [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); + } + [TestMethod] public void GetEntityId_OptionObject2015_ReturnsEntityId() { diff --git a/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/RowObjectHelpersTests.cs b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/RowObjectHelpersTests.cs index 178b8ef..5b4a34d 100644 --- a/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/RowObjectHelpersTests.cs +++ b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/RowObjectHelpersTests.cs @@ -7,6 +7,56 @@ 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_RowObject_WithRowId_ReturnsRowId() { diff --git a/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/FormObjectHelpers.cs b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/FormObjectHelpers.cs index cd276a6..659c456 100644 --- a/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/FormObjectHelpers.cs +++ b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/FormObjectHelpers.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 { @@ -9,10 +10,6 @@ namespace RarelySimple.AvatarScriptLink.Objects.Helpers /// public static class FormObjectHelpers { - private const string NoMatchingFieldObjectsMessage = "No matching field objects were found."; - private const string NoFieldNumbersProvidedMessage = "No field numbers were provided."; - private const string FieldNumberCannotBeEmptyMessage = "Field number cannot be empty."; - /// /// Gets the form ID of a . /// @@ -321,11 +318,7 @@ public static bool IsRowPresent(this FormObject formObject, string rowId) /// The modified FormObject. public static FormObject? SetDisabledField(this FormObject formObject, string fieldNumber) { - if (fieldNumber == null) - throw new ArgumentNullException(nameof(fieldNumber)); - - if (fieldNumber.Length == 0) - throw new ArgumentException(FieldNumberCannotBeEmptyMessage, nameof(fieldNumber)); + ArgumentGuards.ValidateFieldNumber(fieldNumber, nameof(fieldNumber)); if (formObject == null || formObject.CurrentRow == null) return formObject; @@ -334,7 +327,7 @@ public static bool IsRowPresent(this FormObject formObject, string rowId) || (formObject.MultipleIteration && formObject.HasOtherRows() && formObject.OtherRows.Any(r => r.IsFieldPresent(fieldNumber))); if (!hasFieldInForm) - throw new ArgumentException(NoMatchingFieldObjectsMessage, nameof(fieldNumber)); + throw new ArgumentException(ArgumentGuards.NoMatchingFieldObjectsMessage, nameof(fieldNumber)); formObject.CurrentRow.SetDisabledField(fieldNumber); @@ -357,28 +350,16 @@ public static bool IsRowPresent(this FormObject formObject, string rowId) /// The modified FormObject. public static FormObject? SetDisabledFields(this FormObject formObject, List? fieldNumbers) { - if (fieldNumbers == null) - throw new ArgumentNullException(nameof(fieldNumbers)); - - if (fieldNumbers.Count == 0) - throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldNumbers)); + var fieldsToSet = ArgumentGuards.ValidateAndNormalizeFieldNumbers(fieldNumbers, nameof(fieldNumbers)); if (formObject == null || formObject.CurrentRow == null) return formObject; - var fieldsToSet = fieldNumbers - .Where(f => !string.IsNullOrEmpty(f)) - .Distinct() - .ToList(); - - if (fieldsToSet.Count == 0) - throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(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(NoMatchingFieldObjectsMessage, nameof(fieldNumbers)); + throw new ArgumentException(ArgumentGuards.NoMatchingFieldObjectsMessage, nameof(fieldNumbers)); formObject.CurrentRow.SetDisabledFields(fieldsToSet); @@ -401,11 +382,7 @@ public static bool IsRowPresent(this FormObject formObject, string rowId) /// The modified FormObject. public static FormObject? SetEnabledField(this FormObject formObject, string fieldNumber) { - if (fieldNumber == null) - throw new ArgumentNullException(nameof(fieldNumber)); - - if (fieldNumber.Length == 0) - throw new ArgumentException(FieldNumberCannotBeEmptyMessage, nameof(fieldNumber)); + ArgumentGuards.ValidateFieldNumber(fieldNumber, nameof(fieldNumber)); if (formObject == null || formObject.CurrentRow == null) return formObject; @@ -414,7 +391,7 @@ public static bool IsRowPresent(this FormObject formObject, string rowId) || (formObject.MultipleIteration && formObject.HasOtherRows() && formObject.OtherRows.Any(r => r.IsFieldPresent(fieldNumber))); if (!hasFieldInForm) - throw new ArgumentException(NoMatchingFieldObjectsMessage, nameof(fieldNumber)); + throw new ArgumentException(ArgumentGuards.NoMatchingFieldObjectsMessage, nameof(fieldNumber)); formObject.CurrentRow.SetEnabledField(fieldNumber); @@ -437,28 +414,16 @@ public static bool IsRowPresent(this FormObject formObject, string rowId) /// The modified FormObject. public static FormObject? SetEnabledFields(this FormObject formObject, List? fieldNumbers) { - if (fieldNumbers == null) - throw new ArgumentNullException(nameof(fieldNumbers)); - - if (fieldNumbers.Count == 0) - throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldNumbers)); + var fieldsToSet = ArgumentGuards.ValidateAndNormalizeFieldNumbers(fieldNumbers, nameof(fieldNumbers)); if (formObject == null || formObject.CurrentRow == null) return formObject; - var fieldsToSet = fieldNumbers - .Where(f => !string.IsNullOrEmpty(f)) - .Distinct() - .ToList(); - - if (fieldsToSet.Count == 0) - throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(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(NoMatchingFieldObjectsMessage, nameof(fieldNumbers)); + throw new ArgumentException(ArgumentGuards.NoMatchingFieldObjectsMessage, nameof(fieldNumbers)); formObject.CurrentRow.SetEnabledFields(fieldsToSet); @@ -481,11 +446,7 @@ public static bool IsRowPresent(this FormObject formObject, string rowId) /// The modified FormObject. public static FormObject? SetLockedField(this FormObject formObject, string fieldNumber) { - if (fieldNumber == null) - throw new ArgumentNullException(nameof(fieldNumber)); - - if (fieldNumber.Length == 0) - throw new ArgumentException(FieldNumberCannotBeEmptyMessage, nameof(fieldNumber)); + ArgumentGuards.ValidateFieldNumber(fieldNumber, nameof(fieldNumber)); if (formObject == null || formObject.CurrentRow == null) return formObject; @@ -494,7 +455,7 @@ public static bool IsRowPresent(this FormObject formObject, string rowId) || (formObject.MultipleIteration && formObject.HasOtherRows() && formObject.OtherRows.Any(r => r.IsFieldPresent(fieldNumber))); if (!hasFieldInForm) - throw new ArgumentException(NoMatchingFieldObjectsMessage, nameof(fieldNumber)); + throw new ArgumentException(ArgumentGuards.NoMatchingFieldObjectsMessage, nameof(fieldNumber)); formObject.CurrentRow.SetLockedField(fieldNumber); @@ -517,28 +478,16 @@ public static bool IsRowPresent(this FormObject formObject, string rowId) /// The modified FormObject. public static FormObject? SetLockedFields(this FormObject formObject, List? fieldNumbers) { - if (fieldNumbers == null) - throw new ArgumentNullException(nameof(fieldNumbers)); - - if (fieldNumbers.Count == 0) - throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldNumbers)); + var fieldsToSet = ArgumentGuards.ValidateAndNormalizeFieldNumbers(fieldNumbers, nameof(fieldNumbers)); if (formObject == null || formObject.CurrentRow == null) return formObject; - var fieldsToSet = fieldNumbers - .Where(f => !string.IsNullOrEmpty(f)) - .Distinct() - .ToList(); - - if (fieldsToSet.Count == 0) - throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(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(NoMatchingFieldObjectsMessage, nameof(fieldNumbers)); + throw new ArgumentException(ArgumentGuards.NoMatchingFieldObjectsMessage, nameof(fieldNumbers)); formObject.CurrentRow.SetLockedFields(fieldsToSet); @@ -561,11 +510,7 @@ public static bool IsRowPresent(this FormObject formObject, string rowId) /// The modified FormObject. public static FormObject? SetUnlockedField(this FormObject formObject, string fieldNumber) { - if (fieldNumber == null) - throw new ArgumentNullException(nameof(fieldNumber)); - - if (fieldNumber.Length == 0) - throw new ArgumentException(FieldNumberCannotBeEmptyMessage, nameof(fieldNumber)); + ArgumentGuards.ValidateFieldNumber(fieldNumber, nameof(fieldNumber)); if (formObject == null || formObject.CurrentRow == null) return formObject; @@ -574,7 +519,7 @@ public static bool IsRowPresent(this FormObject formObject, string rowId) || (formObject.MultipleIteration && formObject.HasOtherRows() && formObject.OtherRows.Any(r => r.IsFieldPresent(fieldNumber))); if (!hasFieldInForm) - throw new ArgumentException(NoMatchingFieldObjectsMessage, nameof(fieldNumber)); + throw new ArgumentException(ArgumentGuards.NoMatchingFieldObjectsMessage, nameof(fieldNumber)); formObject.CurrentRow.SetUnlockedField(fieldNumber); @@ -597,28 +542,16 @@ public static bool IsRowPresent(this FormObject formObject, string rowId) /// The modified FormObject. public static FormObject? SetUnlockedFields(this FormObject formObject, List? fieldNumbers) { - if (fieldNumbers == null) - throw new ArgumentNullException(nameof(fieldNumbers)); - - if (fieldNumbers.Count == 0) - throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldNumbers)); + var fieldsToSet = ArgumentGuards.ValidateAndNormalizeFieldNumbers(fieldNumbers, nameof(fieldNumbers)); if (formObject == null || formObject.CurrentRow == null) return formObject; - var fieldsToSet = fieldNumbers - .Where(f => !string.IsNullOrEmpty(f)) - .Distinct() - .ToList(); - - if (fieldsToSet.Count == 0) - throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(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(NoMatchingFieldObjectsMessage, nameof(fieldNumbers)); + throw new ArgumentException(ArgumentGuards.NoMatchingFieldObjectsMessage, nameof(fieldNumbers)); formObject.CurrentRow.SetUnlockedFields(fieldsToSet); diff --git a/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/OptionObject2015Helpers.cs b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/OptionObject2015Helpers.cs index 0fc7c5a..bf5fb5a 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 { @@ -9,11 +10,6 @@ namespace RarelySimple.AvatarScriptLink.Objects.Helpers /// public static class OptionObject2015Helpers { - private 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."; - /// /// Gets the entity ID of an . /// @@ -92,17 +88,13 @@ public static bool HasError(this OptionObject2015 optionObject) /// The modified OptionObject2015. public static OptionObject2015? SetDisabledField(this OptionObject2015 optionObject, string fieldNumber) { - if (fieldNumber == null) - throw new ArgumentNullException(nameof(fieldNumber)); - - if (fieldNumber.Length == 0) - throw new ArgumentException(FieldNumberCannotBeEmptyMessage, nameof(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(NoMatchingFieldObjectsMessage, nameof(fieldNumber)); + throw new ArgumentException(ArgumentGuards.NoMatchingFieldObjectsMessage, nameof(fieldNumber)); foreach (var form in optionObject.Forms) { @@ -120,20 +112,7 @@ public static bool HasError(this OptionObject2015 optionObject) /// The modified OptionObject2015. public static OptionObject2015? SetDisabledFields(this OptionObject2015 optionObject, List? fieldObjects) { - if (fieldObjects == null) - throw new ArgumentNullException(nameof(fieldObjects)); - - if (fieldObjects.Count == 0) - throw new ArgumentException(NoFieldObjectsProvidedMessage, nameof(fieldObjects)); - - var fieldNumbers = fieldObjects - .Where(f => !string.IsNullOrEmpty(f?.FieldNumber)) - .Select(f => f.FieldNumber) - .Distinct() - .ToList(); - - if (fieldNumbers.Count == 0) - throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldObjects)); + var fieldNumbers = ArgumentGuards.ValidateAndGetFieldNumbers(fieldObjects, nameof(fieldObjects)); return optionObject.SetDisabledFields(fieldNumbers); } @@ -146,29 +125,17 @@ public static bool HasError(this OptionObject2015 optionObject) /// The modified OptionObject2015. public static OptionObject2015? SetDisabledFields(this OptionObject2015 optionObject, List? fieldNumbers) { - if (fieldNumbers == null) - throw new ArgumentNullException(nameof(fieldNumbers)); - - if (fieldNumbers.Count == 0) - throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldNumbers)); + var fieldsToSet = ArgumentGuards.ValidateAndNormalizeFieldNumbers(fieldNumbers, nameof(fieldNumbers)); if (optionObject == null || optionObject.Forms == null) return optionObject; - var fieldsToSet = fieldNumbers - .Where(f => !string.IsNullOrEmpty(f)) - .Distinct() - .ToList(); - - if (fieldsToSet.Count == 0) - throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldNumbers)); - fieldsToSet = fieldsToSet .Where(f => optionObject.Forms.Any(form => form.IsFieldPresent(f))) .ToList(); if (fieldsToSet.Count == 0) - throw new ArgumentException(NoMatchingFieldObjectsMessage, nameof(fieldNumbers)); + throw new ArgumentException(ArgumentGuards.NoMatchingFieldObjectsMessage, nameof(fieldNumbers)); foreach (var form in optionObject.Forms) { @@ -186,17 +153,13 @@ public static bool HasError(this OptionObject2015 optionObject) /// The modified OptionObject2015. public static OptionObject2015? SetEnabledField(this OptionObject2015 optionObject, string fieldNumber) { - if (fieldNumber == null) - throw new ArgumentNullException(nameof(fieldNumber)); - - if (fieldNumber.Length == 0) - throw new ArgumentException(FieldNumberCannotBeEmptyMessage, nameof(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(NoMatchingFieldObjectsMessage, nameof(fieldNumber)); + throw new ArgumentException(ArgumentGuards.NoMatchingFieldObjectsMessage, nameof(fieldNumber)); foreach (var form in optionObject.Forms) { @@ -214,20 +177,7 @@ public static bool HasError(this OptionObject2015 optionObject) /// The modified OptionObject2015. public static OptionObject2015? SetEnabledFields(this OptionObject2015 optionObject, List? fieldObjects) { - if (fieldObjects == null) - throw new ArgumentNullException(nameof(fieldObjects)); - - if (fieldObjects.Count == 0) - throw new ArgumentException(NoFieldObjectsProvidedMessage, nameof(fieldObjects)); - - var fieldNumbers = fieldObjects - .Where(f => !string.IsNullOrEmpty(f?.FieldNumber)) - .Select(f => f.FieldNumber) - .Distinct() - .ToList(); - - if (fieldNumbers.Count == 0) - throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldObjects)); + var fieldNumbers = ArgumentGuards.ValidateAndGetFieldNumbers(fieldObjects, nameof(fieldObjects)); return optionObject.SetEnabledFields(fieldNumbers); } @@ -240,29 +190,17 @@ public static bool HasError(this OptionObject2015 optionObject) /// The modified OptionObject2015. public static OptionObject2015? SetEnabledFields(this OptionObject2015 optionObject, List? fieldNumbers) { - if (fieldNumbers == null) - throw new ArgumentNullException(nameof(fieldNumbers)); - - if (fieldNumbers.Count == 0) - throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldNumbers)); + var fieldsToSet = ArgumentGuards.ValidateAndNormalizeFieldNumbers(fieldNumbers, nameof(fieldNumbers)); if (optionObject == null || optionObject.Forms == null) return optionObject; - var fieldsToSet = fieldNumbers - .Where(f => !string.IsNullOrEmpty(f)) - .Distinct() - .ToList(); - - if (fieldsToSet.Count == 0) - throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldNumbers)); - fieldsToSet = fieldsToSet .Where(f => optionObject.Forms.Any(form => form.IsFieldPresent(f))) .ToList(); if (fieldsToSet.Count == 0) - throw new ArgumentException(NoMatchingFieldObjectsMessage, nameof(fieldNumbers)); + throw new ArgumentException(ArgumentGuards.NoMatchingFieldObjectsMessage, nameof(fieldNumbers)); foreach (var form in optionObject.Forms) { @@ -280,17 +218,13 @@ public static bool HasError(this OptionObject2015 optionObject) /// The modified OptionObject2015. public static OptionObject2015? SetLockedField(this OptionObject2015 optionObject, string fieldNumber) { - if (fieldNumber == null) - throw new ArgumentNullException(nameof(fieldNumber)); - - if (fieldNumber.Length == 0) - throw new ArgumentException(FieldNumberCannotBeEmptyMessage, nameof(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(NoMatchingFieldObjectsMessage, nameof(fieldNumber)); + throw new ArgumentException(ArgumentGuards.NoMatchingFieldObjectsMessage, nameof(fieldNumber)); foreach (var form in optionObject.Forms) { @@ -308,20 +242,7 @@ public static bool HasError(this OptionObject2015 optionObject) /// The modified OptionObject2015. public static OptionObject2015? SetLockedFields(this OptionObject2015 optionObject, List? fieldObjects) { - if (fieldObjects == null) - throw new ArgumentNullException(nameof(fieldObjects)); - - if (fieldObjects.Count == 0) - throw new ArgumentException(NoFieldObjectsProvidedMessage, nameof(fieldObjects)); - - var fieldNumbers = fieldObjects - .Where(f => !string.IsNullOrEmpty(f?.FieldNumber)) - .Select(f => f.FieldNumber) - .Distinct() - .ToList(); - - if (fieldNumbers.Count == 0) - throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldObjects)); + var fieldNumbers = ArgumentGuards.ValidateAndGetFieldNumbers(fieldObjects, nameof(fieldObjects)); return optionObject.SetLockedFields(fieldNumbers); } @@ -334,29 +255,17 @@ public static bool HasError(this OptionObject2015 optionObject) /// The modified OptionObject2015. public static OptionObject2015? SetLockedFields(this OptionObject2015 optionObject, List? fieldNumbers) { - if (fieldNumbers == null) - throw new ArgumentNullException(nameof(fieldNumbers)); - - if (fieldNumbers.Count == 0) - throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldNumbers)); + var fieldsToSet = ArgumentGuards.ValidateAndNormalizeFieldNumbers(fieldNumbers, nameof(fieldNumbers)); if (optionObject == null || optionObject.Forms == null) return optionObject; - var fieldsToSet = fieldNumbers - .Where(f => !string.IsNullOrEmpty(f)) - .Distinct() - .ToList(); - - if (fieldsToSet.Count == 0) - throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldNumbers)); - fieldsToSet = fieldsToSet .Where(f => optionObject.Forms.Any(form => form.IsFieldPresent(f))) .ToList(); if (fieldsToSet.Count == 0) - throw new ArgumentException(NoMatchingFieldObjectsMessage, nameof(fieldNumbers)); + throw new ArgumentException(ArgumentGuards.NoMatchingFieldObjectsMessage, nameof(fieldNumbers)); foreach (var form in optionObject.Forms) { @@ -374,17 +283,13 @@ public static bool HasError(this OptionObject2015 optionObject) /// The modified OptionObject2015. public static OptionObject2015? SetUnlockedField(this OptionObject2015 optionObject, string fieldNumber) { - if (fieldNumber == null) - throw new ArgumentNullException(nameof(fieldNumber)); - - if (fieldNumber.Length == 0) - throw new ArgumentException(FieldNumberCannotBeEmptyMessage, nameof(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(NoMatchingFieldObjectsMessage, nameof(fieldNumber)); + throw new ArgumentException(ArgumentGuards.NoMatchingFieldObjectsMessage, nameof(fieldNumber)); foreach (var form in optionObject.Forms) { @@ -402,20 +307,7 @@ public static bool HasError(this OptionObject2015 optionObject) /// The modified OptionObject2015. public static OptionObject2015? SetUnlockedFields(this OptionObject2015 optionObject, List? fieldObjects) { - if (fieldObjects == null) - throw new ArgumentNullException(nameof(fieldObjects)); - - if (fieldObjects.Count == 0) - throw new ArgumentException(NoFieldObjectsProvidedMessage, nameof(fieldObjects)); - - var fieldNumbers = fieldObjects - .Where(f => !string.IsNullOrEmpty(f?.FieldNumber)) - .Select(f => f.FieldNumber) - .Distinct() - .ToList(); - - if (fieldNumbers.Count == 0) - throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldObjects)); + var fieldNumbers = ArgumentGuards.ValidateAndGetFieldNumbers(fieldObjects, nameof(fieldObjects)); return optionObject.SetUnlockedFields(fieldNumbers); } @@ -428,29 +320,17 @@ public static bool HasError(this OptionObject2015 optionObject) /// The modified OptionObject2015. public static OptionObject2015? SetUnlockedFields(this OptionObject2015 optionObject, List? fieldNumbers) { - if (fieldNumbers == null) - throw new ArgumentNullException(nameof(fieldNumbers)); - - if (fieldNumbers.Count == 0) - throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldNumbers)); + var fieldsToSet = ArgumentGuards.ValidateAndNormalizeFieldNumbers(fieldNumbers, nameof(fieldNumbers)); if (optionObject == null || optionObject.Forms == null) return optionObject; - var fieldsToSet = fieldNumbers - .Where(f => !string.IsNullOrEmpty(f)) - .Distinct() - .ToList(); - - if (fieldsToSet.Count == 0) - throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldNumbers)); - fieldsToSet = fieldsToSet .Where(f => optionObject.Forms.Any(form => form.IsFieldPresent(f))) .ToList(); if (fieldsToSet.Count == 0) - throw new ArgumentException(NoMatchingFieldObjectsMessage, nameof(fieldNumbers)); + throw new ArgumentException(ArgumentGuards.NoMatchingFieldObjectsMessage, nameof(fieldNumbers)); foreach (var form in optionObject.Forms) { diff --git a/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/OptionObject2Helpers.cs b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/OptionObject2Helpers.cs index 41d6e7c..88adeee 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 { @@ -9,11 +10,6 @@ namespace RarelySimple.AvatarScriptLink.Objects.Helpers /// public static class OptionObject2Helpers { - private 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."; - /// /// Gets the entity ID of an . /// @@ -72,17 +68,13 @@ public static bool HasError(this OptionObject2 optionObject) /// The modified OptionObject2. public static OptionObject2? SetDisabledField(this OptionObject2 optionObject, string fieldNumber) { - if (fieldNumber == null) - throw new ArgumentNullException(nameof(fieldNumber)); - - if (fieldNumber.Length == 0) - throw new ArgumentException(FieldNumberCannotBeEmptyMessage, nameof(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(NoMatchingFieldObjectsMessage, nameof(fieldNumber)); + throw new ArgumentException(ArgumentGuards.NoMatchingFieldObjectsMessage, nameof(fieldNumber)); foreach (var form in optionObject.Forms) { @@ -100,20 +92,7 @@ public static bool HasError(this OptionObject2 optionObject) /// The modified OptionObject2. public static OptionObject2? SetDisabledFields(this OptionObject2 optionObject, List? fieldObjects) { - if (fieldObjects == null) - throw new ArgumentNullException(nameof(fieldObjects)); - - if (fieldObjects.Count == 0) - throw new ArgumentException(NoFieldObjectsProvidedMessage, nameof(fieldObjects)); - - var fieldNumbers = fieldObjects - .Where(f => !string.IsNullOrEmpty(f?.FieldNumber)) - .Select(f => f.FieldNumber) - .Distinct() - .ToList(); - - if (fieldNumbers.Count == 0) - throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldObjects)); + var fieldNumbers = ArgumentGuards.ValidateAndGetFieldNumbers(fieldObjects, nameof(fieldObjects)); return optionObject.SetDisabledFields(fieldNumbers); } @@ -126,29 +105,17 @@ public static bool HasError(this OptionObject2 optionObject) /// The modified OptionObject2. public static OptionObject2? SetDisabledFields(this OptionObject2 optionObject, List? fieldNumbers) { - if (fieldNumbers == null) - throw new ArgumentNullException(nameof(fieldNumbers)); - - if (fieldNumbers.Count == 0) - throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldNumbers)); + var fieldsToSet = ArgumentGuards.ValidateAndNormalizeFieldNumbers(fieldNumbers, nameof(fieldNumbers)); if (optionObject == null || optionObject.Forms == null) return optionObject; - var fieldsToSet = fieldNumbers - .Where(f => !string.IsNullOrEmpty(f)) - .Distinct() - .ToList(); - - if (fieldsToSet.Count == 0) - throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldNumbers)); - fieldsToSet = fieldsToSet .Where(f => optionObject.Forms.Any(form => form.IsFieldPresent(f))) .ToList(); if (fieldsToSet.Count == 0) - throw new ArgumentException(NoMatchingFieldObjectsMessage, nameof(fieldNumbers)); + throw new ArgumentException(ArgumentGuards.NoMatchingFieldObjectsMessage, nameof(fieldNumbers)); foreach (var form in optionObject.Forms) { @@ -166,17 +133,13 @@ public static bool HasError(this OptionObject2 optionObject) /// The modified OptionObject2. public static OptionObject2? SetEnabledField(this OptionObject2 optionObject, string fieldNumber) { - if (fieldNumber == null) - throw new ArgumentNullException(nameof(fieldNumber)); - - if (fieldNumber.Length == 0) - throw new ArgumentException(FieldNumberCannotBeEmptyMessage, nameof(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(NoMatchingFieldObjectsMessage, nameof(fieldNumber)); + throw new ArgumentException(ArgumentGuards.NoMatchingFieldObjectsMessage, nameof(fieldNumber)); foreach (var form in optionObject.Forms) { @@ -194,20 +157,7 @@ public static bool HasError(this OptionObject2 optionObject) /// The modified OptionObject2. public static OptionObject2? SetEnabledFields(this OptionObject2 optionObject, List? fieldObjects) { - if (fieldObjects == null) - throw new ArgumentNullException(nameof(fieldObjects)); - - if (fieldObjects.Count == 0) - throw new ArgumentException(NoFieldObjectsProvidedMessage, nameof(fieldObjects)); - - var fieldNumbers = fieldObjects - .Where(f => !string.IsNullOrEmpty(f?.FieldNumber)) - .Select(f => f.FieldNumber) - .Distinct() - .ToList(); - - if (fieldNumbers.Count == 0) - throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldObjects)); + var fieldNumbers = ArgumentGuards.ValidateAndGetFieldNumbers(fieldObjects, nameof(fieldObjects)); return optionObject.SetEnabledFields(fieldNumbers); } @@ -220,29 +170,17 @@ public static bool HasError(this OptionObject2 optionObject) /// The modified OptionObject2. public static OptionObject2? SetEnabledFields(this OptionObject2 optionObject, List? fieldNumbers) { - if (fieldNumbers == null) - throw new ArgumentNullException(nameof(fieldNumbers)); - - if (fieldNumbers.Count == 0) - throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldNumbers)); + var fieldsToSet = ArgumentGuards.ValidateAndNormalizeFieldNumbers(fieldNumbers, nameof(fieldNumbers)); if (optionObject == null || optionObject.Forms == null) return optionObject; - var fieldsToSet = fieldNumbers - .Where(f => !string.IsNullOrEmpty(f)) - .Distinct() - .ToList(); - - if (fieldsToSet.Count == 0) - throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldNumbers)); - fieldsToSet = fieldsToSet .Where(f => optionObject.Forms.Any(form => form.IsFieldPresent(f))) .ToList(); if (fieldsToSet.Count == 0) - throw new ArgumentException(NoMatchingFieldObjectsMessage, nameof(fieldNumbers)); + throw new ArgumentException(ArgumentGuards.NoMatchingFieldObjectsMessage, nameof(fieldNumbers)); foreach (var form in optionObject.Forms) { @@ -260,17 +198,13 @@ public static bool HasError(this OptionObject2 optionObject) /// The modified OptionObject2. public static OptionObject2? SetLockedField(this OptionObject2 optionObject, string fieldNumber) { - if (fieldNumber == null) - throw new ArgumentNullException(nameof(fieldNumber)); - - if (fieldNumber.Length == 0) - throw new ArgumentException(FieldNumberCannotBeEmptyMessage, nameof(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(NoMatchingFieldObjectsMessage, nameof(fieldNumber)); + throw new ArgumentException(ArgumentGuards.NoMatchingFieldObjectsMessage, nameof(fieldNumber)); foreach (var form in optionObject.Forms) { @@ -288,20 +222,7 @@ public static bool HasError(this OptionObject2 optionObject) /// The modified OptionObject2. public static OptionObject2? SetLockedFields(this OptionObject2 optionObject, List? fieldObjects) { - if (fieldObjects == null) - throw new ArgumentNullException(nameof(fieldObjects)); - - if (fieldObjects.Count == 0) - throw new ArgumentException(NoFieldObjectsProvidedMessage, nameof(fieldObjects)); - - var fieldNumbers = fieldObjects - .Where(f => !string.IsNullOrEmpty(f?.FieldNumber)) - .Select(f => f.FieldNumber) - .Distinct() - .ToList(); - - if (fieldNumbers.Count == 0) - throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldObjects)); + var fieldNumbers = ArgumentGuards.ValidateAndGetFieldNumbers(fieldObjects, nameof(fieldObjects)); return optionObject.SetLockedFields(fieldNumbers); } @@ -314,29 +235,17 @@ public static bool HasError(this OptionObject2 optionObject) /// The modified OptionObject2. public static OptionObject2? SetLockedFields(this OptionObject2 optionObject, List? fieldNumbers) { - if (fieldNumbers == null) - throw new ArgumentNullException(nameof(fieldNumbers)); - - if (fieldNumbers.Count == 0) - throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldNumbers)); + var fieldsToSet = ArgumentGuards.ValidateAndNormalizeFieldNumbers(fieldNumbers, nameof(fieldNumbers)); if (optionObject == null || optionObject.Forms == null) return optionObject; - var fieldsToSet = fieldNumbers - .Where(f => !string.IsNullOrEmpty(f)) - .Distinct() - .ToList(); - - if (fieldsToSet.Count == 0) - throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldNumbers)); - fieldsToSet = fieldsToSet .Where(f => optionObject.Forms.Any(form => form.IsFieldPresent(f))) .ToList(); if (fieldsToSet.Count == 0) - throw new ArgumentException(NoMatchingFieldObjectsMessage, nameof(fieldNumbers)); + throw new ArgumentException(ArgumentGuards.NoMatchingFieldObjectsMessage, nameof(fieldNumbers)); foreach (var form in optionObject.Forms) { @@ -354,17 +263,13 @@ public static bool HasError(this OptionObject2 optionObject) /// The modified OptionObject2. public static OptionObject2? SetUnlockedField(this OptionObject2 optionObject, string fieldNumber) { - if (fieldNumber == null) - throw new ArgumentNullException(nameof(fieldNumber)); - - if (fieldNumber.Length == 0) - throw new ArgumentException(FieldNumberCannotBeEmptyMessage, nameof(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(NoMatchingFieldObjectsMessage, nameof(fieldNumber)); + throw new ArgumentException(ArgumentGuards.NoMatchingFieldObjectsMessage, nameof(fieldNumber)); foreach (var form in optionObject.Forms) { @@ -382,20 +287,7 @@ public static bool HasError(this OptionObject2 optionObject) /// The modified OptionObject2. public static OptionObject2? SetUnlockedFields(this OptionObject2 optionObject, List? fieldObjects) { - if (fieldObjects == null) - throw new ArgumentNullException(nameof(fieldObjects)); - - if (fieldObjects.Count == 0) - throw new ArgumentException(NoFieldObjectsProvidedMessage, nameof(fieldObjects)); - - var fieldNumbers = fieldObjects - .Where(f => !string.IsNullOrEmpty(f?.FieldNumber)) - .Select(f => f.FieldNumber) - .Distinct() - .ToList(); - - if (fieldNumbers.Count == 0) - throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldObjects)); + var fieldNumbers = ArgumentGuards.ValidateAndGetFieldNumbers(fieldObjects, nameof(fieldObjects)); return optionObject.SetUnlockedFields(fieldNumbers); } @@ -408,29 +300,17 @@ public static bool HasError(this OptionObject2 optionObject) /// The modified OptionObject2. public static OptionObject2? SetUnlockedFields(this OptionObject2 optionObject, List? fieldNumbers) { - if (fieldNumbers == null) - throw new ArgumentNullException(nameof(fieldNumbers)); - - if (fieldNumbers.Count == 0) - throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldNumbers)); + var fieldsToSet = ArgumentGuards.ValidateAndNormalizeFieldNumbers(fieldNumbers, nameof(fieldNumbers)); if (optionObject == null || optionObject.Forms == null) return optionObject; - var fieldsToSet = fieldNumbers - .Where(f => !string.IsNullOrEmpty(f)) - .Distinct() - .ToList(); - - if (fieldsToSet.Count == 0) - throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldNumbers)); - fieldsToSet = fieldsToSet .Where(f => optionObject.Forms.Any(form => form.IsFieldPresent(f))) .ToList(); if (fieldsToSet.Count == 0) - throw new ArgumentException(NoMatchingFieldObjectsMessage, nameof(fieldNumbers)); + throw new ArgumentException(ArgumentGuards.NoMatchingFieldObjectsMessage, nameof(fieldNumbers)); foreach (var form in optionObject.Forms) { diff --git a/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/OptionObjectHelpers.cs b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/OptionObjectHelpers.cs index 5b808e8..68428dd 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 { @@ -9,11 +10,6 @@ namespace RarelySimple.AvatarScriptLink.Objects.Helpers /// public static class OptionObjectHelpers { - private 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."; - /// /// Gets the entity ID of an . /// @@ -242,17 +238,13 @@ public static bool IsFieldRequired(this OptionObject optionObject, string fieldN /// The modified OptionObject. public static OptionObject? SetDisabledField(this OptionObject optionObject, string fieldNumber) { - if (fieldNumber == null) - throw new ArgumentNullException(nameof(fieldNumber)); - - if (fieldNumber.Length == 0) - throw new ArgumentException(FieldNumberCannotBeEmptyMessage, nameof(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(NoMatchingFieldObjectsMessage, nameof(fieldNumber)); + throw new ArgumentException(ArgumentGuards.NoMatchingFieldObjectsMessage, nameof(fieldNumber)); foreach (var form in optionObject.Forms) { @@ -270,20 +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) - throw new ArgumentNullException(nameof(fieldObjects)); - - if (fieldObjects.Count == 0) - throw new ArgumentException(NoFieldObjectsProvidedMessage, nameof(fieldObjects)); - - var fieldNumbers = fieldObjects - .Where(f => !string.IsNullOrEmpty(f?.FieldNumber)) - .Select(f => f.FieldNumber) - .Distinct() - .ToList(); - - if (fieldNumbers.Count == 0) - throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldObjects)); + var fieldNumbers = ArgumentGuards.ValidateAndGetFieldNumbers(fieldObjects, nameof(fieldObjects)); return optionObject.SetDisabledFields(fieldNumbers); } @@ -296,29 +275,17 @@ public static bool IsFieldRequired(this OptionObject optionObject, string fieldN /// The modified OptionObject. public static OptionObject? SetDisabledFields(this OptionObject optionObject, List? fieldNumbers) { - if (fieldNumbers == null) - throw new ArgumentNullException(nameof(fieldNumbers)); - - if (fieldNumbers.Count == 0) - throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldNumbers)); + var fieldsToSet = ArgumentGuards.ValidateAndNormalizeFieldNumbers(fieldNumbers, nameof(fieldNumbers)); if (optionObject == null || optionObject.Forms == null) return optionObject; - var fieldsToSet = fieldNumbers - .Where(f => !string.IsNullOrEmpty(f)) - .Distinct() - .ToList(); - - if (fieldsToSet.Count == 0) - throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldNumbers)); - fieldsToSet = fieldsToSet .Where(f => optionObject.Forms.Any(form => form.IsFieldPresent(f))) .ToList(); if (fieldsToSet.Count == 0) - throw new ArgumentException(NoMatchingFieldObjectsMessage, nameof(fieldNumbers)); + throw new ArgumentException(ArgumentGuards.NoMatchingFieldObjectsMessage, nameof(fieldNumbers)); foreach (var form in optionObject.Forms) { @@ -336,17 +303,13 @@ public static bool IsFieldRequired(this OptionObject optionObject, string fieldN /// The modified OptionObject. public static OptionObject? SetEnabledField(this OptionObject optionObject, string fieldNumber) { - if (fieldNumber == null) - throw new ArgumentNullException(nameof(fieldNumber)); - - if (fieldNumber.Length == 0) - throw new ArgumentException(FieldNumberCannotBeEmptyMessage, nameof(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(NoMatchingFieldObjectsMessage, nameof(fieldNumber)); + throw new ArgumentException(ArgumentGuards.NoMatchingFieldObjectsMessage, nameof(fieldNumber)); foreach (var form in optionObject.Forms) { @@ -364,20 +327,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) - throw new ArgumentNullException(nameof(fieldObjects)); - - if (fieldObjects.Count == 0) - throw new ArgumentException(NoFieldObjectsProvidedMessage, nameof(fieldObjects)); - - var fieldNumbers = fieldObjects - .Where(f => !string.IsNullOrEmpty(f?.FieldNumber)) - .Select(f => f.FieldNumber) - .Distinct() - .ToList(); - - if (fieldNumbers.Count == 0) - throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldObjects)); + var fieldNumbers = ArgumentGuards.ValidateAndGetFieldNumbers(fieldObjects, nameof(fieldObjects)); return optionObject.SetEnabledFields(fieldNumbers); } @@ -390,29 +340,17 @@ public static bool IsFieldRequired(this OptionObject optionObject, string fieldN /// The modified OptionObject. public static OptionObject? SetEnabledFields(this OptionObject optionObject, List? fieldNumbers) { - if (fieldNumbers == null) - throw new ArgumentNullException(nameof(fieldNumbers)); - - if (fieldNumbers.Count == 0) - throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldNumbers)); + var fieldsToSet = ArgumentGuards.ValidateAndNormalizeFieldNumbers(fieldNumbers, nameof(fieldNumbers)); if (optionObject == null || optionObject.Forms == null) return optionObject; - var fieldsToSet = fieldNumbers - .Where(f => !string.IsNullOrEmpty(f)) - .Distinct() - .ToList(); - - if (fieldsToSet.Count == 0) - throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldNumbers)); - fieldsToSet = fieldsToSet .Where(f => optionObject.Forms.Any(form => form.IsFieldPresent(f))) .ToList(); if (fieldsToSet.Count == 0) - throw new ArgumentException(NoMatchingFieldObjectsMessage, nameof(fieldNumbers)); + throw new ArgumentException(ArgumentGuards.NoMatchingFieldObjectsMessage, nameof(fieldNumbers)); foreach (var form in optionObject.Forms) { @@ -430,17 +368,13 @@ public static bool IsFieldRequired(this OptionObject optionObject, string fieldN /// The modified OptionObject. public static OptionObject? SetLockedField(this OptionObject optionObject, string fieldNumber) { - if (fieldNumber == null) - throw new ArgumentNullException(nameof(fieldNumber)); - - if (fieldNumber.Length == 0) - throw new ArgumentException(FieldNumberCannotBeEmptyMessage, nameof(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(NoMatchingFieldObjectsMessage, nameof(fieldNumber)); + throw new ArgumentException(ArgumentGuards.NoMatchingFieldObjectsMessage, nameof(fieldNumber)); foreach (var form in optionObject.Forms) { @@ -458,20 +392,7 @@ public static bool IsFieldRequired(this OptionObject optionObject, string fieldN /// The modified OptionObject. public static OptionObject? SetLockedFields(this OptionObject optionObject, List? fieldObjects) { - if (fieldObjects == null) - throw new ArgumentNullException(nameof(fieldObjects)); - - if (fieldObjects.Count == 0) - throw new ArgumentException(NoFieldObjectsProvidedMessage, nameof(fieldObjects)); - - var fieldNumbers = fieldObjects - .Where(f => !string.IsNullOrEmpty(f?.FieldNumber)) - .Select(f => f.FieldNumber) - .Distinct() - .ToList(); - - if (fieldNumbers.Count == 0) - throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldObjects)); + var fieldNumbers = ArgumentGuards.ValidateAndGetFieldNumbers(fieldObjects, nameof(fieldObjects)); return optionObject.SetLockedFields(fieldNumbers); } @@ -484,29 +405,17 @@ public static bool IsFieldRequired(this OptionObject optionObject, string fieldN /// The modified OptionObject. public static OptionObject? SetLockedFields(this OptionObject optionObject, List? fieldNumbers) { - if (fieldNumbers == null) - throw new ArgumentNullException(nameof(fieldNumbers)); - - if (fieldNumbers.Count == 0) - throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldNumbers)); + var fieldsToSet = ArgumentGuards.ValidateAndNormalizeFieldNumbers(fieldNumbers, nameof(fieldNumbers)); if (optionObject == null || optionObject.Forms == null) return optionObject; - var fieldsToSet = fieldNumbers - .Where(f => !string.IsNullOrEmpty(f)) - .Distinct() - .ToList(); - - if (fieldsToSet.Count == 0) - throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldNumbers)); - fieldsToSet = fieldsToSet .Where(f => optionObject.Forms.Any(form => form.IsFieldPresent(f))) .ToList(); if (fieldsToSet.Count == 0) - throw new ArgumentException(NoMatchingFieldObjectsMessage, nameof(fieldNumbers)); + throw new ArgumentException(ArgumentGuards.NoMatchingFieldObjectsMessage, nameof(fieldNumbers)); foreach (var form in optionObject.Forms) { @@ -524,17 +433,13 @@ public static bool IsFieldRequired(this OptionObject optionObject, string fieldN /// The modified OptionObject. public static OptionObject? SetUnlockedField(this OptionObject optionObject, string fieldNumber) { - if (fieldNumber == null) - throw new ArgumentNullException(nameof(fieldNumber)); - - if (fieldNumber.Length == 0) - throw new ArgumentException(FieldNumberCannotBeEmptyMessage, nameof(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(NoMatchingFieldObjectsMessage, nameof(fieldNumber)); + throw new ArgumentException(ArgumentGuards.NoMatchingFieldObjectsMessage, nameof(fieldNumber)); foreach (var form in optionObject.Forms) { @@ -552,20 +457,7 @@ public static bool IsFieldRequired(this OptionObject optionObject, string fieldN /// The modified OptionObject. public static OptionObject? SetUnlockedFields(this OptionObject optionObject, List? fieldObjects) { - if (fieldObjects == null) - throw new ArgumentNullException(nameof(fieldObjects)); - - if (fieldObjects.Count == 0) - throw new ArgumentException(NoFieldObjectsProvidedMessage, nameof(fieldObjects)); - - var fieldNumbers = fieldObjects - .Where(f => !string.IsNullOrEmpty(f?.FieldNumber)) - .Select(f => f.FieldNumber) - .Distinct() - .ToList(); - - if (fieldNumbers.Count == 0) - throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldObjects)); + var fieldNumbers = ArgumentGuards.ValidateAndGetFieldNumbers(fieldObjects, nameof(fieldObjects)); return optionObject.SetUnlockedFields(fieldNumbers); } @@ -578,29 +470,17 @@ public static bool IsFieldRequired(this OptionObject optionObject, string fieldN /// The modified OptionObject. public static OptionObject? SetUnlockedFields(this OptionObject optionObject, List? fieldNumbers) { - if (fieldNumbers == null) - throw new ArgumentNullException(nameof(fieldNumbers)); - - if (fieldNumbers.Count == 0) - throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldNumbers)); + var fieldsToSet = ArgumentGuards.ValidateAndNormalizeFieldNumbers(fieldNumbers, nameof(fieldNumbers)); if (optionObject == null || optionObject.Forms == null) return optionObject; - var fieldsToSet = fieldNumbers - .Where(f => !string.IsNullOrEmpty(f)) - .Distinct() - .ToList(); - - if (fieldsToSet.Count == 0) - throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldNumbers)); - fieldsToSet = fieldsToSet .Where(f => optionObject.Forms.Any(form => form.IsFieldPresent(f))) .ToList(); if (fieldsToSet.Count == 0) - throw new ArgumentException(NoMatchingFieldObjectsMessage, nameof(fieldNumbers)); + throw new ArgumentException(ArgumentGuards.NoMatchingFieldObjectsMessage, nameof(fieldNumbers)); foreach (var form in optionObject.Forms) { diff --git a/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/RowObjectHelpers.cs b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/RowObjectHelpers.cs index 60c2c08..6d4d623 100644 --- a/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/RowObjectHelpers.cs +++ b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/RowObjectHelpers.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Linq; using RarelySimple.AvatarScriptLink.Objects.Helpers.Manipulators; +using RarelySimple.AvatarScriptLink.Objects.Helpers.Validators; namespace RarelySimple.AvatarScriptLink.Objects.Helpers { @@ -10,10 +11,6 @@ namespace RarelySimple.AvatarScriptLink.Objects.Helpers /// public static class RowObjectHelpers { - private const string NoMatchingFieldObjectsMessage = "No matching field objects were found."; - private const string NoFieldNumbersProvidedMessage = "No field numbers were provided."; - private const string FieldNumberCannotBeEmptyMessage = "Field number cannot be empty."; - /// /// Gets the row ID of a . /// @@ -209,18 +206,14 @@ public static bool IsFieldRequired(this RowObject rowObject, string fieldNumber) /// The modified RowObject. public static RowObject? SetDisabledField(this RowObject rowObject, string fieldNumber) { - if (fieldNumber == null) - throw new ArgumentNullException(nameof(fieldNumber)); - - if (fieldNumber.Length == 0) - throw new ArgumentException(FieldNumberCannotBeEmptyMessage, nameof(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(NoMatchingFieldObjectsMessage, nameof(fieldNumber)); + throw new ArgumentException(ArgumentGuards.NoMatchingFieldObjectsMessage, nameof(fieldNumber)); var changed = field.IsEnabled(); field.Disable(); @@ -239,25 +232,13 @@ public static bool IsFieldRequired(this RowObject rowObject, string fieldNumber) /// The modified RowObject. public static RowObject? SetDisabledFields(this RowObject rowObject, List? fieldNumbers) { - if (fieldNumbers == null) - throw new ArgumentNullException(nameof(fieldNumbers)); - - if (fieldNumbers.Count == 0) - throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldNumbers)); + var fieldsToSet = ArgumentGuards.ValidateAndNormalizeFieldNumbers(fieldNumbers, nameof(fieldNumbers)); if (rowObject == null || rowObject.Fields == null) return rowObject; - var fieldsToSet = fieldNumbers - .Where(f => !string.IsNullOrEmpty(f)) - .Distinct() - .ToList(); - - if (fieldsToSet.Count == 0) - throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldNumbers)); - if (!rowObject.Fields.Any(f => fieldsToSet.Contains(f.FieldNumber))) - throw new ArgumentException(NoMatchingFieldObjectsMessage, nameof(fieldNumbers)); + throw new ArgumentException(ArgumentGuards.NoMatchingFieldObjectsMessage, nameof(fieldNumbers)); var changed = false; foreach (var field in rowObject.Fields.Where(f => fieldsToSet.Contains(f.FieldNumber))) @@ -283,18 +264,14 @@ public static bool IsFieldRequired(this RowObject rowObject, string fieldNumber) /// The modified RowObject. public static RowObject? SetEnabledField(this RowObject rowObject, string fieldNumber) { - if (fieldNumber == null) - throw new ArgumentNullException(nameof(fieldNumber)); - - if (fieldNumber.Length == 0) - throw new ArgumentException(FieldNumberCannotBeEmptyMessage, nameof(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(NoMatchingFieldObjectsMessage, nameof(fieldNumber)); + throw new ArgumentException(ArgumentGuards.NoMatchingFieldObjectsMessage, nameof(fieldNumber)); var changed = !field.IsEnabled(); field.Enable(); @@ -313,25 +290,13 @@ public static bool IsFieldRequired(this RowObject rowObject, string fieldNumber) /// The modified RowObject. public static RowObject? SetEnabledFields(this RowObject rowObject, List? fieldNumbers) { - if (fieldNumbers == null) - throw new ArgumentNullException(nameof(fieldNumbers)); - - if (fieldNumbers.Count == 0) - throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldNumbers)); + var fieldsToSet = ArgumentGuards.ValidateAndNormalizeFieldNumbers(fieldNumbers, nameof(fieldNumbers)); if (rowObject == null || rowObject.Fields == null) return rowObject; - var fieldsToSet = fieldNumbers - .Where(f => !string.IsNullOrEmpty(f)) - .Distinct() - .ToList(); - - if (fieldsToSet.Count == 0) - throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldNumbers)); - if (!rowObject.Fields.Any(f => fieldsToSet.Contains(f.FieldNumber))) - throw new ArgumentException(NoMatchingFieldObjectsMessage, nameof(fieldNumbers)); + throw new ArgumentException(ArgumentGuards.NoMatchingFieldObjectsMessage, nameof(fieldNumbers)); var changed = false; foreach (var field in rowObject.Fields.Where(f => fieldsToSet.Contains(f.FieldNumber))) @@ -357,18 +322,14 @@ public static bool IsFieldRequired(this RowObject rowObject, string fieldNumber) /// The modified RowObject. public static RowObject? SetLockedField(this RowObject rowObject, string fieldNumber) { - if (fieldNumber == null) - throw new ArgumentNullException(nameof(fieldNumber)); - - if (fieldNumber.Length == 0) - throw new ArgumentException(FieldNumberCannotBeEmptyMessage, nameof(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(NoMatchingFieldObjectsMessage, nameof(fieldNumber)); + throw new ArgumentException(ArgumentGuards.NoMatchingFieldObjectsMessage, nameof(fieldNumber)); var changed = !field.IsLocked(); field.Lock(); @@ -387,25 +348,13 @@ public static bool IsFieldRequired(this RowObject rowObject, string fieldNumber) /// The modified RowObject. public static RowObject? SetLockedFields(this RowObject rowObject, List? fieldNumbers) { - if (fieldNumbers == null) - throw new ArgumentNullException(nameof(fieldNumbers)); - - if (fieldNumbers.Count == 0) - throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldNumbers)); + var fieldsToSet = ArgumentGuards.ValidateAndNormalizeFieldNumbers(fieldNumbers, nameof(fieldNumbers)); if (rowObject == null || rowObject.Fields == null) return rowObject; - var fieldsToSet = fieldNumbers - .Where(f => !string.IsNullOrEmpty(f)) - .Distinct() - .ToList(); - - if (fieldsToSet.Count == 0) - throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldNumbers)); - if (!rowObject.Fields.Any(f => fieldsToSet.Contains(f.FieldNumber))) - throw new ArgumentException(NoMatchingFieldObjectsMessage, nameof(fieldNumbers)); + throw new ArgumentException(ArgumentGuards.NoMatchingFieldObjectsMessage, nameof(fieldNumbers)); var changed = false; foreach (var field in rowObject.Fields.Where(f => fieldsToSet.Contains(f.FieldNumber))) @@ -432,18 +381,14 @@ public static bool IsFieldRequired(this RowObject rowObject, string fieldNumber) /// The modified RowObject. public static RowObject? SetUnlockedField(this RowObject rowObject, string fieldNumber) { - if (fieldNumber == null) - throw new ArgumentNullException(nameof(fieldNumber)); - - if (fieldNumber.Length == 0) - throw new ArgumentException(FieldNumberCannotBeEmptyMessage, nameof(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(NoMatchingFieldObjectsMessage, nameof(fieldNumber)); + throw new ArgumentException(ArgumentGuards.NoMatchingFieldObjectsMessage, nameof(fieldNumber)); var changed = field.IsLocked(); field.Unlock(); @@ -462,25 +407,13 @@ public static bool IsFieldRequired(this RowObject rowObject, string fieldNumber) /// The modified RowObject. public static RowObject? SetUnlockedFields(this RowObject rowObject, List? fieldNumbers) { - if (fieldNumbers == null) - throw new ArgumentNullException(nameof(fieldNumbers)); - - if (fieldNumbers.Count == 0) - throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldNumbers)); + var fieldsToSet = ArgumentGuards.ValidateAndNormalizeFieldNumbers(fieldNumbers, nameof(fieldNumbers)); if (rowObject == null || rowObject.Fields == null) return rowObject; - var fieldsToSet = fieldNumbers - .Where(f => !string.IsNullOrEmpty(f)) - .Distinct() - .ToList(); - - if (fieldsToSet.Count == 0) - throw new ArgumentException(NoFieldNumbersProvidedMessage, nameof(fieldNumbers)); - if (!rowObject.Fields.Any(f => fieldsToSet.Contains(f.FieldNumber))) - throw new ArgumentException(NoMatchingFieldObjectsMessage, nameof(fieldNumbers)); + throw new ArgumentException(ArgumentGuards.NoMatchingFieldObjectsMessage, nameof(fieldNumbers)); var changed = false; foreach (var field in rowObject.Fields.Where(f => fieldsToSet.Contains(f.FieldNumber))) 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; + } + } +} From ee51c8725ccfc110f882135fbdeafd5fe7d673bc Mon Sep 17 00:00:00 2001 From: Scott Olson Jr Date: Sat, 7 Mar 2026 18:16:41 -0800 Subject: [PATCH 3/3] Implement SetLockedField and SetUnlockedField methods with validation in OptionObject and OptionObject2 helpers --- .github/instructions/dotnet.instructions.md | 2 +- .../FormObjectHelpersTests.cs | 45 ++++++ .../OptionObjectHelpers.OptionObject.Tests.cs | 119 +++++++++++++++ ...OptionObjectHelpers.OptionObject2.Tests.cs | 107 ++++++++++++++ ...ionObjectHelpers.OptionObject2015.Tests.cs | 135 ++++++++++++++++++ .../OptionObject2015Helpers.cs | 24 +++- .../OptionObject2Helpers.cs | 24 +++- .../OptionObjectHelpers.cs | 24 +++- 8 files changed, 467 insertions(+), 13 deletions(-) diff --git a/.github/instructions/dotnet.instructions.md b/.github/instructions/dotnet.instructions.md index 2f1c6fc..e229fa3 100644 --- a/.github/instructions/dotnet.instructions.md +++ b/.github/instructions/dotnet.instructions.md @@ -57,7 +57,7 @@ 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_DoesNothing`) +- 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 diff --git a/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/FormObjectHelpersTests.cs b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/FormObjectHelpersTests.cs index fb479dc..c6f3e51 100644 --- a/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/FormObjectHelpersTests.cs +++ b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/FormObjectHelpersTests.cs @@ -57,6 +57,51 @@ public void SetField_FormObject_WithEmptyFieldNumber_ThrowsArgumentException(str 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 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() { diff --git a/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/OptionObjectHelpers.OptionObject.Tests.cs b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/OptionObjectHelpers.OptionObject.Tests.cs index 05752b1..ba413a0 100644 --- a/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/OptionObjectHelpers.OptionObject.Tests.cs +++ b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/OptionObjectHelpers.OptionObject.Tests.cs @@ -54,6 +54,71 @@ public void SetField_OptionObject_WithEmptyFieldNumber_ThrowsArgumentException(s 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() { @@ -316,6 +381,17 @@ public void SetDisabledField_OptionObject_WithEmptyFieldNumber_ThrowsArgumentExc Assert.ThrowsException(() => optionObject.SetDisabledField(string.Empty)); } + [TestMethod] + public void SetEnabledField_OptionObject_WithNoMatchingField_ThrowsArgumentException() + { + var optionObject = new OptionObject(); + 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 SetDisabledFields_OptionObject_WithNullFieldObjects_ThrowsArgumentNullException() { @@ -359,6 +435,22 @@ public void SetLockedField_OptionObject_LocksTargetField() Assert.AreEqual("EDIT", optionObject.Forms[0].CurrentRow.RowAction); } + [TestMethod] + public void SetEnabledFields_OptionObject_WithFieldObjects_EnablesMatchingFields() + { + 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" } }; + + optionObject.SetEnabledFields(fieldsToEnable); + + Assert.AreEqual("1", form.CurrentRow.Fields[0].Enabled); + Assert.AreEqual("0", form.CurrentRow.Fields[1].Enabled); + } + [TestMethod] public void SetUnlockedFields_OptionObject_WithFieldNumbers_UnlocksMatchingFields() { @@ -374,6 +466,22 @@ public void SetUnlockedFields_OptionObject_WithFieldNumbers_UnlocksMatchingField Assert.AreEqual("0", optionObject.Forms[0].CurrentRow.Fields[1].Lock); } + [TestMethod] + public void SetUnlockedFields_OptionObject_WithFieldObjects_UnlocksMatchingFields() + { + var optionObject = new OptionObject(); + 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", form.CurrentRow.Fields[0].Lock); + Assert.AreEqual("1", form.CurrentRow.Fields[1].Lock); + } + [TestMethod] public void SetLockedFields_OptionObject_WithNullFieldObjects_ThrowsArgumentNullException() { @@ -395,6 +503,17 @@ public void SetUnlockedField_OptionObject_WithNullForms_ReturnsOriginalObject() Assert.AreSame(optionObject, result); } + [TestMethod] + public void SetUnlockedField_OptionObject_WithNoMatchingField_ThrowsArgumentException() + { + var optionObject = new OptionObject(); + 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")); + } + [TestMethod] public void SetLockedFields_OptionObject_WithDuplicateFieldNumbers_LocksTargetField() { diff --git a/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/OptionObjectHelpers.OptionObject2.Tests.cs b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/OptionObjectHelpers.OptionObject2.Tests.cs index e89b920..45e93d1 100644 --- a/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/OptionObjectHelpers.OptionObject2.Tests.cs +++ b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/OptionObjectHelpers.OptionObject2.Tests.cs @@ -54,6 +54,71 @@ public void SetField_OptionObject2_WithEmptyFieldNumber_ThrowsArgumentException( 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() { @@ -64,6 +129,26 @@ public void GetEntityId_OptionObject2_ReturnsEntityId() 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() { @@ -151,6 +236,17 @@ public void SetEnabledField_OptionObject2_WithEmptyFieldNumber_ThrowsArgumentExc 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() { @@ -253,5 +349,16 @@ public void SetLockedFields_OptionObject2_WithDuplicateFieldNumbers_LocksTargetF 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 index ed0b775..9948e17 100644 --- a/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/OptionObjectHelpers.OptionObject2015.Tests.cs +++ b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/OptionObjectHelpers.OptionObject2015.Tests.cs @@ -54,6 +54,71 @@ public void SetField_OptionObject2015_WithEmptyFieldNumber_ThrowsArgumentExcepti 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() { @@ -64,6 +129,38 @@ public void GetEntityId_OptionObject2015_ReturnsEntityId() 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() { @@ -148,6 +245,17 @@ public void SetDisabledField_OptionObject2015_WithEmptyFieldNumber_ThrowsArgumen 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() { @@ -271,5 +379,32 @@ public void SetLockedFields_OptionObject2015_WithDuplicateFieldNumbers_LocksTarg 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/OptionObject2015Helpers.cs b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/OptionObject2015Helpers.cs index bf5fb5a..e75da4d 100644 --- a/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/OptionObject2015Helpers.cs +++ b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/OptionObject2015Helpers.cs @@ -139,7 +139,11 @@ public static bool HasError(this OptionObject2015 optionObject) foreach (var form in optionObject.Forms) { - form.SetDisabledFields(fieldsToSet); + var formFieldNumbers = fieldsToSet.Where(form.IsFieldPresent).ToList(); + if (formFieldNumbers.Count == 0) + continue; + + form.SetDisabledFields(formFieldNumbers); } return optionObject; @@ -204,7 +208,11 @@ public static bool HasError(this OptionObject2015 optionObject) foreach (var form in optionObject.Forms) { - form.SetEnabledFields(fieldsToSet); + var formFieldNumbers = fieldsToSet.Where(form.IsFieldPresent).ToList(); + if (formFieldNumbers.Count == 0) + continue; + + form.SetEnabledFields(formFieldNumbers); } return optionObject; @@ -269,7 +277,11 @@ public static bool HasError(this OptionObject2015 optionObject) foreach (var form in optionObject.Forms) { - form.SetLockedFields(fieldsToSet); + var formFieldNumbers = fieldsToSet.Where(form.IsFieldPresent).ToList(); + if (formFieldNumbers.Count == 0) + continue; + + form.SetLockedFields(formFieldNumbers); } return optionObject; @@ -334,7 +346,11 @@ public static bool HasError(this OptionObject2015 optionObject) foreach (var form in optionObject.Forms) { - form.SetUnlockedFields(fieldsToSet); + 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 88adeee..cf0eb62 100644 --- a/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/OptionObject2Helpers.cs +++ b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/OptionObject2Helpers.cs @@ -119,7 +119,11 @@ public static bool HasError(this OptionObject2 optionObject) foreach (var form in optionObject.Forms) { - form.SetDisabledFields(fieldsToSet); + var formFieldNumbers = fieldsToSet.Where(form.IsFieldPresent).ToList(); + if (formFieldNumbers.Count == 0) + continue; + + form.SetDisabledFields(formFieldNumbers); } return optionObject; @@ -184,7 +188,11 @@ public static bool HasError(this OptionObject2 optionObject) foreach (var form in optionObject.Forms) { - form.SetEnabledFields(fieldsToSet); + var formFieldNumbers = fieldsToSet.Where(form.IsFieldPresent).ToList(); + if (formFieldNumbers.Count == 0) + continue; + + form.SetEnabledFields(formFieldNumbers); } return optionObject; @@ -249,7 +257,11 @@ public static bool HasError(this OptionObject2 optionObject) foreach (var form in optionObject.Forms) { - form.SetLockedFields(fieldsToSet); + var formFieldNumbers = fieldsToSet.Where(form.IsFieldPresent).ToList(); + if (formFieldNumbers.Count == 0) + continue; + + form.SetLockedFields(formFieldNumbers); } return optionObject; @@ -314,7 +326,11 @@ public static bool HasError(this OptionObject2 optionObject) foreach (var form in optionObject.Forms) { - form.SetUnlockedFields(fieldsToSet); + 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 68428dd..697cd0c 100644 --- a/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/OptionObjectHelpers.cs +++ b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/OptionObjectHelpers.cs @@ -289,7 +289,11 @@ public static bool IsFieldRequired(this OptionObject optionObject, string fieldN foreach (var form in optionObject.Forms) { - form.SetDisabledFields(fieldsToSet); + var formFieldNumbers = fieldsToSet.Where(form.IsFieldPresent).ToList(); + if (formFieldNumbers.Count == 0) + continue; + + form.SetDisabledFields(formFieldNumbers); } return optionObject; @@ -354,7 +358,11 @@ public static bool IsFieldRequired(this OptionObject optionObject, string fieldN foreach (var form in optionObject.Forms) { - form.SetEnabledFields(fieldsToSet); + var formFieldNumbers = fieldsToSet.Where(form.IsFieldPresent).ToList(); + if (formFieldNumbers.Count == 0) + continue; + + form.SetEnabledFields(formFieldNumbers); } return optionObject; @@ -419,7 +427,11 @@ public static bool IsFieldRequired(this OptionObject optionObject, string fieldN foreach (var form in optionObject.Forms) { - form.SetLockedFields(fieldsToSet); + var formFieldNumbers = fieldsToSet.Where(form.IsFieldPresent).ToList(); + if (formFieldNumbers.Count == 0) + continue; + + form.SetLockedFields(formFieldNumbers); } return optionObject; @@ -484,7 +496,11 @@ public static bool IsFieldRequired(this OptionObject optionObject, string fieldN foreach (var form in optionObject.Forms) { - form.SetUnlockedFields(fieldsToSet); + var formFieldNumbers = fieldsToSet.Where(form.IsFieldPresent).ToList(); + if (formFieldNumbers.Count == 0) + continue; + + form.SetUnlockedFields(formFieldNumbers); } return optionObject;