Fix hot reload server not launch after App run

Fix state not update UI after it added to global properties
Fix test cases build issue
This commit is contained in:
Jesse 2023-03-26 22:44:13 +11:00
Родитель a8d1db7f6b
Коммит 33122cdfaf
15 изменённых файлов: 196 добавлений и 127 удалений

2
External/Maui поставляемый

@ -1 +1 @@
Subproject commit 439853d004681b16a5ff20d0c16903606d1a77ee Subproject commit 10edb9416a9fe2832748fd9c9c76e683cd9b0d25

Просмотреть файл

@ -1,6 +1,6 @@
{ {
"tools": { "tools": {
"dotnet": "6.0.100-rc.2.21478.25" "dotnet": "6.0.100"
}, },
"msbuild-sdks": { "msbuild-sdks": {
"MSBuild.Sdk.Extras": "3.0.23", "MSBuild.Sdk.Extras": "3.0.23",

Просмотреть файл

@ -40,6 +40,8 @@ namespace Comet
public int IdePort { get; set; } = 9988; public int IdePort { get; set; } = 9988;
int _attempts = 3;
public async void Initialize(IServiceProvider services) public async void Initialize(IServiceProvider services)
{ {
var handlers = services.GetRequiredService<IMauiHandlersFactory>(); var handlers = services.GetRequiredService<IMauiHandlersFactory>();
@ -60,6 +62,14 @@ namespace Comet
{ {
var success = await Reloadify.Reload.Init(IdeIp, IdePort); var success = await Reloadify.Reload.Init(IdeIp, IdePort);
while(!success && _attempts > 0)
{
await Task.Delay(TimeSpan.FromSeconds(5));
Console.WriteLine("Trying to connect HotReload server....");
success = await Reloadify.Reload.Init(IdeIp, IdePort);
_attempts--;
}
Console.WriteLine($"HotReload Initialize: {success}"); Console.WriteLine($"HotReload Initialize: {success}");
} }
catch (Exception ex) catch (Exception ex)

Просмотреть файл

@ -13,6 +13,7 @@ namespace Comet
public static readonly Alignment Top = new Alignment(LayoutAlignment.Center, LayoutAlignment.Start); public static readonly Alignment Top = new Alignment(LayoutAlignment.Center, LayoutAlignment.Start);
public static readonly Alignment TopLeading = new Alignment(LayoutAlignment.Start, LayoutAlignment.Start); public static readonly Alignment TopLeading = new Alignment(LayoutAlignment.Start, LayoutAlignment.Start);
public static readonly Alignment TopTrailing = new Alignment(LayoutAlignment.End, LayoutAlignment.Start); public static readonly Alignment TopTrailing = new Alignment(LayoutAlignment.End, LayoutAlignment.Start);
public static readonly Alignment Fill = new Alignment(LayoutAlignment.Fill, LayoutAlignment.Fill);
public Alignment(LayoutAlignment horizontal, LayoutAlignment vertical) public Alignment(LayoutAlignment horizontal, LayoutAlignment vertical)
{ {

Просмотреть файл

@ -141,8 +141,6 @@ namespace Comet
{ {
changeDictionary[fullProperty] = value; changeDictionary[fullProperty] = value;
UpdatePropertyChangeProperty(view, fullProperty, value); UpdatePropertyChangeProperty(view, fullProperty, value);
if (GlobalProperties.Contains(property))
return false;
if (ViewUpdateProperties.TryGetValue((property.BindingObject, property.PropertyName), out var bindings)) if (ViewUpdateProperties.TryGetValue((property.BindingObject, property.PropertyName), out var bindings))
{ {
foreach (var binding in bindings.ToList()) foreach (var binding in bindings.ToList())
@ -150,6 +148,10 @@ namespace Comet
binding.Binding.BindingValueChanged(property.BindingObject, binding.PropertyName, value); binding.Binding.BindingValueChanged(property.BindingObject, binding.PropertyName, value);
} }
} }
if (GlobalProperties.Contains(property))
{
return false;
}
return true; return true;
} }
} }

Просмотреть файл

@ -428,7 +428,8 @@ namespace Comet
//Get the current MauiContext //Get the current MauiContext
//I might be able to do something better, like searching up though the parent //I might be able to do something better, like searching up though the parent
//Maybe I can do something where I get the current Context whenever I build //Maybe I can do something where I get the current Context whenever I build
var mauiContext = this.ViewHandler?.MauiContext ?? CometApp.CurrentWindow?.MauiContext; //In test project, we don't assign the CurrentWindows to have the MauiContext
var mauiContext = GetMauiContext();
if (mauiContext != null) if (mauiContext != null)
{ {
var type = this.GetType(); var type = this.GetType();
@ -620,6 +621,13 @@ namespace Comet
this.SetFrameFromPlatformView(frame); this.SetFrameFromPlatformView(frame);
if (BuiltView != null) if (BuiltView != null)
BuiltView.LayoutSubviews(frame); BuiltView.LayoutSubviews(frame);
else if (this is ContainerView container)
{
foreach (var view in container)
{
view.LayoutSubviews(this.Frame);
}
}
} }
public override string ToString() => $"{this.GetType()} - {this.Id}"; public override string ToString() => $"{this.GetType()} - {this.Id}";
@ -793,8 +801,9 @@ namespace Comet
//Measure(new Size(widthConstraint, heightConstraint)); //Measure(new Size(widthConstraint, heightConstraint));
Measure(widthConstraint, heightConstraint); Measure(widthConstraint, heightConstraint);
void IView.InvalidateMeasure() => InvalidateMeasurement(); void IView.InvalidateMeasure() => InvalidateMeasurement();
void IView.InvalidateArrange() {} void IView.InvalidateArrange() { }
void IHotReloadableView.TransferState(IView newView) { void IHotReloadableView.TransferState(IView newView)
{
var oldState = this.GetState(); var oldState = this.GetState();
if (oldState == null) if (oldState == null)
return; return;

Просмотреть файл

@ -31,6 +31,8 @@ namespace Comet
public int IdePort { get; set; } = 9988; public int IdePort { get; set; } = 9988;
int _attempts = 3;
public async void Initialize(IServiceProvider services) public async void Initialize(IServiceProvider services)
{ {
var handlers = services.GetRequiredService<IMauiHandlersFactory>(); var handlers = services.GetRequiredService<IMauiHandlersFactory>();
@ -51,6 +53,14 @@ namespace Comet
{ {
var success = await Reloadify.Reload.Init(IdeIp, IdePort); var success = await Reloadify.Reload.Init(IdeIp, IdePort);
while(!success && _attempts > 0)
{
await Task.Delay(TimeSpan.FromSeconds(5));
Console.WriteLine("Trying to connect HotReload server....");
success = await Reloadify.Reload.Init(IdeIp, IdePort);
_attempts--;
}
Console.WriteLine($"HotReload Initialize: {success}"); Console.WriteLine($"HotReload Initialize: {success}");
} }
catch (Exception ex) catch (Exception ex)

Просмотреть файл

@ -121,6 +121,27 @@ namespace Comet.Tests
Assert.True(textHandler.ChangedProperties.TryGetValue(nameof(IText.Text), out var changedText), "Text.Value Change was not set to Text handler"); Assert.True(textHandler.ChangedProperties.TryGetValue(nameof(IText.Text), out var changedText), "Text.Value Change was not set to Text handler");
} }
[Fact]
public void BindingShouldKeepUpdate()
{
Text text = null;
Text text1 = null;
var view = new StatePage();
view.Body = () => new VStack
{
(text = new Text(() => $"{view.clickCount}")),
(text1 = new Text(() => $"{view.clickCount}")),
};
view.SetViewHandlerToGeneric();
for (int i = 1; i < 10; ++i)
{
Assert.Equal(text.Value.CurrentValue, $"{i}");
Assert.Equal(text1.Value.CurrentValue, $"{i}");
view.clickCount.Value++;
}
}
[Fact] [Fact]
public void SingleBindingNotEffectedByGlobal() public void SingleBindingNotEffectedByGlobal()

Просмотреть файл

@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFramework>netcoreapp6.0</TargetFramework> <TargetFramework>net7.0</TargetFramework>
<IsPackable>false</IsPackable> <IsPackable>false</IsPackable>
<Configurations>Release;Debug</Configurations> <Configurations>Release;Debug</Configurations>
</PropertyGroup> </PropertyGroup>
@ -14,11 +14,9 @@
<DebugSymbols>false</DebugSymbols> <DebugSymbols>false</DebugSymbols>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.8.3" /> <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.5.0" />
<PackageReference Include="Microsoft.Maui.Graphics" Version="6.0.100-preview.3.34" /> <PackageReference Include="xunit" Version="2.4.2" />
<PackageReference Include="Microsoft.Maui.Graphics" Version="$(_MicrosoftMauiGraphics)" /> <PackageReference Include="xunit.runner.visualstudio" Version="2.4.5"><IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PackageReference Include="xunit" Version="2.4.1" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.3"><IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>
</PackageReference> </PackageReference>
</ItemGroup> </ItemGroup>
@ -26,8 +24,8 @@
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\..\src\Comet.SourceGenerator\Comet.SourceGenerator.csproj" OutputItemType="Analyzer" ReferenceOutputAssembly="false" /> <ProjectReference Include="..\..\src\Comet.SourceGenerator\Comet.SourceGenerator.csproj" OutputItemType="Analyzer" ReferenceOutputAssembly="false" />
<ProjectReference Include="..\..\src\Comet\Comet.csproj" /> <ProjectReference Include="..\..\src\Comet\Comet.csproj" />
<ProjectReference Include="..\..\external\Maui\src\Core\src\Core.csproj" /> <ProjectReference Include="..\..\External\Maui\src\Core\src\Core.csproj" />
<ProjectReference Include="..\..\external\Maui\src\Essentials\src\Essentials.csproj" /> <ProjectReference Include="..\..\External\Maui\src\Graphics\src\Graphics\Graphics.csproj" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Folder Include="Helpers\" /> <Folder Include="Helpers\" />

Просмотреть файл

@ -31,28 +31,28 @@ namespace Comet.Tests
var text1 = view.GetViewWithTag<Text>("text1"); var text1 = view.GetViewWithTag<Text>("text1");
var text2 = view.GetViewWithTag<Text>("text2"); var text2 = view.GetViewWithTag<Text>("text2");
view.Frame = new Rectangle(0, 0, 320, 600); view.Frame = new Rect(0, 0, 320, 600);
view.Measure(view.Frame.Width, view.Frame.Height); view.Measure(view.Frame.Width, view.Frame.Height);
Assert.True(view.MeasurementValid); Assert.True(view.MeasurementValid);
Assert.Equal(new Size(320, 40), view.MeasuredSize); Assert.Equal(new Size(320, 40), view.MeasuredSize);
Assert.Equal(new Rectangle(0, 0, 320, 600), view.Frame); Assert.Equal(new Rect(0, 0, 320, 600), view.Frame);
Assert.True(grid.MeasurementValid); Assert.True(grid.MeasurementValid);
Assert.Equal(new Size(320, 40), grid.MeasuredSize); Assert.Equal(new Size(320, 40), grid.MeasuredSize);
Assert.Equal(new Rectangle(0, 280, 320, 40), grid.Frame); Assert.Equal(new Rect(0, 280, 320, 40), grid.Frame);
Assert.True(textField.MeasurementValid); Assert.True(textField.MeasurementValid);
Assert.Equal(new Size(40, 12), textField.MeasuredSize); Assert.Equal(new Size(40, 12), textField.MeasuredSize);
Assert.Equal(new Rectangle(0, 0, 320, 20), textField.Frame); Assert.Equal(new Rect(0, 0, 320, 20), textField.Frame);
Assert.True(text1.MeasurementValid); Assert.True(text1.MeasurementValid);
Assert.Equal(new Size(40, 12), text1.MeasuredSize); Assert.Equal(new Size(40, 12), text1.MeasuredSize);
Assert.Equal(new Rectangle(0, 20, 160, 20), text1.Frame); Assert.Equal(new Rect(0, 20, 160, 20), text1.Frame);
Assert.True(text2.MeasurementValid); Assert.True(text2.MeasurementValid);
Assert.Equal(new Size(40, 12), text2.MeasuredSize); Assert.Equal(new Size(40, 12), text2.MeasuredSize);
Assert.Equal(new Rectangle(160, 20, 160, 20), text2.Frame); Assert.Equal(new Rect(160, 20, 160, 20), text2.Frame);
} }
} }
} }

