Skip to content

Commit c460f09

Browse files
test(aot): selftest runner crash/hang harness for NativeAOT baseline
Adds infrastructure to run the selftest fixture suite under NativeAOT without a single crashing fixture killing the entire run, capturing a shippable AOT baseline (573/735 fixtures run cleanly). Runner (`SelfTestRunner.cs`): - 15s per-fixture managed-hang watchdog (`Task.WhenAny` against `Task.Delay`), reports TIMEOUT and continues with next fixture - `DefaultAotSkipPatterns` baked into the runner — fixtures known to silently terminate the process under AOT with `STATUS_FATAL_USER_CALLBACK_EXCEPTION` (0xC000027B). The watchdog cannot catch these because the process dies in native code before any managed continuation runs. - `REACTOR_AOT_SKIP` env var appends to the default skip list, with exact-match or `Prefix*` wildcard patterns — lets you iterate on new skips without rebuilding the native binary - Skip path emits a TAP `# SKIP` directive and yields at `DispatcherQueuePriority.Low` between each iteration so WinUI's render pass actually runs; without this, a run of consecutive skips drains the dispatcher queue faster than rendering catches up and the title bar appears frozen at the prior fixture's index - Pre-fixture low-priority yield so the title bar repaints *before* the next fixture executes — otherwise a fixture that crashes the process leaves the title showing the previous fixture's name and the failure looks attributed to the wrong fixture - AOT detection via `RuntimeFeature.IsDynamicCodeSupported`; skip list is a no-op under the JIT Harness (`Harness.cs`): - New `MarkFixtureSkipped(int)` paints the segment-bar cell amber so skips are visually distinguishable from green (pass) and red (fail) Host csproj: - `PublishAotInternal=true` opt-in property gates the `PublishAot` property to just this host project — `PublishAot=true` at the command line would otherwise propagate to the analyzer/generator projects which target `netstandard2.0` and fail restore AOT baseline (this commit's run): - 735 total fixtures; 573 ran; 162 skipped; 87 failed checks across 27 fixtures; clean exit 1 (no native crash) - Failures cluster as: Loc_* (22, satellite/MessageFormat reflection), PropertyGrid family (~28, reflection-based property discovery losing members under trim — same shape as the DataGrid<T> fix), Devtools_* (8), NavUpdate_* (3), misc (6) - JIT reference: 735 ran, 2614 ok, 0 failures — confirms the underlying code is healthy and every regression is AOT-specific This is a baseline harness, not the AOT fixes themselves. Subsequent work can narrow wildcard skips (`EchoSuppress_*`, `Commanding_*`, `SelectionEvt_*`, etc. were skipped speculatively as cluster mitigation; many likely pass individually) and tackle the failing fixtures + native crash root causes. Also includes a benign alphabetization of `skills/reactor.api.txt` and its plugins/ mirror, left in the working tree from prior work on this branch. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent 6e575e2 commit c460f09

5 files changed

Lines changed: 172 additions & 23 deletions

File tree

