Skip to content

Commit ac58ef1

Browse files
authored
Merge pull request #1163 from bUnit-dev/release/v1.22
Release of new minor version v1.22
2 parents cb0a4cb + 0c1147b commit ac58ef1

File tree

45 files changed

+839
-559
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+839
-559
lines changed

.github/workflows/docs-deploy.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ jobs:
4343
git config --global commit.gpgsign true
4444
4545
- name: ⚙️ Setup GIT versioning
46-
uses: dotnet/[email protected].0
46+
uses: dotnet/[email protected].1
4747
with:
4848
setAllVars: true
4949

.github/workflows/prepare-release.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ jobs:
4848
git config --global commit.gpgsign true
4949
5050
- name: ⚙️ Setup GIT versioning
51-
uses: dotnet/[email protected].0
51+
uses: dotnet/[email protected].1
5252
with:
5353
setAllVars: true
5454

.github/workflows/release-preview.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ jobs:
2626
fetch-depth: 0
2727

2828
- name: ⚙️ Setup GIT versioning
29-
uses: dotnet/[email protected].0
29+
uses: dotnet/[email protected].1
3030

3131
- name: ⚙️ Setup dotnet versions
3232
uses: actions/setup-dotnet@v3

.github/workflows/release.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ jobs:
5555
git config --global commit.gpgsign true
5656
5757
- name: ⚙️ Setup GIT versioning
58-
uses: dotnet/[email protected].0
58+
uses: dotnet/[email protected].1
5959
with:
6060
setAllVars: true
6161

.github/workflows/verification.yml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ jobs:
5656
echo "TERM=xterm" >> $GITHUB_ENV
5757
5858
- name: ⚙️ Setup GIT versioning
59-
uses: dotnet/[email protected].0
59+
uses: dotnet/[email protected].1
6060
with:
6161
setAllVars: true
6262

@@ -72,6 +72,9 @@ jobs:
7272
run: |
7373
dotnet test --filter Category!=async -c release
7474
75+
- name: 🧪 Run sample unit tests
76+
run: dotnet test -c release docs/samples/samples.sln
77+
7578
- name: 📛 Upload hang- and crash-dumps on test failure
7679
if: failure()
7780
uses: actions/upload-artifact@v3

CHANGELOG.md

Lines changed: 207 additions & 195 deletions
Large diffs are not rendered by default.

Directory.Build.props

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@
5050
<!-- Shared code analyzers used for all projects in the solution -->
5151
<ItemGroup Label="Code Analyzers">
5252
<PackageReference Include="AsyncFixer" Version="1.6.0" PrivateAssets="All" />
53-
<PackageReference Include="SonarAnalyzer.CSharp" Version="9.4.0.72892" PrivateAssets="All" />
53+
<PackageReference Include="SonarAnalyzer.CSharp" Version="9.6.0.74858" PrivateAssets="All" />
5454
</ItemGroup>
5555

5656
<ItemGroup Label="Implicit usings"