Просмотреть файл

@ -32,27 +32,27 @@ namespace Comet.Tests
var spacer = view.GetViewWithTag<Spacer>("spacer"); var spacer = view.GetViewWithTag<Spacer>("spacer");
var text = view.GetViewWithTag<Text>("text"); var text = view.GetViewWithTag<Text>("text");
view.Frame = new Rectangle(0, 0, 320, 600); view.Frame = new Rect(0, 0, 320, 600);
Assert.True(view.MeasurementValid); Assert.True(view.MeasurementValid);
Assert.Equal(new Size(320, 12), view.MeasuredSize); Assert.Equal(new Size(320, 12), view.MeasuredSize);
Assert.Equal(new Rectangle(0, 0, 320, 600), view.Frame); Assert.Equal(new Rect(0, 0, 320, 600), view.Frame);
Assert.True(stack.MeasurementValid); Assert.True(stack.MeasurementValid);
Assert.Equal(new Size(320, 12), stack.MeasuredSize); Assert.Equal(new Size(320, 12), stack.MeasuredSize);
Assert.Equal(new Rectangle(0, 294, 320, 12), stack.Frame); Assert.Equal(new Rect(0, 294, 320, 12), stack.Frame);
Assert.True(textField.MeasurementValid); Assert.True(textField.MeasurementValid);
Assert.Equal(new Size(40, 12), textField.MeasuredSize); Assert.Equal(new Size(40, 12), textField.MeasuredSize);
Assert.Equal(new Rectangle(0, 0, 40, 12), textField.Frame); Assert.Equal(new Rect(0, 0, 40, 12), textField.Frame);
Assert.True(spacer.MeasurementValid); Assert.True(spacer.MeasurementValid);
Assert.Equal(new Size(-1, -1), spacer.MeasuredSize); Assert.Equal(new Size(-1, -1), spacer.MeasuredSize);
Assert.Equal(new Rectangle(40, 0, 240, 12), spacer.Frame); Assert.Equal(new Rect(40, 0, 240, 12), spacer.Frame);
Assert.True(text.MeasurementValid); Assert.True(text.MeasurementValid);
Assert.Equal(new Size(40, 12), text.MeasuredSize); Assert.Equal(new Size(40, 12), text.MeasuredSize);
Assert.Equal(new Rectangle(280, 0, 40, 12), text.Frame); Assert.Equal(new Rect(280, 0, 40, 12), text.Frame);
} }
@ -69,23 +69,23 @@ namespace Comet.Tests
Assert.True(view.MeasurementValid); Assert.True(view.MeasurementValid);
Assert.Equal(new Size(320, 12), view.MeasuredSize); Assert.Equal(new Size(320, 12), view.MeasuredSize);
Assert.Equal(new Rectangle(0, 0, 320, 600), view.Frame); Assert.Equal(new Rect(0, 0, 320, 600), view.Frame);
Assert.True(stack.MeasurementValid); Assert.True(stack.MeasurementValid);
Assert.Equal(new Size(320, 12), stack.MeasuredSize); Assert.Equal(new Size(320, 12), stack.MeasuredSize);
Assert.Equal(new Rectangle(0, 294, 320, 12), stack.Frame); Assert.Equal(new Rect(0, 294, 320, 12), stack.Frame);
Assert.True(textField.MeasurementValid); Assert.True(textField.MeasurementValid);
Assert.Equal(new Size(40, 12), textField.MeasuredSize); Assert.Equal(new Size(40, 12), textField.MeasuredSize);
Assert.Equal(new Rectangle(0, 0, 40, 12), textField.Frame); Assert.Equal(new Rect(0, 0, 40, 12), textField.Frame);
Assert.True(spacer.MeasurementValid); Assert.True(spacer.MeasurementValid);
Assert.Equal(new Size(-1, -1), spacer.MeasuredSize); Assert.Equal(new Size(-1, -1), spacer.MeasuredSize);
Assert.Equal(new Rectangle(40, 0, 240, 12), spacer.Frame); Assert.Equal(new Rect(40, 0, 240, 12), spacer.Frame);
Assert.True(text.MeasurementValid); Assert.True(text.MeasurementValid);
Assert.Equal(new Size(40, 12), text.MeasuredSize); Assert.Equal(new Size(40, 12), text.MeasuredSize);
Assert.Equal(new Rectangle(280, 0, 40, 12), text.Frame); Assert.Equal(new Rect(280, 0, 40, 12), text.Frame);
} }
@ -100,27 +100,27 @@ namespace Comet.Tests
var spacer = view.GetViewWithTag<Spacer>("spacer"); var spacer = view.GetViewWithTag<Spacer>("spacer");
var text = view.GetViewWithTag<Text>("text"); var text = view.GetViewWithTag<Text>("text");
view.Frame = new Rectangle(0, 0, 320, 600); view.Frame = new Rect(0, 0, 320, 600);
Assert.True(view.MeasurementValid); Assert.True(view.MeasurementValid);
Assert.Equal(new Size(300, 12), view.MeasuredSize); Assert.Equal(new Size(300, 12), view.MeasuredSize);
Assert.Equal(new Rectangle(0, 0, 320, 600), view.Frame); Assert.Equal(new Rect(0, 0, 320, 600), view.Frame);
Assert.True(stack.MeasurementValid); Assert.True(stack.MeasurementValid);
Assert.Equal(new Size(300, 12), stack.MeasuredSize); Assert.Equal(new Size(300, 12), stack.MeasuredSize);
Assert.Equal(new Rectangle(10, 294, 300, 12), stack.Frame); Assert.Equal(new Rect(10, 294, 300, 12), stack.Frame);
Assert.True(textField.MeasurementValid); Assert.True(textField.MeasurementValid);
Assert.Equal(new Size(40, 12), textField.MeasuredSize); Assert.Equal(new Size(40, 12), textField.MeasuredSize);
Assert.Equal(new Rectangle(0, 0, 40, 12), textField.Frame); Assert.Equal(new Rect(0, 0, 40, 12), textField.Frame);
Assert.True(spacer.MeasurementValid); Assert.True(spacer.MeasurementValid);
Assert.Equal(new Size(-1, -1), spacer.MeasuredSize); Assert.Equal(new Size(-1, -1), spacer.MeasuredSize);
Assert.Equal(new Rectangle(40, 0, 220, 12), spacer.Frame); Assert.Equal(new Rect(40, 0, 220, 12), spacer.Frame);
Assert.True(text.MeasurementValid); Assert.True(text.MeasurementValid);
Assert.Equal(new Size(40, 12), text.MeasuredSize); Assert.Equal(new Size(40, 12), text.MeasuredSize);
Assert.Equal(new Rectangle(260, 0, 40, 12), text.Frame); Assert.Equal(new Rect(260, 0, 40, 12), text.Frame);
} }
@ -135,27 +135,27 @@ namespace Comet.Tests
var spacer = view.GetViewWithTag<Spacer>("spacer"); var spacer = view.GetViewWithTag<Spacer>("spacer");
var text = view.GetViewWithTag<Text>("text"); var text = view.GetViewWithTag<Text>("text");
view.Frame = new Rectangle(0, 0, 320, 600); view.Frame = new Rect(0, 0, 320, 600);
Assert.True(view.MeasurementValid); Assert.True(view.MeasurementValid);
Assert.Equal(new Size(300, 20), view.MeasuredSize); Assert.Equal(new Size(300, 20), view.MeasuredSize);
Assert.Equal(new Rectangle(0, 0, 320, 600), view.Frame); Assert.Equal(new Rect(0, 0, 320, 600), view.Frame);
Assert.True(stack.MeasurementValid); Assert.True(stack.MeasurementValid);
Assert.Equal(new Size(300, 20), stack.MeasuredSize); Assert.Equal(new Size(300, 20), stack.MeasuredSize);
Assert.Equal(new Rectangle(10, 290, 300, 20), stack.Frame); Assert.Equal(new Rect(10, 290, 300, 20), stack.Frame);
Assert.True(textField.MeasurementValid); Assert.True(textField.MeasurementValid);
Assert.Equal(new Size(40, 12), textField.MeasuredSize); Assert.Equal(new Size(40, 12), textField.MeasuredSize);
Assert.Equal(new Rectangle(0, 4, 40, 12), textField.Frame); Assert.Equal(new Rect(0, 4, 40, 12), textField.Frame);
Assert.True(spacer.MeasurementValid); Assert.True(spacer.MeasurementValid);
Assert.Equal(new Size(-1, -1), spacer.MeasuredSize); Assert.Equal(new Size(-1, -1), spacer.MeasuredSize);
Assert.Equal(new Rectangle(40, 4, 220, 12), spacer.Frame); Assert.Equal(new Rect(40, 4, 220, 12), spacer.Frame);
Assert.True(text.MeasurementValid); Assert.True(text.MeasurementValid);
Assert.Equal(new Size(40, 12), text.MeasuredSize); Assert.Equal(new Size(40, 12), text.MeasuredSize);
Assert.Equal(new Rectangle(260, 4, 40, 12), text.Frame); Assert.Equal(new Rect(260, 4, 40, 12), text.Frame);
} }
@ -166,31 +166,31 @@ namespace Comet.Tests
InitializeHandlers(view); InitializeHandlers(view);
var stack = view.GetViewWithTag<HStack>("stack").Margin().Frame(height: 20); var stack = view.GetViewWithTag<HStack>("stack").Margin().Frame(height: 20);
var textField = view.GetViewWithTag<TextField>("textfield").Frame(alignment: Alignment.Top); var textField = view.GetViewWithTag<TextField>("textfield");//.Frame(alignment: Alignment.Top);
var spacer = view.GetViewWithTag<Spacer>("spacer"); var spacer = view.GetViewWithTag<Spacer>("spacer");
var text = view.GetViewWithTag<Text>("text").Frame(alignment: Alignment.Bottom); var text = view.GetViewWithTag<Text>("text");//.Frame(alignment: Alignment.Bottom);
view.Frame = new Rectangle(0, 0, 320, 600); view.Frame = new Rect(0, 0, 320, 600);
Assert.True(view.MeasurementValid); Assert.True(view.MeasurementValid);
Assert.Equal(new Size(300, 20), view.MeasuredSize); Assert.Equal(new Size(300, 20), view.MeasuredSize);
Assert.Equal(new Rectangle(0, 0, 320, 600), view.Frame); Assert.Equal(new Rect(0, 0, 320, 600), view.Frame);
Assert.True(stack.MeasurementValid); Assert.True(stack.MeasurementValid);
Assert.Equal(new Size(300, 20), stack.MeasuredSize); Assert.Equal(new Size(300, 20), stack.MeasuredSize);
Assert.Equal(new Rectangle(10, 290, 300, 20), stack.Frame); Assert.Equal(new Rect(10, 290, 300, 20), stack.Frame);
Assert.True(textField.MeasurementValid); Assert.True(textField.MeasurementValid);
Assert.Equal(new Size(40, 12), textField.MeasuredSize); Assert.Equal(new Size(40, 12), textField.MeasuredSize);
Assert.Equal(new Rectangle(0, 0, 40, 12), textField.Frame); Assert.Equal(new Rect(0, 0, 40, 12), textField.Frame);
Assert.True(spacer.MeasurementValid); Assert.True(spacer.MeasurementValid);
Assert.Equal(new Size(-1, -1), spacer.MeasuredSize); Assert.Equal(new Size(-1, -1), spacer.MeasuredSize);
Assert.Equal(new Rectangle(40, 4, 220, 12), spacer.Frame); Assert.Equal(new Rect(40, 4, 220, 12), spacer.Frame);
Assert.True(text.MeasurementValid); Assert.True(text.MeasurementValid);
Assert.Equal(new Size(40, 12), text.MeasuredSize); Assert.Equal(new Size(40, 12), text.MeasuredSize);
Assert.Equal(new Rectangle(260, 8, 40, 12), text.Frame); Assert.Equal(new Rect(260, 8, 40, 12), text.Frame);
} }
@ -205,27 +205,27 @@ namespace Comet.Tests
var spacer = view.GetViewWithTag<Spacer>("spacer"); var spacer = view.GetViewWithTag<Spacer>("spacer");
var text = view.GetViewWithTag<Text>("text").Frame(height: 18); var text = view.GetViewWithTag<Text>("text").Frame(height: 18);
view.Frame = new Rectangle(0, 0, 320, 600); view.Frame = new Rect(0, 0, 320, 600);
Assert.True(view.MeasurementValid); Assert.True(view.MeasurementValid);
Assert.Equal(new Size(300, 22), view.MeasuredSize); Assert.Equal(new Size(300, 22), view.MeasuredSize);
Assert.Equal(new Rectangle(0, 0, 320, 600), view.Frame); Assert.Equal(new Rect(0, 0, 320, 600), view.Frame);
Assert.True(stack.MeasurementValid); Assert.True(stack.MeasurementValid);
Assert.Equal(new Size(300, 22), stack.MeasuredSize); Assert.Equal(new Size(300, 22), stack.MeasuredSize);
Assert.Equal(new Rectangle(10, 289, 300, 22), stack.Frame); Assert.Equal(new Rect(10, 289, 300, 22), stack.Frame);
Assert.True(textField.MeasurementValid); Assert.True(textField.MeasurementValid);
Assert.Equal(new Size(40, 22), textField.MeasuredSize); Assert.Equal(new Size(40, 22), textField.MeasuredSize);
Assert.Equal(new Rectangle(0, 0, 40, 22), textField.Frame); Assert.Equal(new Rect(0, 0, 40, 22), textField.Frame);
Assert.True(spacer.MeasurementValid); Assert.True(spacer.MeasurementValid);
Assert.Equal(new Size(-1, -1), spacer.MeasuredSize); Assert.Equal(new Size(-1, -1), spacer.MeasuredSize);
Assert.Equal(new Rectangle(40, 0, 220, 22), spacer.Frame); Assert.Equal(new Rect(40, 0, 220, 22), spacer.Frame);
Assert.True(text.MeasurementValid); Assert.True(text.MeasurementValid);
Assert.Equal(new Size(40, 18), text.MeasuredSize); Assert.Equal(new Size(40, 18), text.MeasuredSize);
Assert.Equal(new Rectangle(260, 2, 40, 18), text.Frame); Assert.Equal(new Rect(260, 2, 40, 18), text.Frame);
} }
@ -240,28 +240,28 @@ namespace Comet.Tests
var spacer = view.GetViewWithTag<Spacer>("spacer"); var spacer = view.GetViewWithTag<Spacer>("spacer");
var text = view.GetViewWithTag<Text>("text").Frame(height: 18); var text = view.GetViewWithTag<Text>("text").Frame(height: 18);
view.Frame = new Rectangle(0, 0, 320, 600); view.Frame = new Rect(0, 0, 320, 600);
view.Measure(view.Frame.Width, view.Frame.Height); view.Measure(view.Frame.Width, view.Frame.Height);
Assert.True(view.MeasurementValid); Assert.True(view.MeasurementValid);
Assert.Equal(new Size(300, 42), view.MeasuredSize); Assert.Equal(new Size(300, 42), view.MeasuredSize);
Assert.Equal(new Rectangle(0, 0, 320, 600), view.Frame); Assert.Equal(new Rect(0, 0, 320, 600), view.Frame);
Assert.True(stack.MeasurementValid); Assert.True(stack.MeasurementValid);
Assert.Equal(new Size(300, 42), stack.MeasuredSize); Assert.Equal(new Size(300, 42), stack.MeasuredSize);
Assert.Equal(new Rectangle(10, 279, 300, 42), stack.Frame); Assert.Equal(new Rect(10, 279, 300, 42), stack.Frame);
Assert.True(textField.MeasurementValid); Assert.True(textField.MeasurementValid);
Assert.Equal(new Size(40, 22), textField.MeasuredSize); Assert.Equal(new Size(40, 22), textField.MeasuredSize);
Assert.Equal(new Rectangle(10, 10, 40, 22), textField.Frame); Assert.Equal(new Rect(10, 10, 40, 22), textField.Frame);
Assert.True(spacer.MeasurementValid); Assert.True(spacer.MeasurementValid);
Assert.Equal(new Size(-1, -1), spacer.MeasuredSize); Assert.Equal(new Size(-1, -1), spacer.MeasuredSize);
Assert.Equal(new Rectangle(60, 10, 200, 22), spacer.Frame); Assert.Equal(new Rect(60, 10, 200, 22), spacer.Frame);
Assert.True(text.MeasurementValid); Assert.True(text.MeasurementValid);
Assert.Equal(new Size(40, 18), text.MeasuredSize); Assert.Equal(new Size(40, 18), text.MeasuredSize);
Assert.Equal(new Rectangle(260, 12, 40, 18), text.Frame); Assert.Equal(new Rect(260, 12, 40, 18), text.Frame);
} }
public class HStackTestView2 : View public class HStackTestView2 : View
@ -287,23 +287,23 @@ namespace Comet.Tests
var textField = view.GetViewWithTag<TextField>("textfield"); var textField = view.GetViewWithTag<TextField>("textfield");
var text = view.GetViewWithTag<Text>("text"); var text = view.GetViewWithTag<Text>("text");
view.Frame = new Rectangle(0, 0, 320, 600); view.Frame = new Rect(0, 0, 320, 600);
Assert.True(view.MeasurementValid); Assert.True(view.MeasurementValid);
Assert.Equal(new Size(90, 12), view.MeasuredSize); Assert.Equal(new Size(90, 12), view.MeasuredSize);
Assert.Equal(new Rectangle(0, 0, 320, 600), view.Frame); Assert.Equal(new Rect(0, 0, 320, 600), view.Frame);
Assert.True(stack.MeasurementValid); Assert.True(stack.MeasurementValid);
Assert.Equal(new Size(90, 12), stack.MeasuredSize); Assert.Equal(new Size(90, 12), stack.MeasuredSize);
Assert.Equal(new Rectangle(115, 294, 90, 12), stack.Frame); Assert.Equal(new Rect(115, 294, 90, 12), stack.Frame);
Assert.True(textField.MeasurementValid); Assert.True(textField.MeasurementValid);
Assert.Equal(new Size(40, 12), textField.MeasuredSize); Assert.Equal(new Size(40, 12), textField.MeasuredSize);
Assert.Equal(new Rectangle(0, 0, 40, 12), textField.Frame); Assert.Equal(new Rect(0, 0, 40, 12), textField.Frame);
Assert.True(text.MeasurementValid); Assert.True(text.MeasurementValid);
Assert.Equal(new Size(40, 12), text.MeasuredSize); Assert.Equal(new Size(40, 12), text.MeasuredSize);
Assert.Equal(new Rectangle(50, 0, 40, 12), text.Frame); Assert.Equal(new Rect(50, 0, 40, 12), text.Frame);
} }
} }
} }

