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