Skip to content

Commit 8397f46

Browse files
ngtduc693Duc Nguyen
authored andcommitted
add some test case
1 parent 823ad80 commit 8397f46

File tree

4 files changed

+46
-6
lines changed

4 files changed

+46
-6
lines changed

Algorithms.Tests/Algorithms.Tests.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
</PackageReference>
2121
<PackageReference Include="FluentAssertions" Version="6.12.0" />
2222
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0" />
23+
<PackageReference Include="Moq" Version="4.20.72" />
2324
<PackageReference Include="nunit" Version="4.0.1" />
2425
<PackageReference Include="NUnit3TestAdapter" Version="4.5.0" />
2526
</ItemGroup>

Algorithms.Tests/RecommenderSystem/CollaborativeFilteringTests.cs

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using Algorithms.RecommenderSystem;
2+
using Moq;
23
using NUnit.Framework;
34
using System.Collections.Generic;
45

@@ -7,13 +8,15 @@ namespace Algorithms.Tests.RecommenderSystem
78
[TestFixture]
89
public class CollaborativeFilteringTests
910
{
10-
private CollaborativeFiltering recommender = new();
11+
private Mock<ISimilarityCalculator>? mockSimilarityCalculator;
12+
private CollaborativeFiltering? recommender;
1113
private Dictionary<string, Dictionary<string, double>> testRatings = null!;
1214

1315
[SetUp]
1416
public void Setup()
1517
{
16-
recommender = new CollaborativeFiltering();
18+
mockSimilarityCalculator = new Mock<ISimilarityCalculator>();
19+
recommender = new CollaborativeFiltering(mockSimilarityCalculator.Object);
1720

1821
testRatings = new Dictionary<string, Dictionary<string, double>>
1922
{
@@ -49,7 +52,7 @@ public void CalculateSimilarity_WithValidInputs_ReturnsExpectedResults(
4952
var user1Ratings = new Dictionary<string, double> { [commonItem] = rating1 };
5053
var user2Ratings = new Dictionary<string, double> { [commonItem] = rating2 };
5154

52-
var similarity = recommender.CalculateSimilarity(user1Ratings, user2Ratings);
55+
var similarity = recommender?.CalculateSimilarity(user1Ratings, user2Ratings);
5356

5457
Assert.That(similarity, Is.InRange(-1.0, 1.0));
5558
}
@@ -60,17 +63,33 @@ public void CalculateSimilarity_WithNoCommonItems_ReturnsZero()
6063
var user1Ratings = new Dictionary<string, double> { ["item1"] = 5.0 };
6164
var user2Ratings = new Dictionary<string, double> { ["item2"] = 4.0 };
6265

63-
var similarity = recommender.CalculateSimilarity(user1Ratings, user2Ratings);
66+
var similarity = recommender?.CalculateSimilarity(user1Ratings, user2Ratings);
6467

6568
Assert.That(similarity, Is.EqualTo(0));
6669
}
6770

6871
[Test]
6972
public void PredictRating_WithNonexistentItem_ReturnsZero()
7073
{
71-
var predictedRating = recommender.PredictRating("nonexistentItem", "user1", testRatings);
74+
var predictedRating = recommender?.PredictRating("nonexistentItem", "user1", testRatings);
7275

7376
Assert.That(predictedRating, Is.EqualTo(0));
7477
}
78+
79+
[Test]
80+
public void PredictRating_WithOtherUserHavingRatedTargetItem_ShouldCalculateSimilarityAndWeightedSum()
81+
{
82+
var targetItem = "item1";
83+
var targetUser = "user1";
84+
85+
mockSimilarityCalculator?
86+
.Setup(s => s.CalculateSimilarity(It.IsAny<Dictionary<string, double>>(), It.IsAny<Dictionary<string, double>>()))
87+
.Returns(0.8);
88+
89+
var predictedRating = recommender?.PredictRating(targetItem, targetUser, testRatings);
90+
91+
Assert.That(predictedRating, Is.Not.EqualTo(0.0d));
92+
Assert.That(predictedRating, Is.EqualTo(3.5d).Within(0.01));
93+
}
7594
}
7695
}

Algorithms/RecommenderSystem/CollaborativeFiltering.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,13 @@ namespace Algorithms.RecommenderSystem
66
{
77
public class CollaborativeFiltering
88
{
9+
private readonly ISimilarityCalculator similarityCalculator;
10+
11+
public CollaborativeFiltering(ISimilarityCalculator similarityCalculator)
12+
{
13+
this.similarityCalculator = similarityCalculator;
14+
}
15+
916
/// <summary>
1017
/// Method to calculate similarity between two users using Pearson correlation.
1118
/// </summary>
@@ -70,7 +77,7 @@ public double PredictRating(string targetItem, string targetUser, Dictionary<str
7077
var otherUserRatings = ratings[otherUser];
7178
if (otherUserRatings.ContainsKey(targetItem))
7279
{
73-
var similarity = CalculateSimilarity(targetUserRatings, otherUserRatings);
80+
var similarity = similarityCalculator.CalculateSimilarity(targetUserRatings, otherUserRatings);
7481
totalSimilarity += Math.Abs(similarity);
7582
weightedSum += similarity * otherUserRatings[targetItem];
7683
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Text;
5+
using System.Threading.Tasks;
6+
7+
namespace Algorithms.RecommenderSystem
8+
{
9+
public interface ISimilarityCalculator
10+
{
11+
double CalculateSimilarity(Dictionary<string, double> user1Ratings, Dictionary<string, double> user2Ratings);
12+
}
13+
}

0 commit comments

Comments
 (0)