Skip to content

Commit ccabb37

Browse files
committed
Update project to .NET 8, enhance test cases, and improve value object implementation
1 parent 720c647 commit ccabb37

File tree

5 files changed

+80
-94
lines changed

5 files changed

+80
-94
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -396,3 +396,4 @@ FodyWeavers.xsd
396396

397397
# JetBrains Rider
398398
*.sln.iml
399+
/.idea

ValueObjectCore.UnitTests/ValueObjectCore.UnitTests.csproj

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,21 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
4-
<TargetFramework>net6.0</TargetFramework>
4+
<TargetFramework>net8.0</TargetFramework>
55
<ImplicitUsings>enable</ImplicitUsings>
66
<Nullable>enable</Nullable>
7-
87
<IsPackable>false</IsPackable>
8+
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
99
</PropertyGroup>
1010

1111
<ItemGroup>
12-
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.1.0" />
13-
<PackageReference Include="xunit" Version="2.4.1" />
14-
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.3">
12+
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.12.0" />
13+
<PackageReference Include="xunit" Version="2.9.3" />
14+
<PackageReference Include="xunit.runner.visualstudio" Version="3.0.1">
1515
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
1616
<PrivateAssets>all</PrivateAssets>
1717
</PackageReference>
18-
<PackageReference Include="coverlet.collector" Version="3.1.2">
18+
<PackageReference Include="coverlet.collector" Version="6.0.4">
1919
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
2020
<PrivateAssets>all</PrivateAssets>
2121
</PackageReference>
Lines changed: 63 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -1,84 +1,66 @@
1-
namespace ValueObjectCore.Tests;
2-
3-
public class ValueObjectTests
1+
namespace ValueObjectCore.UnitTests
42
{
5-
[Fact]
6-
public void Equals_WhenCalledWithNull_ReturnsFalse()
7-
{
8-
// Arrange
9-
var valueObject = new SampleValueObject();
10-
11-
// Act
12-
var result = valueObject.Equals(null);
13-
14-
// Assert
15-
Assert.False(result);
16-
}
17-
18-
[Fact]
19-
public void Equals_WhenCalledWithSameInstance_ReturnsTrue()
20-
{
21-
// Arrange
22-
var valueObject = new SampleValueObject();
23-
24-
// Act
25-
var result = valueObject.Equals(valueObject);
26-
27-
// Assert
28-
Assert.True(result);
29-
}
30-
31-
[Fact]
32-
public void Equals_WhenCalledWithEqualValueObjects_ReturnsTrue()
33-
{
34-
// Arrange
35-
var valueObject1 = new SampleValueObject();
36-
var valueObject2 = new SampleValueObject();
37-
38-
// Act
39-
var result = valueObject1.Equals(valueObject2);
40-
41-
// Assert
42-
Assert.True(result);
43-
}
44-
45-
[Fact]
46-
public void Equals_WhenCalledWithDifferentValueObjects_ReturnsFalse()
47-
{
48-
// Arrange
49-
var valueObject1 = new SampleValueObject();
50-
var valueObject2 = new SampleValueObject { PropertyOne = "Different" };
51-
52-
// Act
53-
var result = valueObject1.Equals(valueObject2);
54-
55-
// Assert
56-
Assert.False(result);
57-
}
58-
59-
[Fact]
60-
public void GetHashCode_WhenCalled_ReturnsHashCode()
61-
{
62-
// Arrange
63-
var valueObject = new SampleValueObject();
64-
65-
// Act
66-
var result = valueObject.GetHashCode();
67-
68-
// Assert
69-
Assert.Equal(valueObject.GetAtomicValues().Aggregate(0, (x, y) => HashCode.Combine(x, y)), result);
70-
}
71-
}
72-
73-
internal sealed class SampleValueObject : ValueObject
74-
{
75-
public string PropertyOne { get; set; } = "PropertyOne";
76-
77-
public int PropertyTwo { get; set; } = 2;
78-
79-
public override IEnumerable<object> GetAtomicValues()
3+
public class ValueObjectTests
804
{
81-
yield return PropertyOne;
82-
yield return PropertyTwo;
5+
private class TestValueObject(IEnumerable<object?> values) : ValueObject
6+
{
7+
public override IEnumerable<object?> GetAtomicValues()
8+
{
9+
return values;
10+
}
11+
}
12+
13+
[Fact]
14+
public void Equals_ReturnsTrue_ForEqualValueObjects()
15+
{
16+
var valueObject1 = new TestValueObject([1, "test", null]);
17+
var valueObject2 = new TestValueObject([1, "test", null]);
18+
19+
Assert.True(valueObject1.Equals(valueObject2));
20+
}
21+
22+
[Fact]
23+
public void Equals_ReturnsFalse_ForDifferentValueObjects()
24+
{
25+
var valueObject1 = new TestValueObject([1, "test", null]);
26+
var valueObject2 = new TestValueObject([2, "test", null]);
27+
28+
Assert.False(valueObject1.Equals(valueObject2));
29+
}
30+
31+
[Fact]
32+
public void Equals_ReturnsFalse_WhenOtherIsNull()
33+
{
34+
var valueObject = new TestValueObject([1, "test", null]);
35+
36+
Assert.False(valueObject.Equals(null));
37+
}
38+
39+
[Fact]
40+
public void GetHashCode_ReturnsSameHashCode_ForEqualValueObjects()
41+
{
42+
var valueObject1 = new TestValueObject([1, "test", null]);
43+
var valueObject2 = new TestValueObject([1, "test", null]);
44+
45+
Assert.Equal(valueObject1.GetHashCode(), valueObject2.GetHashCode());
46+
}
47+
48+
[Fact]
49+
public void GetHashCode_ReturnsDifferentHashCode_ForDifferentValueObjects()
50+
{
51+
var valueObject1 = new TestValueObject([1, "test", null]);
52+
var valueObject2 = new TestValueObject([2, "test", null]);
53+
54+
Assert.NotEqual(valueObject1.GetHashCode(), valueObject2.GetHashCode());
55+
}
56+
57+
[Fact]
58+
public void Equals_ReturnsFalse_ForDifferentTypes()
59+
{
60+
var valueObject = new TestValueObject([1, "test", null]);
61+
var differentTypeObject = new object();
62+
63+
Assert.False(valueObject.Equals(differentTypeObject));
64+
}
8365
}
84-
}
66+
}