Просмотреть файл

@ -21,21 +21,22 @@ namespace Comet.Tests.Handlers
public SizeF GetIntrinsicSize(double widthConstraint, double heightConstraint) => OnGetIntrinsicSize?.Invoke(widthConstraint,heightConstraint) ?? new Size(-1,-1); public SizeF GetIntrinsicSize(double widthConstraint, double heightConstraint) => OnGetIntrinsicSize?.Invoke(widthConstraint,heightConstraint) ?? new Size(-1,-1);
public void SetFrame(RectangleF frame) public void SetFrame(Rect frame)
{ {
Frame = frame; Frame = frame;
} }
public Func<double, double, Size> OnGetIntrinsicSize { get; set; } public Func<double, double, Size> OnGetIntrinsicSize { get; set; }
public Rectangle Frame public Rect Frame
{ {
get => (Rectangle)ChangedProperties[nameof(Frame)]; get => (Rect)ChangedProperties[nameof(Frame)];
set => ChangedProperties[nameof(Frame)] = value; set => ChangedProperties[nameof(Frame)] = value;
} }
IElement IElementHandler.VirtualView => CurrentView; IElement IElementHandler.VirtualView => CurrentView;
IView IViewHandler.VirtualView => CurrentView; IView IViewHandler.VirtualView => CurrentView;
object? IElementHandler.PlatformView => CurrentView;
public object ContainerView => throw new NotImplementedException(); public object ContainerView => throw new NotImplementedException();
@ -68,7 +69,7 @@ namespace Comet.Tests.Handlers
public void DisconnectHandler() => CurrentView = null; public void DisconnectHandler() => CurrentView = null;
void IElementHandler.SetMauiContext(IMauiContext mauiContext) => MauiContext = mauiContext; void IElementHandler.SetMauiContext(IMauiContext mauiContext) => MauiContext = mauiContext;
Size IViewHandler.GetDesiredSize(double widthConstraint, double heightConstraint) => GetIntrinsicSize(widthConstraint, heightConstraint); Size IViewHandler.GetDesiredSize(double widthConstraint, double heightConstraint) => GetIntrinsicSize(widthConstraint, heightConstraint);
void IViewHandler.NativeArrange(Rectangle frame) => Frame = frame; void IViewHandler.PlatformArrange(Rect frame) => Frame = frame;
public void Invoke(string command, object args = null) => InvokedCommands.Add(command, args); public void Invoke(string command, object args = null) => InvokedCommands.Add(command, args);
} }
} }