plugins/reactor/skills/reactor-dsl/references/reactor.api.txt

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -79,11 +79,11 @@ Heading(string content) → TextBlockElement
7979
Hyperlink(string text, Uri navigateUri) → RichTextHyperlink
8080
HyperlinkButton(Command command) → HyperlinkButtonElement
8181
HyperlinkButton(string content, Uri navigateUri = null, Action onClick = null) → HyperlinkButtonElement
82-
If(bool condition, Func<Element> then, Func<Element> otherwise = null) → Element
83-
Image(string source) → ImageElement
8482
Icon(IconData data) → IconElement
8583
Icon(Symbol symbol) → IconElement
8684
Icon(string symbol) → IconElement
85+
If(bool condition, Func<Element> then, Func<Element> otherwise = null) → Element
86+
Image(string source) → ImageElement
8787
ImageIcon(Uri source) → ImageIconData
8888
InfoBadge() → InfoBadgeElement
8989
InfoBadge(int value) → InfoBadgeElement
@@ -249,8 +249,8 @@ ColorPickerElement.ValueRange(int minValue, int maxValue) → ColorPickerElement
249249
ComboBoxElement.Description(string description) → ComboBoxElement
250250
ComboBoxElement.DropDownClosed(Action handler) → ComboBoxElement
251251
ComboBoxElement.DropDownOpened(Action handler) → ComboBoxElement
252-
ComboBoxElement.IsEditable(bool editable = true) → ComboBoxElement
253252
ComboBoxElement.Header(string header) → ComboBoxElement
253+
ComboBoxElement.IsEditable(bool editable = true) → ComboBoxElement
254254
ComboBoxElement.MaxDropDownHeight(double height) → ComboBoxElement
255255
ComboBoxElement.Placeholder(string text) → ComboBoxElement
256256
ComboBoxElement.SelectedIndexChanged(Action<int> handler) → ComboBoxElement
@@ -308,19 +308,19 @@ HyperlinkButtonElement.Click(Action handler) → HyperlinkButtonElement
308308
HyperlinkButtonElement.NavigateUri(Uri uri) → HyperlinkButtonElement
309309
HyperlinkButtonElement.Set(Action<HyperlinkButton> configure) → HyperlinkButtonElement
310310
HyperlinkButtonElement.TextLink() → HyperlinkButtonElement
311+
IconElement.Set(Action<IconElement> configure) → IconElement
311312
ImageElement.ImageFailed(Action<string> handler) → ImageElement
312313
ImageElement.ImageOpened(Action handler) → ImageElement
313314
ImageElement.NineGrid(Thickness nineGrid) → ImageElement
314-
IconElement.Set(Action<IconElement> configure) → IconElement
315315
ImageElement.Set(Action<Image> configure) → ImageElement
316316
InfoBadgeElement.Set(Action<InfoBadge> configure) → InfoBadgeElement
317317
InfoBarElement.ActionButtonClick(Action handler) → InfoBarElement
318-
InfoBarElement.IsClosable(bool closable = true) → InfoBarElement
319318
InfoBarElement.Closed(Action handler) → InfoBarElement
320319
InfoBarElement.Content(Element content) → InfoBarElement
321320
InfoBarElement.Error() → InfoBarElement
322321
InfoBarElement.IconSource(IconData icon) → InfoBarElement
323322
InfoBarElement.Informational() → InfoBarElement
323+
InfoBarElement.IsClosable(bool closable = true) → InfoBarElement
324324
InfoBarElement.Set(Action<InfoBar> configure) → InfoBarElement
325325
InfoBarElement.Severity(InfoBarSeverity severity) → InfoBarElement
326326
InfoBarElement.Success() → InfoBarElement
@@ -422,9 +422,9 @@ RadioButtonsElement.SelectedIndexChanged(Action<int> handler) → RadioButtonsEl
422422
RadioButtonsElement.Set(Action<RadioButtons> configure) → RadioButtonsElement
423423
RatingControlElement.Caption(string caption) → RatingControlElement
424424
RatingControlElement.InitialSetValue(int value) → RatingControlElement
425+
RatingControlElement.IsReadOnly(bool readOnly = true) → RatingControlElement
425426
RatingControlElement.MaxRating(int max) → RatingControlElement
426427
RatingControlElement.PlaceholderValue(double value) → RatingControlElement
427-
RatingControlElement.IsReadOnly(bool readOnly = true) → RatingControlElement
428428
RatingControlElement.Set(Action<RatingControl> configure) → RatingControlElement
429429
RatingControlElement.ValueChanged(Action<double> handler) → RatingControlElement
430430
RectangleElement.Fill(Brush brush) → RectangleElement
@@ -501,7 +501,6 @@ T.CenterPoint<T>(Vector3 center) → T
501501
T.ConnectedAnimation<T>(string key) → T
502502
T.CornerRadius<T>(double radius) → T
503503
T.CornerRadius<T>(double topLeft, double topRight, double bottomRight, double bottomLeft) → T
504-
T.IsEnabled<T>(bool enabled = true) → T
505504
T.DraggableWhen<T>(Func<bool> canDrag) → T
506505
T.Flex<T>(double grow = 0, double shrink = 1, double? basis = null, FlexAlign? alignSelf = null, FlexPositionType position = FlexPositionType.Relative, double? left = null, double? top = null, double? right = null, double? bottom = null) → T
507506
T.FocusMeta<T>(FocusManager fm, string fieldName, bool autoFocus = false) → T
@@ -525,7 +524,9 @@ T.HierarchyLevel<T>(int level) → T
525524
T.HorizontalAlignment<T>(HorizontalAlignment alignment) → T
526525
T.Immediate<T>() → T
527526
T.InteractionStates<T>(Func<InteractionStatesBuilder, InteractionStatesBuilder> configure, Curve curve = null) → T
527+
T.IsEnabled<T>(bool enabled = true) → T
528528
T.IsTabStop<T>(bool isTabStop = true) → T
529+
T.IsVisible<T>(bool isVisible) → T
529530
T.ItemContainerTransitions<T>(Transition[] transitions) → T
530531
T.ItemStatus<T>(string status) → T
531532
T.Keyframes<T>(string name, object trigger, Func<KeyframeBuilder, KeyframeBuilder> configure) → T
@@ -623,7 +624,6 @@ T.Validate<T>(string fieldName, object value, IValidator[] validators) → T
623624
T.ValidateAsync<T>(string fieldName, IAsyncValidator[] asyncValidators) → T
624625
T.ValidateAsync<T>(string fieldName, object value, IAsyncValidator[] asyncValidators) → T
625626
T.VerticalAlignment<T>(VerticalAlignment alignment) → T
626-
T.IsVisible<T>(bool isVisible) → T
627627
T.Width<T>(double width) → T
628628
T.WithBorder<T>(Brush brush, double thickness = 1) → T
629629
T.WithBorder<T>(ThemeRef theme, double thickness = 1) → T
@@ -643,9 +643,9 @@ TabViewElement.AllowDropTabs(bool allow = true) → TabViewElement
643643
TabViewElement.CanDragTabs(bool canDrag = true) → TabViewElement
644644
TabViewElement.CanReorderTabs(bool canReorder = true) → TabViewElement
645645
TabViewElement.CloseButtonOverlayMode(TabViewCloseButtonOverlayMode mode) → TabViewElement
646+
TabViewElement.IsAddTabButtonVisible(bool visible = true) → TabViewElement
646647
TabViewElement.SelectedIndexChanged(Action<int> handler) → TabViewElement
647648
TabViewElement.Set(Action<TabView> configure) → TabViewElement
648-
TabViewElement.IsAddTabButtonVisible(bool visible = true) → TabViewElement
649649
TabViewElement.TabCloseRequested(Action<int> handler) → TabViewElement
650650
TabViewElement.TabStripFooter(Element footer) → TabViewElement
651651
TabViewElement.TabStripHeader(Element header) → TabViewElement
@@ -673,9 +673,9 @@ TextBlockElement.FontFamily(FontFamily family) → TextBlockElement
673673
TextBlockElement.FontFamily(string family) → TextBlockElement
674674
TextBlockElement.FontSize(double size) → TextBlockElement
675675
TextBlockElement.FontStyle(FontStyle style) → TextBlockElement
676+
TextBlockElement.IsTextSelectionEnabled(bool enabled = true) → TextBlockElement
676677
TextBlockElement.LineHeight(double height) → TextBlockElement
677678
TextBlockElement.MaxLines(int maxLines) → TextBlockElement
678-
TextBlockElement.IsTextSelectionEnabled(bool enabled = true) → TextBlockElement
679679
TextBlockElement.SemiBold() → TextBlockElement
680680
TextBlockElement.Set(Action<TextBlock> configure) → TextBlockElement
681681
TextBlockElement.TextAlignment(TextAlignment alignment) → TextBlockElement
@@ -690,11 +690,11 @@ TextFieldElement.EmailInput() → TextFieldElement
690690
TextFieldElement.Focus(FocusManager fm, string fieldName, bool autoFocus = false) → TextFieldElement
691691
TextFieldElement.Header(string header) → TextFieldElement
692692
TextFieldElement.InputScope(InputScopeNameValue scope) → TextFieldElement
693+
TextFieldElement.IsReadOnly(bool readOnly = true) → TextFieldElement
693694
TextFieldElement.IsSpellCheckEnabled(bool enabled = true) → TextFieldElement
694695
TextFieldElement.MaxLength(int maxLength) → TextFieldElement
695696
TextFieldElement.NumericInput() → TextFieldElement
696697
TextFieldElement.PhoneInput() → TextFieldElement
697-
TextFieldElement.IsReadOnly(bool readOnly = true) → TextFieldElement
698698
TextFieldElement.SearchInput() → TextFieldElement
699699
TextFieldElement.SelectionChanged(Action<string, int, int> handler) → TextFieldElement
700700
TextFieldElement.Set(Action<TextBox> configure) → TextFieldElement

