Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ dotnet test EulerLibTests/EulerLibTests.csproj
## Structure
- **Euler/** - Console runner app (net8.0)
- **EulerLib/** - Problem solutions library. Each problem implements `IProblem` (`Id`, `Title`, `Solve()`, `Md5OfSolution`)
- **EulerLibTests/** - Test project (NUnit + FluentAssertions + AutoFixture)
- **EulerLibTests/** - Test project (xUnit + FluentAssertions + AutoFixture)

## Conventions
- Problems go in `EulerLib/Problems/0001_0100/Problem0001.cs` (namespace `EulerLib.Problems`)
Expand Down
9 changes: 6 additions & 3 deletions EulerLibTests/EulerLibTests.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,12 @@
<PackageReference Include="AutoFixture" Version="4.18.1" />
<PackageReference Include="FluentAssertions" Version="8.8.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.3.0" />
<PackageReference Include="NUnit" Version="4.5.0" />
<PackageReference Include="NUnit3TestAdapter" Version="6.1.0" />
<PackageReference Include="NUnit.Analyzers" Version="4.11.2">
<PackageReference Include="xunit" Version="2.9.3" />
<PackageReference Include="xunit.runner.visualstudio" Version="3.1.5">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="xunit.analyzers" Version="1.18.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
Expand Down
6 changes: 3 additions & 3 deletions EulerLibTests/Extensions/BigIntegerExtensionsFixture.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,11 @@

namespace EulerLibTests.Extensions;

[TestFixture]
public class BigIntegerExtensionsFixture
{
[TestCase("12345", 15)]
[TestCase("1234567890", 45)]
[Theory]
[InlineData("12345", 15)]
[InlineData("1234567890", 45)]
public void SumOfDigits_Tests(string value, int expectedSumOfDigits)
{
var bigint = BigInteger.Parse(value);
Expand Down
38 changes: 20 additions & 18 deletions EulerLibTests/Extensions/DivisorsExtensionFixture.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,15 @@

namespace EulerLibTests.Extensions;

[TestFixture]
public class DivisorsExtensionFixture
{
[TestCase(1, 1, 1)]
[TestCase(2, 3, 2)]
[TestCase(4, 7, 3)]
[TestCase(16, 31, 5)]
[TestCase(220, 504, 12)]
[TestCase(284, 504, 6)]
[Theory]
[InlineData(1, 1, 1)]
[InlineData(2, 3, 2)]
[InlineData(4, 7, 3)]
[InlineData(16, 31, 5)]
[InlineData(220, 504, 12)]
[InlineData(284, 504, 6)]
public void DivisorsTests(int n, int divisorsSum, int divisorsCount)
{
// Arrange
Expand All @@ -19,16 +19,17 @@ public void DivisorsTests(int n, int divisorsSum, int divisorsCount)
var divisors = n.Divisors();

// Assert
Assert.That(divisors.Count(), Is.EqualTo(divisorsCount));
Assert.That(divisors.Sum(), Is.EqualTo(divisorsSum));
divisors.Count().Should().Be(divisorsCount);
divisors.Sum().Should().Be(divisorsSum);
}

[TestCase(1, 0, 0)]
[TestCase(2, 1, 1)]
[TestCase(4, 3, 2)]
[TestCase(16, 15, 4)]
[TestCase(220, 284, 11)]
[TestCase(284, 220, 5)]
[Theory]
[InlineData(1, 0, 0)]
[InlineData(2, 1, 1)]
[InlineData(4, 3, 2)]
[InlineData(16, 15, 4)]
[InlineData(220, 284, 11)]
[InlineData(284, 220, 5)]
public void ProperDivisorsTests(int n, int divisorsSum, int divisorsCount)
{
// Arrange
Expand All @@ -37,11 +38,12 @@ public void ProperDivisorsTests(int n, int divisorsSum, int divisorsCount)
var divisors = n.ProperDivisors();

// Assert
Assert.That(divisors.Count(), Is.EqualTo(divisorsCount));
Assert.That(divisors.Sum(), Is.EqualTo(divisorsSum));
divisors.Count().Should().Be(divisorsCount);
divisors.Sum().Should().Be(divisorsSum);
}

[TestCase(4, new[] { 1, 2 })]
[Theory]
[InlineData(4, new[] { 1, 2 })]
public void ProperDivisors_ValuesTest(int n, int[] expectedDivisors)
{
var divisors = n.ProperDivisors();
Expand Down
16 changes: 8 additions & 8 deletions EulerLibTests/Extensions/IntegerExtensionsFixture.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,37 +2,37 @@

namespace EulerLibTests.Extensions;

[TestFixture]
public class IntegerExtensionsFixture
{
[TestCase(2, "2")]
[TestCase(3, "6")]
[TestCase(4, "24")]
[TestCase(5, "120")]
[Theory]
[InlineData(2, "2")]
[InlineData(3, "6")]
[InlineData(4, "24")]
[InlineData(5, "120")]
public void FactorialTests(int n, string expectedFactorial)
{
var result = n.Factorial();

result.ToString().Should().Be(expectedFactorial);
}

[Test]
[Fact]
public void DigitRotationsTest2845()
{
var result = 2845.DigitRotations().ToList();

result.Should().BeEquivalentTo([2845, 8452, 4528, 5284]);
}

[Test]
[Fact]
public void DigitRotationsTest197()
{
var result = 197.DigitRotations().ToList();

result.Should().BeEquivalentTo([197, 971, 719]);
}

[Test]
[Fact]
public void DigitRotationsTest111()
{
var result = 111.DigitRotations().ToList();
Expand Down
9 changes: 5 additions & 4 deletions EulerLibTests/Extensions/Md5ExtensionsFixture.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,20 @@

namespace EulerLibTests.Extensions;

[TestFixture]
public class Md5ExtensionsFixture
{
[TestCase("Hello World!", "ed076287532e86365e841e92bfc50d8c")]
[Theory]
[InlineData("Hello World!", "ed076287532e86365e841e92bfc50d8c")]
public void ToMd5Hash(string input, string expectedHash)
{
var hash = input.ToMd5Hash();

hash.Should().Be(expectedHash);
}

[TestCase("Hello World!", "ed076287532e86365e841e92bfc50d8c", true)]
[TestCase("Hello World!", "ed076287532e86355e841e92bfc50d8c", false)]
[Theory]
[InlineData("Hello World!", "ed076287532e86365e841e92bfc50d8c", true)]
[InlineData("Hello World!", "ed076287532e86355e841e92bfc50d8c", false)]
public void VerifyMd5Hash(string input, string hash, bool expectedResult)
{
var result = input.VerifyMd5Hash(hash);
Expand Down
9 changes: 4 additions & 5 deletions EulerLibTests/Extensions/PrimeFactorsExtensionFixture.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,37 +2,36 @@

namespace EulerLibTests.Extensions;

[TestFixture]
public class PrimeFactorsExtensionFixture
{
[Test]
[Fact]
public void PrimeFactorsOf1()
{
var sequence = 1.PrimeFactors().ToList();

sequence.Should().BeEmpty();
}

[Test]
[Fact]
public void PrimeFactorsOf12()
{
var sequence = 12.PrimeFactors().ToList();

sequence.Should().BeEquivalentTo(new[] {2, 2, 3});
}

[Test]
[Fact]
public void PrimeFactorsOf13195()
{
var sequence = 13195.PrimeFactors().ToList();

sequence.Should().BeEquivalentTo(new[] {5, 7, 13, 29});
}

[Test]
[Fact]
public void PrimeFactorsOfFirst3500Numbers()
{
IEnumerable<long> result = null;

Check warning on line 34 in EulerLibTests/Extensions/PrimeFactorsExtensionFixture.cs

View workflow job for this annotation

GitHub Actions / build

Converting null literal or possible null value to non-nullable type.

Check warning on line 34 in EulerLibTests/Extensions/PrimeFactorsExtensionFixture.cs

View workflow job for this annotation

GitHub Actions / build

Converting null literal or possible null value to non-nullable type.

for (int i = 1; i <= 3500; i++)
{
Expand Down
42 changes: 23 additions & 19 deletions EulerLibTests/Extensions/RomanNumeralsExtensionsFixture.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,55 +2,59 @@

namespace EulerLibTests.Extensions;

[TestFixture]
public class RomanNumeralsExtensionsFixture
{
[TestCase("XXFX", "F")]
[TestCase("C%C", "%")]
[Theory]
[InlineData("XXFX", "F")]
[InlineData("C%C", "%")]
public void ParseRomanNumeral_InvalidRomanCharacter_Throws(string input, string expectedInvalidCharacter)
{
var ex = Assert.Throws<ArgumentException>(() => input.ParseRomanNumeral());

ex.Message.Should().Contain("Invalid Roman numeral character: " + expectedInvalidCharacter);
}

[TestCase("I", 1)]
[TestCase("II", 2)]
[TestCase("III", 3)]
[TestCase("IV", 4)]
[TestCase("LVII", 57)]
[TestCase("MMMMCCLXXXVI", 4286)]
[Theory]
[InlineData("I", 1)]
[InlineData("II", 2)]
[InlineData("III", 3)]
[InlineData("IV", 4)]
[InlineData("LVII", 57)]
[InlineData("MMMMCCLXXXVI", 4286)]
public void ParseRomanNumeral_ValidInput_ReturnsExpectedResult(string input, int expectedResult)
{
var result = input.ParseRomanNumeral();

result.Should().Be(expectedResult);
}

[TestCase(-5)]
[TestCase(0)]
[TestCase(5000)]
[TestCase(9678)]
[Theory]
[InlineData(-5)]
[InlineData(0)]
[InlineData(5000)]
[InlineData(9678)]
public void ToRomanNumeral_OutOfRange_Throws(int value)
{
var ex = Assert.Throws<ArgumentOutOfRangeException>(() => value.ToRomanNumeral());

ex.Message.Should().Contain("Input must be between 1 and 4999.");
}

[TestCase(1, "I")]
[TestCase(2, "II")]
[TestCase(4, "IV")]
[TestCase(19, "XIX")]
[TestCase(2024, "MMXXIV")]
[Theory]
[InlineData(1, "I")]
[InlineData(2, "II")]
[InlineData(4, "IV")]
[InlineData(19, "XIX")]
[InlineData(2024, "MMXXIV")]
public void ToRomanNumeral_ValidInput_ReturnsExpectedResult(int value, string expectedResult)
{
var result = value.ToRomanNumeral();

result.Should().Be(expectedResult);
}

[TestCase("XIIII", "XIV")]
[Theory]
[InlineData("XIIII", "XIV")]
public void SimplifyRomanNumeral_ValidInput_ReturnsExpectedOutput(string value, string expectedResult)
{
var result = value.SimplifyRomanNumeral();
Expand Down
Loading