Просмотреть файл

@ -2,6 +2,8 @@
using Microsoft.Maui.Graphics; using Microsoft.Maui.Graphics;
using Comet.Tests.Handlers; using Comet.Tests.Handlers;
using Xunit; using Xunit;
using Microsoft.Maui;
using Microsoft.Maui.Primitives;
namespace Comet.Tests namespace Comet.Tests
{ {
@ -14,10 +16,13 @@ namespace Comet.Tests
[Body] [Body]
View body() => new VStack() View body() => new VStack()
{ {
new Text(text).Tag("text"), new Text(text).FitHorizontal().Tag("text"),
}.Tag("stack"); }.FillHorizontal()
.FitVertical()
.Padding(new Thickness())
.Tag("stack");
} }
[Fact] [Fact]
public void TextInVStackIsFullWidth() public void TextInVStackIsFullWidth()
{ {
@ -26,12 +31,12 @@ namespace Comet.Tests
var stack = view.GetViewWithTag("stack"); var stack = view.GetViewWithTag("stack");
var text = view.GetViewWithTag("text"); var text = view.GetViewWithTag("text");
Assert.Equal(new Rectangle(0, 0, 320, 600), view.Frame); Assert.Equal(new Rect(0, 0, 320, 600), view.Frame);
//Assert.Equal(new Rectangle(0, 294, 320, 12), stack.Frame); Assert.Equal(new Rect(0, 0, 320, 12), stack.Frame);
Assert.Equal(new Rectangle(0, 0, 320, 12), text.Frame); Assert.Equal(new Rect(0, 0, 40, 12), text.Frame);
} }
public class TextFieldInVStackTestView : View public class TextFieldInVStackTestView : View
{ {
public readonly State<string> text = "Test"; public readonly State<string> text = "Test";
@ -39,10 +44,13 @@ namespace Comet.Tests
[Body] [Body]
View body() => new VStack() View body() => new VStack()
{ {
new TextField(text).Tag("textfield"), new TextField(text).FillHorizontal().Tag("textfield"),
}.Tag("stack"); }.FillHorizontal()
.FitVertical()
.Padding(new Thickness())
.Tag("stack");
} }
[Fact] [Fact]
public void TextFieldInVStackIsFullWidth() public void TextFieldInVStackIsFullWidth()
{ {
@ -51,12 +59,12 @@ namespace Comet.Tests
var stack = view.GetViewWithTag("stack"); var stack = view.GetViewWithTag("stack");
var textfield = view.GetViewWithTag("textfield"); var textfield = view.GetViewWithTag("textfield");
Assert.Equal(new Rectangle(0, 0, 320, 600), view.Frame); Assert.Equal(new Rect(0, 0, 320, 600), view.Frame);
//Assert.Equal(new Rectangle(0, 294, 320, 12), stack.Frame); Assert.Equal(new Rect(0, 0, 320, 12), stack.Frame);
Assert.Equal(new Rectangle(0, 0, 320, 12), textfield.Frame); Assert.Equal(new Rect(0, 0, 320, 12), textfield.Frame);
} }
public class SecureFieldInVStackTestView : View public class SecureFieldInVStackTestView : View
{ {
public readonly State<string> text = "Test"; public readonly State<string> text = "Test";
@ -65,9 +73,12 @@ namespace Comet.Tests
View body() => new VStack() View body() => new VStack()
{ {
new SecureField(text).Tag("securefield"), new SecureField(text).Tag("securefield"),
}.Tag("stack"); }.FillHorizontal()
.FitVertical()
.Padding(new Thickness())
.Tag("stack");
} }
[Fact] [Fact]
public void SecureFieldInVStackIsFullWidth() public void SecureFieldInVStackIsFullWidth()
{ {
@ -76,21 +87,24 @@ namespace Comet.Tests
var stack = view.GetViewWithTag("stack"); var stack = view.GetViewWithTag("stack");
var securefield = view.GetViewWithTag("securefield"); var securefield = view.GetViewWithTag("securefield");
Assert.Equal(new Rectangle(0, 0, 320, 600), view.Frame); Assert.Equal(new Rect(0, 0, 320, 600), view.Frame);
//Assert.Equal(new Rectangle(0, 294, 320, 12), stack.Frame); Assert.Equal(new Rect(0, 0, 320, 12), stack.Frame);
Assert.Equal(new Rectangle(0, 0, 320, 12), securefield.Frame); Assert.Equal(new Rect(0, 0, 320, 12), securefield.Frame);
} }
public class SliderInVStackTestView : View public class SliderInVStackTestView : View
{ {
[Body] [Body]
View body() => new VStack() View body() => new VStack()
{ {
new Slider(0).Tag("slider"), new Slider(0).Tag("slider"),
}.Tag("stack"); }.FillHorizontal()
.FitVertical()
.Padding(new Thickness())
.Tag("stack");
} }
[Fact] [Fact]
public void SliderInVStackIsFullWidth() public void SliderInVStackIsFullWidth()
{ {
@ -99,21 +113,24 @@ namespace Comet.Tests
var stack = view.GetViewWithTag("stack"); var stack = view.GetViewWithTag("stack");
var slider = view.GetViewWithTag("slider"); var slider = view.GetViewWithTag("slider");
Assert.Equal(new Rectangle(0, 0, 320, 600), view.Frame); Assert.Equal(new Rect(0, 0, 320, 600), view.Frame);
//Assert.Equal(new Rectangle(0, 290, 320, 20), stack.Frame); Assert.Equal(new Rect(0, 0, 320, 20), stack.Frame);
Assert.Equal(new Rectangle(0, 0, 320, 20), slider.Frame); Assert.Equal(new Rect(0, 0, 320, 20), slider.Frame);
} }
public class ProgressBarInVStackTestView : View public class ProgressBarInVStackTestView : View
{ {
[Body] [Body]
View body() => new VStack() View body() => new VStack()
{ {
new ProgressBar(0).Tag("progressbar"), new ProgressBar(0).Tag("progressbar"),
}.Tag("stack"); }.FillHorizontal()
.FitVertical()
.Padding(new Thickness())
.Tag("stack");
} }
[Fact] [Fact]
public void ProgressBarInVStackIsFullWidth() public void ProgressBarInVStackIsFullWidth()
{ {
@ -122,34 +139,34 @@ namespace Comet.Tests
var stack = view.GetViewWithTag("stack"); var stack = view.GetViewWithTag("stack");
var progressbar = view.GetViewWithTag("progressbar"); var progressbar = view.GetViewWithTag("progressbar");
Assert.Equal(new Rectangle(0, 0, 320, 600), view.Frame); Assert.Equal(new Rect(0, 0, 320, 600), view.Frame);
//Assert.Equal(new Rectangle(0, 290, 320, 20), stack.Frame); Assert.Equal(new Rect(0, 0, 320, 20), stack.Frame);
Assert.Equal(new Rectangle(0, 0, 320, 20), progressbar.Frame); Assert.Equal(new Rect(0, 0, 320, 20), progressbar.Frame);
} }
[Fact] [Fact]
public void ComboBoxInVStackDefaultsToAMinimumWidth() public void ComboBoxInVStackDefaultsToAMinimumWidth()
{ {
} }
[Fact] [Fact]
public void ButtonInVStackDefaultsToAMinimumWidth() public void ButtonInVStackDefaultsToAMinimumWidth()
{ {
} }
[Fact] [Fact]
public void LabelInHStackIsCenterAlignedVertically() public void LabelInHStackIsCenterAlignedVertically()
{ {
} }
[Fact] [Fact]
public void ListViewInAVStackTakesRemainingHeight() public void ListViewInAVStackTakesRemainingHeight()
{ {
} }
} }
} }