skills/reactor.api.txt

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -79,11 +79,11 @@ Heading(string content) → TextBlockElement
7979
Hyperlink(string text, Uri navigateUri) → RichTextHyperlink
8080
HyperlinkButton(Command command) → HyperlinkButtonElement
8181
HyperlinkButton(string content, Uri navigateUri = null, Action onClick = null) → HyperlinkButtonElement
82-
If(bool condition, Func<Element> then, Func<Element> otherwise = null) → Element
83-
Image(string source) → ImageElement
8482
Icon(IconData data) → IconElement
8583
Icon(Symbol symbol) → IconElement
8684
Icon(string symbol) → IconElement
85+
If(bool condition, Func<Element> then, Func<Element> otherwise = null) → Element
86+
Image(string source) → ImageElement
8787
ImageIcon(Uri source) → ImageIconData
8888
InfoBadge() → InfoBadgeElement
8989
InfoBadge(int value) → InfoBadgeElement
@@ -249,8 +249,8 @@ ColorPickerElement.ValueRange(int minValue, int maxValue) → ColorPickerElement
249249
ComboBoxElement.Description(string description) → ComboBoxElement
250250
ComboBoxElement.DropDownClosed(Action handler) → ComboBoxElement
251251
ComboBoxElement.DropDownOpened(Action handler) → ComboBoxElement
252-
ComboBoxElement.IsEditable(bool editable = true) → ComboBoxElement
253252
ComboBoxElement.Header(string header) → ComboBoxElement
253+
ComboBoxElement.IsEditable(bool editable = true) → ComboBoxElement
254254
ComboBoxElement.MaxDropDownHeight(double height) → ComboBoxElement
255255
ComboBoxElement.Placeholder(string text) → ComboBoxElement
256256
ComboBoxElement.SelectedIndexChanged(Action<int> handler) → ComboBoxElement
@@ -308,19 +308,19 @@ HyperlinkButtonElement.Click(Action handler) → HyperlinkButtonElement
308308
HyperlinkButtonElement.NavigateUri(Uri uri) → HyperlinkButtonElement
309309
HyperlinkButtonElement.Set(Action<HyperlinkButton> configure) → HyperlinkButtonElement
310310
HyperlinkButtonElement.TextLink() → HyperlinkButtonElement
311+
IconElement.Set(Action<IconElement> configure) → IconElement
311312
ImageElement.ImageFailed(Action<string> handler) → ImageElement
312313
ImageElement.ImageOpened(Action handler) → ImageElement
313314
ImageElement.NineGrid(Thickness nineGrid) → ImageElement
314-
IconElement.Set(Action<IconElement> configure) → IconElement
315315
ImageElement.Set(Action<Image> configure) → ImageElement
316316
InfoBadgeElement.Set(Action<InfoBadge> configure) → InfoBadgeElement
317317
InfoBarElement.ActionButtonClick(Action handler) → InfoBarElement
318-
InfoBarElement.IsClosable(bool closable = true) → InfoBarElement
319318
InfoBarElement.Closed(Action handler) → InfoBarElement
320319
InfoBarElement.Content(Element content) → InfoBarElement
321320
InfoBarElement.Error() → InfoBarElement
322321
InfoBarElement.IconSource(IconData icon) → InfoBarElement
323322
InfoBarElement.Informational() → InfoBarElement
323+
InfoBarElement.IsClosable(bool closable = true) → InfoBarElement
324324
InfoBarElement.Set(Action<InfoBar> configure) → InfoBarElement
325325
InfoBarElement.Severity(InfoBarSeverity severity) → InfoBarElement
326326
InfoBarElement.Success() → InfoBarElement
@@ -422,9 +422,9 @@ RadioButtonsElement.SelectedIndexChanged(Action<int> handler) → RadioButtonsEl
422422
RadioButtonsElement.Set(Action<RadioButtons> configure) → RadioButtonsElement
423423
RatingControlElement.Caption(string caption) → RatingControlElement
424424
RatingControlElement.InitialSetValue(int value) → RatingControlElement
425+
RatingControlElement.IsReadOnly(bool readOnly = true) → RatingControlElement
425426
RatingControlElement.MaxRating(int max) → RatingControlElement
426427
RatingControlElement.PlaceholderValue(double value) → RatingControlElement
427-
RatingControlElement.IsReadOnly(bool readOnly = true) → RatingControlElement
428428
RatingControlElement.Set(Action<RatingControl> configure) → RatingControlElement
429429
RatingControlElement.ValueChanged(Action<double> handler) → RatingControlElement
430430
RectangleElement.Fill(Brush brush) → RectangleElement
@@ -501,7 +501,6 @@ T.CenterPoint<T>(Vector3 center) → T
501501
T.ConnectedAnimation<T>(string key) → T
502502
T.CornerRadius<T>(double radius) → T
503503
T.CornerRadius<T>(double topLeft, double topRight, double bottomRight, double bottomLeft) → T
504-
T.IsEnabled<T>(bool enabled = true) → T
505504
T.DraggableWhen<T>(Func<bool> canDrag) → T
506505
T.Flex<T>(double grow = 0, double shrink = 1, double? basis = null, FlexAlign? alignSelf = null, FlexPositionType position = FlexPositionType.Relative, double? left = null, double? top = null, double? right = null, double? bottom = null) → T
507506
T.FocusMeta<T>(FocusManager fm, string fieldName, bool autoFocus = false) → T
@@ -525,7 +524,9 @@ T.HierarchyLevel<T>(int level) → T
525524
T.HorizontalAlignment<T>(HorizontalAlignment alignment) → T
526525
T.Immediate<T>() → T
527526
T.InteractionStates<T>(Func<InteractionStatesBuilder, InteractionStatesBuilder> configure, Curve curve = null) → T
527+
T.IsEnabled<T>(bool enabled = true) → T
528528
T.IsTabStop<T>(bool isTabStop = true) → T
529+
T.IsVisible<T>(bool isVisible) → T
529530
T.ItemContainerTransitions<T>(Transition[] transitions) → T
530531
T.ItemStatus<T>(string status) → T
531532
T.Keyframes<T>(string name, object trigger, Func<KeyframeBuilder, KeyframeBuilder> configure) → T
@@ -623,7 +624,6 @@ T.Validate<T>(string fieldName, object value, IValidator[] validators) → T
623624
T.ValidateAsync<T>(string fieldName, IAsyncValidator[] asyncValidators) → T
624625
T.ValidateAsync<T>(string fieldName, object value, IAsyncValidator[] asyncValidators) → T
625626
T.VerticalAlignment<T>(VerticalAlignment alignment) → T
626-
T.IsVisible<T>(bool isVisible) → T
627627
T.Width<T>(double width) → T
628628
T.WithBorder<T>(Brush brush, double thickness = 1) → T
629629
T.WithBorder<T>(ThemeRef theme, double thickness = 1) → T
@@ -643,9 +643,9 @@ TabViewElement.AllowDropTabs(bool allow = true) → TabViewElement
643643
TabViewElement.CanDragTabs(bool canDrag = true) → TabViewElement
644644
TabViewElement.CanReorderTabs(bool canReorder = true) → TabViewElement
645645
TabViewElement.CloseButtonOverlayMode(TabViewCloseButtonOverlayMode mode) → TabViewElement
646+
TabViewElement.IsAddTabButtonVisible(bool visible = true) → TabViewElement
646647
TabViewElement.SelectedIndexChanged(Action<int> handler) → TabViewElement
647648
TabViewElement.Set(Action<TabView> configure) → TabViewElement
648-
TabViewElement.IsAddTabButtonVisible(bool visible = true) → TabViewElement
649649
TabViewElement.TabCloseRequested(Action<int> handler) → TabViewElement
650650
TabViewElement.TabStripFooter(Element footer) → TabViewElement
651651
TabViewElement.TabStripHeader(Element header) → TabViewElement
@@ -673,9 +673,9 @@ TextBlockElement.FontFamily(FontFamily family) → TextBlockElement
673673
TextBlockElement.FontFamily(string family) → TextBlockElement
674674
TextBlockElement.FontSize(double size) → TextBlockElement
675675
TextBlockElement.FontStyle(FontStyle style) → TextBlockElement
676+
TextBlockElement.IsTextSelectionEnabled(bool enabled = true) → TextBlockElement
676677
TextBlockElement.LineHeight(double height) → TextBlockElement
677678
TextBlockElement.MaxLines(int maxLines) → TextBlockElement
678-
TextBlockElement.IsTextSelectionEnabled(bool enabled = true) → TextBlockElement
679679
TextBlockElement.SemiBold() → TextBlockElement
680680
TextBlockElement.Set(Action<TextBlock> configure) → TextBlockElement
681681
TextBlockElement.TextAlignment(TextAlignment alignment) → TextBlockElement
@@ -690,11 +690,11 @@ TextFieldElement.EmailInput() → TextFieldElement
690690
TextFieldElement.Focus(FocusManager fm, string fieldName, bool autoFocus = false) → TextFieldElement
691691
TextFieldElement.Header(string header) → TextFieldElement
692692
TextFieldElement.InputScope(InputScopeNameValue scope) → TextFieldElement
693+
TextFieldElement.IsReadOnly(bool readOnly = true) → TextFieldElement
693694
TextFieldElement.IsSpellCheckEnabled(bool enabled = true) → TextFieldElement
694695
TextFieldElement.MaxLength(int maxLength) → TextFieldElement
695696
TextFieldElement.NumericInput() → TextFieldElement
696697
TextFieldElement.PhoneInput() → TextFieldElement
697-
TextFieldElement.IsReadOnly(bool readOnly = true) → TextFieldElement
698698
TextFieldElement.SearchInput() → TextFieldElement
699699
TextFieldElement.SelectionChanged(Action<string, int, int> handler) → TextFieldElement
700700
TextFieldElement.Set(Action<TextBox> configure) → TextFieldElement

