diff --git a/Exercism.TestRunner.CSharp.sln b/Exercism.TestRunner.CSharp.sln
index ebeec1d..d672577 100644
--- a/Exercism.TestRunner.CSharp.sln
+++ b/Exercism.TestRunner.CSharp.sln
@@ -1,7 +1,6 @@
Microsoft Visual Studio Solution File, Format Version 12.00
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Exercism.TestRunner.CSharp.IntegrationTests", "test\Exercism.TestRunner.CSharp.IntegrationTests\Exercism.TestRunner.CSharp.IntegrationTests.csproj", "{89F04548-B730-4F84-AC39-5B8C6A47CA35}"
-EndProject
+#
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Exercism.TestRunner.CSharp", "src\Exercism.TestRunner.CSharp\Exercism.TestRunner.CSharp.csproj", "{76037C86-908F-4C18-BDBE-1C1CAFF0CB65}"
EndProject
Global
@@ -10,10 +9,6 @@ Global
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {89F04548-B730-4F84-AC39-5B8C6A47CA35}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {89F04548-B730-4F84-AC39-5B8C6A47CA35}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {89F04548-B730-4F84-AC39-5B8C6A47CA35}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {89F04548-B730-4F84-AC39-5B8C6A47CA35}.Release|Any CPU.Build.0 = Release|Any CPU
{76037C86-908F-4C18-BDBE-1C1CAFF0CB65}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{76037C86-908F-4C18-BDBE-1C1CAFF0CB65}.Debug|Any CPU.Build.0 = Debug|Any CPU
{76037C86-908F-4C18-BDBE-1C1CAFF0CB65}.Release|Any CPU.ActiveCfg = Release|Any CPU
diff --git a/test/Exercism.TestRunner.CSharp.IntegrationTests/Exercism.TestRunner.CSharp.IntegrationTests.csproj b/test/Exercism.TestRunner.CSharp.IntegrationTests/Exercism.TestRunner.CSharp.IntegrationTests.csproj
deleted file mode 100644
index 690d636..0000000
--- a/test/Exercism.TestRunner.CSharp.IntegrationTests/Exercism.TestRunner.CSharp.IntegrationTests.csproj
+++ /dev/null
@@ -1,28 +0,0 @@
-
-
-
- net7.0
- false
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/test/Exercism.TestRunner.CSharp.IntegrationTests/NormalizationExtensions.cs b/test/Exercism.TestRunner.CSharp.IntegrationTests/NormalizationExtensions.cs
deleted file mode 100644
index 865222a..0000000
--- a/test/Exercism.TestRunner.CSharp.IntegrationTests/NormalizationExtensions.cs
+++ /dev/null
@@ -1,17 +0,0 @@
-using Newtonsoft.Json;
-using Newtonsoft.Json.Serialization;
-
-namespace Exercism.TestRunner.CSharp.IntegrationTests
-{
- internal static class NormalizationExtensions
- {
- public static string NormalizeJson(this string json) =>
- JsonConvert.SerializeObject(JsonConvert.DeserializeObject(json), Formatting.None, CreateJsonSerializerSettings()).NormalizeNewlines();
-
- private static string NormalizeNewlines(this string json) =>
- json.Replace("\r\n", "\n");
-
- private static JsonSerializerSettings CreateJsonSerializerSettings() =>
- new() { ContractResolver = new DefaultContractResolver { NamingStrategy = new SnakeCaseNamingStrategy() } };
- }
-}
\ No newline at end of file
diff --git a/test/Exercism.TestRunner.CSharp.IntegrationTests/TestRun.cs b/test/Exercism.TestRunner.CSharp.IntegrationTests/TestRun.cs
deleted file mode 100644
index 49ef019..0000000
--- a/test/Exercism.TestRunner.CSharp.IntegrationTests/TestRun.cs
+++ /dev/null
@@ -1,11 +0,0 @@
-namespace Exercism.TestRunner.CSharp.IntegrationTests
-{
- internal class TestRun
- {
- public string Expected { get; }
- public string Actual { get; }
-
- public TestRun(string expected, string actual) =>
- (Expected, Actual) = (expected, actual);
- }
-}
\ No newline at end of file
diff --git a/test/Exercism.TestRunner.CSharp.IntegrationTests/TestRunResultReader.cs b/test/Exercism.TestRunner.CSharp.IntegrationTests/TestRunResultReader.cs
deleted file mode 100644
index 1596a2a..0000000
--- a/test/Exercism.TestRunner.CSharp.IntegrationTests/TestRunResultReader.cs
+++ /dev/null
@@ -1,90 +0,0 @@
-using System;
-using System.IO;
-using System.Text.Json;
-using System.Text.Json.Serialization;
-
-namespace Exercism.TestRunner.CSharp.IntegrationTests
-{
- internal static class TestRunResultReader
- {
- public static string ReadActual(TestSolution solution) =>
- ReadTestRunResult(solution, "results.json");
-
- public static string ReadExpected(TestSolution solution) =>
- ReadTestRunResult(solution, "expected_results.json");
-
- private static string ReadTestRunResult(TestSolution solution, string fileName)
- {
- var testRunResult = DeserializeTestRunResult(solution, fileName);
- NormalizeTestRunResult(testRunResult);
-
- return JsonSerializer.Serialize(testRunResult, CreateJsonSerializerOptions());
- }
-
- private static TestRunResult DeserializeTestRunResult(TestSolution solution, string fileName) =>
- JsonSerializer.Deserialize(ReadFile(solution, fileName), CreateJsonSerializerOptions());
-
- private static string ReadFile(TestSolution solution, string fileName) =>
- File.ReadAllText(Path.Combine(solution.DirectoryFullPath, fileName));
-
- private static void NormalizeTestRunResult(TestRunResult testRunResult)
- {
- if (testRunResult.Tests == null)
- return;
-
- static int Comparison(TestResult x, TestResult y) => string.Compare(x.Name, y.Name, StringComparison.Ordinal);
- Array.Sort(testRunResult.Tests, Comparison);
- }
-
- private static JsonSerializerOptions CreateJsonSerializerOptions()
- {
- var options = new JsonSerializerOptions
- {
- DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull,
- PropertyNamingPolicy = null
- };
- options.Converters.Add(new JsonStringEnumConverter());
- return options;
- }
-
- private enum TestStatus
- {
- Pass,
- Fail,
- Error
- }
-
- private struct TestRunResult
- {
- [JsonPropertyName("version")]
- public int Version { get; set; }
-
- [JsonPropertyName("status")]
- public TestStatus Status { get; set; }
-
- [JsonPropertyName("message")]
- public string Message { get; set; }
-
- [JsonPropertyName("tests")]
- public TestResult[] Tests { get; set; }
- }
-
- private struct TestResult
- {
- [JsonPropertyName("status")]
- public TestStatus Status { get; set; }
-
- [JsonPropertyName("message")]
- public string Message { get; set; }
-
- [JsonPropertyName("name")]
- public string Name { get; set; }
-
- [JsonPropertyName("task_id")]
- public int? TaskId { get; set; }
-
- [JsonPropertyName("output")]
- public string Output { get; set; }
- }
- }
-}
\ No newline at end of file
diff --git a/test/Exercism.TestRunner.CSharp.IntegrationTests/TestRunnerTests.cs b/test/Exercism.TestRunner.CSharp.IntegrationTests/TestRunnerTests.cs
deleted file mode 100644
index e032fbd..0000000
--- a/test/Exercism.TestRunner.CSharp.IntegrationTests/TestRunnerTests.cs
+++ /dev/null
@@ -1,203 +0,0 @@
-using Xunit;
-
-namespace Exercism.TestRunner.CSharp.IntegrationTests
-{
- public class TestRunnerTests
- {
- [Fact]
- public void MultipleCompileErrors()
- {
- var testRun = TestSolutionRunner.Run("MultipleCompileErrors");
- Assert.Equal(testRun.Expected, testRun.Actual);
- }
-
- [Fact]
- public void MultipleTestClassesWithAllPasses()
- {
- var testRun = TestSolutionRunner.Run("MultipleTestClassesWithAllPasses");
- Assert.Equal(testRun.Expected, testRun.Actual);
- }
-
- [Fact]
- public void MultipleTestsWithAllPasses()
- {
- var testRun = TestSolutionRunner.Run("MultipleTestsWithAllPasses");
- Assert.Equal(testRun.Expected, testRun.Actual);
- }
-
- [Fact]
- public void MultipleTestsWithMultipleFails()
- {
- var testRun = TestSolutionRunner.Run("MultipleTestsWithMultipleFails");
- Assert.Equal(testRun.Expected, testRun.Actual);
- }
-
- [Fact]
- public void MultipleTestsWithSingleFail()
- {
- var testRun = TestSolutionRunner.Run("MultipleTestsWithSingleFail");
- Assert.Equal(testRun.Expected, testRun.Actual);
- }
-
- [Fact]
- public void MultipleTestsWithTestOutput()
- {
- var testRun = TestSolutionRunner.Run("MultipleTestsWithTestOutput");
- Assert.Equal(testRun.Expected, testRun.Actual);
- }
-
- [Fact]
- public void MultipleTestsWithTestOutputExceedingLimit()
- {
- var testRun = TestSolutionRunner.Run("MultipleTestsWithTestOutputExceedingLimit");
- Assert.Equal(testRun.Expected, testRun.Actual);
- }
-
- [Fact]
- public void NoTests()
- {
- var testRun = TestSolutionRunner.Run("NoTests");
- Assert.Equal(testRun.Expected, testRun.Actual);
- }
-
- [Fact]
- public void NotImplemented()
- {
- var testRun = TestSolutionRunner.Run("NotImplemented");
- Assert.Equal(testRun.Expected, testRun.Actual);
- }
-
- [Fact]
- public void SingleCompileError()
- {
- var testRun = TestSolutionRunner.Run("SingleCompileError");
- Assert.Equal(testRun.Expected, testRun.Actual);
- }
-
- [Fact]
- public void SingleTestThatFails()
- {
- var testRun = TestSolutionRunner.Run("SingleTestThatFails");
- Assert.Equal(testRun.Expected, testRun.Actual);
- }
-
- [Fact]
- public void SingleTestThatPasses()
- {
- var testRun = TestSolutionRunner.Run("SingleTestThatPasses");
- Assert.Equal(testRun.Expected, testRun.Actual);
- }
-
- [Fact]
- public void SingleTestThatPassesWithDifferentSlug()
- {
- var testRun = TestSolutionRunner.Run("SingleTestThatPassesWithDifferentSlug", "Foo");
- Assert.Equal(testRun.Expected, testRun.Actual);
- }
-
- [Fact]
- public void TestsInDifferentFormats()
- {
- var testRun = TestSolutionRunner.Run("TestsInDifferentFormats");
- Assert.Equal(testRun.Expected, testRun.Actual);
- }
-
- [Fact]
- public void NoTasks()
- {
- var testRun = TestSolutionRunner.Run("NoTasks");
- Assert.Equal(testRun.Expected, testRun.Actual);
- }
-
- [Fact]
- public void AllTestsWithTask()
- {
- var testRun = TestSolutionRunner.Run("AllTestsWithTask");
- Assert.Equal(testRun.Expected, testRun.Actual);
- }
-
- [Fact]
- public void SomeTestsWithTask()
- {
- var testRun = TestSolutionRunner.Run("SomeTestsWithTask");
- Assert.Equal(testRun.Expected, testRun.Actual);
- }
-
- [Fact]
- public void WithExample()
- {
- var testRun = TestSolutionRunner.Run("WithExample");
- Assert.Equal(testRun.Expected, testRun.Actual);
- }
-
- [Fact]
- public void WithConstructor()
- {
- var testRun = TestSolutionRunner.Run("WithConstructor");
- Assert.Equal(testRun.Expected, testRun.Actual);
- }
-
- [Fact]
- public void WithDisposable()
- {
- var testRun = TestSolutionRunner.Run("WithDisposable");
- Assert.Equal(testRun.Expected, testRun.Actual);
- }
-
- [Fact]
- public void UseCultureAttribute()
- {
- var testRun = TestSolutionRunner.Run("UseCultureAttribute");
- Assert.Equal(testRun.Expected, testRun.Actual);
- }
-
- [Fact]
- public void DownloadedSolution()
- {
- var testRun = TestSolutionRunner.Run("DownloadedSolution");
- Assert.Equal(testRun.Expected, testRun.Actual);
- }
-
- [Fact]
- public void CompileErrorWithoutLocation()
- {
- var testRun = TestSolutionRunner.Run("CompileErrorWithoutLocation");
- Assert.Equal(testRun.Expected, testRun.Actual);
- }
-
- [Fact]
- public void WithNonTestClasses()
- {
- var testRun = TestSolutionRunner.Run("WithNonTestClasses");
- Assert.Equal(testRun.Expected, testRun.Actual);
- }
-
- [Fact]
- public void EditorFiles()
- {
- var testRun = TestSolutionRunner.Run("EditorFiles");
- Assert.Equal(testRun.Expected, testRun.Actual);
- }
-
- [Fact]
- public void WithPrivateDisposableClasses()
- {
- var testRun = TestSolutionRunner.Run("WithPrivateDisposableClasses");
- Assert.Equal(testRun.Expected, testRun.Actual);
- }
-
- [Fact]
- public void UseTimeZones()
- {
- var testRun = TestSolutionRunner.Run("UseTimeZones");
- Assert.Equal(testRun.Expected, testRun.Actual);
- }
-
- [Fact]
- public void DifferentTypesOfTests()
- {
- var testRun = TestSolutionRunner.Run("DifferentTypesOfTests");
- Assert.Equal(testRun.Expected, testRun.Actual);
- }
- }
-}
\ No newline at end of file
diff --git a/test/Exercism.TestRunner.CSharp.IntegrationTests/TestSolution.cs b/test/Exercism.TestRunner.CSharp.IntegrationTests/TestSolution.cs
deleted file mode 100644
index d7b0b8b..0000000
--- a/test/Exercism.TestRunner.CSharp.IntegrationTests/TestSolution.cs
+++ /dev/null
@@ -1,17 +0,0 @@
-using System.IO;
-
-namespace Exercism.TestRunner.CSharp.IntegrationTests
-{
- public class TestSolution
- {
- public string Slug { get; }
- public string Directory { get; }
- public string DirectoryFullPath => Path.GetFullPath(Path.Combine(Path.GetDirectoryName(typeof(TestSolution).Assembly.Location)!, "tests", Directory));
-
- public TestSolution(string slug, string directory)
- {
- Slug = slug;
- Directory = directory;
- }
- }
-}
\ No newline at end of file
diff --git a/test/Exercism.TestRunner.CSharp.IntegrationTests/TestSolutionRunner.cs b/test/Exercism.TestRunner.CSharp.IntegrationTests/TestSolutionRunner.cs
deleted file mode 100644
index 813914d..0000000
--- a/test/Exercism.TestRunner.CSharp.IntegrationTests/TestSolutionRunner.cs
+++ /dev/null
@@ -1,26 +0,0 @@
-using System.Diagnostics;
-
-namespace Exercism.TestRunner.CSharp.IntegrationTests
-{
- internal static class TestSolutionRunner
- {
- public static TestRun Run(string directory, string slug = "Fake")
- {
- var testSolution = new TestSolution(slug, directory);
-
- RunTestRunner(testSolution);
- return CreateTestRun(testSolution);
- }
-
- private static void RunTestRunner(TestSolution testSolution) =>
- Program.Main(new[] { testSolution.Slug, testSolution.DirectoryFullPath, testSolution.DirectoryFullPath });
-
- private static TestRun CreateTestRun(TestSolution solution)
- {
- var actualTestRunResult = TestRunResultReader.ReadActual(solution);
- var expectedTestRunResult = TestRunResultReader.ReadExpected(solution);
-
- return new TestRun(expectedTestRunResult, actualTestRunResult);
- }
- }
-}
\ No newline at end of file