8000 Modernize pipe message models' nullability declarations. by plioi · Pull Request #321 · fixie/fixie · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

Modernize pipe message models' nullability declarations. #321

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 7 commits into from
Dec 16, 2023
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
26 changes: 0 additions & 26 deletions src/Fixie.Tests/Internal/JsonSerializationTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,6 @@ public void ShouldSerializeDiscoverTestsMessage()

public void ShouldSerializeExecuteTestsMessage()
{
// Unintended case allowed by the type system.
Expect(new PipeMessage.ExecuteTests(),
"{\"Filter\":null}");

Expect(new PipeMessage.ExecuteTests { Filter = [] },
"{\"Filter\":[]}");

Expand All @@ -30,28 +26,18 @@ public void ShouldSerializeExecuteTestsMessage()

public void ShouldSerializeTestDiscoveredMessage()
{
// Unintended case allowed by the type system.
Expect(new PipeMessage.TestDiscovered(), "{\"Test\":null}");

Expect(new PipeMessage.TestDiscovered { Test = TestClass + ".Pass" },
"{\"Test\":\"Fixie.Tests.Reports.MessagingTests\\u002BSampleTestClass.Pass\"}");
}

public void ShouldSerializeTestStartedMessage()
{
// Unintended case allowed by the type system.
Expect(new PipeMessage.TestStarted(), "{\"Test\":null}");

Expect(new PipeMessage.TestStarted { Test = TestClass + ".Pass" },
"{\"Test\":\"Fixie.Tests.Reports.MessagingTests\\u002BSampleTestClass.Pass\"}");
}

public void ShouldSerializeTestSkippedMessage()
{
// Unintended case allowed by the type system.
Expect(new PipeMessage.TestSkipped(),
"{\"Reason\":null,\"Test\":null,\"TestCase\":null,\"DurationInMilliseconds\":0,\"Output\":null}");

Expect(new PipeMessage.TestSkipped
{
Reason = "⚠ Skipped!",
Expand All @@ -65,10 +51,6 @@ public void ShouldSerializeTestSkippedMessage()

public void ShouldSerializeTestPassedMessage()
{
// Unintended case allowed by the type system.
Expect(new PipeMessage.TestPassed(),
"{\"Test\":null,\"TestCase\":null,\"DurationInMilliseconds\":0,\"Output\":null}");

Expect(new PipeMessage.TestPassed
{
Test = GenericTestClass + ".ShouldBeString",
Expand All @@ -81,10 +63,6 @@ public void ShouldSerializeTestPassedMessage()

public void ShouldSerializeTestFailedMessage()
{
// Unintended case allowed by the type system.
Expect(new PipeMessage.TestFailed(),
"{\"Reason\":null,\"Test\":null,\"TestCase\":null,\"DurationInMilliseconds\":0,\"Output\":null}");

var at = At<SampleGenericTestClass>("ShouldBeString[T](T genericArgument)").Replace("\\", "\\\\");

Expect(new PipeMessage.TestFailed
Expand All @@ -105,10 +83,6 @@ public void ShouldSerializeTestFailedMessage()

public void ShouldSerializeExceptionMessage()
{
// Unintended case allowed by the type system.
Expect(new PipeMessage.Exception(),
"{\"Type\":null,\"Message\":null,\"StackTrace\":null}");

var at = At<SampleGenericTestClass>("ShouldBeString[T](T genericArgument)").Replace("\\", "\\\\");

Expect(new PipeMessage.Exception
Expand Down
34 changes: 15 additions & 19 deletions src/Fixie/Internal/PipeMessage.cs
Original file line number Diff line number Diff line change
@@ -1,43 +1,38 @@
using Fixie.Reports;
using System.Diagnostics.CodeAnalysis;
using Fixie.Reports;

namespace Fixie.Internal;

/*
* Nullability hints here are informed by usages. Although these types are serialized and deserialized
* to and from JSON, and in theory could be null upon deserialization, we can trace all real
* deserialization from corresponding serialization where no nulls are in play.
*/

static class PipeMessage
{
public class DiscoverTests { }

public class ExecuteTests
{
public string[] Filter { get; set; } = default!;
public required string[] Filter { get; init; }
}

public class TestDiscovered
{
public string Test { get; set; } = default!;
public required string Test { get; init; }
}

public class TestStarted
{
public string Test { get; set; } = default!;
public required string Test { get; init; }
}

public abstract class TestCompleted
{
public string Test { get; set; } = default!;
public string TestCase { get; set; } = default!;
public double DurationInMilliseconds { get; set; }
public string Output { get; set; } = default!;
public required string Test { get; init; }
public required string TestCase { get; init; }
public required double DurationInMilliseconds { get; init; }
public required string Output { get; init; }
}

public class TestSkipped : TestCompleted
{
public string Reason { get; set; } = default!;
public required string Reason { get; init; }
}

public class TestPassed : TestCompleted
Expand All @@ -46,7 +41,7 @@ public class TestPassed : TestCompleted

public class TestFailed : TestCompleted
{
public Exception Reason { get; set; } = default!;
public required Exception Reason { get; init; }
}

public class Exception
Expand All @@ -55,16 +50,17 @@ public Exception()
{
}

[SetsRequiredMembers]
public Exception(System.Exception exception)
{
Type = exception.GetType().FullName!;
Message = exception.Message;
StackTrace = exception.StackTraceSummary();
}

public string Type { get; set; } = default!;
public string Message { get; set; } = default!;
public string StackTrace { get; set; } = default!;
public required string Type { get; init; }
public required string Message { get; init; }
public required string StackTrace { get; init; }
}

public class EndOfPipe { }
Expand Down
51 changes: 20 additions & 31 deletions src/Fixie/Reports/TestAdapterReport.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,16 @@

namespace Fixie.Reports;

class TestAdapterReport :
class TestAdapterReport(TestAdapterPipe pipe) :
IHandler<TestDiscovered>,
IHandler<TestStarted>,
IHandler<TestSkipped>,
IHandler<TestPassed>,
IHandler<TestFailed>
{
readonly TestAdapterPipe pipe;

public TestAdapterReport(TestAdapterPipe pipe)
{
this.pipe = pipe;
}

public Task Handle(TestDiscovered message)
{
Write(new PipeMessage.TestDiscovered
pipe.Send(new PipeMessage.TestDiscovered
{
Test = message.Test
});
Expand All @@ -28,7 +21,7 @@ public Task Handle(TestDiscovered message)

public Task Handle(TestStarted message)
{
Write(new PipeMessage.TestStarted
pipe.Send(new PipeMessage.TestStarted
{
Test = message.Test
});
Expand All @@ -38,46 +31,42 @@ public Task Handle(TestStarted message)

public Task Handle(TestSkipped message)
{
Write<PipeMessage.TestSkipped>(message, x =>
pipe.Send(new PipeMessage.TestSkipped
{
x.Reason = message.Reason;
Test = message.Test,
TestCase = message.TestCase,
DurationInMilliseconds = message.Duration.TotalMilliseconds,
Output = message.Output,
Reason = message.Reason
});

return Task.CompletedTask;
}

public Task Handle(TestPassed message)
{
Write<PipeMessage.TestPassed>(message);

return Task.CompletedTask;
}

public Task Handle(TestFailed message)
{
Write<PipeMessage.TestFailed>(message, x =>
pipe.Send(new PipeMessage.TestPassed
{
x.Reason = new PipeMessage.Exception(message.Reason);
Test = message.Test,
TestCase = message.TestCase,
DurationInMilliseconds = message.Duration.TotalMilliseconds,
Output = message.Output
});

return Task.CompletedTask;
}

void Write<TTestResult>(TestCompleted message, Action<TTestResult>? customize = null)
where TTestResult : PipeMessage.TestCompleted, new()
public Task Handle(TestFailed message)
{
var result = new TTestResult
pipe.Send(new PipeMessage.TestFailed
{
Test = message.Test,
TestCase = message.TestCase,
DurationInMilliseconds = message.Duration.TotalMilliseconds,
Output = message.Output
};

customize?.Invoke(result);
Output = message.Output,
Reason = new PipeMessage.Exception(message.Reason)
});

Write(result);
return Task.CompletedTask;
}

void Write<T>(T message) => pipe.Send(message);
}
0