tests/Reactor.AppTests.Host/Reactor.AppTests.Host.csproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@
1212
<WindowsPackageType>None</WindowsPackageType>
1313
</PropertyGroup>
1414

15+
<PropertyGroup Condition="'$(PublishAotInternal)' == 'true'">
16+
<PublishAot>true</PublishAot>
17+
</PropertyGroup>
18+
1519
<ItemGroup>
1620
<PackageReference Include="Microsoft.WindowsAppSDK" Version="$(WindowsAppSDKVersion)" />
1721
<PackageReference Include="MessageFormat" Version="8.0.0" />

tests/Reactor.AppTests.Host/SelfTest/Harness.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,16 @@ public void MarkFixtureResult(int index, bool passed)
139139
: global::Windows.UI.Color.FromArgb(255, 244, 67, 54)); // red
140140
}
141141

142+
/// <summary>
143+
/// Colors the segment at <paramref name="index"/> yellow to indicate a skipped fixture.
144+
/// </summary>
145+
public void MarkFixtureSkipped(int index)
146+
{
147+
if (index < 0 || index >= _testSegments.Count) return;
148+
_testSegments[index].Background = new SolidColorBrush(
149+
global::Windows.UI.Color.FromArgb(255, 255, 193, 7)); // amber/yellow
150+
}
151+
142152
public ReactorHost CreateHost()
143153
{
144154
var host = new ReactorHost(_window);

0 commit comments

Comments
 (0)