private void AssertCast(DataObjectValue value, Int32 expectedValue)
		{
			var testedValue = (Int32)value;
			Assert.IsTrue(testedValue == expectedValue, $"Value '{value.ToString()}' not equals to expected {nameof(Int32)} value '{expectedValue}'");
		}
		private void AssertCast(DataObjectValue value, String expectedValue)
		{
			var testedValue = (String)value;
			//var toStringValue = value.ToString();
			//Assert.IsTrue(testedValue == toStringValue, $"Different result of '{nameof(String.ToString)}' method result and explict cast to '{nameof(String)}'");
			Assert.IsTrue(testedValue == expectedValue, $"Value '{value.ToString()}' not equals to expected {nameof(String)} value '{expectedValue}'");
		}
		private static void AssertAdd(DataObjectValue a, DataObjectValue b, DataObjectValue expected)
		{
			var add1 = a.Add(b);
			//var add2 = b.Add(a);
			Assert.IsTrue(add1 == expected, $"'{a.ToString()}'.Add('{b.ToString()}') returns '{add1.ToString()}' | expected: '{expected.ToString()}'");
			//Assert.IsTrue(add2 == expected, $"'{b.ToString()}'.Add('{a.ToString()}') returns '{add2.ToString()}' | expected: '{expected.ToString()}'");

			var sum1 = a + b;
			//var sum2 = b + a;
			Assert.IsTrue(sum1 == expected, $"'{a.ToString()}'+'{b.ToString()}'='{sum1.ToString()}' | expected: '{expected.ToString()}'");
			//Assert.IsTrue(sum2 == expected, $"'{b.ToString()}'+'{a.ToString()}'='{sum2.ToString()}' | expected: '{expected.ToString()}'");
		}
		private static void AssertAreNotEqual(DataObjectValue value1, DataObjectValue value2, Boolean skipHashCheck = false)
		{
			// Hash check
			var value1Hash = value1.GetHashCode();
			var value2Hash = value2.GetHashCode();

			if (!skipHashCheck)
				Assert.IsTrue(value1Hash != value2Hash, $"Same hash codes for '{value1.ToString()}' and '{value2.ToString()}'");

			// Equality operator check
			var areEqualOperatorForward = value1 != value2;
			var areEqualOperatorBackward = value2 != value1;

			Assert.IsTrue(areEqualOperatorForward, $"Value '{value1.ToString()}'(1) equals to value '{value2.ToString()}'(2)");
			Assert.IsTrue(areEqualOperatorBackward, $"Value '{value2.ToString()}'(2) equals to value '{value1.ToString()}'(1)");

			// DataObjectValue.Equals(DataObjectValue) check
			var areEqualForward = value1.Equals(value2);
			var areEqualBackward = value2.Equals(value1);

			Assert.IsFalse(areEqualForward, $"Value '{value1.ToString()}'(1) equals to value '{value2.ToString()}'(2)");
			Assert.IsFalse(areEqualBackward, $"Value '{value2.ToString()}'(2) equals to value '{value1.ToString()}'(1)");
			
			// Object.Equals(Object) override check
			var areEqualToObjectForward = value1.Equals((Object)value2);
			var areEqialToObjectBackward = value2.Equals((Object)value1);

			Assert.IsFalse(areEqualToObjectForward, $"Value '{value1.ToString()}'(1) equals to object '{value2.ToString()}'(2)");
			Assert.IsFalse(areEqialToObjectBackward, $"Value '{value2.ToString()}'(2) equals to object '{value1.ToString()}'(1)");
		}
		private static void AssertComparison(DataObjectValue value1, DataObjectValue value2, Int32 expectedComparionResult)
		{
			var forwardComparison = value1.CompareTo(value2);
			Assert.IsTrue(forwardComparison == expectedComparionResult, $"Comparison result of '{value1.ToString()}' and '{value2.ToString()}' is not '{expectedComparionResult}'. Actual value is '{forwardComparison}'");

			var backwardComparison = value2.CompareTo(value1);
			var backwardExpectedResult = -1 * expectedComparionResult;
			Assert.IsTrue(backwardComparison == backwardExpectedResult, $"Comparison result of '{value2.ToString()}' and '{value1.ToString()}' is not '{backwardExpectedResult}'. Actual value is '{backwardComparison}'");
		}