diff --git a/11/CosmicExpansion.Tests/CosmicExpansion.Tests.csproj b/11/CosmicExpansion.Tests/CosmicExpansion.Tests.csproj
new file mode 100644
index 0000000..08f293c
--- /dev/null
+++ b/11/CosmicExpansion.Tests/CosmicExpansion.Tests.csproj
@@ -0,0 +1,36 @@
+
+
+
+ net8.0
+ enable
+ enable
+
+ false
+ true
+
+
+
+
+
+
+
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+ all
+
+
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+ all
+
+
+
+
+
+
+
+
+
+ PreserveNewest
+
+
+
+
diff --git a/11/CosmicExpansion.Tests/GlobalUsings.cs b/11/CosmicExpansion.Tests/GlobalUsings.cs
new file mode 100644
index 0000000..7fef4b0
--- /dev/null
+++ b/11/CosmicExpansion.Tests/GlobalUsings.cs
@@ -0,0 +1,2 @@
+global using Xunit;
+global using FluentAssertions;
\ No newline at end of file
diff --git a/11/CosmicExpansion.Tests/UniverseTests.cs b/11/CosmicExpansion.Tests/UniverseTests.cs
new file mode 100644
index 0000000..e99b316
--- /dev/null
+++ b/11/CosmicExpansion.Tests/UniverseTests.cs
@@ -0,0 +1,143 @@
+namespace CosmicExpansion.Tests;
+
+public class UniverseTests
+{
+ [Theory]
+ [MemberData(nameof(TestData.ParseTestData), MemberType = typeof(TestData))]
+ public void Parse_WhenGivenUniverseWithGalaxies_ItShouldReturnListOfGalaxies(string[] givenInput, Universe expectedUniverse)
+ {
+ var result = Universe.Parse(givenInput);
+ result.Should().BeEquivalentTo(expectedUniverse);
+ }
+
+ [Theory]
+ [MemberData(nameof(TestData.GetShortestPathsBetweenGalaxiesTestData), MemberType = typeof(TestData))]
+ public void GetShortestPathsBetweenGalaxies_WhenGivenUniverseWithGalaxies_ItShouldReturnShortestPathsBetweenGalaxies(Universe givenUniverse, int expectedNumberOrPaths)
+ {
+ var result = givenUniverse.GetShortestPathsBetweenGalaxies();
+ result.Count.Should().Be(expectedNumberOrPaths);
+ }
+
+ [Theory]
+ [MemberData(nameof(TestData.SumOfShortestPathsBetweenGalaxiesTestData), MemberType = typeof(TestData))]
+ public void SumOfShortestPathsBetweenGalaxies_WhenGivenUniverseWithGalaxies_ItShouldReturnSumOfShortestPathsBetweenGalaxies(Universe givenUniverse, int expectedSumOfShortestPaths)
+ {
+ givenUniverse.SumOfShortestPathsBetweenGalaxies.Should().Be(expectedSumOfShortestPaths);
+ }
+
+ [Theory]
+ [MemberData(nameof(TestData.CalculateDistanceBetweenGalaxiesTestData), MemberType = typeof(TestData))]
+ public void CalculateDistanceBetweenGalaxies_WhenGivenTwoGalaxies_ItShouldReturnDistanceBetweenGalaxies(Galaxy startGalaxy, Galaxy endGalaxy, int expectedDistance)
+ {
+ var result = Universe.CalculateDistanceBetweenGalaxies(startGalaxy, endGalaxy);
+ result.Should().Be(expectedDistance);
+ }
+
+ [Fact]
+ public void SumOfShortestPathsBetweenGalaxies_WhenGivenInput_ItShouldReturnSumOfShortestPathsBetweenGalaxies()
+ {
+ var input = File.ReadAllLines("INPUT.txt");
+ var universe = Universe.Parse(input);
+ universe.SumOfShortestPathsBetweenGalaxies.Should().Be(10292708);
+ }
+
+ [Fact]
+ public void SumOfShortestPathsBetweenGalaxies_WhenGivenInputAndIsPart2_ItShouldReturnSumOfShortestPathsBetweenGalaxies()
+ {
+ var input = File.ReadAllLines("INPUT.txt");
+ var universe = Universe.Parse(input, 1_000_000);
+ universe.SumOfShortestPathsBetweenGalaxies.Should().Be(790194712336);
+ }
+
+
+
+ public static class TestData
+ {
+ private static readonly Universe TestUniverse = new(
+ 12,
+ 13,
+ [
+ new(0, 4),
+ new(1, 9),
+ new(2, 0),
+ new(5, 8),
+ new(6, 1),
+ new(7, 12),
+ new(10, 9),
+ new(11, 0),
+ new(11, 5),
+ ]
+ );
+
+ public static IEnumerable