Просмотреть файл

@ -1,9 +1,8 @@
using System; using Comet.Internal;
using Microsoft.Maui.Graphics;
using Comet.Internal;
using Xunit;
using Microsoft.Maui.HotReload;
using Microsoft.Maui; using Microsoft.Maui;
using Microsoft.Maui.Graphics;
using Microsoft.Maui.HotReload;
using Xunit;
[assembly: CollectionBehavior(DisableTestParallelization = true)] [assembly: CollectionBehavior(DisableTestParallelization = true)]
namespace Comet.Tests namespace Comet.Tests
@ -50,10 +49,11 @@ namespace Comet.Tests
public static void InitializeHandlers(View view, float width, float height) public static void InitializeHandlers(View view, float width, float height)
{ {
InitializeHandlers(view); InitializeHandlers(view);
var frame = new Rectangle(0, 0, width, height); view.Alignment(Alignment.Fill);
var frame = new Rect(0, 0, width, height);
var iView = (IView)view; var iView = (IView)view;
iView.Measure(frame.Width, frame.Height); iView.Measure(frame.Width, frame.Height);
iView.Arrange(new Rectangle(0, 0, width, height)); iView.Arrange(frame);
} }
public static void ResetComet() public static void ResetComet()

Просмотреть файл

@ -8,14 +8,14 @@ using Microsoft.Maui;
using Microsoft.Maui.Hosting; using Microsoft.Maui.Hosting;
using Microsoft.Maui.Hosting.Internal; using Microsoft.Maui.Hosting.Internal;
using Microsoft.Maui.HotReload; using Microsoft.Maui.HotReload;
using static Microsoft.Maui.HandlerMauiAppBuilderExtensions; using static Microsoft.Maui.Hosting.HandlerMauiAppBuilderExtensions;
namespace Comet.Tests namespace Comet.Tests
{ {
public static class UI public static class UI
{ {
static bool hasInit; static bool hasInit;
public static IMauiHandlersServiceProvider Handlers { get; set; } public static IMauiHandlersFactory Handlers { get; set; }
public static void Init(bool force = false) public static void Init(bool force = false)
{ {
if (hasInit && !force) if (hasInit && !force)
@ -41,7 +41,7 @@ namespace Comet.Tests
}; };
Handlers = new MauiHandlersServiceProvider(handlers.Select(x=> new HandlerRegistration((a)=> a.AddHandler(x.Key,x.Value)))); Handlers = new MauiHandlersFactory(handlers.Select(x=> new HandlerRegistration((a)=> a.AddHandler(x.Key,x.Value))));
MauiHotReloadHelper.IsEnabled = true; MauiHotReloadHelper.IsEnabled = true;