mirror of
https://github.com/OPCFoundation/UA-.NETStandard.git
synced 2026-10-20 00:31:32 +08:00
f66ceffd75
Generate stack and application code using source generators Change built in types to readonly structs Update localized text implementation to use JSON text serializer Status code with symbolic names Immutable node ids No boxing for all built in types <= 8 bytes in Variant. Split user identity token and token handling via token handler Add migration guide for breaking changes
1382 lines
43 KiB
C#
1382 lines
43 KiB
C#
/* ========================================================================
|
|
* Copyright (c) 2005-2025 The OPC Foundation, Inc. All rights reserved.
|
|
*
|
|
* OPC Foundation MIT License 1.00
|
|
*
|
|
* Permission is hereby granted, free of charge, to any person
|
|
* obtaining a copy of this software and associated documentation
|
|
* files (the "Software"), to deal in the Software without
|
|
* restriction, including without limitation the rights to use,
|
|
* copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
* copies of the Software, and to permit persons to whom the
|
|
* Software is furnished to do so, subject to the following
|
|
* conditions:
|
|
*
|
|
* The above copyright notice and this permission notice shall be
|
|
* included in all copies or substantial portions of the Software.
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
|
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
|
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
|
* OTHER DEALINGS IN THE SOFTWARE.
|
|
*
|
|
* The complete license agreement can be found here:
|
|
* http://opcfoundation.org/License/MIT/1.00/
|
|
* ======================================================================*/
|
|
|
|
using NUnit.Framework;
|
|
|
|
namespace Opc.Ua.Schema.Model.Tests
|
|
{
|
|
/// <summary>
|
|
/// Unit tests for the <see cref="LocalizedText"/> class Equals method.
|
|
/// </summary>
|
|
[TestFixture]
|
|
[Category("ModelDesign")]
|
|
[SetCulture("en-us")]
|
|
[SetUICulture("en-us")]
|
|
[Parallelizable]
|
|
public class LocalizedTextTests
|
|
{
|
|
/// <summary>
|
|
/// Tests that Equals returns false when comparing with null.
|
|
/// </summary>
|
|
[Test]
|
|
public void Equals_NullOther_ReturnsFalse()
|
|
{
|
|
// Arrange
|
|
var localizedText = new LocalizedText
|
|
{
|
|
Key = "key1",
|
|
DoNotIgnore = true,
|
|
Value = "value1",
|
|
IsAutogenerated = false
|
|
};
|
|
|
|
// Act
|
|
#pragma warning disable CA1508 // Avoid dead conditional code
|
|
bool result = localizedText.Equals(null);
|
|
#pragma warning restore CA1508 // Avoid dead conditional code
|
|
|
|
// Assert
|
|
Assert.That(result, Is.False);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Tests that Equals returns true when comparing an instance with itself.
|
|
/// </summary>
|
|
[Test]
|
|
public void Equals_SameInstance_ReturnsTrue()
|
|
{
|
|
// Arrange
|
|
var localizedText = new LocalizedText
|
|
{
|
|
Key = "key1",
|
|
DoNotIgnore = true,
|
|
Value = "value1",
|
|
IsAutogenerated = false
|
|
};
|
|
|
|
// Act
|
|
bool result = localizedText.Equals(localizedText);
|
|
|
|
// Assert
|
|
Assert.That(result, Is.True);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Tests that Equals returns true when comparing two instances with identical property values.
|
|
/// </summary>
|
|
[Test]
|
|
public void Equals_IdenticalValues_ReturnsTrue()
|
|
{
|
|
// Arrange
|
|
var localizedText1 = new LocalizedText
|
|
{
|
|
Key = "key1",
|
|
DoNotIgnore = true,
|
|
Value = "value1",
|
|
IsAutogenerated = false
|
|
};
|
|
var localizedText2 = new LocalizedText
|
|
{
|
|
Key = "key1",
|
|
DoNotIgnore = true,
|
|
Value = "value1",
|
|
IsAutogenerated = false
|
|
};
|
|
|
|
// Act
|
|
bool result = localizedText1.Equals(localizedText2);
|
|
|
|
// Assert
|
|
Assert.That(result, Is.True);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Tests that Equals returns false when the Key property differs.
|
|
/// </summary>
|
|
[Test]
|
|
public void Equals_DifferentKey_ReturnsFalse()
|
|
{
|
|
// Arrange
|
|
var localizedText1 = new LocalizedText
|
|
{
|
|
Key = "key1",
|
|
DoNotIgnore = true,
|
|
Value = "value1",
|
|
IsAutogenerated = false
|
|
};
|
|
var localizedText2 = new LocalizedText
|
|
{
|
|
Key = "key2",
|
|
DoNotIgnore = true,
|
|
Value = "value1",
|
|
IsAutogenerated = false
|
|
};
|
|
|
|
// Act
|
|
bool result = localizedText1.Equals(localizedText2);
|
|
|
|
// Assert
|
|
Assert.That(result, Is.False);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Tests that Equals returns false when the DoNotIgnore property differs.
|
|
/// </summary>
|
|
[Test]
|
|
public void Equals_DifferentDoNotIgnore_ReturnsFalse()
|
|
{
|
|
// Arrange
|
|
var localizedText1 = new LocalizedText
|
|
{
|
|
Key = "key1",
|
|
DoNotIgnore = true,
|
|
Value = "value1",
|
|
IsAutogenerated = false
|
|
};
|
|
var localizedText2 = new LocalizedText
|
|
{
|
|
Key = "key1",
|
|
DoNotIgnore = false,
|
|
Value = "value1",
|
|
IsAutogenerated = false
|
|
};
|
|
|
|
// Act
|
|
bool result = localizedText1.Equals(localizedText2);
|
|
|
|
// Assert
|
|
Assert.That(result, Is.False);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Tests that Equals returns false when the Value property differs.
|
|
/// </summary>
|
|
[Test]
|
|
public void Equals_DifferentValue_ReturnsFalse()
|
|
{
|
|
// Arrange
|
|
var localizedText1 = new LocalizedText
|
|
{
|
|
Key = "key1",
|
|
DoNotIgnore = true,
|
|
Value = "value1",
|
|
IsAutogenerated = false
|
|
};
|
|
var localizedText2 = new LocalizedText
|
|
{
|
|
Key = "key1",
|
|
DoNotIgnore = true,
|
|
Value = "value2",
|
|
IsAutogenerated = false
|
|
};
|
|
|
|
// Act
|
|
bool result = localizedText1.Equals(localizedText2);
|
|
|
|
// Assert
|
|
Assert.That(result, Is.False);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Tests that Equals returns false when the IsAutogenerated property differs.
|
|
/// </summary>
|
|
[Test]
|
|
public void Equals_DifferentIsAutogenerated_ReturnsFalse()
|
|
{
|
|
// Arrange
|
|
var localizedText1 = new LocalizedText
|
|
{
|
|
Key = "key1",
|
|
DoNotIgnore = true,
|
|
Value = "value1",
|
|
IsAutogenerated = false
|
|
};
|
|
var localizedText2 = new LocalizedText
|
|
{
|
|
Key = "key1",
|
|
DoNotIgnore = true,
|
|
Value = "value1",
|
|
IsAutogenerated = true
|
|
};
|
|
|
|
// Act
|
|
bool result = localizedText1.Equals(localizedText2);
|
|
|
|
// Assert
|
|
Assert.That(result, Is.False);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Tests that Equals handles null Key values correctly.
|
|
/// Verifies that two instances with null Key values are equal if all other properties match.
|
|
/// </summary>
|
|
[Test]
|
|
public void Equals_NullKeyInBoth_ReturnsTrue()
|
|
{
|
|
// Arrange
|
|
var localizedText1 = new LocalizedText
|
|
{
|
|
Key = null,
|
|
DoNotIgnore = true,
|
|
Value = "value1",
|
|
IsAutogenerated = false
|
|
};
|
|
var localizedText2 = new LocalizedText
|
|
{
|
|
Key = null,
|
|
DoNotIgnore = true,
|
|
Value = "value1",
|
|
IsAutogenerated = false
|
|
};
|
|
|
|
// Act
|
|
bool result = localizedText1.Equals(localizedText2);
|
|
|
|
// Assert
|
|
Assert.That(result, Is.True);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Tests that Equals returns false when one instance has null Key and the other has a non-null Key.
|
|
/// </summary>
|
|
[Test]
|
|
public void Equals_NullKeyInOneInstance_ReturnsFalse()
|
|
{
|
|
// Arrange
|
|
var localizedText1 = new LocalizedText
|
|
{
|
|
Key = null,
|
|
DoNotIgnore = true,
|
|
Value = "value1",
|
|
IsAutogenerated = false
|
|
};
|
|
var localizedText2 = new LocalizedText
|
|
{
|
|
Key = "key1",
|
|
DoNotIgnore = true,
|
|
Value = "value1",
|
|
IsAutogenerated = false
|
|
};
|
|
|
|
// Act
|
|
bool result = localizedText1.Equals(localizedText2);
|
|
|
|
// Assert
|
|
Assert.That(result, Is.False);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Tests that Equals handles null Value correctly.
|
|
/// Verifies that two instances with null Value are equal if all other properties match.
|
|
/// </summary>
|
|
[Test]
|
|
public void Equals_NullValueInBoth_ReturnsTrue()
|
|
{
|
|
// Arrange
|
|
var localizedText1 = new LocalizedText
|
|
{
|
|
Key = "key1",
|
|
DoNotIgnore = true,
|
|
Value = null,
|
|
IsAutogenerated = false
|
|
};
|
|
var localizedText2 = new LocalizedText
|
|
{
|
|
Key = "key1",
|
|
DoNotIgnore = true,
|
|
Value = null,
|
|
IsAutogenerated = false
|
|
};
|
|
|
|
// Act
|
|
bool result = localizedText1.Equals(localizedText2);
|
|
|
|
// Assert
|
|
Assert.That(result, Is.True);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Tests that Equals returns false when one instance has null Value and the other has a non-null Value.
|
|
/// </summary>
|
|
[Test]
|
|
public void Equals_NullValueInOneInstance_ReturnsFalse()
|
|
{
|
|
// Arrange
|
|
var localizedText1 = new LocalizedText
|
|
{
|
|
Key = "key1",
|
|
DoNotIgnore = true,
|
|
Value = null,
|
|
IsAutogenerated = false
|
|
};
|
|
var localizedText2 = new LocalizedText
|
|
{
|
|
Key = "key1",
|
|
DoNotIgnore = true,
|
|
Value = "value1",
|
|
IsAutogenerated = false
|
|
};
|
|
|
|
// Act
|
|
bool result = localizedText1.Equals(localizedText2);
|
|
|
|
// Assert
|
|
Assert.That(result, Is.False);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Tests that Equals handles empty string Key values correctly.
|
|
/// Verifies that two instances with empty Key values are equal if all other properties match.
|
|
/// </summary>
|
|
[Test]
|
|
public void Equals_EmptyKeyInBoth_ReturnsTrue()
|
|
{
|
|
// Arrange
|
|
var localizedText1 = new LocalizedText
|
|
{
|
|
Key = string.Empty,
|
|
DoNotIgnore = true,
|
|
Value = "value1",
|
|
IsAutogenerated = false
|
|
};
|
|
var localizedText2 = new LocalizedText
|
|
{
|
|
Key = string.Empty,
|
|
DoNotIgnore = true,
|
|
Value = "value1",
|
|
IsAutogenerated = false
|
|
};
|
|
|
|
// Act
|
|
bool result = localizedText1.Equals(localizedText2);
|
|
|
|
// Assert
|
|
Assert.That(result, Is.True);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Tests that Equals handles empty string Value correctly.
|
|
/// Verifies that two instances with empty Value are equal if all other properties match.
|
|
/// </summary>
|
|
[Test]
|
|
public void Equals_EmptyValueInBoth_ReturnsTrue()
|
|
{
|
|
// Arrange
|
|
var localizedText1 = new LocalizedText
|
|
{
|
|
Key = "key1",
|
|
DoNotIgnore = true,
|
|
Value = string.Empty,
|
|
IsAutogenerated = false
|
|
};
|
|
var localizedText2 = new LocalizedText
|
|
{
|
|
Key = "key1",
|
|
DoNotIgnore = true,
|
|
Value = string.Empty,
|
|
IsAutogenerated = false
|
|
};
|
|
|
|
// Act
|
|
bool result = localizedText1.Equals(localizedText2);
|
|
|
|
// Assert
|
|
Assert.That(result, Is.True);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Tests that Equals handles whitespace string values correctly in Key property.
|
|
/// Verifies that whitespace is considered a distinct value from empty or other whitespace patterns.
|
|
/// </summary>
|
|
[Test]
|
|
public void Equals_WhitespaceKeyInBoth_ReturnsTrue()
|
|
{
|
|
// Arrange
|
|
var localizedText1 = new LocalizedText
|
|
{
|
|
Key = " ",
|
|
DoNotIgnore = true,
|
|
Value = "value1",
|
|
IsAutogenerated = false
|
|
};
|
|
var localizedText2 = new LocalizedText
|
|
{
|
|
Key = " ",
|
|
DoNotIgnore = true,
|
|
Value = "value1",
|
|
IsAutogenerated = false
|
|
};
|
|
|
|
// Act
|
|
bool result = localizedText1.Equals(localizedText2);
|
|
|
|
// Assert
|
|
Assert.That(result, Is.True);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Tests that Equals handles whitespace string values correctly in Value property.
|
|
/// Verifies that whitespace is considered a distinct value from empty or other whitespace patterns.
|
|
/// </summary>
|
|
[Test]
|
|
public void Equals_WhitespaceValueInBoth_ReturnsTrue()
|
|
{
|
|
// Arrange
|
|
var localizedText1 = new LocalizedText
|
|
{
|
|
Key = "key1",
|
|
DoNotIgnore = true,
|
|
Value = " ",
|
|
IsAutogenerated = false
|
|
};
|
|
var localizedText2 = new LocalizedText
|
|
{
|
|
Key = "key1",
|
|
DoNotIgnore = true,
|
|
Value = " ",
|
|
IsAutogenerated = false
|
|
};
|
|
|
|
// Act
|
|
bool result = localizedText1.Equals(localizedText2);
|
|
|
|
// Assert
|
|
Assert.That(result, Is.True);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Tests that Equals handles special characters in string properties correctly.
|
|
/// Verifies that special characters are properly compared.
|
|
/// </summary>
|
|
[Test]
|
|
public void Equals_SpecialCharactersInStrings_ReturnsTrue()
|
|
{
|
|
// Arrange
|
|
var localizedText1 = new LocalizedText
|
|
{
|
|
Key = "key\t\r\n\\!@#$%^&*()",
|
|
DoNotIgnore = true,
|
|
Value = "value\t\r\n\\!@#$%^&*()",
|
|
IsAutogenerated = false
|
|
};
|
|
var localizedText2 = new LocalizedText
|
|
{
|
|
Key = "key\t\r\n\\!@#$%^&*()",
|
|
DoNotIgnore = true,
|
|
Value = "value\t\r\n\\!@#$%^&*()",
|
|
IsAutogenerated = false
|
|
};
|
|
|
|
// Act
|
|
bool result = localizedText1.Equals(localizedText2);
|
|
|
|
// Assert
|
|
Assert.That(result, Is.True);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Tests that Equals correctly compares instances with default constructor values.
|
|
/// The default constructor initializes Key to "" and DoNotIgnore to false.
|
|
/// </summary>
|
|
[Test]
|
|
public void Equals_DefaultConstructorValues_ReturnsTrue()
|
|
{
|
|
// Arrange
|
|
var localizedText1 = new LocalizedText();
|
|
var localizedText2 = new LocalizedText();
|
|
|
|
// Act
|
|
bool result = localizedText1.Equals(localizedText2);
|
|
|
|
// Assert
|
|
Assert.That(result, Is.True);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Tests that Equals correctly handles instances with all boolean combinations.
|
|
/// Verifies equality with both DoNotIgnore and IsAutogenerated set to true.
|
|
/// </summary>
|
|
[Test]
|
|
public void Equals_BothBooleanPropertiesTrue_ReturnsTrue()
|
|
{
|
|
// Arrange
|
|
var localizedText1 = new LocalizedText
|
|
{
|
|
Key = "key1",
|
|
DoNotIgnore = true,
|
|
Value = "value1",
|
|
IsAutogenerated = true
|
|
};
|
|
var localizedText2 = new LocalizedText
|
|
{
|
|
Key = "key1",
|
|
DoNotIgnore = true,
|
|
Value = "value1",
|
|
IsAutogenerated = true
|
|
};
|
|
|
|
// Act
|
|
bool result = localizedText1.Equals(localizedText2);
|
|
|
|
// Assert
|
|
Assert.That(result, Is.True);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Tests that Equals correctly handles instances with all properties set to false.
|
|
/// Verifies equality with both DoNotIgnore and IsAutogenerated set to false.
|
|
/// </summary>
|
|
[Test]
|
|
public void Equals_BothBooleanPropertiesFalse_ReturnsTrue()
|
|
{
|
|
// Arrange
|
|
var localizedText1 = new LocalizedText
|
|
{
|
|
Key = "key1",
|
|
DoNotIgnore = false,
|
|
Value = "value1",
|
|
IsAutogenerated = false
|
|
};
|
|
var localizedText2 = new LocalizedText
|
|
{
|
|
Key = "key1",
|
|
DoNotIgnore = false,
|
|
Value = "value1",
|
|
IsAutogenerated = false
|
|
};
|
|
|
|
// Act
|
|
bool result = localizedText1.Equals(localizedText2);
|
|
|
|
// Assert
|
|
Assert.That(result, Is.True);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Tests that Equals handles very long string values correctly.
|
|
/// Verifies that string comparison works properly with large strings.
|
|
/// </summary>
|
|
[Test]
|
|
public void Equals_VeryLongStrings_ReturnsTrue()
|
|
{
|
|
// Arrange
|
|
string longString = new('a', 10000);
|
|
var localizedText1 = new LocalizedText
|
|
{
|
|
Key = longString,
|
|
DoNotIgnore = true,
|
|
Value = longString,
|
|
IsAutogenerated = false
|
|
};
|
|
var localizedText2 = new LocalizedText
|
|
{
|
|
Key = longString,
|
|
DoNotIgnore = true,
|
|
Value = longString,
|
|
IsAutogenerated = false
|
|
};
|
|
|
|
// Act
|
|
bool result = localizedText1.Equals(localizedText2);
|
|
|
|
// Assert
|
|
Assert.That(result, Is.True);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Tests that Equals returns false when comparing very long strings that differ.
|
|
/// Verifies that string comparison correctly identifies differences in large strings.
|
|
/// </summary>
|
|
[Test]
|
|
public void Equals_VeryLongStringsDifferent_ReturnsFalse()
|
|
{
|
|
// Arrange
|
|
string longString1 = new('a', 10000);
|
|
string longString2 = new('b', 10000);
|
|
var localizedText1 = new LocalizedText
|
|
{
|
|
Key = longString1,
|
|
DoNotIgnore = true,
|
|
Value = "value1",
|
|
IsAutogenerated = false
|
|
};
|
|
var localizedText2 = new LocalizedText
|
|
{
|
|
Key = longString2,
|
|
DoNotIgnore = true,
|
|
Value = "value1",
|
|
IsAutogenerated = false
|
|
};
|
|
|
|
// Act
|
|
bool result = localizedText1.Equals(localizedText2);
|
|
|
|
// Assert
|
|
Assert.That(result, Is.False);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Tests that Equals(object) returns false when parameter is null.
|
|
/// Verifies null handling in object overload.
|
|
/// Expected result: false.
|
|
/// </summary>
|
|
[Test]
|
|
public void Equals_NullObject_ReturnsFalse()
|
|
{
|
|
// Arrange
|
|
var text = new LocalizedText
|
|
{
|
|
Key = "testKey",
|
|
Value = "testValue"
|
|
};
|
|
|
|
// Act
|
|
#pragma warning disable CA1508 // Avoid dead conditional code
|
|
bool result = text.Equals((object)null);
|
|
#pragma warning restore CA1508 // Avoid dead conditional code
|
|
|
|
// Assert
|
|
Assert.That(result, Is.False);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Tests that Equals(object) returns false when parameter is of different type.
|
|
/// Verifies type checking via 'as' operator cast.
|
|
/// Expected result: false.
|
|
/// </summary>
|
|
[Test]
|
|
public void Equals_DifferentType_ReturnsFalse()
|
|
{
|
|
// Arrange
|
|
var text = new LocalizedText
|
|
{
|
|
Key = "testKey",
|
|
Value = "testValue"
|
|
};
|
|
object differentType = "string object";
|
|
|
|
// Act
|
|
bool result = text.Equals(differentType);
|
|
|
|
// Assert
|
|
Assert.That(result, Is.False);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Tests that Equals(object) returns true when comparing two instances with identical property values.
|
|
/// Verifies value-based equality comparison.
|
|
/// Expected result: true.
|
|
/// </summary>
|
|
[Test]
|
|
public void Equals_EqualInstances_ReturnsTrue()
|
|
{
|
|
// Arrange
|
|
var text1 = new LocalizedText
|
|
{
|
|
Key = "testKey",
|
|
DoNotIgnore = true,
|
|
Value = "testValue",
|
|
IsAutogenerated = false
|
|
};
|
|
var text2 = new LocalizedText
|
|
{
|
|
Key = "testKey",
|
|
DoNotIgnore = true,
|
|
Value = "testValue",
|
|
IsAutogenerated = false
|
|
};
|
|
|
|
// Act
|
|
bool result = text1.Equals((object)text2);
|
|
|
|
// Assert
|
|
Assert.That(result, Is.True);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Tests that Equals(object) returns true when both instances have null Value and other properties are equal.
|
|
/// Verifies null value handling in equality comparison.
|
|
/// Expected result: true.
|
|
/// </summary>
|
|
[Test]
|
|
public void Equals_BothNullValue_ReturnsTrue()
|
|
{
|
|
// Arrange
|
|
var text1 = new LocalizedText
|
|
{
|
|
Key = "testKey",
|
|
DoNotIgnore = true,
|
|
Value = null,
|
|
IsAutogenerated = false
|
|
};
|
|
var text2 = new LocalizedText
|
|
{
|
|
Key = "testKey",
|
|
DoNotIgnore = true,
|
|
Value = null,
|
|
IsAutogenerated = false
|
|
};
|
|
|
|
// Act
|
|
bool result = text1.Equals((object)text2);
|
|
|
|
// Assert
|
|
Assert.That(result, Is.True);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Tests that Equals(object) returns false when one instance has null Value and the other does not.
|
|
/// Verifies null vs non-null value comparison.
|
|
/// Expected result: false.
|
|
/// </summary>
|
|
[Test]
|
|
public void Equals_OneNullValue_ReturnsFalse()
|
|
{
|
|
// Arrange
|
|
var text1 = new LocalizedText
|
|
{
|
|
Key = "testKey",
|
|
DoNotIgnore = true,
|
|
Value = null,
|
|
IsAutogenerated = false
|
|
};
|
|
var text2 = new LocalizedText
|
|
{
|
|
Key = "testKey",
|
|
DoNotIgnore = true,
|
|
Value = "testValue",
|
|
IsAutogenerated = false
|
|
};
|
|
|
|
// Act
|
|
bool result = text1.Equals((object)text2);
|
|
|
|
// Assert
|
|
Assert.That(result, Is.False);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Tests that Equals(object) returns true when comparing instances with empty string Key and Value.
|
|
/// Verifies handling of empty strings in equality comparison.
|
|
/// Expected result: true.
|
|
/// </summary>
|
|
[Test]
|
|
public void Equals_EmptyStrings_ReturnsTrue()
|
|
{
|
|
// Arrange
|
|
var text1 = new LocalizedText
|
|
{
|
|
Key = string.Empty,
|
|
DoNotIgnore = false,
|
|
Value = string.Empty,
|
|
IsAutogenerated = false
|
|
};
|
|
var text2 = new LocalizedText
|
|
{
|
|
Key = string.Empty,
|
|
DoNotIgnore = false,
|
|
Value = string.Empty,
|
|
IsAutogenerated = false
|
|
};
|
|
|
|
// Act
|
|
bool result = text1.Equals((object)text2);
|
|
|
|
// Assert
|
|
Assert.That(result, Is.True);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Tests that Equals(object) returns true when comparing default-initialized instances.
|
|
/// Verifies equality comparison with default property values.
|
|
/// Expected result: true.
|
|
/// </summary>
|
|
[Test]
|
|
public void Equals_DefaultInstances_ReturnsTrue()
|
|
{
|
|
// Arrange
|
|
var text1 = new LocalizedText();
|
|
var text2 = new LocalizedText();
|
|
|
|
// Act
|
|
bool result = text1.Equals((object)text2);
|
|
|
|
// Assert
|
|
Assert.That(result, Is.True);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Tests that Equals(object) returns false when Key differs by whitespace.
|
|
/// Verifies that whitespace differences are detected.
|
|
/// Expected result: false.
|
|
/// </summary>
|
|
[Test]
|
|
public void Equals_KeyDiffersByWhitespace_ReturnsFalse()
|
|
{
|
|
// Arrange
|
|
var text1 = new LocalizedText
|
|
{
|
|
Key = "testKey",
|
|
DoNotIgnore = false,
|
|
Value = "testValue",
|
|
IsAutogenerated = false
|
|
};
|
|
var text2 = new LocalizedText
|
|
{
|
|
Key = "testKey ",
|
|
DoNotIgnore = false,
|
|
Value = "testValue",
|
|
IsAutogenerated = false
|
|
};
|
|
|
|
// Act
|
|
bool result = text1.Equals((object)text2);
|
|
|
|
// Assert
|
|
Assert.That(result, Is.False);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Tests that Equals(object) returns false when Value differs by case.
|
|
/// Verifies that string comparison is case-sensitive.
|
|
/// Expected result: false.
|
|
/// </summary>
|
|
[Test]
|
|
public void Equals_ValueDiffersByCase_ReturnsFalse()
|
|
{
|
|
// Arrange
|
|
var text1 = new LocalizedText
|
|
{
|
|
Key = "testKey",
|
|
DoNotIgnore = false,
|
|
Value = "TestValue",
|
|
IsAutogenerated = false
|
|
};
|
|
var text2 = new LocalizedText
|
|
{
|
|
Key = "testKey",
|
|
DoNotIgnore = false,
|
|
Value = "testvalue",
|
|
IsAutogenerated = false
|
|
};
|
|
|
|
// Act
|
|
bool result = text1.Equals((object)text2);
|
|
|
|
// Assert
|
|
Assert.That(result, Is.False);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Tests that GetHashCode returns consistent value across multiple invocations for the same object.
|
|
/// Input: LocalizedText with all properties set to default values.
|
|
/// Expected: Hash code remains consistent.
|
|
/// </summary>
|
|
[Test]
|
|
public void GetHashCode_ConsistentInvocations_ReturnsSameHashCode()
|
|
{
|
|
// Arrange
|
|
var localizedText = new LocalizedText
|
|
{
|
|
Key = "TestKey",
|
|
DoNotIgnore = true,
|
|
Value = "TestValue",
|
|
IsAutogenerated = false
|
|
};
|
|
|
|
// Act
|
|
int hashCode1 = localizedText.GetHashCode();
|
|
int hashCode2 = localizedText.GetHashCode();
|
|
|
|
// Assert
|
|
Assert.That(hashCode2, Is.EqualTo(hashCode1));
|
|
}
|
|
|
|
/// <summary>
|
|
/// Tests that equal objects produce equal hash codes.
|
|
/// Input: Two LocalizedText instances with identical property values.
|
|
/// Expected: Both objects return the same hash code.
|
|
/// </summary>
|
|
[Test]
|
|
public void GetHashCode_EqualObjects_ReturnsSameHashCode()
|
|
{
|
|
// Arrange
|
|
var localizedText1 = new LocalizedText
|
|
{
|
|
Key = "TestKey",
|
|
DoNotIgnore = true,
|
|
Value = "TestValue",
|
|
IsAutogenerated = false
|
|
};
|
|
|
|
var localizedText2 = new LocalizedText
|
|
{
|
|
Key = "TestKey",
|
|
DoNotIgnore = true,
|
|
Value = "TestValue",
|
|
IsAutogenerated = false
|
|
};
|
|
|
|
// Act
|
|
int hashCode1 = localizedText1.GetHashCode();
|
|
int hashCode2 = localizedText2.GetHashCode();
|
|
|
|
// Assert
|
|
Assert.That(hashCode2, Is.EqualTo(hashCode1));
|
|
}
|
|
|
|
/// <summary>
|
|
/// Tests that different Key values produce different hash codes.
|
|
/// Input: Two LocalizedText instances differing only in Key property.
|
|
/// Expected: Different hash codes are returned.
|
|
/// </summary>
|
|
[Test]
|
|
public void GetHashCode_DifferentKey_ReturnsDifferentHashCode()
|
|
{
|
|
// Arrange
|
|
var localizedText1 = new LocalizedText
|
|
{
|
|
Key = "Key1",
|
|
DoNotIgnore = false,
|
|
Value = "Value",
|
|
IsAutogenerated = false
|
|
};
|
|
|
|
var localizedText2 = new LocalizedText
|
|
{
|
|
Key = "Key2",
|
|
DoNotIgnore = false,
|
|
Value = "Value",
|
|
IsAutogenerated = false
|
|
};
|
|
|
|
// Act
|
|
int hashCode1 = localizedText1.GetHashCode();
|
|
int hashCode2 = localizedText2.GetHashCode();
|
|
|
|
// Assert
|
|
Assert.That(hashCode2, Is.Not.EqualTo(hashCode1));
|
|
}
|
|
|
|
/// <summary>
|
|
/// Tests that different DoNotIgnore values produce different hash codes.
|
|
/// Input: Two LocalizedText instances differing only in DoNotIgnore property.
|
|
/// Expected: Different hash codes are returned.
|
|
/// </summary>
|
|
[Test]
|
|
public void GetHashCode_DifferentDoNotIgnore_ReturnsDifferentHashCode()
|
|
{
|
|
// Arrange
|
|
var localizedText1 = new LocalizedText
|
|
{
|
|
Key = "TestKey",
|
|
DoNotIgnore = true,
|
|
Value = "TestValue",
|
|
IsAutogenerated = false
|
|
};
|
|
|
|
var localizedText2 = new LocalizedText
|
|
{
|
|
Key = "TestKey",
|
|
DoNotIgnore = false,
|
|
Value = "TestValue",
|
|
IsAutogenerated = false
|
|
};
|
|
|
|
// Act
|
|
int hashCode1 = localizedText1.GetHashCode();
|
|
int hashCode2 = localizedText2.GetHashCode();
|
|
|
|
// Assert
|
|
Assert.That(hashCode2, Is.Not.EqualTo(hashCode1));
|
|
}
|
|
|
|
/// <summary>
|
|
/// Tests that different Value values produce different hash codes.
|
|
/// Input: Two LocalizedText instances differing only in Value property.
|
|
/// Expected: Different hash codes are returned.
|
|
/// </summary>
|
|
[Test]
|
|
public void GetHashCode_DifferentValue_ReturnsDifferentHashCode()
|
|
{
|
|
// Arrange
|
|
var localizedText1 = new LocalizedText
|
|
{
|
|
Key = "TestKey",
|
|
DoNotIgnore = false,
|
|
Value = "Value1",
|
|
IsAutogenerated = false
|
|
};
|
|
|
|
var localizedText2 = new LocalizedText
|
|
{
|
|
Key = "TestKey",
|
|
DoNotIgnore = false,
|
|
Value = "Value2",
|
|
IsAutogenerated = false
|
|
};
|
|
|
|
// Act
|
|
int hashCode1 = localizedText1.GetHashCode();
|
|
int hashCode2 = localizedText2.GetHashCode();
|
|
|
|
// Assert
|
|
Assert.That(hashCode2, Is.Not.EqualTo(hashCode1));
|
|
}
|
|
|
|
/// <summary>
|
|
/// Tests that different IsAutogenerated values produce different hash codes.
|
|
/// Input: Two LocalizedText instances differing only in IsAutogenerated property.
|
|
/// Expected: Different hash codes are returned.
|
|
/// </summary>
|
|
[Test]
|
|
public void GetHashCode_DifferentIsAutogenerated_ReturnsDifferentHashCode()
|
|
{
|
|
// Arrange
|
|
var localizedText1 = new LocalizedText
|
|
{
|
|
Key = "TestKey",
|
|
DoNotIgnore = false,
|
|
Value = "TestValue",
|
|
IsAutogenerated = true
|
|
};
|
|
|
|
var localizedText2 = new LocalizedText
|
|
{
|
|
Key = "TestKey",
|
|
DoNotIgnore = false,
|
|
Value = "TestValue",
|
|
IsAutogenerated = false
|
|
};
|
|
|
|
// Act
|
|
int hashCode1 = localizedText1.GetHashCode();
|
|
int hashCode2 = localizedText2.GetHashCode();
|
|
|
|
// Assert
|
|
Assert.That(hashCode2, Is.Not.EqualTo(hashCode1));
|
|
}
|
|
|
|
/// <summary>
|
|
/// Tests GetHashCode with null Key value.
|
|
/// Input: LocalizedText with Key set to null.
|
|
/// Expected: Hash code is computed without throwing exception.
|
|
/// </summary>
|
|
[Test]
|
|
public void GetHashCode_NullKey_ReturnsHashCode()
|
|
{
|
|
// Arrange
|
|
var localizedText = new LocalizedText
|
|
{
|
|
Key = null,
|
|
DoNotIgnore = false,
|
|
Value = "TestValue",
|
|
IsAutogenerated = false
|
|
};
|
|
|
|
// Act
|
|
int hashCode = localizedText.GetHashCode();
|
|
|
|
// Assert
|
|
Assert.That(hashCode, Is.InstanceOf<int>());
|
|
}
|
|
|
|
/// <summary>
|
|
/// Tests GetHashCode with null Value.
|
|
/// Input: LocalizedText with Value set to null.
|
|
/// Expected: Hash code is computed without throwing exception.
|
|
/// </summary>
|
|
[Test]
|
|
public void GetHashCode_NullValue_ReturnsHashCode()
|
|
{
|
|
// Arrange
|
|
var localizedText = new LocalizedText
|
|
{
|
|
Key = "TestKey",
|
|
DoNotIgnore = false,
|
|
Value = null,
|
|
IsAutogenerated = false
|
|
};
|
|
|
|
// Act
|
|
int hashCode = localizedText.GetHashCode();
|
|
|
|
// Assert
|
|
Assert.That(hashCode, Is.InstanceOf<int>());
|
|
}
|
|
|
|
/// <summary>
|
|
/// Tests GetHashCode with all null string properties.
|
|
/// Input: LocalizedText with Key and Value set to null.
|
|
/// Expected: Hash code is computed without throwing exception.
|
|
/// </summary>
|
|
[Test]
|
|
public void GetHashCode_AllNullStrings_ReturnsHashCode()
|
|
{
|
|
// Arrange
|
|
var localizedText = new LocalizedText
|
|
{
|
|
Key = null,
|
|
DoNotIgnore = false,
|
|
Value = null,
|
|
IsAutogenerated = false
|
|
};
|
|
|
|
// Act
|
|
int hashCode = localizedText.GetHashCode();
|
|
|
|
// Assert
|
|
Assert.That(hashCode, Is.InstanceOf<int>());
|
|
}
|
|
|
|
/// <summary>
|
|
/// Tests GetHashCode with empty string properties.
|
|
/// Input: LocalizedText with Key and Value set to empty strings.
|
|
/// Expected: Hash code is computed correctly.
|
|
/// </summary>
|
|
[Test]
|
|
public void GetHashCode_EmptyStrings_ReturnsHashCode()
|
|
{
|
|
// Arrange
|
|
var localizedText = new LocalizedText
|
|
{
|
|
Key = string.Empty,
|
|
DoNotIgnore = false,
|
|
Value = string.Empty,
|
|
IsAutogenerated = false
|
|
};
|
|
|
|
// Act
|
|
int hashCode = localizedText.GetHashCode();
|
|
|
|
// Assert
|
|
Assert.That(hashCode, Is.InstanceOf<int>());
|
|
}
|
|
|
|
/// <summary>
|
|
/// Tests GetHashCode with whitespace string properties.
|
|
/// Input: LocalizedText with Key and Value set to whitespace strings.
|
|
/// Expected: Hash code is computed correctly.
|
|
/// </summary>
|
|
[Test]
|
|
public void GetHashCode_WhitespaceStrings_ReturnsHashCode()
|
|
{
|
|
// Arrange
|
|
var localizedText = new LocalizedText
|
|
{
|
|
Key = " ",
|
|
DoNotIgnore = false,
|
|
Value = " ",
|
|
IsAutogenerated = false
|
|
};
|
|
|
|
// Act
|
|
int hashCode = localizedText.GetHashCode();
|
|
|
|
// Assert
|
|
Assert.That(hashCode, Is.InstanceOf<int>());
|
|
}
|
|
|
|
/// <summary>
|
|
/// Tests GetHashCode with very long string properties.
|
|
/// Input: LocalizedText with Key and Value set to very long strings.
|
|
/// Expected: Hash code is computed correctly.
|
|
/// </summary>
|
|
[Test]
|
|
public void GetHashCode_VeryLongStrings_ReturnsHashCode()
|
|
{
|
|
// Arrange
|
|
string longString = new('A', 10000);
|
|
var localizedText = new LocalizedText
|
|
{
|
|
Key = longString,
|
|
DoNotIgnore = true,
|
|
Value = longString,
|
|
IsAutogenerated = true
|
|
};
|
|
|
|
// Act
|
|
int hashCode = localizedText.GetHashCode();
|
|
|
|
// Assert
|
|
Assert.That(hashCode, Is.InstanceOf<int>());
|
|
}
|
|
|
|
/// <summary>
|
|
/// Tests GetHashCode with special characters in string properties.
|
|
/// Input: LocalizedText with Key and Value containing special characters.
|
|
/// Expected: Hash code is computed correctly.
|
|
/// </summary>
|
|
[Test]
|
|
public void GetHashCode_SpecialCharacters_ReturnsHashCode()
|
|
{
|
|
// Arrange
|
|
var localizedText = new LocalizedText
|
|
{
|
|
Key = "Test\nKey\r\n\t",
|
|
DoNotIgnore = false,
|
|
Value = "Value\0\x01\x1F",
|
|
IsAutogenerated = false
|
|
};
|
|
|
|
// Act
|
|
int hashCode = localizedText.GetHashCode();
|
|
|
|
// Assert
|
|
Assert.That(hashCode, Is.InstanceOf<int>());
|
|
}
|
|
|
|
/// <summary>
|
|
/// Tests that two LocalizedText instances with different combinations of boolean properties produce different hash codes.
|
|
/// Input: Multiple LocalizedText instances with different boolean property combinations.
|
|
/// Expected: Different hash codes for different boolean combinations.
|
|
/// </summary>
|
|
[TestCase(false, false, TestName = "GetHashCode_BooleanCombination_FalseFalse")]
|
|
[TestCase(false, true, TestName = "GetHashCode_BooleanCombination_FalseTrue")]
|
|
[TestCase(true, false, TestName = "GetHashCode_BooleanCombination_TrueTrue")]
|
|
[TestCase(true, true, TestName = "GetHashCode_BooleanCombination_TrueFalse")]
|
|
public void GetHashCode_DifferentBooleanCombinations_ReturnsHashCode(bool doNotIgnore, bool isAutogenerated)
|
|
{
|
|
// Arrange
|
|
var localizedText = new LocalizedText
|
|
{
|
|
Key = "TestKey",
|
|
DoNotIgnore = doNotIgnore,
|
|
Value = "TestValue",
|
|
IsAutogenerated = isAutogenerated
|
|
};
|
|
|
|
// Act
|
|
int hashCode = localizedText.GetHashCode();
|
|
|
|
// Assert
|
|
Assert.That(hashCode, Is.InstanceOf<int>());
|
|
}
|
|
|
|
/// <summary>
|
|
/// Tests that equal LocalizedText instances with null properties produce equal hash codes.
|
|
/// Input: Two LocalizedText instances with identical null properties.
|
|
/// Expected: Same hash code is returned.
|
|
/// </summary>
|
|
[Test]
|
|
public void GetHashCode_EqualObjectsWithNullProperties_ReturnsSameHashCode()
|
|
{
|
|
// Arrange
|
|
var localizedText1 = new LocalizedText
|
|
{
|
|
Key = null,
|
|
DoNotIgnore = true,
|
|
Value = null,
|
|
IsAutogenerated = true
|
|
};
|
|
|
|
var localizedText2 = new LocalizedText
|
|
{
|
|
Key = null,
|
|
DoNotIgnore = true,
|
|
Value = null,
|
|
IsAutogenerated = true
|
|
};
|
|
|
|
// Act
|
|
int hashCode1 = localizedText1.GetHashCode();
|
|
int hashCode2 = localizedText2.GetHashCode();
|
|
|
|
// Assert
|
|
Assert.That(hashCode2, Is.EqualTo(hashCode1));
|
|
}
|
|
|
|
/// <summary>
|
|
/// Tests that LocalizedText instances where one has null Key and the other has non-null Key produce different hash codes.
|
|
/// Input: Two LocalizedText instances differing only in Key nullability.
|
|
/// Expected: Different hash codes are returned.
|
|
/// </summary>
|
|
[Test]
|
|
public void GetHashCode_NullVsNonNullKey_ReturnsDifferentHashCode()
|
|
{
|
|
// Arrange
|
|
var localizedText1 = new LocalizedText
|
|
{
|
|
Key = null,
|
|
DoNotIgnore = false,
|
|
Value = "Value",
|
|
IsAutogenerated = false
|
|
};
|
|
|
|
var localizedText2 = new LocalizedText
|
|
{
|
|
Key = "Key",
|
|
DoNotIgnore = false,
|
|
Value = "Value",
|
|
IsAutogenerated = false
|
|
};
|
|
|
|
// Act
|
|
int hashCode1 = localizedText1.GetHashCode();
|
|
int hashCode2 = localizedText2.GetHashCode();
|
|
|
|
// Assert
|
|
Assert.That(hashCode2, Is.Not.EqualTo(hashCode1));
|
|
}
|
|
|
|
/// <summary>
|
|
/// Tests that LocalizedText instances where one has null Value and the other has non-null Value produce different hash codes.
|
|
/// Input: Two LocalizedText instances differing only in Value nullability.
|
|
/// Expected: Different hash codes are returned.
|
|
/// </summary>
|
|
[Test]
|
|
public void GetHashCode_NullVsNonNullValue_ReturnsDifferentHashCode()
|
|
{
|
|
// Arrange
|
|
var localizedText1 = new LocalizedText
|
|
{
|
|
Key = "Key",
|
|
DoNotIgnore = false,
|
|
Value = null,
|
|
IsAutogenerated = false
|
|
};
|
|
|
|
var localizedText2 = new LocalizedText
|
|
{
|
|
Key = "Key",
|
|
DoNotIgnore = false,
|
|
Value = "Value",
|
|
IsAutogenerated = false
|
|
};
|
|
|
|
// Act
|
|
int hashCode1 = localizedText1.GetHashCode();
|
|
int hashCode2 = localizedText2.GetHashCode();
|
|
|
|
// Assert
|
|
Assert.That(hashCode2, Is.Not.EqualTo(hashCode1));
|
|
}
|
|
}
|
|
}
|