ValueObjectCore/ValueObject.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ public abstract class ValueObject : IEquatable<ValueObject>
1212
/// Gets the atomic values that define the state of the value object.
1313
/// </summary>
1414
/// <returns>An IEnumerable containing the atomic values of the value object.</returns>
15-
public abstract IEnumerable<object> GetAtomicValues();
15+
public abstract IEnumerable<object?> GetAtomicValues();
1616

1717
/// <summary>
1818
/// Determines whether this value object is equal to another value object.
@@ -31,16 +31,16 @@ public bool Equals(ValueObject? other)
3131
/// <returns>True if the object is a value object and they are equal; otherwise, false.</returns>
3232
public override bool Equals(object? obj)
3333
{
34-
return obj is not null && obj is ValueObject other && ValueObjectsAreEqual(other);
34+
return obj is ValueObject other && ValueObjectsAreEqual(other);
3535
}
3636

37-
// <summary>
37+
/// <summary>
3838
/// Calculates the hash code for this value object.
3939
/// </summary>
4040
/// <returns>The hash code for the value object.</returns>
4141
public override int GetHashCode()
4242
{
43-
return GetAtomicValues().Aggregate(default(int), HashCode.Combine);
43+
return GetAtomicValues().Aggregate(0, HashCode.Combine);
4444
}
4545

4646
/// <summary>

ValueObjectCore/ValueObjectCore.csproj

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,23 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
4-
<TargetFramework>net6.0</TargetFramework>
4+
<TargetFramework>net8.0</TargetFramework>
55
<ImplicitUsings>enable</ImplicitUsings>
66
<Nullable>enable</Nullable>
77
<GeneratePackageOnBuild>True</GeneratePackageOnBuild>
88
<PackageId>ValueObjectCore</PackageId>
99
<Title>Value Object base class</Title>
10-
<Version>1.0.0</Version>
10+
<Version>2.0.0</Version>
1111
<Authors>ipazooki</Authors>
1212
<Description>A value object is a design pattern that represents an immutable object with equality based on its state, not its identity. This is a base class for value objects</Description>
1313
<PackageReadmeFile>README.md</PackageReadmeFile>
1414
<RepositoryUrl>https://github.com/iPazooki/ValueObjectCore</RepositoryUrl>
1515
<PackageTags>ValueObject;DDD;value-object</PackageTags>
1616
<PackageLicenseExpression>MIT</PackageLicenseExpression>
17+
<AssemblyVersion>2.0.0</AssemblyVersion>
18+
<FileVersion>2.0.0</FileVersion>
19+
<NeutralLanguage>en-GB</NeutralLanguage>
20+
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
1721
</PropertyGroup>
1822

1923
<ItemGroup>
@@ -25,7 +29,6 @@
2529
<Pack>True</Pack>
2630
<PackagePath>\</PackagePath>
2731
</None>
28-
<None Include="C:\Projects\ValueObjectCore\ValueObjectCore\.editorconfig" />
2932
</ItemGroup>
3033

3134
</Project>

0 commit comments

Comments
 (0)