diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index fff2fd6..7968823 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -2,7 +2,7 @@ ## About Project -This project provides a open-source libraries for building SOAP web services compatible with Netsmart Technologies' myAvatar CareRecord using ScriptLink. The libraries include the definition of the foundational data types, as well as the ScriptLink request and response structures needed to create custom SOAP web services that can interact with myAvatar. They also include helper methods formanaging and manipulating the data within these structures including creation of the SOAP response. This project aims to simplify the development of custom integrations with myAvatar by providing a robust and easy-to-use set of tools for working with ScriptLink and CareRecord data. +This project provides open-source libraries for building SOAP web services compatible with Netsmart Technologies' myAvatar CareRecord using ScriptLink. The libraries include foundational data types, as well as the ScriptLink request and response structures needed to create custom SOAP web services that interact with myAvatar. They also include helper methods for managing and manipulating data within these structures, including creation of SOAP responses. This project aims to simplify custom myAvatar integrations by providing a robust, easy-to-use set of tools for working with ScriptLink and CareRecord data. The libraries are intended to be packaged and delivered as NuGet packages for easy integration into .NET projects. @@ -12,9 +12,13 @@ The original project, **RarelySimple.AvatarScriptLink**, provided both the found ### New Projects -1. **RarelySimple.AvatarScriptLink.Objects**: This project focuses solely on providing the foundational data types required for working with ScriptLink and CareRecord data. It does not include any helper methods, allowing developers to use just the data structures if they prefer to implement their own logic. -2. **RarelySimple.AvatarScriptLink.Net**: This project provides the helper methods for managing and manipulating the data within the ScriptLink structures. It depends on the RarelySimple.AvatarScriptLink.Objects project for the data types, allowing developers to leverage the helper methods without being tied to a specific implementation of the data structures. -3. **RarelySimple.AvatarScriptLink.Services**: This project contains the interface for defining the ScriptLink web services, allowing developers to create custom SOAP web services that can interact with myAvatar. +1. **RarelySimple.AvatarScriptLink.Objects**: Foundational data types required for working with ScriptLink and CareRecord data. +2. **RarelySimple.AvatarScriptLink.Objects.Helpers**: Extension methods and helper operations for querying and manipulating ScriptLink objects. +3. **RarelySimple.AvatarScriptLink.Objects.Builders**: Fluent builders for constructing ScriptLink objects. +4. **RarelySimple.AvatarScriptLink.Objects.Converters**: Conversion helpers between object representations. +5. **RarelySimple.AvatarScriptLink.Objects.Validators**: Validation helpers and rules for ScriptLink objects. +6. **RarelySimple.AvatarScriptLink.Net**: Batteries-included meta-package that references Objects, Builders, Converters, Helpers, and Validators. +7. **RarelySimple.AvatarScriptLink.Services**: Interfaces for defining ScriptLink web services. ## Repository Organization @@ -23,9 +27,17 @@ The repository is organized into the following directories: - `dotnet`: Contains the .NET implementation of the ScriptLink libraries. - `dotnet/RarelySimple.AvatarScriptLink`: Contains the original ScriptLink project with foundational data types and helper methods. - `dotnet/RarelySimple.AvatarScriptLink.Tests`: Contains unit tests for the RarelySimple.AvatarScriptLink project. -- `dotnet/RarelySimple.AvatarScriptLink.Objects`: Contains the new ScriptLink project which only provides the foundational data types. +- `dotnet/RarelySimple.AvatarScriptLink.Objects`: Contains the foundational data types. - `dotnet/RarelySimple.AvatarScriptLink.Objects.Tests`: Contains unit tests for the RarelySimple.AvatarScriptLink.Objects project. -- `dotnet/RarelySimple.AvatarScriptLink.Net`: Contains the new ScriptLink project specifically providing the helper methods for managing and manipulating the data within these structures. +- `dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers`: Contains extension/helper methods for manipulating data structures. +- `dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests`: Contains unit tests for the Helpers project. +- `dotnet/RarelySimple.AvatarScriptLink.Objects.Builders`: Contains object builders. +- `dotnet/RarelySimple.AvatarScriptLink.Objects.Builders.Tests`: Contains unit tests for the Builders project. +- `dotnet/RarelySimple.AvatarScriptLink.Objects.Converters`: Contains conversion helpers. +- `dotnet/RarelySimple.AvatarScriptLink.Objects.Converters.Tests`: Contains unit tests for the Converters project. +- `dotnet/RarelySimple.AvatarScriptLink.Objects.Validators`: Contains validation helpers. +- `dotnet/RarelySimple.AvatarScriptLink.Objects.Validators.Tests`: Contains unit tests for the Validators project. +- `dotnet/RarelySimple.AvatarScriptLink.Net`: Contains the batteries-included meta-package that references the modular Objects.* projects. - `dotnet/RarelySimple.AvatarScriptLink.Net.Tests`: Contains unit tests for the RarelySimple.AvatarScriptLink.Net project. - `dotnet/RarelySimple.AvatarScriptLink.Services`: Contains the interface for defining the ScriptLink web services. @@ -45,15 +57,15 @@ This is the original version of the RarelySimple.AvatarScriptLink project, which ### Version 2.x.x -This version introduces the separation of concerns by creating new projects for the foundational data types and the helper methods. The RarelySimple.AvatarScriptLink project continues to exist for backward compatibility, while the new projects allow developers to choose only the components they need. +This version introduces separation of concerns through modular Objects.* projects. The RarelySimple.AvatarScriptLink project continues to exist for backward compatibility, while the newer projects allow developers to consume only the layers they need. -In version 2.x.x, the RarelySimple.AvatarScriptLink.Objects project provides the foundational data types, and the RarelySimple.AvatarScriptLink.Net project provides the helper methods. The RarelySimple.AvatarScriptLink.Services project contains the interface for defining the ScriptLink web services. These projects are incompatible with version RarelySimple.AvatarScriptLink due to the separation of concerns and changes in project structure. +In version 2.x.x, RarelySimple.AvatarScriptLink.Objects provides core models, while RarelySimple.AvatarScriptLink.Objects.Helpers, RarelySimple.AvatarScriptLink.Objects.Builders, RarelySimple.AvatarScriptLink.Objects.Converters, and RarelySimple.AvatarScriptLink.Objects.Validators provide focused utility layers. RarelySimple.AvatarScriptLink.Net serves as a batteries-included meta-package over those modular projects. RarelySimple.AvatarScriptLink.Services contains service interfaces for SOAP implementations. These projects are incompatible with version 1.x.x due to the modularized structure. The RarelySimple.AvatarScriptLink project in version 2.x.x will be considered deprecated and receive minimal maintenance for security fixes only. Feature enhancements will be added to the new projects instead. This transition version is intended to give developers time to migrate their implementations to the new modular structure and validate parity between the old and new structures. ### Version 3.x.x and Beyond -Future versions will continue to follow Semantic Versioning principles, with new features and improvements being added to the RarelySimple.AvatarScriptLink.Objects, RarelySimple.AvatarScriptLink.Net, and RarelySimple.AvatarScriptLink.Services projects as needed. Major version changes will be reserved for significant changes that may introduce incompatibilities or require substantial modifications to existing implementations. RarelySimple.AvatarScriptLink will be removed in version 3.0.0. +Future versions will continue to follow Semantic Versioning principles, with new features and improvements added to the RarelySimple.AvatarScriptLink.Objects, RarelySimple.AvatarScriptLink.Net, and RarelySimple.AvatarScriptLink.Services projects as needed. Major version changes will be reserved for significant updates that may introduce incompatibilities or require substantial modifications to existing implementations. RarelySimple.AvatarScriptLink will be removed in version 3.0.0. ## Technology Stack & Dependencies @@ -121,7 +133,7 @@ Future versions will continue to follow Semantic Versioning principles, with new ## Design Principles & Architecture ### Core Architectural Decisions -1. **Separation of Concerns**: Data models (Objects) are separate from utilities (Net), enabling flexibility +1. **Separation of Concerns**: Data models (Objects) are separate from utilities (Objects.Helpers/Builders/Converters/Validators), enabling flexibility 2. **Dependency Injection**: Use DI containers for loose coupling and testability 3. **Interface-Based Design**: All public services expose interfaces, allowing multiple implementations 4. **SOAP Web Service Foundation**: Built on .NET's SOAP/WCF capabilities for myAvatar compatibility @@ -130,8 +142,12 @@ Future versions will continue to follow Semantic Versioning principles, with new ### Project Dependency Graph ``` RarelySimple.AvatarScriptLink.Objects -├── RarelySimple.AvatarScriptLink.Net (depends on Objects) -└── RarelySimple.AvatarScriptLink.Services (depends on Net) +├── RarelySimple.AvatarScriptLink.Objects.Helpers (depends on Objects) +├── RarelySimple.AvatarScriptLink.Objects.Builders (depends on Objects) +├── RarelySimple.AvatarScriptLink.Objects.Converters (depends on Objects) +├── RarelySimple.AvatarScriptLink.Objects.Validators (depends on Objects) +├── RarelySimple.AvatarScriptLink.Net (meta-package depends on Objects.* projects) +└── RarelySimple.AvatarScriptLink.Services (depends on Objects) RarelySimple.AvatarScriptLink (legacy) └── Contains both Objects and Net functionality for backward compatibility @@ -274,11 +290,11 @@ RarelySimple.AvatarScriptLink (legacy) ### Handling Breaking Changes 1. **Planning**: Discuss breaking change scope and timing -3. **Versioning**: Plan for next MAJOR version bump -4. **Deprecation**: Add deprecation warnings in current version first (if possible) -5. **Communication**: Announce in blog post well in advance -6. **Transition Period**: Allow users time to migrate (typically 1-2 major versions) -7. **Release**: Document breaking changes in release notes +2. **Versioning**: Plan for next MAJOR version bump +3. **Deprecation**: Add deprecation warnings in current version first (if possible) +4. **Communication**: Announce in blog post well in advance +5. **Transition Period**: Allow users time to migrate (typically 1-2 major versions) +6. **Release**: Document breaking changes in release notes ### Setting Up Local Development Environment 1. Clone repository and checkout `main` branch diff --git a/.github/instructions/dotnet.instructions.md b/.github/instructions/dotnet.instructions.md index 521f63d..9482b0f 100644 --- a/.github/instructions/dotnet.instructions.md +++ b/.github/instructions/dotnet.instructions.md @@ -9,14 +9,19 @@ This directory contains the .NET implementation of the RarelySimple.AvatarScript ## Projects 1. **RarelySimple.AvatarScriptLink**: The original project that includes both the foundational data types and helper methods. This project is maintained for backward compatibility but is considered deprecated in favor of the new modular projects. -2. **RarelySimple.AvatarScriptLink.Objects**: This project provides the foundational data types required for working with ScriptLink and CareRecord data. It does not include any helper methods, allowing developers to use just the data structures if they prefer to implement their own logic. -3. **RarelySimple.AvatarScriptLink.Net**: This project provides the helper methods for managing and manipulating the data within the ScriptLink structures. It depends on the RarelySimple.AvatarScriptLink.Objects project for the data types, allowing developers to leverage the helper methods without being tied to a specific implementation of the data structures. -4. **RarelySimple.AvatarScriptLink.Services**: This project contains the interface for defining the ScriptLink web services, allowing developers to create custom SOAP web services that can interact with myAvatar. -5. **Unit Test Projects**: Each of the main projects has a corresponding unit test project (e.g., `RarelySimple.AvatarScriptLink.Tests`, `RarelySimple.AvatarScriptLink.Objects.Tests`, `RarelySimple.AvatarScriptLink.Net.Tests`) to ensure code quality and reliability. +2. **RarelySimple.AvatarScriptLink.Objects**: Foundational data types required for working with ScriptLink and CareRecord data. +3. **RarelySimple.AvatarScriptLink.Objects.Helpers**: Extension methods and helper operations for querying and manipulating ScriptLink objects. +4. **RarelySimple.AvatarScriptLink.Objects.Builders**: Fluent builders for constructing ScriptLink objects. +5. **RarelySimple.AvatarScriptLink.Objects.Converters**: Conversion helpers between object representations. +6. **RarelySimple.AvatarScriptLink.Objects.Validators**: Validation helpers and rules for ScriptLink objects. +7. **RarelySimple.AvatarScriptLink.Net**: Batteries-included meta-package that references Objects, Builders, Converters, Helpers, and Validators. +8. **RarelySimple.AvatarScriptLink.Services**: Interfaces for defining ScriptLink web services. +9. **Unit Test Projects**: Each primary project has a corresponding unit test project (e.g., `RarelySimple.AvatarScriptLink.Objects.Helpers.Tests`, `RarelySimple.AvatarScriptLink.Objects.Builders.Tests`, `RarelySimple.AvatarScriptLink.Objects.Converters.Tests`, `RarelySimple.AvatarScriptLink.Objects.Validators.Tests`). -## Compatibiltility +## Compatibility + +To provide the broadest compatibility, core libraries target .NET Standard 2.0, allowing them to be used in a wide range of .NET applications, including .NET Framework, .NET Core, and modern .NET. However, due to reliance on .NET 8+-specific features, RarelySimple.AvatarScriptLink.Services targets .NET 8.0. -To provide the broadest compatiblity, the projects target .NET Standard 2.0, allowing them to be used in a wide range of .NET applications, including .NET Framework, .NET Core, and .NET 5/6/7+. However, due to the reliance on .NET 8+-specific features, RarelySimple.AvatarScriptLink.Services targets .NET 8.0. ## Best Practices ### Project Structure & Organization diff --git a/README.md b/README.md index 45b33c4..86b5716 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,18 @@ AvatarScriptLink.NET is a library for accelerating Netsmart myAvatar ScriptLink API development. +## Package Structure ## + +Version 2.x is modularized into focused packages: + +- `RarelySimple.AvatarScriptLink.Objects` - Core ScriptLink object models +- `RarelySimple.AvatarScriptLink.Objects.Helpers` - Extension methods for querying/manipulating models +- `RarelySimple.AvatarScriptLink.Objects.Builders` - Fluent builders +- `RarelySimple.AvatarScriptLink.Objects.Converters` - Object conversion helpers +- `RarelySimple.AvatarScriptLink.Objects.Validators` - Validation helpers +- `RarelySimple.AvatarScriptLink.Net` - Batteries-included meta-package that references all Objects.* layers +- `RarelySimple.AvatarScriptLink.Services` - ScriptLink service interfaces + ## Documentation ## Check out [the documentation](https://scriptlink.rarelysimple.com/) to learn more. diff --git a/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/ExtensionMethodsTests.cs b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/ExtensionMethodsTests.cs deleted file mode 100644 index f62b10f..0000000 --- a/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/ExtensionMethodsTests.cs +++ /dev/null @@ -1,967 +0,0 @@ -namespace RarelySimple.AvatarScriptLink.Objects.Helpers.Tests -{ - /// - /// Tests for FieldObjectHelpers extension methods - /// - [TestClass] - public class FieldObjectHelpersTests - { - [TestMethod] - public void GetValue_WithValue_ReturnsValue() - { - // Arrange - var field = new FieldObject { FieldValue = "TestValue" }; - - // Act - var result = field.GetValue(); - - // Assert - Assert.AreEqual("TestValue", result); - } - - [TestMethod] - public void GetValue_WithNull_ReturnsNull() - { - // Arrange - FieldObject? field = null; - - // Act - var result = field?.GetValue(); - - // Assert - Assert.IsNull(result); - } - - [TestMethod] - public void SetValue_WithValue_SetsFieldValue() - { - // Arrange - var field = new FieldObject(); - - // Act - field.SetValue("NewValue"); - - // Assert - Assert.AreEqual("NewValue", field.FieldValue); - } - - [TestMethod] - public void SetValue_WithNull_SetsEmptyString() - { - // Arrange - var field = new FieldObject { FieldValue = "OldValue" }; - - // Act - field.SetValue(null!); - - // Assert - Assert.AreEqual(string.Empty, field.FieldValue); - } - - [TestMethod] - public void SetValue_WithNullField_DoesNotThrow() - { - // Arrange - FieldObject? field = null; - - // Act - calling extension method on null should not throw - field?.SetValue("Value"); - // If we reach here, no exception was thrown - test passes - } - - [TestMethod] - public void ClearValue_WithValue_ClearsFieldValue() - { - // Arrange - var field = new FieldObject { FieldValue = "SomeValue" }; - - // Act - field.ClearValue(); - - // Assert - Assert.AreEqual(string.Empty, field.FieldValue); - } - - [TestMethod] - public void ClearValue_WithNullField_DoesNotThrow() - { - // Arrange - FieldObject? field = null; - - // Act - calling extension method on null should not throw - field?.ClearValue(); - // If we reach here, no exception was thrown - test passes - } - } - - /// - /// Tests for RowObjectHelpers extension methods - /// - [TestClass] - public class RowObjectHelpersTests - { - [TestMethod] - public void GetRowId_WithRowId_ReturnsRowId() - { - // Arrange - var row = new RowObject { RowId = "123" }; - - // Act - var result = row.GetRowId(); - - // Assert - Assert.AreEqual("123", result); - } - - [TestMethod] - public void GetRowId_WithNull_ReturnsNull() - { - // Arrange - RowObject? row = null; - - // Act - var result = row?.GetRowId(); - - // Assert - Assert.IsNull(result); - } - - [TestMethod] - public void GetParentRowId_WithParentRowId_ReturnsParentRowId() - { - // Arrange - var row = new RowObject { ParentRowId = "456" }; - - // Act - var result = row.GetParentRowId(); - - // Assert - Assert.AreEqual("456", result); - } - - [TestMethod] - public void GetRowAction_WithRowAction_ReturnsRowAction() - { - // Arrange - var row = new RowObject { RowAction = "EDIT" }; - - // Act - var result = row.GetRowAction(); - - // Assert - Assert.AreEqual("EDIT", result); - } - - [TestMethod] - public void IsMarkedForDeletion_WithDeleteAction_ReturnsTrue() - { - // Arrange - var row = new RowObject { RowAction = "DELETE" }; - - // Act - var result = row.IsMarkedForDeletion(); - - // Assert - Assert.IsTrue(result); - } - - [TestMethod] - public void IsMarkedForDeletion_WithEditAction_ReturnsFalse() - { - // Arrange - var row = new RowObject { RowAction = "EDIT" }; - - // Act - var result = row.IsMarkedForDeletion(); - - // Assert - Assert.IsFalse(result); - } - - [TestMethod] - public void GetFieldCount_WithFields_ReturnsCount() - { - // Arrange - var row = new RowObject(); - row.Fields.Add(new FieldObject()); - row.Fields.Add(new FieldObject()); - - // Act - var result = row.GetFieldCount(); - - // Assert - Assert.AreEqual(2, result); - } - - [TestMethod] - public void GetFieldCount_WithNull_ReturnsZero() - { - // Arrange - RowObject? row = null; - - // Act - var result = row?.GetFieldCount() ?? 0; - - // Assert - Assert.AreEqual(0, result); - } - - [TestMethod] - public void GetFieldValue_WithExistingField_ReturnsValue() - { - // Arrange - var row = new RowObject(); - row.Fields.Add(new FieldObject { FieldNumber = "100", FieldValue = "TestValue" }); - - // Act - var result = row.GetFieldValue("100"); - - // Assert - Assert.AreEqual("TestValue", result); - } - - [TestMethod] - public void GetFieldValue_WithNonExistentField_ReturnsNull() - { - // Arrange - var row = new RowObject(); - row.Fields.Add(new FieldObject { FieldNumber = "100", FieldValue = "TestValue" }); - - // Act - var result = row.GetFieldValue("999"); - - // Assert - Assert.IsNull(result); - } - - [TestMethod] - public void GetFieldValue_WithNullRow_ReturnsNull() - { - // Arrange - RowObject? row = null; - - // Act - var result = row?.GetFieldValue("100"); - - // Assert - Assert.IsNull(result); - } - - [TestMethod] - public void IsFieldPresent_WithField_ReturnsTrue() - { - // Arrange - var row = new RowObject(); - row.Fields.Add(new FieldObject { FieldNumber = "100" }); - - // Act - var result = row.IsFieldPresent("100"); - - // Assert - Assert.IsTrue(result); - } - - [TestMethod] - public void IsFieldPresent_WithoutField_ReturnsFalse() - { - // Arrange - var row = new RowObject(); - - // Act - var result = row.IsFieldPresent("100"); - - // Assert - Assert.IsFalse(result); - } - - [TestMethod] - public void IsFieldEnabled_WithEnabledField_ReturnsTrue() - { - // Arrange - var row = new RowObject(); - row.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "1" }); - - // Act - var result = row.IsFieldEnabled("100"); - - // Assert - Assert.IsTrue(result); - } - - [TestMethod] - public void IsFieldEnabled_WithDisabledField_ReturnsFalse() - { - // Arrange - var row = new RowObject(); - row.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "0" }); - - // Act - var result = row.IsFieldEnabled("100"); - - // Assert - Assert.IsFalse(result); - } - - [TestMethod] - public void IsFieldLocked_WithLockedField_ReturnsTrue() - { - // Arrange - var row = new RowObject(); - row.Fields.Add(new FieldObject { FieldNumber = "100", Lock = "1" }); - - // Act - var result = row.IsFieldLocked("100"); - - // Assert - Assert.IsTrue(result); - } - - [TestMethod] - public void IsFieldRequired_WithRequiredField_ReturnsTrue() - { - // Arrange - var row = new RowObject(); - row.Fields.Add(new FieldObject { FieldNumber = "100", Required = "1" }); - - // Act - var result = row.IsFieldRequired("100"); - - // Assert - Assert.IsTrue(result); - } - - [TestMethod] - public void SetFieldValue_WithExistingField_UpdatesValue() - { - // Arrange - var row = new RowObject { RowAction = "" }; - row.Fields.Add(new FieldObject { FieldNumber = "100", FieldValue = "OldValue" }); - - // Act - var result = row.SetFieldValue("100", "NewValue"); - - // Assert - Assert.AreEqual("NewValue", row.Fields[0].FieldValue); - Assert.AreEqual("EDIT", row.RowAction); - Assert.AreSame(row, result); - } - - [TestMethod] - public void SetFieldValue_WithNonExistentField_DoesNothing() - { - // Arrange - var row = new RowObject(); - - // Act - var result = row.SetFieldValue("999", "Value"); - - // Assert - Assert.IsNull(result?.Fields.FirstOrDefault(f => f.FieldNumber == "999")); - } - - [TestMethod] - public void SetFieldValue_WithNullRow_ReturnsNull() - { - // Arrange - RowObject? row = null; - - // Act - var result = row?.SetFieldValue("100", "Value"); - - // Assert - Assert.IsNull(result); - } - - [TestMethod] - public void DisableAllFieldObjects_WithoutExclusions_DisablesAll() - { - // Arrange - var row = new RowObject(); - var field1 = new FieldObject { FieldNumber = "100", Enabled = "1" }; - var field2 = new FieldObject { FieldNumber = "101", Enabled = "1" }; - row.Fields.Add(field1); - row.Fields.Add(field2); - - // Act - row.DisableAllFieldObjects(); - - // Assert - Assert.AreEqual("0", field1.Enabled); - Assert.AreEqual("0", field2.Enabled); - Assert.AreEqual("EDIT", row.RowAction); - } - - [TestMethod] - public void DisableAllFieldObjects_WithExclusions_DisablesOnlyNonExcluded() - { - // Arrange - var row = new RowObject(); - var field1 = new FieldObject { FieldNumber = "100", Enabled = "1" }; - var field2 = new FieldObject { FieldNumber = "101", Enabled = "1" }; - row.Fields.Add(field1); - row.Fields.Add(field2); - - // Act - row.DisableAllFieldObjects(new List { "101" }); - - // Assert - Assert.AreEqual("0", field1.Enabled); - Assert.AreEqual("1", field2.Enabled); - } - - [TestMethod] - public void EnableAllFieldObjects_WithoutExclusions_EnablesAll() - { - // Arrange - var row = new RowObject(); - var field1 = new FieldObject { FieldNumber = "100", Enabled = "0" }; - var field2 = new FieldObject { FieldNumber = "101", Enabled = "0" }; - row.Fields.Add(field1); - row.Fields.Add(field2); - - // Act - row.EnableAllFieldObjects(); - - // Assert - Assert.AreEqual("1", field1.Enabled); - Assert.AreEqual("1", field2.Enabled); - } - - [TestMethod] - public void EnableAllFieldObjects_WithExclusions_EnablesOnlyNonExcluded() - { - // Arrange - var row = new RowObject(); - var field1 = new FieldObject { FieldNumber = "100", Enabled = "0" }; - var field2 = new FieldObject { FieldNumber = "101", Enabled = "0" }; - row.Fields.Add(field1); - row.Fields.Add(field2); - - // Act - row.EnableAllFieldObjects(new List { "101" }); - - // Assert - Assert.AreEqual("1", field1.Enabled); - Assert.AreEqual("0", field2.Enabled); - } - - [TestMethod] - public void LockAllFieldObjects_LocksAllFields() - { - // Arrange - var row = new RowObject(); - var field = new FieldObject { FieldNumber = "100", Lock = "0" }; - row.Fields.Add(field); - - // Act - row.LockAllFieldObjects(); - - // Assert - Assert.AreEqual("1", field.Lock); - } - - [TestMethod] - public void UnlockAllFieldObjects_UnlocksAllFields() - { - // Arrange - var row = new RowObject(); - var field = new FieldObject { FieldNumber = "100", Lock = "1" }; - row.Fields.Add(field); - - // Act - row.UnlockAllFieldObjects(); - - // Assert - Assert.AreEqual("0", field.Lock); - } - } - - /// - /// Tests for FormObjectHelpers extension methods - /// - [TestClass] - public class FormObjectHelpersTests - { - [TestMethod] - public void IsRowPresent_WithCurrentRow_ReturnsTrue() - { - // Arrange - var form = new FormObject { CurrentRow = new RowObject { RowId = "1" } }; - - // Act - var result = form.IsRowPresent("1"); - - // Assert - Assert.IsTrue(result); - } - - [TestMethod] - public void IsRowPresent_WithOtherRow_ReturnsTrue() - { - // Arrange - var form = new FormObject { CurrentRow = new RowObject { RowId = "1" }, MultipleIteration = true }; - form.OtherRows.Add(new RowObject { RowId = "2" }); - - // Act - var result = form.IsRowPresent("2"); - - // Assert - Assert.IsTrue(result); - } - - [TestMethod] - public void IsRowPresent_WithAbsentRow_ReturnsFalse() - { - // Arrange - var form = new FormObject { CurrentRow = new RowObject { RowId = "1" } }; - - // Act - var result = form.IsRowPresent("999"); - - // Assert - Assert.IsFalse(result); - } - - [TestMethod] - public void IsRowMarkedForDeletion_WithDeletedRow_ReturnsTrue() - { - // Arrange - var form = new FormObject { CurrentRow = new RowObject { RowId = "1", RowAction = "DELETE" } }; - - // Act - var result = form.IsRowMarkedForDeletion("1"); - - // Assert - Assert.IsTrue(result); - } - - [TestMethod] - public void IsRowMarkedForDeletion_WithNormalRow_ReturnsFalse() - { - // Arrange - var form = new FormObject { CurrentRow = new RowObject { RowId = "1", RowAction = "EDIT" } }; - - // Act - var result = form.IsRowMarkedForDeletion("1"); - - // Assert - Assert.IsFalse(result); - } - - [TestMethod] - public void IsFieldPresent_InCurrentRow_ReturnsTrue() - { - // Arrange - var form = new FormObject { CurrentRow = new RowObject() }; - form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100" }); - - // Act - var result = form.IsFieldPresent("100"); - - // Assert - Assert.IsTrue(result); - } - - [TestMethod] - public void IsFieldEnabled_WithEnabledField_ReturnsTrue() - { - // Arrange - var form = new FormObject { CurrentRow = new RowObject() }; - form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "1" }); - - // Act - var result = form.IsFieldEnabled("100"); - - // Assert - Assert.IsTrue(result); - } - - [TestMethod] - public void IsFieldLocked_WithLockedField_ReturnsTrue() - { - // Arrange - var form = new FormObject { CurrentRow = new RowObject() }; - form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Lock = "1" }); - - // Act - var result = form.IsFieldLocked("100"); - - // Assert - Assert.IsTrue(result); - } - - [TestMethod] - public void IsFieldRequired_WithRequiredField_ReturnsTrue() - { - // Arrange - var form = new FormObject { CurrentRow = new RowObject() }; - form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Required = "1" }); - - // Act - var result = form.IsFieldRequired("100"); - - // Assert - Assert.IsTrue(result); - } - - [TestMethod] - public void GetFieldValue_FromCurrentRow_ReturnsValue() - { - // Arrange - var form = new FormObject { CurrentRow = new RowObject() }; - form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", FieldValue = "TestValue" }); - - // Act - var result = form.GetFieldValue("100"); - - // Assert - Assert.AreEqual("TestValue", result); - } - - [TestMethod] - public void GetFieldValue_WithRowIdAndFieldNumber_ReturnsValue() - { - // Arrange - var form = new FormObject { CurrentRow = new RowObject { RowId = "1" } }; - form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", FieldValue = "TestValue" }); - - // Act - var result = form.GetFieldValue("1", "100"); - - // Assert - Assert.AreEqual("TestValue", result); - } - - [TestMethod] - public void GetFieldValueFromOtherRows_WithRowIdAndFieldNumber_ReturnsValue() - { - // Arrange - var form = new FormObject { CurrentRow = new RowObject { RowId = "1" }, MultipleIteration = true }; - var otherRow = new RowObject { RowId = "2" }; - otherRow.Fields.Add(new FieldObject { FieldNumber = "100", FieldValue = "OtherValue" }); - form.OtherRows.Add(otherRow); - - // Act - var result = form.GetFieldValue("2", "100"); - - // Assert - Assert.AreEqual("OtherValue", result); - } - - [TestMethod] - public void GetFieldValues_ReturnsAllValues() - { - // Arrange - var form = new FormObject { CurrentRow = new RowObject { RowId = "1" }, MultipleIteration = true }; - form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", FieldValue = "Value1" }); - - var otherRow = new RowObject { RowId = "2" }; - otherRow.Fields.Add(new FieldObject { FieldNumber = "100", FieldValue = "Value2" }); - form.OtherRows.Add(otherRow); - - // Act - var result = form.GetFieldValues("100"); - - // Assert - Assert.AreEqual(2, result.Count); - CollectionAssert.Contains(result, "Value1"); - CollectionAssert.Contains(result, "Value2"); - } - - [TestMethod] - public void SetFieldValue_InCurrentRow_UpdatesValue() - { - // Arrange - var form = new FormObject { CurrentRow = new RowObject { RowId = "1" } }; - form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", FieldValue = "OldValue" }); - - // Act - form.SetFieldValue("100", "NewValue"); - - // Assert - Assert.AreEqual("NewValue", form.CurrentRow.Fields[0].FieldValue); - } - - [TestMethod] - public void SetFieldValue_WithRowId_UpdatesValueInSpecificRow() - { - // Arrange - var form = new FormObject { CurrentRow = new RowObject { RowId = "1" }, MultipleIteration = true }; - form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", FieldValue = "Value1" }); - - var otherRow = new RowObject { RowId = "2" }; - otherRow.Fields.Add(new FieldObject { FieldNumber = "100", FieldValue = "Value2" }); - form.OtherRows.Add(otherRow); - - // Act - form.SetFieldValue("2", "100", "NewValue"); - - // Assert - Assert.AreEqual("Value1", form.CurrentRow.Fields[0].FieldValue); - Assert.AreEqual("NewValue", otherRow.Fields[0].FieldValue); - } - } - - /// - /// Tests for OptionObjectHelpers extension methods - /// - [TestClass] - public class OptionObjectHelpersTests - { - [TestMethod] - public void GetCurrentRowId_ReturnsCurrrentRowId() - { - // Arrange - var optionObject = new OptionObject(); - var form = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "100" } }; - optionObject.Forms.Add(form); - - // Act - var result = optionObject.GetCurrentRowId("1"); - - // Assert - Assert.AreEqual("100", result); - } - - [TestMethod] - public void GetCurrentRowId_WithNonExistentForm_ReturnsNull() - { - // Arrange - var optionObject = new OptionObject(); - - // Act - var result = optionObject.GetCurrentRowId("999"); - - // Assert - Assert.IsNull(result); - } - - [TestMethod] - public void GetParentRowId_ReturnsParentRowId() - { - // Arrange - var optionObject = new OptionObject(); - var form = new FormObject { FormId = "1", CurrentRow = new RowObject { ParentRowId = "200" } }; - optionObject.Forms.Add(form); - - // Act - var result = optionObject.GetParentRowId("1"); - - // Assert - Assert.AreEqual("200", result); - } - - [TestMethod] - public void GetFieldValue_FromAnyForm_ReturnsValue() - { - // Arrange - var optionObject = new OptionObject(); - var form = new FormObject { FormId = "1", CurrentRow = new RowObject() }; - form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", FieldValue = "TestValue" }); - optionObject.Forms.Add(form); - - // Act - var result = optionObject.GetFieldValue("100"); - - // Assert - Assert.AreEqual("TestValue", result); - } - - [TestMethod] - public void GetFieldValue_WithFormIdRowIdFieldNumber_ReturnsValue() - { - // Arrange - var optionObject = new OptionObject(); - var form = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1" } }; - form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", FieldValue = "TestValue" }); - optionObject.Forms.Add(form); - - // Act - var result = optionObject.GetFieldValue("1", "1", "100"); - - // Assert - Assert.AreEqual("TestValue", result); - } - - [TestMethod] - public void GetFieldValues_ReturnsAllValues() - { - // Arrange - var optionObject = new OptionObject(); - var form1 = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1" } }; - form1.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", FieldValue = "Value1" }); - optionObject.Forms.Add(form1); - - var form2 = new FormObject { FormId = "2", CurrentRow = new RowObject { RowId = "2" } }; - form2.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", FieldValue = "Value2" }); - optionObject.Forms.Add(form2); - - // Act - var result = optionObject.GetFieldValues("100"); - - // Assert - Assert.AreEqual(2, result.Count); - CollectionAssert.Contains(result, "Value1"); - CollectionAssert.Contains(result, "Value2"); - } - - [TestMethod] - public void GetMultipleIterationStatus_ReturnsStatus() - { - // Arrange - var optionObject = new OptionObject(); - var form = new FormObject { FormId = "1", CurrentRow = new RowObject(), MultipleIteration = true }; - optionObject.Forms.Add(form); - - // Act - var result = optionObject.GetMultipleIterationStatus("1"); - - // Assert - Assert.IsTrue(result); - } - - [TestMethod] - public void IsFieldPresent_InAnyForm_ReturnsTrue() - { - // Arrange - var optionObject = new OptionObject(); - var form = new FormObject { FormId = "1", CurrentRow = new RowObject() }; - form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100" }); - optionObject.Forms.Add(form); - - // Act - var result = optionObject.IsFieldPresent("100"); - - // Assert - Assert.IsTrue(result); - } - - [TestMethod] - public void IsFieldEnabled_InAnyForm_ReturnsTrue() - { - // Arrange - var optionObject = new OptionObject(); - var form = new FormObject { FormId = "1", CurrentRow = new RowObject() }; - form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "1" }); - optionObject.Forms.Add(form); - - // Act - var result = optionObject.IsFieldEnabled("100"); - - // Assert - Assert.IsTrue(result); - } - - [TestMethod] - public void IsFieldLocked_InAnyForm_ReturnsTrue() - { - // Arrange - var optionObject = new OptionObject(); - var form = new FormObject { FormId = "1", CurrentRow = new RowObject() }; - form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Lock = "1" }); - optionObject.Forms.Add(form); - - // Act - var result = optionObject.IsFieldLocked("100"); - - // Assert - Assert.IsTrue(result); - } - - [TestMethod] - public void IsFieldRequired_InAnyForm_ReturnsTrue() - { - // Arrange - var optionObject = new OptionObject(); - var form = new FormObject { FormId = "1", CurrentRow = new RowObject() }; - form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Required = "1" }); - optionObject.Forms.Add(form); - - // Act - var result = optionObject.IsFieldRequired("100"); - - // Assert - Assert.IsTrue(result); - } - - [TestMethod] - public void GetErrorCode_ReturnsErrorCode() - { - // Arrange - var optionObject = new OptionObject { ErrorCode = 1.0 }; - - // Act - var result = optionObject.GetErrorCode(); - - // Assert - Assert.AreEqual(1.0, result); - } - - [TestMethod] - public void GetErrorMessage_ReturnsErrorMessage() - { - // Arrange - var optionObject = new OptionObject { ErrorMesg = "Test Error" }; - - // Act - var result = optionObject.GetErrorMessage(); - - // Assert - Assert.AreEqual("Test Error", result); - } - - [TestMethod] - public void GetEntityId_ReturnsEntityId() - { - // Arrange - var optionObject = new OptionObject { EntityID = "12345" }; - - // Act - var result = optionObject.GetEntityId(); - - // Assert - Assert.AreEqual("12345", result); - } - - [TestMethod] - public void GetFormCount_ReturnsFormCount() - { - // Arrange - var optionObject = new OptionObject(); - optionObject.Forms.Add(new FormObject { FormId = "1" }); - optionObject.Forms.Add(new FormObject { FormId = "2" }); - - // Act - var result = optionObject.GetFormCount(); - - // Assert - Assert.AreEqual(2, result); - } - - [TestMethod] - public void HasError_WithNonZeroErrorCode_ReturnsTrue() - { - // Arrange - var optionObject = new OptionObject { ErrorCode = 1.0 }; - - // Act - var result = optionObject.HasError(); - - // Assert - Assert.IsTrue(result); - } - - [TestMethod] - public void HasError_WithZeroErrorCode_ReturnsFalse() - { - // Arrange - var optionObject = new OptionObject { ErrorCode = 0.0 }; - - // Act - var result = optionObject.HasError(); - - // Assert - Assert.IsFalse(result); - } - } -} diff --git a/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/FieldObjectHelpersTests.cs b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/FieldObjectHelpersTests.cs new file mode 100644 index 0000000..d27952a --- /dev/null +++ b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/FieldObjectHelpersTests.cs @@ -0,0 +1,97 @@ +namespace RarelySimple.AvatarScriptLink.Objects.Helpers.Tests +{ + /// + /// Tests for FieldObjectHelpers extension methods + /// + [TestClass] + public class FieldObjectHelpersTests + { + [TestMethod] + public void GetValue_WithValue_ReturnsValue() + { + // Arrange + var field = new FieldObject { FieldValue = "TestValue" }; + + // Act + var result = field.GetValue(); + + // Assert + Assert.AreEqual("TestValue", result); + } + + [TestMethod] + public void GetValue_WithNull_ReturnsNull() + { + // Arrange + FieldObject? field = null; + + // Act + var result = field?.GetValue(); + + // Assert + Assert.IsNull(result); + } + + [TestMethod] + public void SetValue_WithValue_SetsFieldValue() + { + // Arrange + var field = new FieldObject(); + + // Act + field.SetValue("NewValue"); + + // Assert + Assert.AreEqual("NewValue", field.FieldValue); + } + + [TestMethod] + public void SetValue_WithNull_SetsEmptyString() + { + // Arrange + var field = new FieldObject { FieldValue = "OldValue" }; + + // Act + field.SetValue(null!); + + // Assert + Assert.AreEqual(string.Empty, field.FieldValue); + } + + [TestMethod] + public void SetValue_WithNullField_DoesNotThrow() + { + // Arrange + FieldObject? field = null; + + // Act - calling extension method on null should not throw + field?.SetValue("Value"); + // If we reach here, no exception was thrown - test passes + } + + [TestMethod] + public void ClearValue_WithValue_ClearsFieldValue() + { + // Arrange + var field = new FieldObject { FieldValue = "SomeValue" }; + + // Act + field.ClearValue(); + + // Assert + Assert.AreEqual(string.Empty, field.FieldValue); + } + + [TestMethod] + public void ClearValue_WithNullField_DoesNotThrow() + { + // Arrange + FieldObject? field = null; + + // Act - calling extension method on null should not throw + field?.ClearValue(); + // If we reach here, no exception was thrown - test passes + } + } + +} diff --git a/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/FormObjectHelpersTests.cs b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/FormObjectHelpersTests.cs new file mode 100644 index 0000000..ca847c4 --- /dev/null +++ b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/FormObjectHelpersTests.cs @@ -0,0 +1,345 @@ +namespace RarelySimple.AvatarScriptLink.Objects.Helpers.Tests +{ + + /// + /// Tests for FormObjectHelpers extension methods + /// + [TestClass] + public class FormObjectHelpersTests + { + [TestMethod] + public void IsRowPresent_WithCurrentRow_ReturnsTrue() + { + // Arrange + var form = new FormObject { CurrentRow = new RowObject { RowId = "1" } }; + + // Act + var result = form.IsRowPresent("1"); + + // Assert + Assert.IsTrue(result); + } + + [TestMethod] + public void IsRowPresent_WithOtherRow_ReturnsTrue() + { + // Arrange + var form = new FormObject { CurrentRow = new RowObject { RowId = "1" }, MultipleIteration = true }; + form.OtherRows.Add(new RowObject { RowId = "2" }); + + // Act + var result = form.IsRowPresent("2"); + + // Assert + Assert.IsTrue(result); + } + + [TestMethod] + public void IsRowPresent_WithAbsentRow_ReturnsFalse() + { + // Arrange + var form = new FormObject { CurrentRow = new RowObject { RowId = "1" } }; + + // Act + var result = form.IsRowPresent("999"); + + // Assert + Assert.IsFalse(result); + } + + [TestMethod] + public void IsRowMarkedForDeletion_WithDeletedRow_ReturnsTrue() + { + // Arrange + var form = new FormObject { CurrentRow = new RowObject { RowId = "1", RowAction = "DELETE" } }; + + // Act + var result = form.IsRowMarkedForDeletion("1"); + + // Assert + Assert.IsTrue(result); + } + + [TestMethod] + public void IsRowMarkedForDeletion_WithNormalRow_ReturnsFalse() + { + // Arrange + var form = new FormObject { CurrentRow = new RowObject { RowId = "1", RowAction = "EDIT" } }; + + // Act + var result = form.IsRowMarkedForDeletion("1"); + + // Assert + Assert.IsFalse(result); + } + + [TestMethod] + public void IsFieldPresent_InCurrentRow_ReturnsTrue() + { + // Arrange + var form = new FormObject { CurrentRow = new RowObject() }; + form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100" }); + + // Act + var result = form.IsFieldPresent("100"); + + // Assert + Assert.IsTrue(result); + } + + [TestMethod] + public void IsFieldEnabled_WithEnabledField_ReturnsTrue() + { + // Arrange + var form = new FormObject { CurrentRow = new RowObject() }; + form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "1" }); + + // Act + var result = form.IsFieldEnabled("100"); + + // Assert + Assert.IsTrue(result); + } + + [TestMethod] + public void IsFieldLocked_WithLockedField_ReturnsTrue() + { + // Arrange + var form = new FormObject { CurrentRow = new RowObject() }; + form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Lock = "1" }); + + // Act + var result = form.IsFieldLocked("100"); + + // Assert + Assert.IsTrue(result); + } + + [TestMethod] + public void IsFieldRequired_WithRequiredField_ReturnsTrue() + { + // Arrange + var form = new FormObject { CurrentRow = new RowObject() }; + form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Required = "1" }); + + // Act + var result = form.IsFieldRequired("100"); + + // Assert + Assert.IsTrue(result); + } + + [TestMethod] + public void GetFieldValue_FromCurrentRow_ReturnsValue() + { + // Arrange + var form = new FormObject { CurrentRow = new RowObject() }; + form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", FieldValue = "TestValue" }); + + // Act + var result = form.GetFieldValue("100"); + + // Assert + Assert.AreEqual("TestValue", result); + } + + [TestMethod] + public void GetFieldValue_WithRowIdAndFieldNumber_ReturnsValue() + { + // Arrange + var form = new FormObject { CurrentRow = new RowObject { RowId = "1" } }; + form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", FieldValue = "TestValue" }); + + // Act + var result = form.GetFieldValue("1", "100"); + + // Assert + Assert.AreEqual("TestValue", result); + } + + [TestMethod] + public void GetFieldValueFromOtherRows_WithRowIdAndFieldNumber_ReturnsValue() + { + // Arrange + var form = new FormObject { CurrentRow = new RowObject { RowId = "1" }, MultipleIteration = true }; + var otherRow = new RowObject { RowId = "2" }; + otherRow.Fields.Add(new FieldObject { FieldNumber = "100", FieldValue = "OtherValue" }); + form.OtherRows.Add(otherRow); + + // Act + var result = form.GetFieldValue("2", "100"); + + // Assert + Assert.AreEqual("OtherValue", result); + } + + [TestMethod] + public void GetFieldValues_ReturnsAllValues() + { + // Arrange + var form = new FormObject { CurrentRow = new RowObject { RowId = "1" }, MultipleIteration = true }; + form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", FieldValue = "Value1" }); + + var otherRow = new RowObject { RowId = "2" }; + otherRow.Fields.Add(new FieldObject { FieldNumber = "100", FieldValue = "Value2" }); + form.OtherRows.Add(otherRow); + + // Act + var result = form.GetFieldValues("100"); + + // Assert + Assert.AreEqual(2, result.Count); + CollectionAssert.Contains(result, "Value1"); + CollectionAssert.Contains(result, "Value2"); + } + + [TestMethod] + public void SetFieldValue_InCurrentRow_UpdatesValue() + { + // Arrange + var form = new FormObject { CurrentRow = new RowObject { RowId = "1" } }; + form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", FieldValue = "OldValue" }); + + // Act + form.SetFieldValue("100", "NewValue"); + + // Assert + Assert.AreEqual("NewValue", form.CurrentRow.Fields[0].FieldValue); + } + + [TestMethod] + public void SetFieldValue_WithRowId_UpdatesValueInSpecificRow() + { + // Arrange + var form = new FormObject { CurrentRow = new RowObject { RowId = "1" }, MultipleIteration = true }; + form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", FieldValue = "Value1" }); + + var otherRow = new RowObject { RowId = "2" }; + otherRow.Fields.Add(new FieldObject { FieldNumber = "100", FieldValue = "Value2" }); + form.OtherRows.Add(otherRow); + + // Act + form.SetFieldValue("2", "100", "NewValue"); + + // Assert + Assert.AreEqual("Value1", form.CurrentRow.Fields[0].FieldValue); + Assert.AreEqual("NewValue", otherRow.Fields[0].FieldValue); + } + + [TestMethod] + public void SetDisabledField_WithMultipleIteration_DisablesFieldInAllRows() + { + // Arrange + var form = new FormObject { CurrentRow = new RowObject { RowId = "1", RowAction = "" }, MultipleIteration = true }; + form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "1" }); + var otherRow = new RowObject { RowId = "2", RowAction = "" }; + otherRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "1" }); + form.OtherRows.Add(otherRow); + + // Act + form.SetDisabledField("100"); + + // Assert + Assert.AreEqual("0", form.CurrentRow.Fields[0].Enabled); + Assert.AreEqual("0", otherRow.Fields[0].Enabled); + Assert.AreEqual("EDIT", form.CurrentRow.RowAction); + Assert.AreEqual("EDIT", otherRow.RowAction); + } + + [TestMethod] + public void SetEnabledFields_WithMultipleIteration_EnablesMatchingFieldsInAllRows() + { + // Arrange + var form = new FormObject { CurrentRow = new RowObject { RowId = "1" }, MultipleIteration = true }; + form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "0" }); + var otherRow = new RowObject { RowId = "2" }; + otherRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "0" }); + form.OtherRows.Add(otherRow); + + // Act + form.SetEnabledFields(new List { "100" }); + + // Assert + Assert.AreEqual("1", form.CurrentRow.Fields[0].Enabled); + Assert.AreEqual("1", otherRow.Fields[0].Enabled); + } + + [TestMethod] + public void SetDisabledField_WithEmptyFieldNumber_DoesNotChangeForm() + { + // Arrange + var form = new FormObject { CurrentRow = new RowObject { RowId = "1", RowAction = "" } }; + form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "1" }); + + // Act + form.SetDisabledField(string.Empty); + + // Assert + Assert.AreEqual("1", form.CurrentRow.Fields[0].Enabled); + Assert.AreEqual("", form.CurrentRow.RowAction); + } + + [TestMethod] + public void SetEnabledFields_WithNullFieldNumbers_DoesNotChangeForm() + { + // Arrange + var form = new FormObject { CurrentRow = new RowObject { RowId = "1", RowAction = "" } }; + form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "0" }); + + // Act + form.SetEnabledFields(null); + + // Assert + Assert.AreEqual("0", form.CurrentRow.Fields[0].Enabled); + Assert.AreEqual("", form.CurrentRow.RowAction); + } + + [TestMethod] + public void SetDisabledField_WithNullCurrentRow_ReturnsOriginalForm() + { + // Arrange + var form = new FormObject { CurrentRow = null! }; + + // Act + var result = form.SetDisabledField("100"); + + // Assert + Assert.AreSame(form, result); + } + + [TestMethod] + public void SetEnabledField_WithEmptyFieldNumber_DoesNotChangeForm() + { + // Arrange + var form = new FormObject { CurrentRow = new RowObject { RowId = "1", RowAction = "" } }; + form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "0" }); + + // Act + form.SetEnabledField(string.Empty); + + // Assert + Assert.AreEqual("0", form.CurrentRow.Fields[0].Enabled); + Assert.AreEqual("", form.CurrentRow.RowAction); + } + + [TestMethod] + public void SetDisabledFields_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.SetDisabledFields(["100"]); + + // Assert + Assert.AreEqual("0", form.CurrentRow.Fields[0].Enabled); + Assert.AreEqual("1", otherRow.Fields[0].Enabled); + } + } + +} diff --git a/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/OptionObjectHelpersTests.cs b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/OptionObjectHelpersTests.cs new file mode 100644 index 0000000..47912c3 --- /dev/null +++ b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/OptionObjectHelpersTests.cs @@ -0,0 +1,719 @@ +namespace RarelySimple.AvatarScriptLink.Objects.Helpers.Tests +{ + + /// + /// Tests for OptionObject/OptionObject2/OptionObject2015 helper extension methods + /// + [TestClass] + public class OptionObjectHelpersTests + { + [TestMethod] + public void GetCurrentRowId_ReturnsCurrentRowId() + { + // Arrange + var optionObject = new OptionObject(); + var form = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "100" } }; + optionObject.Forms.Add(form); + + // Act + var result = optionObject.GetCurrentRowId("1"); + + // Assert + Assert.AreEqual("100", result); + } + + [TestMethod] + public void GetCurrentRowId_WithNonExistentForm_ReturnsNull() + { + // Arrange + var optionObject = new OptionObject(); + + // Act + var result = optionObject.GetCurrentRowId("999"); + + // Assert + Assert.IsNull(result); + } + + [TestMethod] + public void GetParentRowId_ReturnsParentRowId() + { + // Arrange + var optionObject = new OptionObject(); + var form = new FormObject { FormId = "1", CurrentRow = new RowObject { ParentRowId = "200" } }; + optionObject.Forms.Add(form); + + // Act + var result = optionObject.GetParentRowId("1"); + + // Assert + Assert.AreEqual("200", result); + } + + [TestMethod] + public void GetFieldValue_FromAnyForm_ReturnsValue() + { + // Arrange + var optionObject = new OptionObject(); + var form = new FormObject { FormId = "1", CurrentRow = new RowObject() }; + form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", FieldValue = "TestValue" }); + optionObject.Forms.Add(form); + + // Act + var result = optionObject.GetFieldValue("100"); + + // Assert + Assert.AreEqual("TestValue", result); + } + + [TestMethod] + public void GetFieldValue_WithFormIdRowIdFieldNumber_ReturnsValue() + { + // Arrange + var optionObject = new OptionObject(); + var form = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1" } }; + form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", FieldValue = "TestValue" }); + optionObject.Forms.Add(form); + + // Act + var result = optionObject.GetFieldValue("1", "1", "100"); + + // Assert + Assert.AreEqual("TestValue", result); + } + + [TestMethod] + public void GetFieldValues_ReturnsAllValues() + { + // Arrange + var optionObject = new OptionObject(); + var form1 = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1" } }; + form1.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", FieldValue = "Value1" }); + optionObject.Forms.Add(form1); + + var form2 = new FormObject { FormId = "2", CurrentRow = new RowObject { RowId = "2" } }; + form2.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", FieldValue = "Value2" }); + optionObject.Forms.Add(form2); + + // Act + var result = optionObject.GetFieldValues("100"); + + // Assert + Assert.AreEqual(2, result.Count); + CollectionAssert.Contains(result, "Value1"); + CollectionAssert.Contains(result, "Value2"); + } + + [TestMethod] + public void GetMultipleIterationStatus_ReturnsStatus() + { + // Arrange + var optionObject = new OptionObject(); + var form = new FormObject { FormId = "1", CurrentRow = new RowObject(), MultipleIteration = true }; + optionObject.Forms.Add(form); + + // Act + var result = optionObject.GetMultipleIterationStatus("1"); + + // Assert + Assert.IsTrue(result); + } + + [TestMethod] + public void IsFieldPresent_InAnyForm_ReturnsTrue() + { + // Arrange + var optionObject = new OptionObject(); + var form = new FormObject { FormId = "1", CurrentRow = new RowObject() }; + form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100" }); + optionObject.Forms.Add(form); + + // Act + var result = optionObject.IsFieldPresent("100"); + + // Assert + Assert.IsTrue(result); + } + + [TestMethod] + public void IsFieldEnabled_InAnyForm_ReturnsTrue() + { + // Arrange + var optionObject = new OptionObject(); + var form = new FormObject { FormId = "1", CurrentRow = new RowObject() }; + form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "1" }); + optionObject.Forms.Add(form); + + // Act + var result = optionObject.IsFieldEnabled("100"); + + // Assert + Assert.IsTrue(result); + } + + [TestMethod] + public void IsFieldLocked_InAnyForm_ReturnsTrue() + { + // Arrange + var optionObject = new OptionObject(); + var form = new FormObject { FormId = "1", CurrentRow = new RowObject() }; + form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Lock = "1" }); + optionObject.Forms.Add(form); + + // Act + var result = optionObject.IsFieldLocked("100"); + + // Assert + Assert.IsTrue(result); + } + + [TestMethod] + public void IsFieldRequired_InAnyForm_ReturnsTrue() + { + // Arrange + var optionObject = new OptionObject(); + var form = new FormObject { FormId = "1", CurrentRow = new RowObject() }; + form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Required = "1" }); + optionObject.Forms.Add(form); + + // Act + var result = optionObject.IsFieldRequired("100"); + + // Assert + Assert.IsTrue(result); + } + + [TestMethod] + public void GetErrorCode_ReturnsErrorCode() + { + // Arrange + var optionObject = new OptionObject { ErrorCode = 1.0 }; + + // Act + var result = optionObject.GetErrorCode(); + + // Assert + Assert.AreEqual(1.0, result); + } + + [TestMethod] + public void GetErrorMessage_ReturnsErrorMessage() + { + // Arrange + var optionObject = new OptionObject { ErrorMesg = "Test Error" }; + + // Act + var result = optionObject.GetErrorMessage(); + + // Assert + Assert.AreEqual("Test Error", result); + } + + [TestMethod] + public void GetEntityId_ReturnsEntityId() + { + // Arrange + var optionObject = new OptionObject { EntityID = "12345" }; + + // Act + var result = optionObject.GetEntityId(); + + // Assert + Assert.AreEqual("12345", result); + } + + [TestMethod] + public void GetFormCount_ReturnsFormCount() + { + // Arrange + var optionObject = new OptionObject(); + optionObject.Forms.Add(new FormObject { FormId = "1" }); + optionObject.Forms.Add(new FormObject { FormId = "2" }); + + // Act + var result = optionObject.GetFormCount(); + + // Assert + Assert.AreEqual(2, result); + } + + [TestMethod] + public void HasError_WithNonZeroErrorCode_ReturnsTrue() + { + // Arrange + var optionObject = new OptionObject { ErrorCode = 1.0 }; + + // Act + var result = optionObject.HasError(); + + // Assert + Assert.IsTrue(result); + } + + [TestMethod] + public void HasError_WithZeroErrorCode_ReturnsFalse() + { + // Arrange + var optionObject = new OptionObject { ErrorCode = 0.0 }; + + // Act + var result = optionObject.HasError(); + + // Assert + Assert.IsFalse(result); + } + + [TestMethod] + public void GetEntityId_OptionObject2_ReturnsEntityId() + { + var optionObject = new OptionObject2 { EntityID = "E-2" }; + + var result = optionObject.GetEntityId(); + + Assert.AreEqual("E-2", result); + } + + [TestMethod] + public void GetFormCount_OptionObject2_ReturnsFormCount() + { + var optionObject = new OptionObject2(); + optionObject.Forms.Add(new FormObject { FormId = "1" }); + optionObject.Forms.Add(new FormObject { FormId = "2" }); + + var result = optionObject.GetFormCount(); + + Assert.AreEqual(2, result); + } + + [TestMethod] + public void HasError_OptionObject2_WithZeroErrorCode_ReturnsFalse() + { + var optionObject = new OptionObject2 { ErrorCode = 0 }; + + var result = optionObject.HasError(); + + Assert.IsFalse(result); + } + + [TestMethod] + public void GetEntityId_OptionObject2015_ReturnsEntityId() + { + var optionObject = new OptionObject2015 { EntityID = "E-2015" }; + + var result = optionObject.GetEntityId(); + + Assert.AreEqual("E-2015", result); + } + + [TestMethod] + public void GetSessionToken_OptionObject2015_ReturnsSessionToken() + { + var optionObject = new OptionObject2015 { SessionToken = "token-123" }; + + var result = optionObject.GetSessionToken(); + + Assert.AreEqual("token-123", result); + } + + [TestMethod] + public void GetOptionUserId_OptionObject2015_ReturnsOptionUserId() + { + var optionObject = new OptionObject2015 { OptionUserId = "user-01" }; + + var result = optionObject.GetOptionUserId(); + + Assert.AreEqual("user-01", result); + } + + [TestMethod] + public void HasError_OptionObject2015_WithNonZeroErrorCode_ReturnsTrue() + { + var optionObject = new OptionObject2015 { ErrorCode = 1 }; + + var result = optionObject.HasError(); + + Assert.IsTrue(result); + } + + [TestMethod] + public void SetDisabledField_OptionObject_DisablesTargetField() + { + // Arrange + var optionObject = new OptionObject(); + var form = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1", RowAction = "" } }; + form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "1" }); + optionObject.Forms.Add(form); + + // Act + optionObject.SetDisabledField("100"); + + // Assert + Assert.AreEqual("0", optionObject.Forms[0].CurrentRow.Fields[0].Enabled); + Assert.AreEqual("EDIT", optionObject.Forms[0].CurrentRow.RowAction); + } + + [TestMethod] + public void SetEnabledFields_OptionObject_EnablesMatchingFields() + { + // Arrange + var optionObject = new OptionObject(); + var form = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1" } }; + form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "0" }); + form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "101", Enabled = "0" }); + optionObject.Forms.Add(form); + + // Act + optionObject.SetEnabledFields(new List { "101" }); + + // Assert + Assert.AreEqual("0", optionObject.Forms[0].CurrentRow.Fields[0].Enabled); + Assert.AreEqual("1", optionObject.Forms[0].CurrentRow.Fields[1].Enabled); + } + + [TestMethod] + public void SetDisabledField_OptionObject2_DisablesTargetField() + { + // Arrange + var optionObject = new OptionObject2(); + var form = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1" } }; + form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "1" }); + optionObject.Forms.Add(form); + + // Act + optionObject.SetDisabledField("100"); + + // Assert + Assert.AreEqual("0", optionObject.Forms[0].CurrentRow.Fields[0].Enabled); + } + + [TestMethod] + public void SetEnabledField_OptionObject2015_EnablesTargetField() + { + // Arrange + var optionObject = new OptionObject2015(); + var form = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1" } }; + form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "0" }); + optionObject.Forms.Add(form); + + // Act + optionObject.SetEnabledField("100"); + + // Assert + Assert.AreEqual("1", optionObject.Forms[0].CurrentRow.Fields[0].Enabled); + } + + [TestMethod] + public void SetDisabledFields_OptionObject_WithFieldObjects_DisablesMatchingFields() + { + // Arrange + var optionObject = new OptionObject(); + var form = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1" } }; + form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "1" }); + form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "101", Enabled = "1" }); + optionObject.Forms.Add(form); + + var fieldsToDisable = new List { new FieldObject { FieldNumber = "101" } }; + + // Act + optionObject.SetDisabledFields(fieldsToDisable); + + // Assert + Assert.AreEqual("1", optionObject.Forms[0].CurrentRow.Fields[0].Enabled); + Assert.AreEqual("0", optionObject.Forms[0].CurrentRow.Fields[1].Enabled); + } + + [TestMethod] + public void SetEnabledFields_OptionObject2_WithFieldObjects_EnablesMatchingFields() + { + // Arrange + var optionObject = new OptionObject2(); + var form = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1" } }; + form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "0" }); + optionObject.Forms.Add(form); + + var fieldsToEnable = new List { new FieldObject { FieldNumber = "100" } }; + + // Act + optionObject.SetEnabledFields(fieldsToEnable); + + // Assert + Assert.AreEqual("1", optionObject.Forms[0].CurrentRow.Fields[0].Enabled); + } + + [TestMethod] + public void SetDisabledFields_OptionObject2015_WithFieldObjects_DisablesMatchingFields() + { + // Arrange + var optionObject = new OptionObject2015(); + var form = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1" } }; + form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "1" }); + optionObject.Forms.Add(form); + + var fieldsToDisable = new List { new FieldObject { FieldNumber = "100" } }; + + // Act + optionObject.SetDisabledFields(fieldsToDisable); + + // Assert + Assert.AreEqual("0", optionObject.Forms[0].CurrentRow.Fields[0].Enabled); + } + + [TestMethod] + public void SetDisabledField_OptionObject_WithEmptyFieldNumber_DoesNothing() + { + // Arrange + var optionObject = new OptionObject(); + var form = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1", RowAction = "" } }; + form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "1" }); + optionObject.Forms.Add(form); + + // Act + optionObject.SetDisabledField(string.Empty); + + // Assert + Assert.AreEqual("1", optionObject.Forms[0].CurrentRow.Fields[0].Enabled); + Assert.AreEqual("", optionObject.Forms[0].CurrentRow.RowAction); + } + + [TestMethod] + public void SetDisabledFields_OptionObject_WithNullFieldObjects_DoesNothing() + { + // Arrange + var optionObject = new OptionObject(); + var form = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1" } }; + form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "1" }); + optionObject.Forms.Add(form); + + // Act + optionObject.SetDisabledFields((List?)null); + + // Assert + Assert.AreEqual("1", optionObject.Forms[0].CurrentRow.Fields[0].Enabled); + } + + [TestMethod] + public void SetDisabledField_OptionObject_WithNullOptionObject_ReturnsNull() + { + // Act + var result = OptionObjectHelpers.SetDisabledField(null!, "100"); + + // Assert + Assert.IsNull(result); + } + + [TestMethod] + public void SetEnabledField_OptionObject_WithNullForms_ReturnsOriginalObject() + { + // Arrange + var optionObject = new OptionObject { Forms = null! }; + + // Act + var result = optionObject.SetEnabledField("100"); + + // Assert + Assert.AreSame(optionObject, result); + } + + [TestMethod] + public void SetDisabledFields_OptionObject2_WithFieldNumbers_DisablesMatchingFields() + { + // Arrange + var optionObject = new OptionObject2(); + var form = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1" } }; + form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "1" }); + form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "101", Enabled = "1" }); + optionObject.Forms.Add(form); + + // Act + optionObject.SetDisabledFields(new List { "101" }); + + // Assert + Assert.AreEqual("1", optionObject.Forms[0].CurrentRow.Fields[0].Enabled); + Assert.AreEqual("0", optionObject.Forms[0].CurrentRow.Fields[1].Enabled); + } + + [TestMethod] + public void SetDisabledFields_OptionObject2_WithEmptyFieldObjects_DoesNothing() + { + var optionObject = new OptionObject2(); + var form = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1" } }; + form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "1" }); + optionObject.Forms.Add(form); + + optionObject.SetDisabledFields(new List()); + + Assert.AreEqual("1", optionObject.Forms[0].CurrentRow.Fields[0].Enabled); + } + + [TestMethod] + public void SetEnabledField_OptionObject2_WithEmptyFieldNumber_DoesNothing() + { + // Arrange + var optionObject = new OptionObject2(); + var form = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1", RowAction = "" } }; + form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "0" }); + optionObject.Forms.Add(form); + + // Act + optionObject.SetEnabledField(string.Empty); + + // Assert + Assert.AreEqual("0", optionObject.Forms[0].CurrentRow.Fields[0].Enabled); + Assert.AreEqual("", optionObject.Forms[0].CurrentRow.RowAction); + } + + [TestMethod] + public void SetEnabledField_OptionObject2_WithNullOptionObject_ReturnsNull() + { + // Act + var result = OptionObject2Helpers.SetEnabledField(null!, "100"); + + // Assert + Assert.IsNull(result); + } + + [TestMethod] + public void SetEnabledFields_OptionObject2_WithEmptyFieldNumbers_DoesNothing() + { + // Arrange + var optionObject = new OptionObject2(); + var form = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1" } }; + form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "0" }); + optionObject.Forms.Add(form); + + // Act + optionObject.SetEnabledFields(new List()); + + // Assert + Assert.AreEqual("0", optionObject.Forms[0].CurrentRow.Fields[0].Enabled); + } + + [TestMethod] + public void SetEnabledFields_OptionObject2_WithNullFieldObjects_DoesNothing() + { + var optionObject = new OptionObject2(); + var form = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1" } }; + form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "0" }); + optionObject.Forms.Add(form); + + optionObject.SetEnabledFields((List?)null); + + Assert.AreEqual("0", optionObject.Forms[0].CurrentRow.Fields[0].Enabled); + } + + [TestMethod] + public void SetDisabledField_OptionObject2_WithNullForms_ReturnsOriginalObject() + { + // Arrange + var optionObject = new OptionObject2 { Forms = null! }; + + // Act + var result = optionObject.SetDisabledField("100"); + + // Assert + Assert.AreSame(optionObject, result); + } + + [TestMethod] + public void SetEnabledFields_OptionObject2015_WithFieldNumbers_EnablesMatchingFields() + { + // Arrange + var optionObject = new OptionObject2015(); + var form = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1" } }; + form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "0" }); + form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "101", Enabled = "0" }); + optionObject.Forms.Add(form); + + // Act + optionObject.SetEnabledFields(new List { "100" }); + + // Assert + Assert.AreEqual("1", optionObject.Forms[0].CurrentRow.Fields[0].Enabled); + Assert.AreEqual("0", optionObject.Forms[0].CurrentRow.Fields[1].Enabled); + } + + [TestMethod] + public void SetDisabledField_OptionObject2015_WithEmptyFieldNumber_DoesNothing() + { + // Arrange + var optionObject = new OptionObject2015(); + var form = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1", RowAction = "" } }; + form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "1" }); + optionObject.Forms.Add(form); + + // Act + optionObject.SetDisabledField(string.Empty); + + // Assert + Assert.AreEqual("1", optionObject.Forms[0].CurrentRow.Fields[0].Enabled); + Assert.AreEqual("", optionObject.Forms[0].CurrentRow.RowAction); + } + + [TestMethod] + public void SetEnabledFields_OptionObject2015_WithNullFieldObjects_DoesNothing() + { + // Arrange + var optionObject = new OptionObject2015(); + var form = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1" } }; + form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "0" }); + optionObject.Forms.Add(form); + + // Act + optionObject.SetEnabledFields((List?)null); + + // Assert + Assert.AreEqual("0", optionObject.Forms[0].CurrentRow.Fields[0].Enabled); + } + + [TestMethod] + public void SetDisabledFields_OptionObject2015_WithEmptyFieldObjects_DoesNothing() + { + var optionObject = new OptionObject2015(); + var form = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1" } }; + form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "1" }); + optionObject.Forms.Add(form); + + optionObject.SetDisabledFields(new List()); + + Assert.AreEqual("1", optionObject.Forms[0].CurrentRow.Fields[0].Enabled); + } + + [TestMethod] + public void SetEnabledFields_OptionObject2015_WithEmptyFieldObjects_DoesNothing() + { + var optionObject = new OptionObject2015(); + var form = new FormObject { FormId = "1", CurrentRow = new RowObject { RowId = "1" } }; + form.CurrentRow.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "0" }); + optionObject.Forms.Add(form); + + optionObject.SetEnabledFields(new List()); + + Assert.AreEqual("0", optionObject.Forms[0].CurrentRow.Fields[0].Enabled); + } + + [TestMethod] + public void SetDisabledField_OptionObject2015_WithNullForms_ReturnsOriginalObject() + { + // Arrange + var optionObject = new OptionObject2015 { Forms = null! }; + + // Act + var result = optionObject.SetDisabledField("100"); + + // Assert + Assert.AreSame(optionObject, result); + } + + [TestMethod] + public void SetEnabledFields_OptionObject2015_WithNullOptionObject_ReturnsNull() + { + // Act + var result = OptionObject2015Helpers.SetEnabledFields(null!, new List { "100" }); + + // Assert + Assert.IsNull(result); + } + + } + +} diff --git a/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/RowObjectHelpersTests.cs b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/RowObjectHelpersTests.cs new file mode 100644 index 0000000..e454721 --- /dev/null +++ b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers.Tests/RowObjectHelpersTests.cs @@ -0,0 +1,830 @@ +namespace RarelySimple.AvatarScriptLink.Objects.Helpers.Tests +{ + + /// + /// Tests for RowObjectHelpers extension methods + /// + [TestClass] + public class RowObjectHelpersTests + { + [TestMethod] + public void GetRowId_WithRowId_ReturnsRowId() + { + // Arrange + var row = new RowObject { RowId = "123" }; + + // Act + var result = row.GetRowId(); + + // Assert + Assert.AreEqual("123", result); + } + + [TestMethod] + public void GetRowId_WithNull_ReturnsNull() + { + // Arrange + RowObject? row = null; + + // Act + var result = row?.GetRowId(); + + // Assert + Assert.IsNull(result); + } + + [TestMethod] + public void GetParentRowId_WithParentRowId_ReturnsParentRowId() + { + // Arrange + var row = new RowObject { ParentRowId = "456" }; + + // Act + var result = row.GetParentRowId(); + + // Assert + Assert.AreEqual("456", result); + } + + [TestMethod] + public void GetRowAction_WithRowAction_ReturnsRowAction() + { + // Arrange + var row = new RowObject { RowAction = "EDIT" }; + + // Act + var result = row.GetRowAction(); + + // Assert + Assert.AreEqual("EDIT", result); + } + + [TestMethod] + public void IsMarkedForDeletion_WithDeleteAction_ReturnsTrue() + { + // Arrange + var row = new RowObject { RowAction = "DELETE" }; + + // Act + var result = row.IsMarkedForDeletion(); + + // Assert + Assert.IsTrue(result); + } + + [TestMethod] + public void IsMarkedForDeletion_WithEditAction_ReturnsFalse() + { + // Arrange + var row = new RowObject { RowAction = "EDIT" }; + + // Act + var result = row.IsMarkedForDeletion(); + + // Assert + Assert.IsFalse(result); + } + + [TestMethod] + public void GetFieldCount_WithFields_ReturnsCount() + { + // Arrange + var row = new RowObject(); + row.Fields.Add(new FieldObject()); + row.Fields.Add(new FieldObject()); + + // Act + var result = row.GetFieldCount(); + + // Assert + Assert.AreEqual(2, result); + } + + [TestMethod] + public void GetFieldCount_WithNull_ReturnsZero() + { + // Arrange + RowObject? row = null; + + // Act + var result = row?.GetFieldCount() ?? 0; + + // Assert + Assert.AreEqual(0, result); + } + + [TestMethod] + public void GetFieldValue_WithExistingField_ReturnsValue() + { + // Arrange + var row = new RowObject(); + row.Fields.Add(new FieldObject { FieldNumber = "100", FieldValue = "TestValue" }); + + // Act + var result = row.GetFieldValue("100"); + + // Assert + Assert.AreEqual("TestValue", result); + } + + [TestMethod] + public void GetFieldValue_WithNonExistentField_ReturnsNull() + { + // Arrange + var row = new RowObject(); + row.Fields.Add(new FieldObject { FieldNumber = "100", FieldValue = "TestValue" }); + + // Act + var result = row.GetFieldValue("999"); + + // Assert + Assert.IsNull(result); + } + + [TestMethod] + public void GetFieldValue_WithNullRow_ReturnsNull() + { + // Arrange + RowObject? row = null; + + // Act + var result = row?.GetFieldValue("100"); + + // Assert + Assert.IsNull(result); + } + + [TestMethod] + public void IsFieldPresent_WithField_ReturnsTrue() + { + // Arrange + var row = new RowObject(); + row.Fields.Add(new FieldObject { FieldNumber = "100" }); + + // Act + var result = row.IsFieldPresent("100"); + + // Assert + Assert.IsTrue(result); + } + + [TestMethod] + public void IsFieldPresent_WithoutField_ReturnsFalse() + { + // Arrange + var row = new RowObject(); + + // Act + var result = row.IsFieldPresent("100"); + + // Assert + Assert.IsFalse(result); + } + + [TestMethod] + public void IsFieldEnabled_WithEnabledField_ReturnsTrue() + { + // Arrange + var row = new RowObject(); + row.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "1" }); + + // Act + var result = row.IsFieldEnabled("100"); + + // Assert + Assert.IsTrue(result); + } + + [TestMethod] + public void IsFieldEnabled_WithDisabledField_ReturnsFalse() + { + // Arrange + var row = new RowObject(); + row.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "0" }); + + // Act + var result = row.IsFieldEnabled("100"); + + // Assert + Assert.IsFalse(result); + } + + [TestMethod] + public void IsFieldLocked_WithLockedField_ReturnsTrue() + { + // Arrange + var row = new RowObject(); + row.Fields.Add(new FieldObject { FieldNumber = "100", Lock = "1" }); + + // Act + var result = row.IsFieldLocked("100"); + + // Assert + Assert.IsTrue(result); + } + + [TestMethod] + public void IsFieldRequired_WithRequiredField_ReturnsTrue() + { + // Arrange + var row = new RowObject(); + row.Fields.Add(new FieldObject { FieldNumber = "100", Required = "1" }); + + // Act + var result = row.IsFieldRequired("100"); + + // Assert + Assert.IsTrue(result); + } + + [TestMethod] + public void SetFieldValue_WithExistingField_UpdatesValue() + { + // Arrange + var row = new RowObject { RowAction = "" }; + row.Fields.Add(new FieldObject { FieldNumber = "100", FieldValue = "OldValue" }); + + // Act + var result = row.SetFieldValue("100", "NewValue"); + + // Assert + Assert.AreEqual("NewValue", row.Fields[0].FieldValue); + Assert.AreEqual("EDIT", row.RowAction); + Assert.AreSame(row, result); + } + + [TestMethod] + public void SetFieldValue_WithNonExistentField_DoesNothing() + { + // Arrange + var row = new RowObject(); + + // Act + var result = row.SetFieldValue("999", "Value"); + + // Assert + Assert.IsNull(result?.Fields.FirstOrDefault(f => f.FieldNumber == "999")); + } + + [TestMethod] + public void SetFieldValue_WithNullRow_ReturnsNull() + { + // Arrange + RowObject? row = null; + + // Act + var result = row?.SetFieldValue("100", "Value"); + + // Assert + Assert.IsNull(result); + } + + [TestMethod] + public void DisableAllFieldObjects_WithoutExclusions_DisablesAll() + { + // Arrange + var row = new RowObject(); + var field1 = new FieldObject { FieldNumber = "100", Enabled = "1" }; + var field2 = new FieldObject { FieldNumber = "101", Enabled = "1" }; + row.Fields.Add(field1); + row.Fields.Add(field2); + + // Act + row.DisableAllFieldObjects(); + + // Assert + Assert.AreEqual("0", field1.Enabled); + Assert.AreEqual("0", field2.Enabled); + Assert.AreEqual("EDIT", row.RowAction); + } + + [TestMethod] + public void DisableAllFieldObjects_WithNullRowAction_SetsRowActionToEdit() + { + // Arrange + var row = new RowObject { RowAction = null! }; + var field = new FieldObject { FieldNumber = "100", Enabled = "1" }; + row.Fields.Add(field); + + // Act + row.DisableAllFieldObjects(); + + // Assert + Assert.AreEqual("0", field.Enabled); + Assert.AreEqual(RowObject.RowActions.Edit, row.RowAction); + } + + [TestMethod] + public void DisableAllFieldObjects_WithExclusions_DisablesOnlyNonExcluded() + { + // Arrange + var row = new RowObject(); + var field1 = new FieldObject { FieldNumber = "100", Enabled = "1" }; + var field2 = new FieldObject { FieldNumber = "101", Enabled = "1" }; + row.Fields.Add(field1); + row.Fields.Add(field2); + + // Act + row.DisableAllFieldObjects(new List { "101" }); + + // Assert + Assert.AreEqual("0", field1.Enabled); + Assert.AreEqual("1", field2.Enabled); + } + + [TestMethod] + public void SetDisabledField_WithExistingField_DisablesTargetField() + { + // Arrange + var row = new RowObject { RowAction = "" }; + row.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "1" }); + row.Fields.Add(new FieldObject { FieldNumber = "101", Enabled = "1" }); + + // Act + row.SetDisabledField("101"); + + // Assert + Assert.AreEqual("1", row.Fields[0].Enabled); + Assert.AreEqual("0", row.Fields[1].Enabled); + Assert.AreEqual("EDIT", row.RowAction); + } + + [TestMethod] + public void SetDisabledField_WithNullRowAction_SetsRowActionToEdit() + { + // Arrange + var row = new RowObject { RowAction = null! }; + row.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "1" }); + + // Act + row.SetDisabledField("100"); + + // Assert + Assert.AreEqual("0", row.Fields[0].Enabled); + Assert.AreEqual(RowObject.RowActions.Edit, row.RowAction); + } + + [TestMethod] + public void SetDisabledFields_WithFieldNumbers_DisablesMatchingFields() + { + // Arrange + var row = new RowObject(); + row.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "1" }); + row.Fields.Add(new FieldObject { FieldNumber = "101", Enabled = "1" }); + + // Act + row.SetDisabledFields(["100"]); + + // Assert + Assert.AreEqual("0", row.Fields[0].Enabled); + Assert.AreEqual("1", row.Fields[1].Enabled); + } + + [TestMethod] + public void SetEnabledField_WithExistingField_EnablesTargetField() + { + // Arrange + var row = new RowObject { RowAction = "" }; + row.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "0" }); + row.Fields.Add(new FieldObject { FieldNumber = "101", Enabled = "0" }); + + // Act + row.SetEnabledField("100"); + + // Assert + Assert.AreEqual("1", row.Fields[0].Enabled); + Assert.AreEqual("0", row.Fields[1].Enabled); + Assert.AreEqual("EDIT", row.RowAction); + } + + [TestMethod] + public void SetEnabledField_WithNullRowAction_SetsRowActionToEdit() + { + // Arrange + var row = new RowObject { RowAction = null! }; + row.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "0" }); + + // Act + row.SetEnabledField("100"); + + // Assert + Assert.AreEqual("1", row.Fields[0].Enabled); + Assert.AreEqual(RowObject.RowActions.Edit, row.RowAction); + } + + [TestMethod] + public void SetDisabledField_WithAddRowAction_PreservesAdd() + { + // Arrange + var row = new RowObject { RowAction = RowObject.RowActions.Add }; + row.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "1" }); + + // Act + row.SetDisabledField("100"); + + // Assert + Assert.AreEqual("0", row.Fields[0].Enabled); + Assert.AreEqual(RowObject.RowActions.Add, row.RowAction); + } + + [TestMethod] + public void SetDisabledField_WithDeleteRowAction_PreservesDelete() + { + // Arrange + var row = new RowObject { RowAction = RowObject.RowActions.Delete }; + row.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "1" }); + + // Act + row.SetDisabledField("100"); + + // Assert + Assert.AreEqual("0", row.Fields[0].Enabled); + Assert.AreEqual(RowObject.RowActions.Delete, row.RowAction); + } + + [TestMethod] + public void SetEnabledFields_WithFieldNumbers_EnablesMatchingFields() + { + // Arrange + var row = new RowObject(); + row.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "0" }); + row.Fields.Add(new FieldObject { FieldNumber = "101", Enabled = "0" }); + + // Act + row.SetEnabledFields(["101"]); + + // Assert + Assert.AreEqual("0", row.Fields[0].Enabled); + Assert.AreEqual("1", row.Fields[1].Enabled); + } + + [TestMethod] + public void SetEnabledFields_WithDeleteRowAction_PreservesDelete() + { + // Arrange + var row = new RowObject { RowAction = RowObject.RowActions.Delete }; + row.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "0" }); + + // Act + row.SetEnabledFields(["100"]); + + // Assert + Assert.AreEqual("1", row.Fields[0].Enabled); + Assert.AreEqual(RowObject.RowActions.Delete, row.RowAction); + } + + [TestMethod] + public void SetEnabledFields_WithAddRowAction_PreservesAdd() + { + // Arrange + var row = new RowObject { RowAction = RowObject.RowActions.Add }; + row.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "0" }); + + // Act + row.SetEnabledFields(["100"]); + + // Assert + Assert.AreEqual("1", row.Fields[0].Enabled); + Assert.AreEqual(RowObject.RowActions.Add, row.RowAction); + } + + [TestMethod] + public void SetDisabledField_WithMissingField_DoesNotChangeRow() + { + // 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); + } + + [TestMethod] + public void SetDisabledField_WhenAlreadyDisabled_DoesNotSetRowAction() + { + // Arrange + var row = new RowObject { RowAction = "" }; + row.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "0" }); + + // Act + row.SetDisabledField("100"); + + // Assert + Assert.AreEqual("0", row.Fields[0].Enabled); + Assert.AreEqual("", row.RowAction); + } + + [TestMethod] + public void SetDisabledFields_WhenAllAlreadyDisabled_DoesNotSetRowAction() + { + // Arrange + var row = new RowObject { RowAction = "" }; + row.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "0" }); + row.Fields.Add(new FieldObject { FieldNumber = "101", Enabled = "0" }); + + // Act + row.SetDisabledFields(["100", "101"]); + + // Assert + Assert.AreEqual("0", row.Fields[0].Enabled); + Assert.AreEqual("0", row.Fields[1].Enabled); + Assert.AreEqual("", row.RowAction); + } + + [TestMethod] + public void SetEnabledFields_WithEmptyFieldNumbers_DoesNotChangeRow() + { + // 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); + } + + [TestMethod] + public void SetEnabledField_WhenAlreadyEnabled_DoesNotSetRowAction() + { + // Arrange + var row = new RowObject { RowAction = "" }; + row.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "1" }); + + // Act + row.SetEnabledField("100"); + + // Assert + Assert.AreEqual("1", row.Fields[0].Enabled); + Assert.AreEqual("", row.RowAction); + } + + [TestMethod] + public void SetEnabledFields_WhenAllAlreadyEnabled_DoesNotSetRowAction() + { + // Arrange + var row = new RowObject { RowAction = "" }; + row.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "1" }); + row.Fields.Add(new FieldObject { FieldNumber = "101", Enabled = "1" }); + + // Act + row.SetEnabledFields(["100", "101"]); + + // Assert + Assert.AreEqual("1", row.Fields[0].Enabled); + Assert.AreEqual("1", row.Fields[1].Enabled); + Assert.AreEqual("", row.RowAction); + } + + [TestMethod] + public void EnableAllFieldObjects_WithoutExclusions_EnablesAll() + { + // Arrange + var row = new RowObject(); + var field1 = new FieldObject { FieldNumber = "100", Enabled = "0" }; + var field2 = new FieldObject { FieldNumber = "101", Enabled = "0" }; + row.Fields.Add(field1); + row.Fields.Add(field2); + + // Act + row.EnableAllFieldObjects(); + + // Assert + Assert.AreEqual("1", field1.Enabled); + Assert.AreEqual("1", field2.Enabled); + Assert.AreEqual(RowObject.RowActions.Edit, row.RowAction); + } + + [TestMethod] + public void EnableAllFieldObjects_WithExclusions_EnablesOnlyNonExcluded() + { + // Arrange + var row = new RowObject(); + var field1 = new FieldObject { FieldNumber = "100", Enabled = "0" }; + var field2 = new FieldObject { FieldNumber = "101", Enabled = "0" }; + row.Fields.Add(field1); + row.Fields.Add(field2); + + // Act + row.EnableAllFieldObjects(new List { "101" }); + + // Assert + Assert.AreEqual("1", field1.Enabled); + Assert.AreEqual("0", field2.Enabled); + Assert.AreEqual(RowObject.RowActions.Edit, row.RowAction); + } + + [TestMethod] + public void EnableAllFieldObjects_WithNoFields_DoesNotSetRowAction() + { + // Arrange + var row = new RowObject { RowAction = "" }; + + // Act + row.EnableAllFieldObjects(); + + // Assert + Assert.AreEqual("", row.RowAction); + } + + [TestMethod] + public void EnableAllFieldObjects_WithAllExcluded_DoesNotSetRowAction() + { + // Arrange + var row = new RowObject { RowAction = "" }; + row.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "0" }); + + // Act + row.EnableAllFieldObjects(new List { "100" }); + + // Assert + Assert.AreEqual("0", row.Fields[0].Enabled); + Assert.AreEqual("", row.RowAction); + } + + [TestMethod] + public void EnableAllFieldObjects_WhenAlreadyEnabled_DoesNotSetRowAction() + { + // Arrange + var row = new RowObject { RowAction = "" }; + row.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "1" }); + + // Act + row.EnableAllFieldObjects(); + + // Assert + Assert.AreEqual("1", row.Fields[0].Enabled); + Assert.AreEqual("", row.RowAction); + } + + [TestMethod] + public void EnableAllFieldObjects_WithNullRowAction_AndChanges_SetsRowActionToEdit() + { + // Arrange + var row = new RowObject { RowAction = null! }; + row.Fields.Add(new FieldObject { FieldNumber = "100", Enabled = "0" }); + + // Act + row.EnableAllFieldObjects(); + + // Assert + Assert.AreEqual("1", row.Fields[0].Enabled); + Assert.AreEqual(RowObject.RowActions.Edit, row.RowAction); + } + + [TestMethod] + public void LockAllFieldObjects_LocksAllFields() + { + // Arrange + var row = new RowObject(); + var field = new FieldObject { FieldNumber = "100", Lock = "0" }; + row.Fields.Add(field); + + // Act + row.LockAllFieldObjects(); + + // Assert + Assert.AreEqual("1", field.Lock); + Assert.AreEqual(RowObject.RowActions.Edit, row.RowAction); + } + + [TestMethod] + public void LockAllFieldObjects_WithNoFields_DoesNotSetRowAction() + { + // Arrange + var row = new RowObject { RowAction = "" }; + + // Act + row.LockAllFieldObjects(); + + // Assert + Assert.AreEqual("", row.RowAction); + } + + [TestMethod] + public void LockAllFieldObjects_WithAllExcluded_DoesNotSetRowAction() + { + // Arrange + var row = new RowObject { RowAction = "" }; + row.Fields.Add(new FieldObject { FieldNumber = "100", Lock = "0" }); + + // Act + row.LockAllFieldObjects(new List { "100" }); + + // Assert + Assert.AreEqual("0", row.Fields[0].Lock); + Assert.AreEqual("", row.RowAction); + } + + [TestMethod] + public void LockAllFieldObjects_WhenAlreadyLocked_DoesNotSetRowAction() + { + // Arrange + var row = new RowObject { RowAction = "" }; + row.Fields.Add(new FieldObject { FieldNumber = "100", Lock = "1" }); + + // Act + row.LockAllFieldObjects(); + + // Assert + Assert.AreEqual("1", row.Fields[0].Lock); + Assert.AreEqual("", row.RowAction); + } + + [TestMethod] + public void LockAllFieldObjects_WithNullRowAction_AndChanges_SetsRowActionToEdit() + { + // Arrange + var row = new RowObject { RowAction = null! }; + row.Fields.Add(new FieldObject { FieldNumber = "100", Lock = "0" }); + + // Act + row.LockAllFieldObjects(); + + // Assert + Assert.AreEqual("1", row.Fields[0].Lock); + Assert.AreEqual(RowObject.RowActions.Edit, row.RowAction); + } + + [TestMethod] + public void UnlockAllFieldObjects_UnlocksAllFields() + { + // Arrange + var row = new RowObject(); + var field = new FieldObject { FieldNumber = "100", Lock = "1" }; + row.Fields.Add(field); + + // Act + row.UnlockAllFieldObjects(); + + // Assert + Assert.AreEqual("0", field.Lock); + Assert.AreEqual(RowObject.RowActions.Edit, row.RowAction); + } + + [TestMethod] + public void UnlockAllFieldObjects_WithNoFields_DoesNotSetRowAction() + { + // Arrange + var row = new RowObject { RowAction = "" }; + + // Act + row.UnlockAllFieldObjects(); + + // Assert + Assert.AreEqual("", row.RowAction); + } + + [TestMethod] + public void UnlockAllFieldObjects_WithAllExcluded_DoesNotSetRowAction() + { + // Arrange + var row = new RowObject { RowAction = "" }; + row.Fields.Add(new FieldObject { FieldNumber = "100", Lock = "1" }); + + // Act + row.UnlockAllFieldObjects(new List { "100" }); + + // Assert + Assert.AreEqual("1", row.Fields[0].Lock); + Assert.AreEqual("", row.RowAction); + } + + [TestMethod] + public void UnlockAllFieldObjects_WhenAlreadyUnlocked_DoesNotSetRowAction() + { + // Arrange + var row = new RowObject { RowAction = "" }; + row.Fields.Add(new FieldObject { FieldNumber = "100", Lock = "0" }); + + // Act + row.UnlockAllFieldObjects(); + + // Assert + Assert.AreEqual("0", row.Fields[0].Lock); + Assert.AreEqual("", row.RowAction); + } + + [TestMethod] + public void UnlockAllFieldObjects_WithNullRowAction_AndChanges_SetsRowActionToEdit() + { + // Arrange + var row = new RowObject { RowAction = null! }; + row.Fields.Add(new FieldObject { FieldNumber = "100", Lock = "1" }); + + // Act + row.UnlockAllFieldObjects(); + + // 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 cca31d0..b75d8ca 100644 --- a/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/FormObjectHelpers.cs +++ b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/FormObjectHelpers.cs @@ -307,5 +307,101 @@ public static bool IsRowPresent(this FormObject formObject, string rowId) return formObject; } + + /// + /// Disables a in a by field number. + /// + /// The FormObject to modify. + /// The field number to disable. + /// The modified FormObject. + public static FormObject? SetDisabledField(this FormObject formObject, string fieldNumber) + { + if (formObject == null || formObject.CurrentRow == null || string.IsNullOrEmpty(fieldNumber)) + return formObject; + + formObject.CurrentRow.SetDisabledField(fieldNumber); + + if (formObject.MultipleIteration && formObject.HasOtherRows()) + { + foreach (var row in formObject.OtherRows) + { + row.SetDisabledField(fieldNumber); + } + } + + return formObject; + } + + /// + /// Disables instances in a by field numbers. + /// + /// The FormObject to modify. + /// The field numbers to disable. + /// The modified FormObject. + public static FormObject? SetDisabledFields(this FormObject formObject, List? fieldNumbers) + { + if (formObject == null || formObject.CurrentRow == null || fieldNumbers == null || fieldNumbers.Count == 0) + return formObject; + + formObject.CurrentRow.SetDisabledFields(fieldNumbers); + + if (formObject.MultipleIteration && formObject.HasOtherRows()) + { + foreach (var row in formObject.OtherRows) + { + row.SetDisabledFields(fieldNumbers); + } + } + + return formObject; + } + + /// + /// Enables a in a by field number. + /// + /// The FormObject to modify. + /// The field number to enable. + /// The modified FormObject. + public static FormObject? SetEnabledField(this FormObject formObject, string fieldNumber) + { + if (formObject == null || formObject.CurrentRow == null || string.IsNullOrEmpty(fieldNumber)) + return formObject; + + formObject.CurrentRow.SetEnabledField(fieldNumber); + + if (formObject.MultipleIteration && formObject.HasOtherRows()) + { + foreach (var row in formObject.OtherRows) + { + row.SetEnabledField(fieldNumber); + } + } + + return formObject; + } + + /// + /// Enables instances in a by field numbers. + /// + /// The FormObject to modify. + /// The field numbers to enable. + /// The modified FormObject. + public static FormObject? SetEnabledFields(this FormObject formObject, List? fieldNumbers) + { + if (formObject == null || formObject.CurrentRow == null || fieldNumbers == null || fieldNumbers.Count == 0) + return formObject; + + formObject.CurrentRow.SetEnabledFields(fieldNumbers); + + if (formObject.MultipleIteration && formObject.HasOtherRows()) + { + foreach (var row in formObject.OtherRows) + { + row.SetEnabledFields(fieldNumbers); + } + } + + return formObject; + } } } diff --git a/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/Manipulators/RowObjectManipulators.cs b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/Manipulators/RowObjectManipulators.cs index d0d8cc2..98d742e 100644 --- a/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/Manipulators/RowObjectManipulators.cs +++ b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/Manipulators/RowObjectManipulators.cs @@ -16,7 +16,7 @@ public static class RowObjectManipulators { if (rowObject != null) { - rowObject.RowAction = "ADD"; + rowObject.RowAction = RowObject.RowActions.Add; } return rowObject; } @@ -30,7 +30,7 @@ public static class RowObjectManipulators { if (rowObject != null) { - rowObject.RowAction = "EDIT"; + rowObject.RowAction = RowObject.RowActions.Edit; } return rowObject; } @@ -44,7 +44,7 @@ public static class RowObjectManipulators { if (rowObject != null) { - rowObject.RowAction = "DELETE"; + rowObject.RowAction = RowObject.RowActions.Delete; } return rowObject; } diff --git a/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/OptionObject2015Helpers.cs b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/OptionObject2015Helpers.cs index b9919d0..350853f 100644 --- a/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/OptionObject2015Helpers.cs +++ b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/OptionObject2015Helpers.cs @@ -1,4 +1,6 @@ using System; +using System.Collections.Generic; +using System.Linq; namespace RarelySimple.AvatarScriptLink.Objects.Helpers { @@ -76,5 +78,119 @@ public static bool HasError(this OptionObject2015 optionObject) { return Math.Abs(optionObject?.ErrorCode ?? 0d) > double.Epsilon; } + + /// + /// Disables a in an by field number. + /// + /// The OptionObject2015 to modify. + /// The field number to disable. + /// The modified OptionObject2015. + public static OptionObject2015? SetDisabledField(this OptionObject2015 optionObject, string fieldNumber) + { + if (optionObject == null || optionObject.Forms == null || string.IsNullOrEmpty(fieldNumber)) + return optionObject; + + foreach (var form in optionObject.Forms) + { + form.SetDisabledField(fieldNumber); + } + + return optionObject; + } + + /// + /// Disables instances in an . + /// + /// The OptionObject2015 to modify. + /// The field objects to disable. + /// 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(); + + return optionObject.SetDisabledFields(fieldNumbers); + } + + /// + /// Disables instances in an by field numbers. + /// + /// The OptionObject2015 to modify. + /// The field numbers to disable. + /// The modified OptionObject2015. + public static OptionObject2015? SetDisabledFields(this OptionObject2015 optionObject, List? fieldNumbers) + { + if (optionObject == null || optionObject.Forms == null || fieldNumbers == null || fieldNumbers.Count == 0) + return optionObject; + + foreach (var form in optionObject.Forms) + { + form.SetDisabledFields(fieldNumbers); + } + + return optionObject; + } + + /// + /// Enables a in an by field number. + /// + /// The OptionObject2015 to modify. + /// The field number to enable. + /// The modified OptionObject2015. + public static OptionObject2015? SetEnabledField(this OptionObject2015 optionObject, string fieldNumber) + { + if (optionObject == null || optionObject.Forms == null || string.IsNullOrEmpty(fieldNumber)) + return optionObject; + + foreach (var form in optionObject.Forms) + { + form.SetEnabledField(fieldNumber); + } + + return optionObject; + } + + /// + /// Enables instances in an . + /// + /// The OptionObject2015 to modify. + /// The field objects to enable. + /// 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(); + + return optionObject.SetEnabledFields(fieldNumbers); + } + + /// + /// Enables instances in an by field numbers. + /// + /// The OptionObject2015 to modify. + /// The field numbers to enable. + /// The modified OptionObject2015. + public static OptionObject2015? SetEnabledFields(this OptionObject2015 optionObject, List? fieldNumbers) + { + if (optionObject == null || optionObject.Forms == null || fieldNumbers == null || fieldNumbers.Count == 0) + return optionObject; + + foreach (var form in optionObject.Forms) + { + form.SetEnabledFields(fieldNumbers); + } + + return optionObject; + } } } diff --git a/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/OptionObject2Helpers.cs b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/OptionObject2Helpers.cs index 84be4b5..fd0d4d7 100644 --- a/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/OptionObject2Helpers.cs +++ b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/OptionObject2Helpers.cs @@ -1,4 +1,6 @@ using System; +using System.Collections.Generic; +using System.Linq; namespace RarelySimple.AvatarScriptLink.Objects.Helpers { @@ -56,5 +58,119 @@ public static bool HasError(this OptionObject2 optionObject) { return Math.Abs(optionObject?.ErrorCode ?? 0d) > double.Epsilon; } + + /// + /// Disables a in an by field number. + /// + /// The OptionObject2 to modify. + /// The field number to disable. + /// The modified OptionObject2. + public static OptionObject2? SetDisabledField(this OptionObject2 optionObject, string fieldNumber) + { + if (optionObject == null || optionObject.Forms == null || string.IsNullOrEmpty(fieldNumber)) + return optionObject; + + foreach (var form in optionObject.Forms) + { + form.SetDisabledField(fieldNumber); + } + + return optionObject; + } + + /// + /// Disables instances in an . + /// + /// The OptionObject2 to modify. + /// The field objects to disable. + /// 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(); + + return optionObject.SetDisabledFields(fieldNumbers); + } + + /// + /// Disables instances in an by field numbers. + /// + /// The OptionObject2 to modify. + /// The field numbers to disable. + /// The modified OptionObject2. + public static OptionObject2? SetDisabledFields(this OptionObject2 optionObject, List? fieldNumbers) + { + if (optionObject == null || optionObject.Forms == null || fieldNumbers == null || fieldNumbers.Count == 0) + return optionObject; + + foreach (var form in optionObject.Forms) + { + form.SetDisabledFields(fieldNumbers); + } + + return optionObject; + } + + /// + /// Enables a in an by field number. + /// + /// The OptionObject2 to modify. + /// The field number to enable. + /// The modified OptionObject2. + public static OptionObject2? SetEnabledField(this OptionObject2 optionObject, string fieldNumber) + { + if (optionObject == null || optionObject.Forms == null || string.IsNullOrEmpty(fieldNumber)) + return optionObject; + + foreach (var form in optionObject.Forms) + { + form.SetEnabledField(fieldNumber); + } + + return optionObject; + } + + /// + /// Enables instances in an . + /// + /// The OptionObject2 to modify. + /// The field objects to enable. + /// 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(); + + return optionObject.SetEnabledFields(fieldNumbers); + } + + /// + /// Enables instances in an by field numbers. + /// + /// The OptionObject2 to modify. + /// The field numbers to enable. + /// The modified OptionObject2. + public static OptionObject2? SetEnabledFields(this OptionObject2 optionObject, List? fieldNumbers) + { + if (optionObject == null || optionObject.Forms == null || fieldNumbers == null || fieldNumbers.Count == 0) + return optionObject; + + foreach (var form in optionObject.Forms) + { + form.SetEnabledFields(fieldNumbers); + } + + return optionObject; + } } } diff --git a/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/OptionObjectHelpers.cs b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/OptionObjectHelpers.cs index a35d6ce..d79e5fc 100644 --- a/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/OptionObjectHelpers.cs +++ b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/OptionObjectHelpers.cs @@ -228,5 +228,119 @@ public static bool IsFieldRequired(this OptionObject optionObject, string fieldN .Select(f => f.IsFieldRequired(fieldNumber)) .FirstOrDefault(); } + + /// + /// Disables a in an by field number. + /// + /// The OptionObject to modify. + /// The field number to disable. + /// The modified OptionObject. + public static OptionObject? SetDisabledField(this OptionObject optionObject, string fieldNumber) + { + if (optionObject == null || optionObject.Forms == null || string.IsNullOrEmpty(fieldNumber)) + return optionObject; + + foreach (var form in optionObject.Forms) + { + form.SetDisabledField(fieldNumber); + } + + return optionObject; + } + + /// + /// Disables instances in an . + /// + /// The OptionObject to modify. + /// The field objects to disable. + /// 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(); + + return optionObject.SetDisabledFields(fieldNumbers); + } + + /// + /// Disables instances in an by field numbers. + /// + /// The OptionObject to modify. + /// The field numbers to disable. + /// The modified OptionObject. + public static OptionObject? SetDisabledFields(this OptionObject optionObject, List? fieldNumbers) + { + if (optionObject == null || optionObject.Forms == null || fieldNumbers == null || fieldNumbers.Count == 0) + return optionObject; + + foreach (var form in optionObject.Forms) + { + form.SetDisabledFields(fieldNumbers); + } + + return optionObject; + } + + /// + /// Enables a in an by field number. + /// + /// The OptionObject to modify. + /// The field number to enable. + /// The modified OptionObject. + public static OptionObject? SetEnabledField(this OptionObject optionObject, string fieldNumber) + { + if (optionObject == null || optionObject.Forms == null || string.IsNullOrEmpty(fieldNumber)) + return optionObject; + + foreach (var form in optionObject.Forms) + { + form.SetEnabledField(fieldNumber); + } + + return optionObject; + } + + /// + /// Enables instances in an . + /// + /// The OptionObject to modify. + /// The field objects to enable. + /// 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(); + + return optionObject.SetEnabledFields(fieldNumbers); + } + + /// + /// Enables instances in an by field numbers. + /// + /// The OptionObject to modify. + /// The field numbers to enable. + /// The modified OptionObject. + public static OptionObject? SetEnabledFields(this OptionObject optionObject, List? fieldNumbers) + { + if (optionObject == null || optionObject.Forms == null || fieldNumbers == null || fieldNumbers.Count == 0) + return optionObject; + + foreach (var form in optionObject.Forms) + { + form.SetEnabledFields(fieldNumbers); + } + + return optionObject; + } } } diff --git a/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/RowObjectHelpers.cs b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/RowObjectHelpers.cs index ded2b07..d470789 100644 --- a/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/RowObjectHelpers.cs +++ b/dotnet/RarelySimple.AvatarScriptLink.Objects.Helpers/RowObjectHelpers.cs @@ -46,7 +46,7 @@ public static class RowObjectHelpers /// True if the row is marked for deletion, false otherwise. public static bool IsMarkedForDeletion(this RowObject rowObject) { - return rowObject?.RowAction == "DELETE"; + return rowObject?.RowAction == RowObject.RowActions.Delete; } /// @@ -157,8 +157,8 @@ public static bool IsFieldRequired(this RowObject rowObject, string fieldNumber) if (field != null) { field.SetValue(fieldValue); - if (rowObject.RowAction == "") - rowObject.RowAction = "EDIT"; + if (string.IsNullOrEmpty(rowObject.RowAction)) + rowObject.RowAction = RowObject.RowActions.Edit; } return rowObject; } @@ -190,8 +190,110 @@ public static bool IsFieldRequired(this RowObject rowObject, string fieldNumber) field.Disable(); } - if (rowObject.RowAction == "") - rowObject.RowAction = "EDIT"; + if (string.IsNullOrEmpty(rowObject.RowAction)) + rowObject.RowAction = RowObject.RowActions.Edit; + + return rowObject; + } + + /// + /// Disables a in a by field number. + /// + /// The RowObject to modify. + /// The field number to disable. + /// The modified RowObject. + public static RowObject? SetDisabledField(this RowObject rowObject, string fieldNumber) + { + if (rowObject == null || rowObject.Fields == null || string.IsNullOrEmpty(fieldNumber)) + return rowObject; + + var field = rowObject.Fields.FirstOrDefault(f => f.FieldNumber == fieldNumber); + if (field == null) + return rowObject; + + var changed = field.IsEnabled(); + field.Disable(); + + if (changed && string.IsNullOrEmpty(rowObject.RowAction)) + rowObject.RowAction = RowObject.RowActions.Edit; + + return rowObject; + } + + /// + /// Disables instances in a by field numbers. + /// + /// The RowObject to modify. + /// The field numbers to disable. + /// The modified RowObject. + public static RowObject? SetDisabledFields(this RowObject rowObject, List? fieldNumbers) + { + if (rowObject == null || rowObject.Fields == null || fieldNumbers == null || fieldNumbers.Count == 0) + return rowObject; + + var changed = false; + foreach (var field in rowObject.Fields.Where(f => fieldNumbers.Contains(f.FieldNumber))) + { + if (field.IsEnabled()) + { + changed = true; + } + field.Disable(); + } + + if (changed && string.IsNullOrEmpty(rowObject.RowAction)) + rowObject.RowAction = RowObject.RowActions.Edit; + + return rowObject; + } + + /// + /// Enables a in a by field number. + /// + /// The RowObject to modify. + /// The field number to enable. + /// The modified RowObject. + public static RowObject? SetEnabledField(this RowObject rowObject, string fieldNumber) + { + if (rowObject == null || rowObject.Fields == null || string.IsNullOrEmpty(fieldNumber)) + return rowObject; + + var field = rowObject.Fields.FirstOrDefault(f => f.FieldNumber == fieldNumber); + if (field == null) + return rowObject; + + var changed = !field.IsEnabled(); + field.Enable(); + + if (changed && string.IsNullOrEmpty(rowObject.RowAction)) + rowObject.RowAction = RowObject.RowActions.Edit; + + return rowObject; + } + + /// + /// Enables instances in a by field numbers. + /// + /// The RowObject to modify. + /// The field numbers to enable. + /// The modified RowObject. + public static RowObject? SetEnabledFields(this RowObject rowObject, List? fieldNumbers) + { + if (rowObject == null || rowObject.Fields == null || fieldNumbers == null || fieldNumbers.Count == 0) + return rowObject; + + var changed = false; + foreach (var field in rowObject.Fields.Where(f => fieldNumbers.Contains(f.FieldNumber))) + { + if (!field.IsEnabled()) + { + changed = true; + } + field.Enable(); + } + + if (changed && string.IsNullOrEmpty(rowObject.RowAction)) + rowObject.RowAction = RowObject.RowActions.Edit; return rowObject; } @@ -218,13 +320,18 @@ public static bool IsFieldRequired(this RowObject rowObject, string fieldNumber) return rowObject; var excluded = excludedFieldNumbers ?? new List(); + var changed = false; foreach (var field in rowObject.Fields.Where(f => !excluded.Contains(f.FieldNumber))) { + if (!field.IsEnabled()) + { + changed = true; + } field.Enable(); } - if (rowObject.RowAction == "") - rowObject.RowAction = "EDIT"; + if (changed && string.IsNullOrEmpty(rowObject.RowAction)) + rowObject.RowAction = RowObject.RowActions.Edit; return rowObject; } @@ -251,13 +358,18 @@ public static bool IsFieldRequired(this RowObject rowObject, string fieldNumber) return rowObject; var excluded = excludedFieldNumbers ?? new List(); + var changed = false; foreach (var field in rowObject.Fields.Where(f => !excluded.Contains(f.FieldNumber))) { + if (!field.IsLocked()) + { + changed = true; + } field.Lock(); } - if (rowObject.RowAction == "") - rowObject.RowAction = "EDIT"; + if (changed && string.IsNullOrEmpty(rowObject.RowAction)) + rowObject.RowAction = RowObject.RowActions.Edit; return rowObject; } @@ -284,13 +396,18 @@ public static bool IsFieldRequired(this RowObject rowObject, string fieldNumber) return rowObject; var excluded = excludedFieldNumbers ?? new List(); + var changed = false; foreach (var field in rowObject.Fields.Where(f => !excluded.Contains(f.FieldNumber))) { + if (field.IsLocked()) + { + changed = true; + } field.Unlock(); } - if (rowObject.RowAction == "") - rowObject.RowAction = "EDIT"; + if (changed && string.IsNullOrEmpty(rowObject.RowAction)) + rowObject.RowAction = RowObject.RowActions.Edit; return rowObject; } diff --git a/dotnet/RarelySimple.AvatarScriptLink.Objects/README.md b/dotnet/RarelySimple.AvatarScriptLink.Objects/README.md index cd62f92..f5c8f6d 100644 --- a/dotnet/RarelySimple.AvatarScriptLink.Objects/README.md +++ b/dotnet/RarelySimple.AvatarScriptLink.Objects/README.md @@ -2,9 +2,12 @@ [![NuGet Latest](https://img.shields.io/nuget/v/RarelySimple.AvatarScriptLink.Objects)](https://www.nuget.org/packages/RarelySimple.AvatarScriptLink.Objects/) [![NuGet Downloads](https://img.shields.io/nuget/dt/RarelySimple.AvatarScriptLink.Objects)](https://www.nuget.org/packages/RarelySimple.AvatarScriptLink.Objects/) [![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=rarelysimple_RarelySimple.AvatarScriptLink.Objects&metric=alert_status)](https://sonarcloud.io/dashboard?id=rarelysimple_RarelySimple.AvatarScriptLink.Objects) [![Maintainability Rating](https://sonarcloud.io/api/project_badges/measure?project=rarelysimple_RarelySimple.AvatarScriptLink.Objects&metric=sqale_rating)](https://sonarcloud.io/dashboard?id=rarelysimple_RarelySimple.AvatarScriptLink.Objects) [![Reliability Rating](https://sonarcloud.io/api/project_badges/measure?project=rarelysimple_RarelySimple.AvatarScriptLink.Objects&metric=reliability_rating)](https://sonarcloud.io/dashboard?id=rarelysimple_RarelySimple.AvatarScriptLink.Objects) [![Security Rating](https://sonarcloud.io/api/project_badges/measure?project=rarelysimple_RarelySimple.AvatarScriptLink.Objects&metric=security_rating)](https://sonarcloud.io/dashboard?id=rarelysimple_RarelySimple.AvatarScriptLink.Objects) -RarelySimple.AvatarScriptLink.Objects provides the ScriptLink Object classes to help create Netsmart myAvatar-compatible ScriptLink APIs. +RarelySimple.AvatarScriptLink.Objects provides the ScriptLink object classes to help create Netsmart myAvatar-compatible ScriptLink APIs. -Note: This package only includes the object definitions. For helpers and utilities to accelerate your ScriptLink development we recommend using the [RarelySimple.AvatarScriptLink.Net](https://www.nuget.org/packages/RarelySimple.AvatarScriptLink..Net/) package. +Note: This package only includes object definitions. + +- Use [RarelySimple.AvatarScriptLink.Objects.Helpers](https://www.nuget.org/packages/RarelySimple.AvatarScriptLink.Objects.Helpers/) when you only need extension/helper operations. +- Use [RarelySimple.AvatarScriptLink.Net](https://www.nuget.org/packages/RarelySimple.AvatarScriptLink.Net/) when you want the batteries-included meta-package (Objects + Builders + Converters + Helpers + Validators). # Usage diff --git a/dotnet/RarelySimple.AvatarScriptLink.Services/README.md b/dotnet/RarelySimple.AvatarScriptLink.Services/README.md index b5983ec..80d6f70 100644 --- a/dotnet/RarelySimple.AvatarScriptLink.Services/README.md +++ b/dotnet/RarelySimple.AvatarScriptLink.Services/README.md @@ -2,9 +2,12 @@ [![NuGet Latest](https://img.shields.io/nuget/v/RarelySimple.AvatarScriptLink.Services)](https://www.nuget.org/packages/RarelySimple.AvatarScriptLink.Services/) [![NuGet Downloads](https://img.shields.io/nuget/dt/RarelySimple.AvatarScriptLink.Services)](https://www.nuget.org/packages/RarelySimple.AvatarScriptLink.Services/) [![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=rarelysimple_RarelySimple.AvatarScriptLink.Services&metric=alert_status)](https://sonarcloud.io/dashboard?id=rarelysimple_RarelySimple.AvatarScriptLink.Services) [![Maintainability Rating](https://sonarcloud.io/api/project_badges/measure?project=rarelysimple_RarelySimple.AvatarScriptLink.Services&metric=sqale_rating)](https://sonarcloud.io/dashboard?id=rarelysimple_RarelySimple.AvatarScriptLink.Services) [![Reliability Rating](https://sonarcloud.io/api/project_badges/measure?project=rarelysimple_RarelySimple.AvatarScriptLink.Services&metric=reliability_rating)](https://sonarcloud.io/dashboard?id=rarelysimple_RarelySimple.AvatarScriptLink.Services) [![Security Rating](https://sonarcloud.io/api/project_badges/measure?project=rarelysimple_RarelySimple.AvatarScriptLink.Services&metric=security_rating)](https://sonarcloud.io/dashboard?id=rarelysimple_RarelySimple.AvatarScriptLink.Services) -RarelySimple.AvatarScriptLink.Services provides the ScriptLink service definitions to help create Netsmart myAvatar-compatible ScriptLink APIs in .NET. +RarelySimple.AvatarScriptLink.Services provides ScriptLink service interface definitions to help create Netsmart myAvatar-compatible ScriptLink APIs in .NET. -For additional helpers and utilities to accelerate your ScriptLink development we recommend using the [RarelySimple.AvatarScriptLink.Net](https://www.nuget.org/packages/RarelySimple.AvatarScriptLink.Net/) package. +For additional helper utilities: + +- Use [RarelySimple.AvatarScriptLink.Objects.Helpers](https://www.nuget.org/packages/RarelySimple.AvatarScriptLink.Objects.Helpers/) for just extension/helper operations. +- Use [RarelySimple.AvatarScriptLink.Net](https://www.nuget.org/packages/RarelySimple.AvatarScriptLink.Net/) for the batteries-included meta-package. # Usage