Avoid image source layout invalidation for fixed-size views#35369
Conversation
Updated [Magick.NET-Q8-AnyCPU](https://github.com/dlemstra/Magick.NET) from 14.10.4 to 14.12.0. <details> <summary>Release notes</summary> _Sourced from [Magick.NET-Q8-AnyCPU's releases](https://github.com/dlemstra/Magick.NET/releases)._ ## 14.12.0 ### What's Changed - Added `FixByteOrder` to the `DcmReadDefines` (#1976) - Added `IconWriteDefines`. ### Related changes in ImageMagick since the last release of Magick.NET: - Correct bug in `Composite` when using `CopyAlpha` (#1985) - Fixed incorrect orientation of JPEG compressed TIFF images (#1991) - Heap-Buffer-Overflow write of single zero byte when parsing xml (GHSA-cr67-pvmx-2pp2) - Stack Overflow in DestroyXMLTree (GHSA-fwvm-ggf6-2p4x) - Out-of-Bounds read in sample operation (GHSA-pcvx-ph33-r5vv) - Stack Overflow via Recursive FX Expression Parsing (GHSA-f4qm-vj5j-9xpw) - Heap Buffer Overflow in ImageMagick MVG decoder (GHSA-x9h5-r9v2-vcww) - Heap overflow caused by integer overflow/wraparound in viff encoder on 32-bit builds (GHSA-v67w-737x-v2c9) - Stack-buffer-overflow in MNG encoder with oversized pallete (GHSA-98cp-rj9f-6v5g) - Integer overflow in despeckle operation causes heap buffer overflow on 32-bit builds (GHSA-26qp-ffjh-2x4v) - Off-by-One in MSL decoder could result in crash (GHSA-5xg3-585r-9jh5) - Heap buffer overflow when encoding JXL image with a 16-bit float (GHSA-jvgr-9ph5-m8v4) - Heap-use-after-free via XMP profile could result in a crash when printing the values (GHSA-r83h-crwp-3vm7) - Heap buffer overflow (WRITE) in the YAML and JSON encoders (GHSA-5592-p365-24xh) - Heap out-of-bounds write in JP2 encoder (GHSA-pwg5-6jfc-crvh) ### Library updates: - ImageMagick 7.1.2-19 (2026-04-12) - aom 3.13.3 (2026-04-02) - openexr 3.4.9 (2026-04-03) - freetype 2.14.3 (2026-03-22) - gdk-pixbuf 2.44.6 (2026-03-31) - harfbuzz 14.0.0 (2026-04-01) - liblzma 5.8.3 (2026-04-31) - libpng 1.6.56 (2026-03-25) **Full Changelog**: dlemstra/Magick.NET@14.11.1...14.12.0 ## 14.11.1 ### Related changes in ImageMagick since the last release of Magick.NET: - Stack-buffer-overflow WRITE in InterpretImageFilename due to overflow (GHSA-8793-7xv6-82cf) ### Library updates: - ImageMagick 7.1.2-18 (2026-03-23) - aom 3.13.2 (2026-03-19) - openexr 3.4.7 (2026-03-15) - harfbuzz 13.2.1 (2026-03-19) **Full Changelog**: dlemstra/Magick.NET@14.11.0...14.11.1 ## 14.11.0 ### What's Changed - Added `DcmReadDefines`. ### Related changes in ImageMagick since the last release of Magick.NET: - Access mode change for files created from 0666 to 0600 (ImageMagick/ImageMagick#8609) - Heap-buffer-overflow in NewXMLTree could result in crash (GHSA-gc62-2v5p-qpmp) ### Library updates: - ImageMagick 7.1.2-17 (2026-03-16) - openexr 3.4.6 (2026-03-01) - freetype 2.14.2 (2026-03-01) - harfbuzz 13.0.1 (2026-03-07) - libxml2 2.15.2 (2026-03-03) **Full Changelog**: dlemstra/Magick.NET@14.10.4...14.11.0 Commits viewable in [compare view](dlemstra/Magick.NET@14.10.4...14.12.0). </details> [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/dotnet/maui/network/alerts). </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
…t#35333) Bump OpenTelemetry packages to latest stable versions in the maui-aspire-servicedefaults template: - OpenTelemetry.Exporter.OpenTelemetryProtocol: 1.9.0 to 1.15.3 - OpenTelemetry.Extensions.Hosting: 1.9.0 to 1.15.3 - OpenTelemetry.Instrumentation.Http: 1.9.0 to 1.15.1 - OpenTelemetry.Instrumentation.Runtime: 1.9.0 to 1.15.1 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This pull request updates the following dependencies [marker]: <> (Begin:a71c12d9-5aa4-4b46-e2d6-08da0cf8cd95) ## From https://github.com/dotnet/xharness - **Subscription**: [a71c12d9-5aa4-4b46-e2d6-08da0cf8cd95](https://maestro.dot.net/subscriptions?search=a71c12d9-5aa4-4b46-e2d6-08da0cf8cd95) - **Build**: [20260430.4](https://dev.azure.com/dnceng/internal/_build/results?buildId=2964906) ([312724](https://maestro.dot.net/channel/2/github:dotnet:xharness/build/312724)) - **Date Produced**: May 1, 2026 7:05:11 AM UTC - **Commit**: [92962e5c46ac08a66ded4c5696209cc60f1a232f](dotnet/xharness@92962e5) - **Branch**: [main](https://github.com/dotnet/xharness/tree/main) [DependencyUpdate]: <> (Begin) - **Dependency Updates**: - From [11.0.0-prerelease.26229.1 to 11.0.0-prerelease.26230.4][1] - Microsoft.DotNet.XHarness.CLI - Microsoft.DotNet.XHarness.TestRunners.Common - Microsoft.DotNet.XHarness.TestRunners.Xunit [1]: dotnet/xharness@9d5a7e9...92962e5 [DependencyUpdate]: <> (End) [marker]: <> (End:a71c12d9-5aa4-4b46-e2d6-08da0cf8cd95) Co-authored-by: dotnet-maestro[bot] <dotnet-maestro[bot]@users.noreply.github.com>
> [!NOTE] > Are you waiting for the changes in this PR to be merged? > It would be very helpful if you could [test the resulting artifacts](https://github.com/dotnet/maui/wiki/Testing-PR-Builds) from this PR and let us know in a comment if this change resolves your issue. Thank you! ## Description Replaces `review-rules.md` (flat 345-line checklist) with a dimensional expert review agent. Single source of truth for all review rules, organized into 30 dimensions for per-dimension sub-agent evaluation. Adds inline file:line PR comments alongside the existing wall-of-text summary. Extracted from 28k review comments across 5 maintainers via [extraction-pipeline](https://github.com/dotnet/fsharp/blob/main/.github/agents/extraction-pipeline.md). No functional code changes. Recreated from dotnet#35062 on a dotnet/maui branch (originally opened from a fork). ## What changed **Before:** `review-rules.md` had 345 lines of flat rules. `code-review` skill loaded them all into one context. Output was a single wall-of-text PR comment. **After:** Rules absorbed into `maui-expert-reviewer.md` as 30 dimensions with 200+ CHECK items. Each dimension runs as an independent sub-agent with focused context. Output is inline file:line PR comments via `inline-findings.json`. ## CI Flow ``` Review-PR.ps1 prompt: 1. code-review → maui-expert-reviewer agent → inline-findings.json 2. pr-review → Pre-Flight → Try-Fix → Report (sees findings, no duplication) Posting: post-inline-review.ps1 → .json → GitHub file:line comments (NEW) post-ai-summary-comment.ps1 → {phase}/content.md → wall-of-text (existing) CI: COMMENTS_VIA_FILE=true → agent writes .json, script posts Local: agent writes .json, code-review posts directly via gh api ``` ## Files | Action | File | What | |--------|------|------| | **Add** | `agents/maui-expert-reviewer.md` | 30 dimensions, 200+ CHECKs, routing table | | **Add** | `instructions/collectionview-{android,ios,windows}` | Platform-isolated CV rules | | **Add** | `instructions/{handler-patterns,layout-system,performance-hotpaths,public-api,threading-async}` | Domain-specific ambient guidance | | **Add** | `scripts/post-inline-review.ps1` | Posts .json as GitHub PR review | | **Del** | `skills/code-review/references/review-rules.md` | Absorbed into agent | | **Mod** | `skills/code-review/SKILL.md` | Delegates to agent | | **Mod** | `scripts/Review-PR.ps1` | Prompt + inline posting wiring | | **Mod** | `eng/pipelines/ci-copilot.yml` | `COMMENTS_VIA_FILE` env var | --------- Co-authored-by: kubaflo <kubaflo@users.noreply.github.com> Co-authored-by: T-Gro <46543583+T-Gro@users.noreply.github.com> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Co-authored-by: Tomas Grosup <tomasgrosup@microsoft.com>
|
🚀 Dogfood this PR with:
curl -fsSL https://raw.githubusercontent.com/dotnet/maui/main/eng/scripts/get-maui-pr.sh | bash -s -- 35369Or
iex "& { $(irm https://raw.githubusercontent.com/dotnet/maui/main/eng/scripts/get-maui-pr.ps1) } 35369" |
|
Hey there @@AdamEssenmacher! Thank you so much for your PR! Someone from the team will get assigned to your PR shortly and we'll get it reviewed. |
There was a problem hiding this comment.
Pull request overview
This PR reduces unnecessary layout/measure invalidations when swapping ImageSource on image-backed controls that are effectively fixed-size (explicit width/height + both alignments Fill), improving scrolling performance in image-heavy UIs.
Changes:
- Conditionalized
InvalidateMeasureforImageSourcechanges so fixed-size/Fill-aligned views don’t thrash layout. - Preserved invalidation behavior for cases where the source can affect measured size (implicit dimensions, non-Fill alignments, iOS stream-source post-load sizing).
- Added unit regression tests for
Image,ImageButton, andButton, plus BenchmarkDotNet coverage for the source-swap layout invalidation path.
Reviewed changes
Copilot reviewed 6 out of 6 changed files in this pull request and generated no comments.
Show a summary per file
| File | Description |
|---|---|
| src/Controls/src/Core/ImageElement.cs | Skips measure invalidation on source changes when the view’s measured size cannot change. |
| src/Core/src/Handlers/Image/ImageHandler.iOS.cs | Avoids iOS stream-image post-load measure invalidation for fixed-size/Fill-aligned images (but currently has a brace issue). |
| src/Controls/tests/Core.UnitTests/ImageTests.cs | Adds regression tests ensuring source changes don’t invalidate measure for fixed-size images, and still do in sizing-sensitive cases. |
| src/Controls/tests/Core.UnitTests/ImageButtonUnitTest.cs | Mirrors the new regression coverage for ImageButton. |
| src/Controls/tests/Core.UnitTests/ButtonUnitTest.cs | Adds regression coverage for Button.ImageSource under fixed-size vs sizing-sensitive scenarios. |
| src/Core/tests/Benchmarks/Benchmarks/ImageSourceBenchmarker.cs | Adds benchmarks for image-source swapping and layout invalidation impact under auto-sized vs explicitly sized setups. |
|
/azp run maui-pr |
|
Azure Pipelines successfully started running 1 pipeline(s). |
🤖 AI Summary
📊 Review Session —
|
| Test | Without Fix (expect FAIL) | With Fix (expect PASS) |
|---|---|---|
🧪 ButtonUnitTest ButtonUnitTest |
✅ FAIL — 32s | ✅ PASS — 17s |
🧪 ImageButtonTests ImageButtonTests |
✅ FAIL — 6s | ✅ PASS — 5s |
🧪 ImageTests ImageTests |
✅ FAIL — 6s | ✅ PASS — 5s |
🔴 Without fix — 🧪 ButtonUnitTest: FAIL ✅ · 32s
Determining projects to restore...
Restored /Users/cloudtest/vss/_work/1/s/src/Graphics/src/Graphics/Graphics.csproj (in 979 ms).
Restored /Users/cloudtest/vss/_work/1/s/src/TestUtils/src/TestUtils/TestUtils.csproj (in 4.18 sec).
Restored /Users/cloudtest/vss/_work/1/s/src/Controls/tests/Core.UnitTests/Controls.Core.UnitTests.csproj (in 4.83 sec).
Restored /Users/cloudtest/vss/_work/1/s/src/Essentials/src/Essentials.csproj (in 4.85 sec).
Restored /Users/cloudtest/vss/_work/1/s/src/Core/src/Core.csproj (in 5.62 sec).
Restored /Users/cloudtest/vss/_work/1/s/src/Core/maps/src/Maps.csproj (in 5.62 sec).
Restored /Users/cloudtest/vss/_work/1/s/src/Controls/Maps/src/Controls.Maps.csproj (in 5.62 sec).
Restored /Users/cloudtest/vss/_work/1/s/src/Controls/src/Core/Controls.Core.csproj (in 5.62 sec).
Restored /Users/cloudtest/vss/_work/1/s/src/Controls/src/Xaml/Controls.Xaml.csproj (in 5.63 sec).
1 of 10 projects are up-to-date for restore.
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14065311
Graphics -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Graphics/Debug/net10.0/Microsoft.Maui.Graphics.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14065311
Essentials -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Essentials/Debug/net10.0/Microsoft.Maui.Essentials.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14065311
Core -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Core/Debug/net10.0/Microsoft.Maui.dll
Controls.BindingSourceGen -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.BindingSourceGen/Debug/netstandard2.0/Microsoft.Maui.Controls.BindingSourceGen.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14065311
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14065311
Maps -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Maps/Debug/net10.0/Microsoft.Maui.Maps.dll
Controls.Core -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Core/Debug/net10.0/Microsoft.Maui.Controls.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14065311
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14065311
Controls.Maps -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Maps/Debug/net10.0/Microsoft.Maui.Controls.Maps.dll
Controls.Xaml -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Xaml/Debug/net10.0/Microsoft.Maui.Controls.Xaml.dll
TestUtils -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/TestUtils/Debug/netstandard2.0/Microsoft.Maui.TestUtils.dll
Controls.Core.UnitTests -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Core.UnitTests/Debug/net10.0/Microsoft.Maui.Controls.Core.UnitTests.dll
Test run for /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Core.UnitTests/Debug/net10.0/Microsoft.Maui.Controls.Core.UnitTests.dll (.NETCoreApp,Version=v10.0)
VSTest version 18.0.1 (arm64)
Starting test execution, please wait...
A total of 1 test files matched the specified pattern.
[xUnit.net 00:00:00.00] xUnit.net VSTest Adapter v2.8.2+699d445a1a (64-bit .NET 10.0.0)
[xUnit.net 00:00:00.08] Discovering: Microsoft.Maui.Controls.Core.UnitTests
[xUnit.net 00:00:00.59] Discovered: Microsoft.Maui.Controls.Core.UnitTests
[xUnit.net 00:00:00.60] Starting: Microsoft.Maui.Controls.Core.UnitTests
Passed DisabledLayoutDisablesChild(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [13 ms]
Passed DisabledLayoutDisablesChild(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
Passed DisabledLayoutDisablesChild(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
Passed DisabledLayoutDisablesChild(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
Passed TestClickedvent(isEnabled: False) [< 1 ms]
Passed TestClickedvent(isEnabled: True) [< 1 ms]
Passed ImageSourceChangeTriggersResizeWhenWidthOrHeightIsImplicit(setWidth: False, setHeight: True) [3 ms]
Passed ImageSourceChangeTriggersResizeWhenWidthOrHeightIsImplicit(setWidth: True, setHeight: False) [< 1 ms]
Passed DisablingLayoutDisablesChild(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
Passed DisablingLayoutDisablesChild(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
Passed DisablingLayoutDisablesChild(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [< 1 ms]
Passed DisablingLayoutDisablesChild(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
Passed CommandCanExecuteModifiesEnabled(initial: True) [1 ms]
Passed CommandCanExecuteModifiesEnabled(initial: False) [< 1 ms]
Passed DisabledLayoutDisablesNestedChild(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
Passed DisabledLayoutDisablesNestedChild(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [< 1 ms]
Passed DisabledLayoutDisablesNestedChild(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
Passed DisabledLayoutDisablesNestedChild(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
Passed EnablingChildDoesNotEnableChildOfDisabledLayout(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
Passed EnablingChildDoesNotEnableChildOfDisabledLayout(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [< 1 ms]
Passed EnablingChildDoesNotEnableChildOfDisabledLayout(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
Passed EnablingChildDoesNotEnableChildOfDisabledLayout(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
Passed TestReleasedEvent(isEnabled: False) [< 1 ms]
Passed TestReleasedEvent(isEnabled: True) [< 1 ms]
Passed CommandCanExecuteInvokedOnChange [< 1 ms]
Passed EnablingLayoutWithDisabledChildWithBindingDoesNotEnableChild(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [4 ms]
Passed EnablingLayoutWithDisabledChildWithBindingDoesNotEnableChild(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
Passed EnablingLayoutWithDisabledChildWithBindingDoesNotEnableChild(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
Passed EnablingLayoutWithDisabledChildWithBindingDoesNotEnableChild(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
Passed DisabledLayoutDisablesChildWithCommand(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
Passed DisabledLayoutDisablesChildWithCommand(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
Passed DisabledLayoutDisablesChildWithCommand(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
Passed DisabledLayoutDisablesChildWithCommand(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [< 1 ms]
Passed ButtonClickWhenCommandCanExecuteFalse [< 1 ms]
Passed CommandUpdatesDoNotOverrideEnabled(viewEnabled: True, commandEnabled: True, expectedEnabled: False) [1 ms]
Passed CommandUpdatesDoNotOverrideEnabled(viewEnabled: True, commandEnabled: False, expectedEnabled: True) [< 1 ms]
Passed CommandUpdatesDoNotOverrideEnabled(viewEnabled: False, commandEnabled: True, expectedEnabled: False) [< 1 ms]
Passed CommandUpdatesDoNotOverrideEnabled(viewEnabled: False, commandEnabled: False, expectedEnabled: False) [< 1 ms]
Passed TestCommand [< 1 ms]
Passed EnabledLayoutDoesNotAffectChildIsEnabled(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [< 1 ms]
Passed EnabledLayoutDoesNotAffectChildIsEnabled(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
Passed EnabledLayoutDoesNotAffectChildIsEnabled(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
Passed EnabledLayoutDoesNotAffectChildIsEnabled(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
Passed EnabledUpdatesDoNotOverrideCommand(viewEnabled: True, commandEnabled: False, expectedEnabled: False) [< 1 ms]
Passed EnabledUpdatesDoNotOverrideCommand(viewEnabled: False, commandEnabled: False, expectedEnabled: False) [< 1 ms]
Passed EnabledUpdatesDoNotOverrideCommand(viewEnabled: False, commandEnabled: True, expectedEnabled: True) [< 1 ms]
Passed EnabledUpdatesDoNotOverrideCommand(viewEnabled: True, commandEnabled: True, expectedEnabled: False) [< 1 ms]
Passed DisablingLayoutDisablesChildWithBinding(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
Passed DisablingLayoutDisablesChildWithBinding(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [< 1 ms]
Passed DisablingLayoutDisablesChildWithBinding(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
Passed DisablingLayoutDisablesChildWithBinding(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
Passed EnablingLayoutWithDisabledChildWithCommandDoesNotEnableChild(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
Passed EnablingLayoutWithDisabledChildWithCommandDoesNotEnableChild(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
Passed EnablingLayoutWithDisabledChildWithCommandDoesNotEnableChild(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
Passed EnablingLayoutWithDisabledChildWithCommandDoesNotEnableChild(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [< 1 ms]
Passed EnabledAndCommandAreCorrect(viewEnabled: False, commandEnabled: True, expectedEnabled: False) [< 1 ms]
Passed EnabledAndCommandAreCorrect(viewEnabled: False, commandEnabled: False, expectedEnabled: False) [< 1 ms]
Passed EnabledAndCommandAreCorrect(viewEnabled: True, commandEnabled: True, expectedEnabled: True) [< 1 ms]
Passed EnabledAndCommandAreCorrect(viewEnabled: True, commandEnabled: False, expectedEnabled: False) [< 1 ms]
Passed AssignToFontFamilyUpdatesFont [5 ms]
Passed CommandCanExecuteInvokedOnCommandSet [< 1 ms]
Passed TestPressedEvent(isEnabled: False) [< 1 ms]
Passed TestPressedEvent(isEnabled: True) [< 1 ms]
[xUnit.net 00:00:00.65] FileImageSourcePropertiesChangedDoesNotTriggerResizeWhenWidthAndHeightExplicit [FAIL]
[xUnit.net 00:00:00.65] Assert.False() Failure
[xUnit.net 00:00:00.65] Expected: False
[xUnit.net 00:00:00.65] Actual: True
[xUnit.net 00:00:00.65] Stack Trace:
[xUnit.net 00:00:00.66] /_/src/Controls/tests/Core.UnitTests/ButtonUnitTest.cs(220,0): at Microsoft.Maui.Controls.Core.UnitTests.ButtonUnitTest.FileImageSourcePropertiesChangedDoesNotTriggerResizeWhenWidthAndHeightExplicit()
[xUnit.net 00:00:00.66] at System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(Object obj, IntPtr* args)
[xUnit.net 00:00:00.66] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr)
Passed EnablingChildWithCommandDoesNotEnableChildOfDisabledLayout(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
Passed EnablingChildWithCommandDoesNotEnableChildOfDisabledLayout(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
Passed EnablingChildWithCommandDoesNotEnableChildOfDisabledLayout(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [< 1 ms]
Passed EnablingChildWithCommandDoesNotEnableChildOfDisabledLayout(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
Failed FileImageSourcePropertiesChangedDoesNotTriggerResizeWhenWidthAndHeightExplicit [< 1 ms]
Error Message:
Assert.False() Failure
Expected: False
Actual: True
Stack Trace:
at Microsoft.Maui.Controls.Core.UnitTests.ButtonUnitTest.FileImageSourcePropertiesChangedDoesNotTriggerResizeWhenWidthAndHeightExplicit() in /_/src/Controls/tests/Core.UnitTests/ButtonUnitTest.cs:line 220
at System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(Object obj, IntPtr* args)
at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr)
Passed ReenabledAfterCommandRemoved [< 1 ms]
Passed EnabledUpdatesDoNotRemoveBindings [< 1 ms]
Passed ButtonContentLayoutTypeConverterTest [5 ms]
Passed PressedVisualState [2 ms]
[xUnit.net 00:00:00.66] ImageSourceChangeDoesNotTriggerResizeWhenWidthAndHeightExplicit [FAIL]
[xUnit.net 00:00:00.66] Assert.Equal() Failure: Values differ
[xUnit.net 00:00:00.66] Expected: 0
[xUnit.net 00:00:00.66] Actual: 1
[xUnit.net 00:00:00.66] Stack Trace:
[xUnit.net 00:00:00.66] /_/src/Controls/tests/Core.UnitTests/ButtonUnitTest.cs(151,0): at Microsoft.Maui.Controls.Core.UnitTests.ButtonUnitTest.ImageSourceChangeDoesNotTriggerResizeWhenWidthAndHeightExplicit()
[xUnit.net 00:00:00.66] at System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(Object obj, IntPtr* args)
[xUnit.net 00:00:00.66] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr)
Passed TestImageSourcePropertiesChangedTriggerResize [< 1 ms]
Failed ImageSourceChangeDoesNotTriggerResizeWhenWidthAndHeightExplicit [< 1 ms]
Error Message:
Assert.Equal() Failure: Values differ
Expected: 0
Actual: 1
Stack Trace:
at Microsoft.Maui.Controls.Core.UnitTests.ButtonUnitTest.ImageSourceChangeDoesNotTriggerResizeWhenWidthAndHeightExplicit() in /_/src/Controls/tests/Core.UnitTests/ButtonUnitTest.cs:line 151
at System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(Object obj, IntPtr* args)
at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr)
Passed ButtonCornerRadiusSetToFive [< 1 ms]
Passed ImageSourceChangeTriggersResizeWhenExplicitButLayoutAlignmentIsNotFill(setHorizontalCenter: True, setVerticalCenter: False) [< 1 ms]
Passed ImageSourceChangeTriggersResizeWhenExplicitButLayoutAlignmentIsNotFill(setHorizontalCenter: False, setVerticalCenter: True) [< 1 ms]
Passed AssignToFontAttributesUpdatesFont [< 1 ms]
Passed TestBindingContextPropagation [< 1 ms]
Passed DisablingLayoutDisablesChildWithCommand(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
Passed DisablingLayoutDisablesChildWithCommand(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
[xUnit.net 00:00:00.67] Finished: Microsoft.Maui.Controls.Core.UnitTests
Passed DisablingLayoutDisablesChildWithCommand(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
Passed DisablingLayoutDisablesChildWithCommand(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [< 1 ms]
Passed MeasureInvalidatedOnTextChange [< 1 ms]
Passed CommandUnhooksOnNull [< 1 ms]
Passed AssignToFontSizeUpdatesFont [< 1 ms]
Passed CommandCanExecuteUpdatesEnabled [< 1 ms]
Passed CommandCanExecuteInvokedOnCommandParameterSet [< 1 ms]
Test Run Failed.
Total tests: 88
Passed: 86
Failed: 2
Total time: 0.9147 Seconds
🟢 With fix — 🧪 ButtonUnitTest: PASS ✅ · 17s
Determining projects to restore...
All projects are up-to-date for restore.
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14065311
Graphics -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Graphics/Debug/net10.0/Microsoft.Maui.Graphics.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14065311
Essentials -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Essentials/Debug/net10.0/Microsoft.Maui.Essentials.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14065311
Core -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Core/Debug/net10.0/Microsoft.Maui.dll
Controls.BindingSourceGen -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.BindingSourceGen/Debug/netstandard2.0/Microsoft.Maui.Controls.BindingSourceGen.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14065311
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14065311
Maps -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Maps/Debug/net10.0/Microsoft.Maui.Maps.dll
Controls.Core -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Core/Debug/net10.0/Microsoft.Maui.Controls.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14065311
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14065311
Controls.Xaml -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Xaml/Debug/net10.0/Microsoft.Maui.Controls.Xaml.dll
Controls.Maps -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Maps/Debug/net10.0/Microsoft.Maui.Controls.Maps.dll
TestUtils -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/TestUtils/Debug/netstandard2.0/Microsoft.Maui.TestUtils.dll
Controls.Core.UnitTests -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Core.UnitTests/Debug/net10.0/Microsoft.Maui.Controls.Core.UnitTests.dll
Test run for /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Core.UnitTests/Debug/net10.0/Microsoft.Maui.Controls.Core.UnitTests.dll (.NETCoreApp,Version=v10.0)
VSTest version 18.0.1 (arm64)
Starting test execution, please wait...
A total of 1 test files matched the specified pattern.
[xUnit.net 00:00:00.00] xUnit.net VSTest Adapter v2.8.2+699d445a1a (64-bit .NET 10.0.0)
[xUnit.net 00:00:00.06] Discovering: Microsoft.Maui.Controls.Core.UnitTests
[xUnit.net 00:00:00.53] Discovered: Microsoft.Maui.Controls.Core.UnitTests
[xUnit.net 00:00:00.54] Starting: Microsoft.Maui.Controls.Core.UnitTests
Passed DisabledLayoutDisablesChild(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [10 ms]
Passed DisabledLayoutDisablesChild(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
Passed DisabledLayoutDisablesChild(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
Passed DisabledLayoutDisablesChild(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
Passed TestClickedvent(isEnabled: False) [< 1 ms]
Passed TestClickedvent(isEnabled: True) [< 1 ms]
Passed ImageSourceChangeTriggersResizeWhenWidthOrHeightIsImplicit(setWidth: False, setHeight: True) [3 ms]
Passed ImageSourceChangeTriggersResizeWhenWidthOrHeightIsImplicit(setWidth: True, setHeight: False) [< 1 ms]
Passed DisablingLayoutDisablesChild(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
Passed DisablingLayoutDisablesChild(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
Passed DisablingLayoutDisablesChild(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [< 1 ms]
Passed DisablingLayoutDisablesChild(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
Passed CommandCanExecuteModifiesEnabled(initial: True) [1 ms]
Passed CommandCanExecuteModifiesEnabled(initial: False) [< 1 ms]
Passed DisabledLayoutDisablesNestedChild(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
Passed DisabledLayoutDisablesNestedChild(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [< 1 ms]
Passed DisabledLayoutDisablesNestedChild(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
Passed DisabledLayoutDisablesNestedChild(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
Passed EnablingChildDoesNotEnableChildOfDisabledLayout(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
Passed EnablingChildDoesNotEnableChildOfDisabledLayout(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [< 1 ms]
Passed EnablingChildDoesNotEnableChildOfDisabledLayout(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
Passed EnablingChildDoesNotEnableChildOfDisabledLayout(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
Passed TestReleasedEvent(isEnabled: False) [< 1 ms]
Passed TestReleasedEvent(isEnabled: True) [< 1 ms]
Passed CommandCanExecuteInvokedOnChange [< 1 ms]
Passed EnablingLayoutWithDisabledChildWithBindingDoesNotEnableChild(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [3 ms]
Passed EnablingLayoutWithDisabledChildWithBindingDoesNotEnableChild(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
Passed EnablingLayoutWithDisabledChildWithBindingDoesNotEnableChild(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
Passed EnablingLayoutWithDisabledChildWithBindingDoesNotEnableChild(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
Passed DisabledLayoutDisablesChildWithCommand(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
Passed DisabledLayoutDisablesChildWithCommand(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
Passed DisabledLayoutDisablesChildWithCommand(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
Passed DisabledLayoutDisablesChildWithCommand(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [< 1 ms]
Passed ButtonClickWhenCommandCanExecuteFalse [< 1 ms]
Passed CommandUpdatesDoNotOverrideEnabled(viewEnabled: True, commandEnabled: True, expectedEnabled: False) [1 ms]
Passed CommandUpdatesDoNotOverrideEnabled(viewEnabled: True, commandEnabled: False, expectedEnabled: True) [< 1 ms]
Passed CommandUpdatesDoNotOverrideEnabled(viewEnabled: False, commandEnabled: True, expectedEnabled: False) [< 1 ms]
Passed CommandUpdatesDoNotOverrideEnabled(viewEnabled: False, commandEnabled: False, expectedEnabled: False) [< 1 ms]
Passed TestCommand [< 1 ms]
Passed EnabledLayoutDoesNotAffectChildIsEnabled(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [< 1 ms]
Passed EnabledLayoutDoesNotAffectChildIsEnabled(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
Passed EnabledLayoutDoesNotAffectChildIsEnabled(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
Passed EnabledLayoutDoesNotAffectChildIsEnabled(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
Passed EnabledUpdatesDoNotOverrideCommand(viewEnabled: True, commandEnabled: False, expectedEnabled: False) [< 1 ms]
Passed EnabledUpdatesDoNotOverrideCommand(viewEnabled: False, commandEnabled: False, expectedEnabled: False) [< 1 ms]
Passed EnabledUpdatesDoNotOverrideCommand(viewEnabled: False, commandEnabled: True, expectedEnabled: True) [< 1 ms]
Passed EnabledUpdatesDoNotOverrideCommand(viewEnabled: True, commandEnabled: True, expectedEnabled: False) [< 1 ms]
Passed DisablingLayoutDisablesChildWithBinding(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
Passed DisablingLayoutDisablesChildWithBinding(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [< 1 ms]
Passed DisablingLayoutDisablesChildWithBinding(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
Passed DisablingLayoutDisablesChildWithBinding(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
Passed EnablingLayoutWithDisabledChildWithCommandDoesNotEnableChild(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
Passed EnablingLayoutWithDisabledChildWithCommandDoesNotEnableChild(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
Passed EnablingLayoutWithDisabledChildWithCommandDoesNotEnableChild(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
Passed EnablingLayoutWithDisabledChildWithCommandDoesNotEnableChild(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [< 1 ms]
Passed EnabledAndCommandAreCorrect(viewEnabled: False, commandEnabled: True, expectedEnabled: False) [< 1 ms]
Passed EnabledAndCommandAreCorrect(viewEnabled: False, commandEnabled: False, expectedEnabled: False) [< 1 ms]
Passed EnabledAndCommandAreCorrect(viewEnabled: True, commandEnabled: True, expectedEnabled: True) [< 1 ms]
Passed EnabledAndCommandAreCorrect(viewEnabled: True, commandEnabled: False, expectedEnabled: False) [< 1 ms]
Passed AssignToFontFamilyUpdatesFont [2 ms]
Passed CommandCanExecuteInvokedOnCommandSet [< 1 ms]
Passed TestPressedEvent(isEnabled: False) [< 1 ms]
Passed TestPressedEvent(isEnabled: True) [< 1 ms]
Passed EnablingChildWithCommandDoesNotEnableChildOfDisabledLayout(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
Passed EnablingChildWithCommandDoesNotEnableChildOfDisabledLayout(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
Passed EnablingChildWithCommandDoesNotEnableChildOfDisabledLayout(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [< 1 ms]
Passed EnablingChildWithCommandDoesNotEnableChildOfDisabledLayout(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
Passed FileImageSourcePropertiesChangedDoesNotTriggerResizeWhenWidthAndHeightExplicit [< 1 ms]
Passed ReenabledAfterCommandRemoved [< 1 ms]
Passed EnabledUpdatesDoNotRemoveBindings [< 1 ms]
Passed ButtonContentLayoutTypeConverterTest [5 ms]
Passed PressedVisualState [2 ms]
Passed TestImageSourcePropertiesChangedTriggerResize [< 1 ms]
Passed ImageSourceChangeDoesNotTriggerResizeWhenWidthAndHeightExplicit [< 1 ms]
Passed ButtonCornerRadiusSetToFive [< 1 ms]
Passed ImageSourceChangeTriggersResizeWhenExplicitButLayoutAlignmentIsNotFill(setHorizontalCenter: True, setVerticalCenter: False) [< 1 ms]
Passed ImageSourceChangeTriggersResizeWhenExplicitButLayoutAlignmentIsNotFill(setHorizontalCenter: False, setVerticalCenter: True) [< 1 ms]
Passed AssignToFontAttributesUpdatesFont [< 1 ms]
Passed TestBindingContextPropagation [< 1 ms]
Passed DisablingLayoutDisablesChildWithCommand(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
Passed DisablingLayoutDisablesChildWithCommand(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
[xUnit.net 00:00:00.60] Finished: Microsoft.Maui.Controls.Core.UnitTests
Passed DisablingLayoutDisablesChildWithCommand(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
Passed DisablingLayoutDisablesChildWithCommand(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [< 1 ms]
Passed MeasureInvalidatedOnTextChange [< 1 ms]
Passed CommandUnhooksOnNull [< 1 ms]
Passed AssignToFontSizeUpdatesFont [< 1 ms]
Passed CommandCanExecuteUpdatesEnabled [< 1 ms]
Passed CommandCanExecuteInvokedOnCommandParameterSet [< 1 ms]
Test Run Successful.
Total tests: 88
Passed: 88
Total time: 0.8439 Seconds
🔴 Without fix — 🧪 ImageButtonTests: FAIL ✅ · 6s
(truncated to last 15,000 chars)
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14065311
Core -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Core/Debug/net10.0/Microsoft.Maui.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14065311
Controls.BindingSourceGen -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.BindingSourceGen/Debug/netstandard2.0/Microsoft.Maui.Controls.BindingSourceGen.dll
Maps -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Maps/Debug/net10.0/Microsoft.Maui.Maps.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14065311
Controls.Core -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Core/Debug/net10.0/Microsoft.Maui.Controls.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14065311
Controls.Xaml -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Xaml/Debug/net10.0/Microsoft.Maui.Controls.Xaml.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14065311
Controls.Maps -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Maps/Debug/net10.0/Microsoft.Maui.Controls.Maps.dll
TestUtils -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/TestUtils/Debug/netstandard2.0/Microsoft.Maui.TestUtils.dll
Controls.Core.UnitTests -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Core.UnitTests/Debug/net10.0/Microsoft.Maui.Controls.Core.UnitTests.dll
Test run for /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Core.UnitTests/Debug/net10.0/Microsoft.Maui.Controls.Core.UnitTests.dll (.NETCoreApp,Version=v10.0)
VSTest version 18.0.1 (arm64)
Starting test execution, please wait...
A total of 1 test files matched the specified pattern.
[xUnit.net 00:00:00.00] xUnit.net VSTest Adapter v2.8.2+699d445a1a (64-bit .NET 10.0.0)
[xUnit.net 00:00:00.08] Discovering: Microsoft.Maui.Controls.Core.UnitTests
[xUnit.net 00:00:00.71] Discovered: Microsoft.Maui.Controls.Core.UnitTests
[xUnit.net 00:00:00.72] Starting: Microsoft.Maui.Controls.Core.UnitTests
Passed EnablingLayoutWithDisabledChildWithBindingDoesNotEnableChild(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [18 ms]
Passed EnablingLayoutWithDisabledChildWithBindingDoesNotEnableChild(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
Passed EnablingLayoutWithDisabledChildWithBindingDoesNotEnableChild(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
Passed EnablingLayoutWithDisabledChildWithBindingDoesNotEnableChild(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
Passed DisabledLayoutDisablesChild(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [< 1 ms]
Passed DisabledLayoutDisablesChild(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
Passed DisabledLayoutDisablesChild(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
Passed DisabledLayoutDisablesChild(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
Passed TestClickedvent(isEnabled: False) [< 1 ms]
Passed TestClickedvent(isEnabled: True) [< 1 ms]
Passed CommandCanExecuteInvokedOnCommandSet [< 1 ms]
Passed EnablingChildWithCommandDoesNotEnableChildOfDisabledLayout(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
Passed EnablingChildWithCommandDoesNotEnableChildOfDisabledLayout(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
Passed EnablingChildWithCommandDoesNotEnableChildOfDisabledLayout(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
Passed EnablingChildWithCommandDoesNotEnableChildOfDisabledLayout(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [< 1 ms]
Passed CommandCanExecuteInvokedOnCommandParameterSet [< 1 ms]
Passed SourceChangeTriggersResizeWhenExplicitButLayoutAlignmentIsNotFill(setHorizontalCenter: True, setVerticalCenter: False) [4 ms]
Passed SourceChangeTriggersResizeWhenExplicitButLayoutAlignmentIsNotFill(setHorizontalCenter: False, setVerticalCenter: True) [< 1 ms]
Passed DisabledLayoutDisablesNestedChild(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
Passed DisabledLayoutDisablesNestedChild(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
Passed DisabledLayoutDisablesNestedChild(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
Passed DisabledLayoutDisablesNestedChild(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [< 1 ms]
Passed DisablingLayoutDisablesChild(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [< 1 ms]
Passed DisablingLayoutDisablesChild(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
Passed DisablingLayoutDisablesChild(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
Passed DisablingLayoutDisablesChild(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
Passed EnabledUpdatesDoNotOverrideCommand(viewEnabled: False, commandEnabled: False, expectedEnabled: False) [1 ms]
Passed EnabledUpdatesDoNotOverrideCommand(viewEnabled: True, commandEnabled: True, expectedEnabled: False) [< 1 ms]
Passed EnabledUpdatesDoNotOverrideCommand(viewEnabled: True, commandEnabled: False, expectedEnabled: False) [< 1 ms]
Passed EnabledUpdatesDoNotOverrideCommand(viewEnabled: False, commandEnabled: True, expectedEnabled: True) [< 1 ms]
Passed DisablingLayoutDisablesChildWithCommand(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [< 1 ms]
Passed DisablingLayoutDisablesChildWithCommand(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
Passed DisablingLayoutDisablesChildWithCommand(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
Passed DisablingLayoutDisablesChildWithCommand(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
Passed EnabledUpdatesDoNotRemoveBindings [< 1 ms]
Passed EnablingLayoutWithDisabledChildWithCommandDoesNotEnableChild(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
Passed EnablingLayoutWithDisabledChildWithCommandDoesNotEnableChild(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [< 1 ms]
Passed EnablingLayoutWithDisabledChildWithCommandDoesNotEnableChild(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
Passed EnablingLayoutWithDisabledChildWithCommandDoesNotEnableChild(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
Passed TestStreamImageSourcePropertiesChangedTriggerResize [< 1 ms]
Passed CommandCanExecuteModifiesEnabled(initial: True) [1 ms]
Passed CommandCanExecuteModifiesEnabled(initial: False) [< 1 ms]
Passed TestFillSizingWithConstrainedHeight [7 ms]
Passed TestSizing [< 1 ms]
Passed DisablingLayoutDisablesChildWithBinding(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [< 1 ms]
Passed DisablingLayoutDisablesChildWithBinding(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
Passed DisablingLayoutDisablesChildWithBinding(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
Passed DisablingLayoutDisablesChildWithBinding(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
Passed TestCommand [< 1 ms]
Passed EnabledLayoutDoesNotAffectChildIsEnabled(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
Passed EnabledLayoutDoesNotAffectChildIsEnabled(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [< 1 ms]
Passed EnabledLayoutDoesNotAffectChildIsEnabled(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
Passed EnabledLayoutDoesNotAffectChildIsEnabled(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
Passed CommandCanExecuteUpdatesEnabled [< 1 ms]
Passed CommandUpdatesDoNotOverrideEnabled(viewEnabled: True, commandEnabled: False, expectedEnabled: True) [< 1 ms]
Passed CommandUpdatesDoNotOverrideEnabled(viewEnabled: False, commandEnabled: True, expectedEnabled: False) [< 1 ms]
Passed CommandUpdatesDoNotOverrideEnabled(viewEnabled: False, commandEnabled: False, expectedEnabled: False) [< 1 ms]
Passed CommandUpdatesDoNotOverrideEnabled(viewEnabled: True, commandEnabled: True, expectedEnabled: False) [< 1 ms]
Passed ButtonClickWhenCommandCanExecuteFalse [< 1 ms]
Passed TestFileImageSourcePropertiesChangedTriggerResize [< 1 ms]
Passed TestSource [< 1 ms]
Passed TestSizeChanged [< 1 ms]
Passed TestPressedEvent(isEnabled: False) [< 1 ms]
Passed TestPressedEvent(isEnabled: True) [< 1 ms]
Passed DisabledLayoutDisablesChildWithCommand(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [< 1 ms]
Passed DisabledLayoutDisablesChildWithCommand(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
Passed DisabledLayoutDisablesChildWithCommand(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
Passed DisabledLayoutDisablesChildWithCommand(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
Passed CommandUnhooksOnNull [< 1 ms]
Passed EnablingChildDoesNotEnableChildOfDisabledLayout(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
Passed EnablingChildDoesNotEnableChildOfDisabledLayout(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [< 1 ms]
Passed EnablingChildDoesNotEnableChildOfDisabledLayout(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
[xUnit.net 00:00:00.79] SourceChangeDoesNotTriggerResizeWhenWidthAndHeightExplicit [FAIL]
[xUnit.net 00:00:00.79] Assert.Equal() Failure: Values differ
[xUnit.net 00:00:00.79] Expected: 0
[xUnit.net 00:00:00.79] Actual: 1
[xUnit.net 00:00:00.79] Stack Trace:
[xUnit.net 00:00:00.79] /_/src/Controls/tests/Core.UnitTests/ImageButtonUnitTest.cs(125,0): at Microsoft.Maui.Controls.Core.UnitTests.ImageButtonTests.SourceChangeDoesNotTriggerResizeWhenWidthAndHeightExplicit()
[xUnit.net 00:00:00.79] at System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(Object obj, IntPtr* args)
[xUnit.net 00:00:00.79] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr)
Passed EnablingChildDoesNotEnableChildOfDisabledLayout(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
Failed SourceChangeDoesNotTriggerResizeWhenWidthAndHeightExplicit [< 1 ms]
Error Message:
Assert.Equal() Failure: Values differ
Expected: 0
Actual: 1
Stack Trace:
at Microsoft.Maui.Controls.Core.UnitTests.ImageButtonTests.SourceChangeDoesNotTriggerResizeWhenWidthAndHeightExplicit() in /_/src/Controls/tests/Core.UnitTests/ImageButtonUnitTest.cs:line 125
at System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(Object obj, IntPtr* args)
at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr)
Passed EnabledAndCommandAreCorrect(viewEnabled: True, commandEnabled: True, expectedEnabled: True) [< 1 ms]
Passed EnabledAndCommandAreCorrect(viewEnabled: False, commandEnabled: False, expectedEnabled: False) [< 1 ms]
Passed EnabledAndCommandAreCorrect(viewEnabled: True, commandEnabled: False, expectedEnabled: False) [< 1 ms]
Passed EnabledAndCommandAreCorrect(viewEnabled: False, commandEnabled: True, expectedEnabled: False) [< 1 ms]
Passed ReenabledAfterCommandRemoved [< 1 ms]
Passed TestBindingContextPropagation [< 1 ms]
Passed TestAspectFillSizingWithConstrainedHeight [< 1 ms]
Passed SourceChangeTriggersResizeWhenWidthOrHeightIsImplicit(setWidth: True, setHeight: False) [< 1 ms]
Passed SourceChangeTriggersResizeWhenWidthOrHeightIsImplicit(setWidth: False, setHeight: True) [< 1 ms]
Passed PressedVisualState [2 ms]
Passed TestImageSourceToNullCancelsLoading [2 ms]
Passed TestFileImageSourceChanged [< 1 ms]
Passed TestAspectFillSizingWithConstrainedWidth [< 1 ms]
Passed TestImageSourcePropertiesChangedTriggerResize [< 1 ms]
Passed TestSourceDoubleSet [< 1 ms]
Passed CommandCanExecuteInvokedOnChange [< 1 ms]
[xUnit.net 00:00:00.79] Assert.False() Failure
[xUnit.net 00:00:00.79] Expected: False
[xUnit.net 00:00:00.79] Actual: True
[xUnit.net 00:00:00.79] StreamImageSourcePropertiesChangedDoesNotTriggerResizeWhenWidthAndHeightExplicit [FAIL]
[xUnit.net 00:00:00.79] Stack Trace:
[xUnit.net 00:00:00.79] /_/src/Controls/tests/Core.UnitTests/ImageButtonUnitTest.cs(296,0): at Microsoft.Maui.Controls.Core.UnitTests.ImageButtonTests.StreamImageSourcePropertiesChangedDoesNotTriggerResizeWhenWidthAndHeightExplicit()
[xUnit.net 00:00:00.79] at System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(Object obj, IntPtr* args)
[xUnit.net 00:00:00.79] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr)
[xUnit.net 00:00:00.79] FileImageSourcePropertiesChangedDoesNotTriggerResizeWhenWidthAndHeightExplicit [FAIL]
[xUnit.net 00:00:00.79] Assert.False() Failure
[xUnit.net 00:00:00.79] Expected: False
[xUnit.net 00:00:00.79] Actual: True
[xUnit.net 00:00:00.79] Stack Trace:
[xUnit.net 00:00:00.79] /_/src/Controls/tests/Core.UnitTests/ImageButtonUnitTest.cs(262,0): at Microsoft.Maui.Controls.Core.UnitTests.ImageButtonTests.FileImageSourcePropertiesChangedDoesNotTriggerResizeWhenWidthAndHeightExplicit()
[xUnit.net 00:00:00.79] at System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(Object obj, IntPtr* args)
[xUnit.net 00:00:00.79] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr)
[xUnit.net 00:00:00.80] Finished: Microsoft.Maui.Controls.Core.UnitTests
Failed StreamImageSourcePropertiesChangedDoesNotTriggerResizeWhenWidthAndHeightExplicit [< 1 ms]
Error Message:
Assert.False() Failure
Expected: False
Actual: True
Stack Trace:
at Microsoft.Maui.Controls.Core.UnitTests.ImageButtonTests.StreamImageSourcePropertiesChangedDoesNotTriggerResizeWhenWidthAndHeightExplicit() in /_/src/Controls/tests/Core.UnitTests/ImageButtonUnitTest.cs:line 296
at System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(Object obj, IntPtr* args)
at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr)
Passed TestReleasedEvent(isEnabled: False) [< 1 ms]
Passed TestReleasedEvent(isEnabled: True) [< 1 ms]
Failed FileImageSourcePropertiesChangedDoesNotTriggerResizeWhenWidthAndHeightExplicit [< 1 ms]
Error Message:
Assert.False() Failure
Expected: False
Actual: True
Stack Trace:
at Microsoft.Maui.Controls.Core.UnitTests.ImageButtonTests.FileImageSourcePropertiesChangedDoesNotTriggerResizeWhenWidthAndHeightExplicit() in /_/src/Controls/tests/Core.UnitTests/ImageButtonUnitTest.cs:line 262
at System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(Object obj, IntPtr* args)
at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr)
Passed TestAspectSizingWithConstrainedWidth [< 1 ms]
Passed TestAspectSizingWithConstrainedHeight [< 1 ms]
Passed TestFillSizingWithConstrainedWidth [< 1 ms]
Test Run Failed.
Total tests: 97
Passed: 94
Failed: 3
Total time: 1.1297 Seconds
🟢 With fix — 🧪 ImageButtonTests: PASS ✅ · 5s
Determining projects to restore...
All projects are up-to-date for restore.
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14065311
Graphics -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Graphics/Debug/net10.0/Microsoft.Maui.Graphics.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14065311
Essentials -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Essentials/Debug/net10.0/Microsoft.Maui.Essentials.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14065311
Core -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Core/Debug/net10.0/Microsoft.Maui.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14065311
Controls.BindingSourceGen -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.BindingSourceGen/Debug/netstandard2.0/Microsoft.Maui.Controls.BindingSourceGen.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14065311
Maps -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Maps/Debug/net10.0/Microsoft.Maui.Maps.dll
Controls.Core -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Core/Debug/net10.0/Microsoft.Maui.Controls.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14065311
Controls.Xaml -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Xaml/Debug/net10.0/Microsoft.Maui.Controls.Xaml.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14065311
Controls.Maps -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Maps/Debug/net10.0/Microsoft.Maui.Controls.Maps.dll
TestUtils -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/TestUtils/Debug/netstandard2.0/Microsoft.Maui.TestUtils.dll
Controls.Core.UnitTests -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Core.UnitTests/Debug/net10.0/Microsoft.Maui.Controls.Core.UnitTests.dll
Test run for /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Core.UnitTests/Debug/net10.0/Microsoft.Maui.Controls.Core.UnitTests.dll (.NETCoreApp,Version=v10.0)
VSTest version 18.0.1 (arm64)
Starting test execution, please wait...
A total of 1 test files matched the specified pattern.
[xUnit.net 00:00:00.00] xUnit.net VSTest Adapter v2.8.2+699d445a1a (64-bit .NET 10.0.0)
[xUnit.net 00:00:00.08] Discovering: Microsoft.Maui.Controls.Core.UnitTests
[xUnit.net 00:00:00.59] Discovered: Microsoft.Maui.Controls.Core.UnitTests
[xUnit.net 00:00:00.59] Starting: Microsoft.Maui.Controls.Core.UnitTests
Passed EnablingLayoutWithDisabledChildWithBindingDoesNotEnableChild(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [14 ms]
Passed EnablingLayoutWithDisabledChildWithBindingDoesNotEnableChild(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
Passed EnablingLayoutWithDisabledChildWithBindingDoesNotEnableChild(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
Passed EnablingLayoutWithDisabledChildWithBindingDoesNotEnableChild(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
Passed DisabledLayoutDisablesChild(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [< 1 ms]
Passed DisabledLayoutDisablesChild(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
Passed DisabledLayoutDisablesChild(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
Passed DisabledLayoutDisablesChild(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
Passed TestClickedvent(isEnabled: False) [< 1 ms]
Passed TestClickedvent(isEnabled: True) [< 1 ms]
Passed CommandCanExecuteInvokedOnCommandSet [< 1 ms]
Passed EnablingChildWithCommandDoesNotEnableChildOfDisabledLayout(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
Passed EnablingChildWithCommandDoesNotEnableChildOfDisabledLayout(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
Passed EnablingChildWithCommandDoesNotEnableChildOfDisabledLayout(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
Passed EnablingChildWithCommandDoesNotEnableChildOfDisabledLayout(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [< 1 ms]
Passed CommandCanExecuteInvokedOnCommandParameterSet [< 1 ms]
Passed SourceChangeTriggersResizeWhenExplicitButLayoutAlignmentIsNotFill(setHorizontalCenter: True, setVerticalCenter: False) [3 ms]
Passed SourceChangeTriggersResizeWhenExplicitButLayoutAlignmentIsNotFill(setHorizontalCenter: False, setVerticalCenter: True) [< 1 ms]
Passed DisabledLayoutDisablesNestedChild(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
Passed DisabledLayoutDisablesNestedChild(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
Passed DisabledLayoutDisablesNestedChild(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
Passed DisabledLayoutDisablesNestedChild(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [< 1 ms]
Passed DisablingLayoutDisablesChild(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [< 1 ms]
Passed DisablingLayoutDisablesChild(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
Passed DisablingLayoutDisablesChild(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
Passed DisablingLayoutDisablesChild(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
Passed EnabledUpdatesDoNotOverrideCommand(viewEnabled: False, commandEnabled: False, expectedEnabled: False) [1 ms]
Passed EnabledUpdatesDoNotOverrideCommand(viewEnabled: True, commandEnabled: True, expectedEnabled: False) [< 1 ms]
Passed EnabledUpdatesDoNotOverrideCommand(viewEnabled: True, commandEnabled: False, expectedEnabled: False) [< 1 ms]
Passed EnabledUpdatesDoNotOverrideCommand(viewEnabled: False, commandEnabled: True, expectedEnabled: True) [< 1 ms]
Passed DisablingLayoutDisablesChildWithCommand(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [< 1 ms]
Passed DisablingLayoutDisablesChildWithCommand(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
Passed DisablingLayoutDisablesChildWithCommand(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
Passed DisablingLayoutDisablesChildWithCommand(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
Passed EnabledUpdatesDoNotRemoveBindings [< 1 ms]
Passed EnablingLayoutWithDisabledChildWithCommandDoesNotEnableChild(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
Passed EnablingLayoutWithDisabledChildWithCommandDoesNotEnableChild(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [< 1 ms]
Passed EnablingLayoutWithDisabledChildWithCommandDoesNotEnableChild(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
Passed EnablingLayoutWithDisabledChildWithCommandDoesNotEnableChild(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
Passed TestStreamImageSourcePropertiesChangedTriggerResize [< 1 ms]
Passed CommandCanExecuteModifiesEnabled(initial: True) [1 ms]
Passed CommandCanExecuteModifiesEnabled(initial: False) [< 1 ms]
Passed TestFillSizingWithConstrainedHeight [6 ms]
Passed TestSizing [< 1 ms]
Passed DisablingLayoutDisablesChildWithBinding(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [< 1 ms]
Passed DisablingLayoutDisablesChildWithBinding(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
Passed DisablingLayoutDisablesChildWithBinding(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
Passed DisablingLayoutDisablesChildWithBinding(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
Passed TestCommand [< 1 ms]
Passed EnabledLayoutDoesNotAffectChildIsEnabled(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
Passed EnabledLayoutDoesNotAffectChildIsEnabled(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [< 1 ms]
Passed EnabledLayoutDoesNotAffectChildIsEnabled(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
Passed EnabledLayoutDoesNotAffectChildIsEnabled(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
Passed CommandCanExecuteUpdatesEnabled [< 1 ms]
Passed CommandUpdatesDoNotOverrideEnabled(viewEnabled: True, commandEnabled: False, expectedEnabled: True) [< 1 ms]
Passed CommandUpdatesDoNotOverrideEnabled(viewEnabled: False, commandEnabled: True, expectedEnabled: False) [< 1 ms]
Passed CommandUpdatesDoNotOverrideEnabled(viewEnabled: False, commandEnabled: False, expectedEnabled: False) [< 1 ms]
Passed CommandUpdatesDoNotOverrideEnabled(viewEnabled: True, commandEnabled: True, expectedEnabled: False) [< 1 ms]
Passed ButtonClickWhenCommandCanExecuteFalse [< 1 ms]
Passed TestFileImageSourcePropertiesChangedTriggerResize [< 1 ms]
Passed TestSource [< 1 ms]
Passed TestSizeChanged [< 1 ms]
Passed TestPressedEvent(isEnabled: False) [< 1 ms]
Passed TestPressedEvent(isEnabled: True) [< 1 ms]
Passed DisabledLayoutDisablesChildWithCommand(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [< 1 ms]
Passed DisabledLayoutDisablesChildWithCommand(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
Passed DisabledLayoutDisablesChildWithCommand(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
Passed DisabledLayoutDisablesChildWithCommand(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
Passed CommandUnhooksOnNull [< 1 ms]
Passed EnablingChildDoesNotEnableChildOfDisabledLayout(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
Passed EnablingChildDoesNotEnableChildOfDisabledLayout(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [< 1 ms]
Passed EnablingChildDoesNotEnableChildOfDisabledLayout(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
Passed EnablingChildDoesNotEnableChildOfDisabledLayout(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
Passed SourceChangeDoesNotTriggerResizeWhenWidthAndHeightExplicit [< 1 ms]
Passed EnabledAndCommandAreCorrect(viewEnabled: True, commandEnabled: True, expectedEnabled: True) [< 1 ms]
Passed EnabledAndCommandAreCorrect(viewEnabled: False, commandEnabled: False, expectedEnabled: False) [< 1 ms]
Passed EnabledAndCommandAreCorrect(viewEnabled: True, commandEnabled: False, expectedEnabled: False) [< 1 ms]
Passed EnabledAndCommandAreCorrect(viewEnabled: False, commandEnabled: True, expectedEnabled: False) [< 1 ms]
Passed ReenabledAfterCommandRemoved [< 1 ms]
Passed TestBindingContextPropagation [< 1 ms]
Passed TestAspectFillSizingWithConstrainedHeight [< 1 ms]
Passed SourceChangeTriggersResizeWhenWidthOrHeightIsImplicit(setWidth: True, setHeight: False) [< 1 ms]
Passed SourceChangeTriggersResizeWhenWidthOrHeightIsImplicit(setWidth: False, setHeight: True) [< 1 ms]
Passed PressedVisualState [2 ms]
Passed TestImageSourceToNullCancelsLoading [2 ms]
Passed TestFileImageSourceChanged [< 1 ms]
Passed TestAspectFillSizingWithConstrainedWidth [< 1 ms]
Passed TestImageSourcePropertiesChangedTriggerResize [< 1 ms]
Passed TestSourceDoubleSet [< 1 ms]
Passed CommandCanExecuteInvokedOnChange [< 1 ms]
[xUnit.net 00:00:00.66] Finished: Microsoft.Maui.Controls.Core.UnitTests
Passed StreamImageSourcePropertiesChangedDoesNotTriggerResizeWhenWidthAndHeightExplicit [< 1 ms]
Passed TestReleasedEvent(isEnabled: False) [< 1 ms]
Passed TestReleasedEvent(isEnabled: True) [< 1 ms]
Passed FileImageSourcePropertiesChangedDoesNotTriggerResizeWhenWidthAndHeightExplicit [< 1 ms]
Passed TestAspectSizingWithConstrainedWidth [< 1 ms]
Passed TestAspectSizingWithConstrainedHeight [< 1 ms]
Passed TestFillSizingWithConstrainedWidth [< 1 ms]
Test Run Successful.
Total tests: 97
Passed: 97
Total time: 0.9453 Seconds
🔴 Without fix — 🧪 ImageTests: FAIL ✅ · 6s
Determining projects to restore...
All projects are up-to-date for restore.
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14065311
Graphics -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Graphics/Debug/net10.0/Microsoft.Maui.Graphics.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14065311
Essentials -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Essentials/Debug/net10.0/Microsoft.Maui.Essentials.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14065311
Core -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Core/Debug/net10.0/Microsoft.Maui.dll
Controls.BindingSourceGen -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.BindingSourceGen/Debug/netstandard2.0/Microsoft.Maui.Controls.BindingSourceGen.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14065311
Maps -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Maps/Debug/net10.0/Microsoft.Maui.Maps.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14065311
Controls.Core -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Core/Debug/net10.0/Microsoft.Maui.Controls.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14065311
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14065311
Controls.Maps -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Maps/Debug/net10.0/Microsoft.Maui.Controls.Maps.dll
Controls.Xaml -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Xaml/Debug/net10.0/Microsoft.Maui.Controls.Xaml.dll
TestUtils -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/TestUtils/Debug/netstandard2.0/Microsoft.Maui.TestUtils.dll
Controls.Core.UnitTests -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Core.UnitTests/Debug/net10.0/Microsoft.Maui.Controls.Core.UnitTests.dll
Test run for /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Core.UnitTests/Debug/net10.0/Microsoft.Maui.Controls.Core.UnitTests.dll (.NETCoreApp,Version=v10.0)
VSTest version 18.0.1 (arm64)
Starting test execution, please wait...
A total of 1 test files matched the specified pattern.
[xUnit.net 00:00:00.00] xUnit.net VSTest Adapter v2.8.2+699d445a1a (64-bit .NET 10.0.0)
[xUnit.net 00:00:00.10] Discovering: Microsoft.Maui.Controls.Core.UnitTests
[xUnit.net 00:00:00.71] Discovered: Microsoft.Maui.Controls.Core.UnitTests
[xUnit.net 00:00:00.71] Starting: Microsoft.Maui.Controls.Core.UnitTests
[xUnit.net 00:00:00.76] StreamImageSourcePropertiesChangedDoesNotTriggerResizeWhenWidthAndHeightExplicit [FAIL]
[xUnit.net 00:00:00.76] Assert.False() Failure
[xUnit.net 00:00:00.76] Expected: False
[xUnit.net 00:00:00.76] Actual: True
[xUnit.net 00:00:00.76] Stack Trace:
[xUnit.net 00:00:00.76] /_/src/Controls/tests/Core.UnitTests/ImageTests.cs(297,0): at Microsoft.Maui.Controls.Core.UnitTests.ImageTests.StreamImageSourcePropertiesChangedDoesNotTriggerResizeWhenWidthAndHeightExplicit()
[xUnit.net 00:00:00.76] at System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(Object obj, IntPtr* args)
[xUnit.net 00:00:00.76] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr)
Passed SourceChangeTriggersResizeWhenWidthOrHeightIsImplicit(setWidth: False, setHeight: True) [8 ms]
Passed SourceChangeTriggersResizeWhenWidthOrHeightIsImplicit(setWidth: True, setHeight: False) [< 1 ms]
Passed TestSourceDoubleSet [< 1 ms]
Passed TestAspectSizingWithConstrainedHeight [10 ms]
Passed TestFillSizingWithConstrainedHeight [< 1 ms]
Passed TestSizing [< 1 ms]
Passed TestFileImageSourcePropertiesChangedTriggerResize [< 1 ms]
Passed TestAspectFillSizingWithConstrainedHeight [< 1 ms]
Failed StreamImageSourcePropertiesChangedDoesNotTriggerResizeWhenWidthAndHeightExplicit [1 ms]
Error Message:
Assert.False() Failure
Expected: False
Actual: True
Stack Trace:
at Microsoft.Maui.Controls.Core.UnitTests.ImageTests.StreamImageSourcePropertiesChangedDoesNotTriggerResizeWhenWidthAndHeightExplicit() in /_/src/Controls/tests/Core.UnitTests/ImageTests.cs:line 297
at System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(Object obj, IntPtr* args)
at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr)
[xUnit.net 00:00:00.77] SourceChangeDoesNotTriggerResizeWhenWidthAndHeightExplicit [FAIL]
[xUnit.net 00:00:00.77] Assert.Equal() Failure: Values differ
[xUnit.net 00:00:00.77] Expected: 0
[xUnit.net 00:00:00.77] Actual: 1
[xUnit.net 00:00:00.77] Stack Trace:
[xUnit.net 00:00:00.77] /_/src/Controls/tests/Core.UnitTests/ImageTests.cs(127,0): at Microsoft.Maui.Controls.Core.UnitTests.ImageTests.SourceChangeDoesNotTriggerResizeWhenWidthAndHeightExplicit()
[xUnit.net 00:00:00.77] at System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(Object obj, IntPtr* args)
[xUnit.net 00:00:00.77] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr)
Passed TestStreamImageSourcePropertiesChangedTriggerResize [< 1 ms]
Passed TestSource [1 ms]
Passed TestAspectSizingWithConstrainedWidth [< 1 ms]
Passed TestFillSizingWithConstrainedWidth [< 1 ms]
Passed TestSizeChanged [< 1 ms]
Passed SourceChangeTriggersResizeWhenExplicitButLayoutAlignmentIsNotFill(setHorizontalCenter: False, setVerticalCenter: True) [< 1 ms]
Passed SourceChangeTriggersResizeWhenExplicitButLayoutAlignmentIsNotFill(setHorizontalCenter: True, setVerticalCenter: False) [< 1 ms]
Passed TestImageSourceToNullCancelsLoading [2 ms]
Failed SourceChangeDoesNotTriggerResizeWhenWidthAndHeightExplicit [1 ms]
Error Message:
Assert.Equal() Failure: Values differ
Expected: 0
Actual: 1
Stack Trace:
at Microsoft.Maui.Controls.Core.UnitTests.ImageTests.SourceChangeDoesNotTriggerResizeWhenWidthAndHeightExplicit() in /_/src/Controls/tests/Core.UnitTests/ImageTests.cs:line 127
at System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(Object obj, IntPtr* args)
at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr)
[xUnit.net 00:00:00.77] Assert.False() Failure
[xUnit.net 00:00:00.77] Expected: False
[xUnit.net 00:00:00.77] FileImageSourcePropertiesChangedDoesNotTriggerResizeWhenWidthAndHeightExplicit [FAIL]
[xUnit.net 00:00:00.77] Actual: True
[xUnit.net 00:00:00.77] Stack Trace:
[xUnit.net 00:00:00.77] /_/src/Controls/tests/Core.UnitTests/ImageTests.cs(264,0): at Microsoft.Maui.Controls.Core.UnitTests.ImageTests.FileImageSourcePropertiesChangedDoesNotTriggerResizeWhenWidthAndHeightExplicit()
[xUnit.net 00:00:00.77] at System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(Object obj, IntPtr* args)
[xUnit.net 00:00:00.77] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr)
[xUnit.net 00:00:00.77] Finished: Microsoft.Maui.Controls.Core.UnitTests
Failed FileImageSourcePropertiesChangedDoesNotTriggerResizeWhenWidthAndHeightExplicit [< 1 ms]
Error Message:
Assert.False() Failure
Expected: False
Actual: True
Stack Trace:
at Microsoft.Maui.Controls.Core.UnitTests.ImageTests.FileImageSourcePropertiesChangedDoesNotTriggerResizeWhenWidthAndHeightExplicit() in /_/src/Controls/tests/Core.UnitTests/ImageTests.cs:line 264
at System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(Object obj, IntPtr* args)
at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr)
Passed TestFileImageSourceChanged [< 1 ms]
Passed TestAspectFillSizingWithConstrainedWidth [< 1 ms]
Test Run Failed.
Total tests: 21
Passed: 18
Failed: 3
Total time: 1.0904 Seconds
🟢 With fix — 🧪 ImageTests: PASS ✅ · 5s
Determining projects to restore...
All projects are up-to-date for restore.
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14065311
Graphics -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Graphics/Debug/net10.0/Microsoft.Maui.Graphics.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14065311
Essentials -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Essentials/Debug/net10.0/Microsoft.Maui.Essentials.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14065311
Core -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Core/Debug/net10.0/Microsoft.Maui.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14065311
Controls.BindingSourceGen -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.BindingSourceGen/Debug/netstandard2.0/Microsoft.Maui.Controls.BindingSourceGen.dll
Maps -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Maps/Debug/net10.0/Microsoft.Maui.Maps.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14065311
Controls.Core -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Core/Debug/net10.0/Microsoft.Maui.Controls.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14065311
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14065311
Controls.Xaml -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Xaml/Debug/net10.0/Microsoft.Maui.Controls.Xaml.dll
Controls.Maps -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Maps/Debug/net10.0/Microsoft.Maui.Controls.Maps.dll
TestUtils -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/TestUtils/Debug/netstandard2.0/Microsoft.Maui.TestUtils.dll
Controls.Core.UnitTests -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Core.UnitTests/Debug/net10.0/Microsoft.Maui.Controls.Core.UnitTests.dll
Test run for /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Core.UnitTests/Debug/net10.0/Microsoft.Maui.Controls.Core.UnitTests.dll (.NETCoreApp,Version=v10.0)
VSTest version 18.0.1 (arm64)
Starting test execution, please wait...
A total of 1 test files matched the specified pattern.
[xUnit.net 00:00:00.00] xUnit.net VSTest Adapter v2.8.2+699d445a1a (64-bit .NET 10.0.0)
[xUnit.net 00:00:00.06] Discovering: Microsoft.Maui.Controls.Core.UnitTests
[xUnit.net 00:00:00.58] Discovered: Microsoft.Maui.Controls.Core.UnitTests
[xUnit.net 00:00:00.59] Starting: Microsoft.Maui.Controls.Core.UnitTests
Passed SourceChangeTriggersResizeWhenWidthOrHeightIsImplicit(setWidth: False, setHeight: True) [7 ms]
Passed SourceChangeTriggersResizeWhenWidthOrHeightIsImplicit(setWidth: True, setHeight: False) [< 1 ms]
Passed TestSourceDoubleSet [< 1 ms]
Passed TestAspectSizingWithConstrainedHeight [11 ms]
Passed TestFillSizingWithConstrainedHeight [< 1 ms]
Passed TestSizing [< 1 ms]
Passed TestFileImageSourcePropertiesChangedTriggerResize [< 1 ms]
Passed TestAspectFillSizingWithConstrainedHeight [< 1 ms]
Passed StreamImageSourcePropertiesChangedDoesNotTriggerResizeWhenWidthAndHeightExplicit [< 1 ms]
Passed TestStreamImageSourcePropertiesChangedTriggerResize [< 1 ms]
Passed TestSource [1 ms]
Passed TestAspectSizingWithConstrainedWidth [< 1 ms]
Passed TestFillSizingWithConstrainedWidth [< 1 ms]
Passed TestSizeChanged [< 1 ms]
Passed SourceChangeTriggersResizeWhenExplicitButLayoutAlignmentIsNotFill(setHorizontalCenter: False, setVerticalCenter: True) [< 1 ms]
Passed SourceChangeTriggersResizeWhenExplicitButLayoutAlignmentIsNotFill(setHorizontalCenter: True, setVerticalCenter: False) [< 1 ms]
Passed TestImageSourceToNullCancelsLoading [3 ms]
Passed SourceChangeDoesNotTriggerResizeWhenWidthAndHeightExplicit [< 1 ms]
[xUnit.net 00:00:00.64] Finished: Microsoft.Maui.Controls.Core.UnitTests
Passed FileImageSourcePropertiesChangedDoesNotTriggerResizeWhenWidthAndHeightExplicit [< 1 ms]
Passed TestFileImageSourceChanged [< 1 ms]
Passed TestAspectFillSizingWithConstrainedWidth [< 1 ms]
Test Run Successful.
Total tests: 21
Passed: 21
Total time: 0.9358 Seconds
📁 Fix files reverted (2 files)
src/Controls/src/Core/ImageElement.cssrc/Core/src/Handlers/Image/ImageHandler.iOS.cs
🧪 UI Tests — ViewBaseTests
Detected UI test categories: ViewBaseTests
🧪 UI Test Execution Results
⏭️ SKIPPED — 0 passed, 0 failed, 1 skipped (platform: ios)
| Category | Result | Tests | Duration | Notes |
|---|---|---|---|---|
ViewBaseTests |
⏭️ SKIPPED | — | 0s | Runner threw an exception |
Failures here are informational only — they do not block the gate or affect try-fix candidate scoring.
✅ Deep UI tests — 112 passed, 0 failed across 1 category on platform-pool agent (replaces in-process counts above).
🧪 UI Test Execution Results (deep, platform pool)
| Category | Tests | Snapshot diffs |
|---|---|---|
ios_ui_tests-controls-ViewBaseTests |
112/112 ✓ | — |
| 📎 Download drop-deep-uitests artifact (TRX + snapshot diffs) |
🔍 Pre-Flight — Context & Validation
Pre-Flight — PR #35369
Issue Summary (#32457)
Rapid ImageSource swaps thrash the layout system. Every source change calls
InvalidateMeasureInternal(MeasureChanged), which propagates a full measure/arrange up
the visual tree even when the view's measured size cannot change (explicit width/height,
Fill alignment). In a virtualized CollectionView of images this drops frame rates
dramatically (~26 FPS reported on iOS device vs. ~60 FPS with a Skia control that does
not request relayout).
PR Summary
Title: Avoid image source layout invalidation for fixed-size views
Author: AdamEssenmacher (community, also the issue author)
Base: main · Head: issue-32457 @ 8480ac8
Files: 6 (+598 / −4)
Approach
Skip InvalidateMeasureInternal from the image-source change path when the view's
measured size cannot change. The "size is locked" predicate
(SourceCouldChangeMeasuredSize → returns false only when):
WidthRequestis explicit (Dimension.IsExplicitSet(view.Width)), ANDHeightRequestis explicit, ANDHorizontalLayoutAlignment == Fill, ANDVerticalLayoutAlignment == Fill.
Two call sites updated:
ImageElement.ImageSourceChanged/ImageSourceSourceChanged(Controls — covers
Image,ImageButton,Button.ImageSource).ImageHandler.iOS.SetImageSourcestream-image post-load path (Core — iOS only).
Files Changed
| # | File | Kind | Notes |
|---|---|---|---|
| 1 | src/Controls/src/Core/ImageElement.cs |
src | adds SourceCouldChangeMeasuredSize and gates both invalidation call sites |
| 2 | src/Core/src/Handlers/Image/ImageHandler.iOS.cs |
src/iOS | gates stream-image InvalidateMeasure(image) |
| 3 | src/Controls/tests/Core.UnitTests/ButtonUnitTest.cs |
test | regression tests |
| 4 | src/Controls/tests/Core.UnitTests/ImageButtonUnitTest.cs |
test | regression tests |
| 5 | src/Controls/tests/Core.UnitTests/ImageTests.cs |
test | regression tests |
| 6 | src/Core/tests/Benchmarks/Benchmarks/ImageSourceBenchmarker.cs |
bench | new BDN benchmark |
Platform Classification
| Platform | Touched | Notes |
|---|---|---|
| Cross-platform | ✅ | ImageElement.cs covers Android/iOS/Windows/MacCatalyst |
| iOS / MacCatalyst | ✅ | ImageHandler.iOS.cs stream-source path |
| Android | unchanged in handler — Android image handler does its own measure invalidation; issue reproduces there too but PR does not touch it. Open question whether the cross-platform ImageElement gating is sufficient on Android. |
|
| Windows | unchanged in handler |
Gate Result (from caller)
✅ PASSED — added unit tests FAIL without the fix and PASS with it.
Code-Review Summary (see code-review.md)
- Verdict: NEEDS_DISCUSSION (confidence: medium)
- Errors: none — fix is correct under stated invariants.
- Warnings:
- Cross-platform fix only validated by unit tests on the cross-platform code path; the iOS-handler change is exercised only indirectly. No device/UI regression test for actual rendering.
SourceCouldChangeMeasuredSize(imageElement)dereferences(IView)imageElementbefore the null-conditional?.later in the caller; ifbindableis ever null (was previously tolerated byimageElement?.…), this would NRE. Low likelihood, but the previous code defended against it.- Android-side image source swaps continue to trigger handler-level layout work; PR addresses cross-platform layer but not the parallel Android-specific path.
- Failure-mode probes (advisory for try-fix):
- Implicit
Width/Height(most common scenario) → still invalidates ✅ WidthRequest/HeightRequestset but alignment Start/Center/End → still invalidates ✅- Explicit size + Fill on both axes → invalidation skipped ✅ (the new hot path)
- First image load on a stream source where intrinsic size would change layout because the view was previously unmeasured → guarded by same predicate; correct because explicit size locks the box.
- Implicit
- Blast radius: runs on every
ImageSourcechange for everyImage/ImageButton/Buttonand every stream-source post-load on iOS. Hot path on scrolling galleries.
Suggested hints for Try-Fix
- Alternative gating dimensions: check
view.Width/Heightset state viaDimension.IsExplicitSetversus checkingIView.Width/Heightactual values; the latter can be NaN before first measure. - Could also be gated at the
Imagemapper level (ImageMapper.UpdateSource) instead ofImageElement. - Consider
IImageElement.Aspect != AspectFill/AspectFitinterplay — does aspect mode affect whether the rendered area could change? Under explicit width/height + Fill the layout box is fixed, but the content still respects aspect. - Android parity: the same gating could be applied in
ImageHandler.Android.csif it independently callsInvalidateMeasure.
🔧 Fix — Analysis & Comparison
Try-Fix Phase — PR #35369
Four independent fix candidates generated in isolated git worktrees off origin/main.
Each tested against the PR's regression suite (imported verbatim from PR #35369).
Fix Candidates
| # | Source | Model | Approach | Test Result | Files Changed | Notes |
|---|---|---|---|---|---|---|
| 1 | try-fix-1 | claude-opus-4.6 | Generic propagation short-circuit in VisualElement.InvalidateMeasureInternal — HasFullyConstrainedSize() checks raw WidthRequest/HeightRequest + alignment, skips MeasureInvalidated event + parent bubble when MeasureChanged on a size-locked view. |
✅ PASS (9/9) | src/Controls/src/Core/VisualElement/VisualElement.cs |
Generic — benefits all controls. Wider blast radius than PR. |
| 2 | try-fix-2 | claude-sonnet-4.6 | IImage.SourceCouldAffectLayout Core extension method — same predicate as PR, lifted into src/Core/src/Core/Extensions/ImageExtensions.cs; called from ImageElement.cs + ImageHandler.iOS.cs. |
✅ PASS (24/24) | Extensions/ImageExtensions.cs (NEW), ImageElement.cs, ImageHandler.iOS.cs |
Functionally equivalent to PR — same gating predicate, refactored location. Adds a Core API surface (extension method on IImage). |
| 3 | try-fix-3 | gpt-5.3-codex | Propagation boundary via SelfConstraint (LayoutConstraint flags) + alignment in VisualElement.InvalidateMeasureInternal. Reuses MAUI's existing constraint-tracking. |
✅ PASS (9/9) | src/Controls/src/Core/VisualElement/VisualElement.cs |
Generic. Uses LayoutConstraint instead of raw request values — slightly more idiomatic. Same broader-scope risk as try-fix-1. |
| 4 | try-fix-4 | gpt-5.4 | Early-return guard placed at the top of VisualElement.InvalidateMeasureInternal using Constraint == LayoutConstraint.Fixed. Skips InvalidateMeasureCache AND propagation. |
✅ PASS (9/9) | src/Controls/src/Core/VisualElement/VisualElement.cs |
More aggressive than try-fix-1/-3 — also skips local measure cache invalidation. Could mask edge cases where the cache should be invalidated even if propagation isn't needed. |
| PR | PR #35369 | Adam Essenmacher | Image-specific gating: SourceCouldChangeMeasuredSize (explicit W+H + both Fill) at three call sites in ImageElement.cs (×2) and ImageHandler.iOS.cs (×1). |
✅ PASSED (Gate) | ImageElement.cs, ImageHandler.iOS.cs |
Surgical, narrow scope. Doesn't help non-image controls. |
| pr-plus-reviewer | maui-expert-reviewer | claude-opus-4.6 | PR + reviewer's brace-indentation fix on ImageHandler.iOS.cs (cosmetic but improves readability of the new method). |
✅ PASSED (same tests) | Same 2 source files | Functionally identical to PR; minor formatting only. |
Cross-Pollination
| Model | Round | New Ideas? | Details |
|---|---|---|---|
| claude-opus-4.6 | 1 | — | Produced generic propagation short-circuit (try-fix-1). |
| claude-sonnet-4.6 | 1 | — | Lifted PR's predicate into Core extension (try-fix-2). Did NOT meaningfully diverge from the PR's logic. |
| gpt-5.3-codex | 1 | — | Produced propagation boundary via SelfConstraint (try-fix-3). |
| gpt-5.4 | 1 | — | Produced top-of-method early return on LayoutConstraint.Fixed (try-fix-4). |
| All | 2 | No new ideas | The three generic candidates (try-fix-1/-3/-4) converged on the same architectural insight (propagation-level gating) with mechanical variations. The handler-extension variant (try-fix-2) re-states the PR's logic at a different layer. Further rounds unlikely to surface a genuinely novel direction. |
Exhausted: Yes (all 4 models produced candidates; 3 converged on generic VisualElement gating, 1 on the PR's predicate-at-Core-extension).
Selected Fix
pr-plus-reviewer — the PR's fix with the expert reviewer's cosmetic brace-indent
correction applied. See report/content.md for the full comparative rationale.
Headline reasoning: All four try-fix candidates passed the regression suite, but the
three generic VisualElement-level variants (try-fix-1/-3/-4) change behaviour for every
control with explicit size + Fill, not just images. That's a much larger blast radius
than the PR's image-specific gating and would require its own multi-control regression
investigation before merge. try-fix-2 is functionally equivalent to the PR but adds a new
Core API surface (IImage extension), which is unnecessary churn for this fix. The PR
plus the reviewer's brace-indent cleanup is the smallest, safest, and well-tested change.
📋 Report — Final Recommendation
Phase 3 — Comparative Report — PR #35369
Candidates Evaluated
| Candidate | Approach | Test Verdict | Blast Radius | Key Concern |
|---|---|---|---|---|
| pr | Image-specific gating: SourceCouldChangeMeasuredSize private helper at three sites (ImageElement.cs ×2, ImageHandler.iOS.cs ×1) |
✅ PASSED (Gate) | Narrow — only image source changes | Minor brace-indent ambiguity in ImageHandler.iOS.cs (noted by expert reviewer) |
| pr-plus-reviewer | PR + 1-line brace-indentation cleanup in ImageHandler.iOS.cs |
✅ PASSED (Gate) | Narrow — same as PR | None functional |
| try-fix-1 | Generic gate in VisualElement.InvalidateMeasureInternal using WidthRequest/HeightRequest/HorizontalOptions/VerticalOptions |
✅ PASS (9/9) | WIDE — affects every control with explicit size + Fill | Behaviour change for all view types, not just images. Suppresses MeasureInvalidated event for any MeasureChanged trigger. Needs broad regression coverage. |
| try-fix-2 | Same predicate as PR, hoisted into a new IImage.SourceCouldAffectLayout extension in Core |
✅ PASS (24/24) | Narrow — same as PR | Adds Core API surface (ImageExtensions) for a single internal usage; |
| try-fix-3 | Generic propagation boundary in VisualElement.InvalidateMeasureInternal keyed on SelfConstraint flags + alignment |
✅ PASS (9/9) | WIDE — same risk surface as try-fix-1 | Same as try-fix-1 |
| try-fix-4 | Generic early-return at top of VisualElement.InvalidateMeasureInternal using Constraint == LayoutConstraint.Fixed; also skips InvalidateMeasureCache() |
✅ PASS (9/9) | WIDE + AGGRESSIVE — additionally bypasses local measure-cache invalidation | Highest risk — measure cache is normally invalidated on every MeasureChanged; suppressing that could surface stale DesiredSize reads in unrelated code paths |
Comparative Analysis
Why the three generic candidates (try-fix-1, -3, -4) are NOT ranked above the PR
All three rewrite VisualElement.InvalidateMeasureInternal to short-circuit MeasureChanged
propagation whenever a view has both explicit WidthRequest/HeightRequest and
Fill/Fill alignment. This is intellectually attractive — it fixes the bug for every
control, not just images — but it has a fundamentally different risk profile:
- Behavioural change for non-image scenarios. Any control whose layout system relies
onMeasureChangedpropagating up under fixed-size+Fill conditions will silently
change behaviour. Examples that could be affected:- A
LabelwithWidthRequest=100, HeightRequest=40, HorizontalOptions=Fill, VerticalOptions=Fillthat updates itsText: under the generic fix, parent
InvalidateMeasureis skipped. In most cases this is fine, but custom layouts that
subscribe toMeasureInvalidatedwould no longer be notified. - Custom views or third-party controls that depend on the existing contract.
- A
- No additional regression coverage. The candidates passed the PR's own image-specific
tests, but they ALSO change behaviour for non-image controls and added zero new
tests for those scenarios. - The PR's diagnosis is correct and narrowly scoped. The bug is specifically about
image source swaps. Fixing it at the image layer is the minimal, locally-reasoned
change. Generalising the fix is a separate, larger design decision that deserves its
own PR with its own regression suite. - try-fix-4 additionally skips the local measure cache invalidation. This is more
aggressive still —InvalidateMeasureCache()is normally run on everyMeasureChanged
regardless of propagation. Suppressing it can leave staleDesiredSizevalues
readable to callers between layout passes.
Why try-fix-2 is functionally equivalent to the PR (not better)
try-fix-2 uses the same predicate (explicit W+H + Fill+Fill) and the same call sites
(both ImageElement.cs invalidations + the iOS handler stream-source invalidation). The
only difference is location: it lives in src/Core/src/Core/Extensions/ImageExtensions.cs
as an IImage extension. The PR's helper is a private static on ImageElement. Both are
internal helpers. There is no concrete reuse today that would justify the extra Core
extension API; the PR keeps the predicate co-located with its only callers.
Why pr-plus-reviewer wins over plain pr
The expert reviewer (maui-expert-reviewer at claude-opus-4.6) ran a 30-dimension audit
and surfaced a single moderate finding: in ImageHandler.iOS.cs the new expression-bodied
method's closing context made the trailing brace at \t\t} look like a method-closing
brace, when in fact it closes the outer class. The reviewer applied a 1-line indentation
fix. This is a strict superset of the PR with zero behavioural change.
Decision
Winner: pr-plus-reviewer
- Smallest diff among passing candidates with the correct conservative scope.
- Includes the expert reviewer's readability fix for the iOS handler.
- All regression tests pass (gate-verified).
- Does not introduce broad VisualElement behavioural changes that lack regression coverage.
Recommendation to the PR Author
- Apply the brace-indent fix on
src/Core/src/Handlers/Image/ImageHandler.iOS.cs:83-84
(seeexpert-pr-eval/content.mdfor diff hint). - (Optional / follow-up) The generic-propagation idea (try-fix-1/-3) is interesting
and worth a separate exploratory issue/PR with broader (non-image) regression coverage
— but it is not a substitute for this fix. - (Optional) Consider parity for Android (
ImageHandler.Android.cs) — the PR fixes the
cross-platformImageElementpath which benefits Android, but if the Android handler
has its own analogous post-load invalidation it would not be gated.
### Description of Change This PR avoids invalidating layout when an `ImageSource` changes for image-backed controls whose measured size cannot change: both width and height are explicit and both layout alignments are `Fill`. The fix preserves measure invalidation when the image source can still affect measured size, including: - implicit width or height - non-`Fill` horizontal or vertical alignment - iOS stream image post-load sizing paths Added regression coverage for `Image`, `ImageButton`, and `Button`, plus BenchmarkDotNet coverage for the source-swap layout invalidation path. BenchmarkDotNet results for the layout-proxy benchmark: | Scenario | Before | After | |---|---:|---:| | Auto-sized image source swaps | 2.875 ms, 1.59 MB | 2.926 ms, 1630.47 KB | | Explicitly sized image source swaps | 4.189 ms, 1.59 MB | 62.08 us, 71.88 KB | Validation performed: - `dotnet test ./src/Controls/tests/Core.UnitTests/Controls.Core.UnitTests.csproj` - `dotnet build ./src/Core/src/Core.csproj -f net10.0-ios26.0 -c Debug` - `dotnet build ./src/Core/tests/Benchmarks/Core.Benchmarks.csproj -c Release` - BenchmarkDotNet default job for `ImageSourceLayoutBenchmarker` ### Issues Fixed Fixes #32457 ---------
### Description of Change This PR avoids invalidating layout when an `ImageSource` changes for image-backed controls whose measured size cannot change: both width and height are explicit and both layout alignments are `Fill`. The fix preserves measure invalidation when the image source can still affect measured size, including: - implicit width or height - non-`Fill` horizontal or vertical alignment - iOS stream image post-load sizing paths Added regression coverage for `Image`, `ImageButton`, and `Button`, plus BenchmarkDotNet coverage for the source-swap layout invalidation path. BenchmarkDotNet results for the layout-proxy benchmark: | Scenario | Before | After | |---|---:|---:| | Auto-sized image source swaps | 2.875 ms, 1.59 MB | 2.926 ms, 1630.47 KB | | Explicitly sized image source swaps | 4.189 ms, 1.59 MB | 62.08 us, 71.88 KB | Validation performed: - `dotnet test ./src/Controls/tests/Core.UnitTests/Controls.Core.UnitTests.csproj` - `dotnet build ./src/Core/src/Core.csproj -f net10.0-ios26.0 -c Debug` - `dotnet build ./src/Core/tests/Benchmarks/Core.Benchmarks.csproj -c Release` - BenchmarkDotNet default job for `ImageSourceLayoutBenchmarker` ### Issues Fixed Fixes #32457 ---------
Description of Change
This PR avoids invalidating layout when an
ImageSourcechanges for image-backed controls whose measured size cannot change: both width and height are explicit and both layout alignments areFill.The fix preserves measure invalidation when the image source can still affect measured size, including:
Fillhorizontal or vertical alignmentAdded regression coverage for
Image,ImageButton, andButton, plus BenchmarkDotNet coverage for the source-swap layout invalidation path.BenchmarkDotNet results for the layout-proxy benchmark:
Validation performed:
dotnet test ./src/Controls/tests/Core.UnitTests/Controls.Core.UnitTests.csprojdotnet build ./src/Core/src/Core.csproj -f net10.0-ios26.0 -c Debugdotnet build ./src/Core/tests/Benchmarks/Core.Benchmarks.csproj -c ReleaseImageSourceLayoutBenchmarkerIssues Fixed
Fixes #32457