src/bunit.core/Extensions/WaitForHelpers/WaitForHelperLoggerExtensions.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,22 @@ namespace Bunit.Extensions.WaitForHelpers;
55
internal static class WaitForHelperLoggerExtensions
66
{
77
private static readonly Action<ILogger, int, Exception?> CheckingWaitCondition
8-
= LoggerMessage.Define<int>(LogLevel.Debug, new EventId(1, "OnAfterRender"), "Checking the wait condition for component {Id}.");
8+
= LoggerMessage.Define<int>(LogLevel.Debug, new EventId(1, "CheckingWaitCondition"), "Checking the wait condition for component {Id}.");
99

1010
private static readonly Action<ILogger, int, Exception?> CheckCompleted
11-
= LoggerMessage.Define<int>(LogLevel.Debug, new EventId(2, "OnAfterRender"), "The check completed successfully for component {Id}.");
11+
= LoggerMessage.Define<int>(LogLevel.Debug, new EventId(2, "CheckCompleted"), "The check completed successfully for component {Id}.");
1212

1313
private static readonly Action<ILogger, int, Exception?> CheckFailed
14-
= LoggerMessage.Define<int>(LogLevel.Debug, new EventId(3, "OnAfterRender"), "The check failed for component {Id}.");
14+
= LoggerMessage.Define<int>(LogLevel.Debug, new EventId(3, "CheckFailed"), "The check failed for component {Id}.");
1515

1616
private static readonly Action<ILogger, int, Exception> CheckThrow
17-
= LoggerMessage.Define<int>(LogLevel.Debug, new EventId(4, "OnAfterRender"), "The checker for component {Id} throw an exception.");
17+
= LoggerMessage.Define<int>(LogLevel.Debug, new EventId(4, "CheckThrow"), "The checker for component {Id} throw an exception.");
1818

1919
private static readonly Action<ILogger, int, Exception?> WaiterTimedOut
20-
= LoggerMessage.Define<int>(LogLevel.Debug, new EventId(10, "OnTimeout"), "The waiter for component {Id} timed out.");
20+
= LoggerMessage.Define<int>(LogLevel.Debug, new EventId(10, "WaiterTimedOut"), "The waiter for component {Id} timed out.");
2121

2222
private static readonly Action<ILogger, int, Exception?> WaiterDisposed
23-
= LoggerMessage.Define<int>(LogLevel.Debug, new EventId(20, "OnTimeout"), "The waiter for component {Id} disposed.");
23+
= LoggerMessage.Define<int>(LogLevel.Debug, new EventId(20, "WaiterDisposed"), "The waiter for component {Id} disposed.");
2424

2525
internal static void LogCheckingWaitCondition<T>(this ILogger<WaitForHelper<T>> logger, int componentId)
2626
{

src/bunit.core/Rendering/RenderEvent.cs

Lines changed: 41 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -5,24 +5,15 @@ namespace Bunit.Rendering;
55
/// </summary>
66
public sealed class RenderEvent
77
{
8-
private readonly RenderBatch renderBatch;
8+
private readonly Dictionary<int, Status> statuses = new();
9+
10+
internal IReadOnlyDictionary<int, Status> Statuses => statuses;
911

1012
/// <summary>
1113
/// Gets a collection of <see cref="ArrayRange{RenderTreeFrame}"/>, accessible via the ID
1214
/// of the component they are created by.
1315
/// </summary>
14-
public RenderTreeFrameDictionary Frames { get; }
15-
16-
/// <summary>
17-
/// Initializes a new instance of the <see cref="RenderEvent"/> class.
18-
/// </summary>
19-
/// <param name="renderBatch">The <see cref="RenderBatch"/> update from the render event.</param>
20-
/// <param name="frames">The <see cref="RenderTreeFrameDictionary"/> from the current render.</param>
21-
internal RenderEvent(RenderBatch renderBatch, RenderTreeFrameDictionary frames)
22-
{
23-
this.renderBatch = renderBatch;
24-
Frames = frames;
25-
}
16+
public RenderTreeFrameDictionary Frames { get; } = new();
2617

2718
/// <summary>
2819
/// Gets the render status for a <paramref name="renderedComponent"/>.
@@ -34,86 +25,57 @@ internal RenderEvent(RenderBatch renderBatch, RenderTreeFrameDictionary frames)
3425
if (renderedComponent is null)
3526
throw new ArgumentNullException(nameof(renderedComponent));
3627

37-
var result = (Rendered: false, Changed: false, Disposed: false);
28+
return statuses.TryGetValue(renderedComponent.ComponentId, out var status)
29+
? (status.Rendered, status.Changed, status.Disposed)
30+
: (Rendered: false, Changed: false, Disposed: false);
31+
}
3832

39-
if (DidComponentDispose(renderedComponent))
40-
{
41-
result.Disposed = true;
42-
}
43-
else
33+
internal Status GetOrCreateStatus(int componentId)
34+
{
35+
if (!statuses.TryGetValue(componentId, out var status))
4436
{
45-
(result.Rendered, result.Changed) = GetRenderAndChangeStatus(renderedComponent);
37+
status = new();
38+
statuses[componentId] = status;
4639
}
40+
return status;
41+
}
4742

48-
return result;
43+
internal void SetDisposed(int componentId)
44+
{
45+
GetOrCreateStatus(componentId).Disposed = true;
4946
}
5047

51-
private bool DidComponentDispose(IRenderedFragmentBase renderedComponent)
48+
internal void SetUpdated(int componentId, bool hasChanges)
5249
{
53-
for (var i = 0; i < renderBatch.DisposedComponentIDs.Count; i++)
54-
{
55-
if (renderBatch.DisposedComponentIDs.Array[i].Equals(renderedComponent.ComponentId))
56-
{
57-
return true;
58-
}
59-
}
50+
var status = GetOrCreateStatus(componentId);
51+
status.Rendered = true;
52+
status.Changed = status.Changed || hasChanges;
53+
}
6054

61-
return false;
55+
internal void SetUpdatedApplied(int componentId)
56+
{
57+
GetOrCreateStatus(componentId).UpdatesApplied = true;
6258
}
6359

64-
/// <summary>
65-
/// This method determines if the <paramref name="renderedComponent"/> or any of the
66-
/// components underneath it in the render tree rendered and whether they they changed
67-
/// their render tree during render.
68-
///
69-
/// It does this by getting the status from the <paramref name="renderedComponent"/>,
70-
/// then from all its children, using a recursive pattern, where the internal methods
71-
/// GetStatus and GetStatusFromChildren call each other until there are no more children,
72-
/// or both a render and a change is found.
73-
/// </summary>
74-
private (bool Rendered, bool HasChanges) GetRenderAndChangeStatus(IRenderedFragmentBase renderedComponent)
60+
internal void AddFrames(int componentId, ArrayRange<RenderTreeFrame> frames)
7561
{
76-
var result = (Rendered: false, HasChanges: false);
62+
Frames.Add(componentId, frames);
63+
GetOrCreateStatus(componentId).FramesLoaded = true;
64+
}
7765

78-
GetStatus(renderedComponent.ComponentId);
66+
internal record class Status
67+
{
68+
public bool Rendered { get; set; }
7969

80-
return result;
70+
public bool Changed { get; set; }
8171

82-
void GetStatus(int componentId)
83-
{
84-
for (var i = 0; i < renderBatch.UpdatedComponents.Count; i++)
85-
{
86-
ref var update = ref renderBatch.UpdatedComponents.Array[i];
87-
if (update.ComponentId == componentId)
88-
{
89-
result.Rendered = true;
90-
result.HasChanges = update.Edits.Count > 0;
91-
break;
92-
}
93-
}
94-
95-
if (!result.HasChanges)
96-
{
97-
GetStatusFromChildren(componentId);
98-
}
99-
}
72+
public bool Disposed { get; set; }
10073

101-
void GetStatusFromChildren(int componentId)
102-
{
103-
var frames = Frames[componentId];
104-
for (var i = 0; i < frames.Count; i++)
105-
{
106-
ref var frame = ref frames.Array[i];
107-
if (frame.FrameType == RenderTreeFrameType.Component)
108-
{
109-
GetStatus(frame.ComponentId);
110-
111-
if (result.HasChanges)
112-
{
113-
break;
114-
}
115-
}
116-
}
117-
}
74+
public bool UpdatesApplied { get; set; }
75+
76+
public bool FramesLoaded { get; set; }
77+
78+
public bool UpdateNeeded => Rendered || Changed;
11879
}
11980
}
81+

0 commit comments

Comments
 (0)