Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,12 @@
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
</PropertyGroup>
<ItemGroup>
<PackageVersion Include="Avalonia.Headless" Version="11.2.2" />
<PackageVersion Include="Avalonia.Headless.XUnit" Version="11.2.2" />
<PackageVersion Include="Fabulous" Version="$(FabulousVersion)" />
<PackageVersion Include="FsCheck.NUnit" Version="2.16.4" />
<PackageVersion Include="FSharp.Core" Version="8.0.301" />
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.2.0" />
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.12.0" />
<PackageVersion Include="NUnit" Version="3.13.3" />
<PackageVersion Include="FsUnit" Version="5.2.0" />
<PackageVersion Include="NUnit3TestAdapter" Version="4.5.0" />
Expand All @@ -22,5 +24,6 @@
<PackageVersion Include="Avalonia.Controls.ColorPicker" Version="$(AvaloniaVersion)" />
<PackageVersion Include="Avalonia.Controls.DataGrid" Version="$(AvaloniaVersion)" />
<PackageVersion Include="Avalonia.Controls.TreeDataGrid" Version="11.0.10" />
<PackageVersion Include="xunit" Version="2.9.2" />
</ItemGroup>
</Project>
18 changes: 18 additions & 0 deletions Fabulous.Avalonia.Samples.sln
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,12 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "_Solution Items", "_Solutio
EndProject
Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Tetris", "samples\Component\Tetris\Tetris.fsproj", "{48A8F92E-CFAD-4B35-9DD4-D3110E259AE6}"
EndProject
Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "TestableApp", "samples\TestableApp\TestableApp.fsproj", "{A9902E3A-53B8-4864-8587-5E37D9934631}"
EndProject
Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "TestableApp.Headless.XUnit", "samples\TestableApp.Headless.XUnit\TestableApp.Headless.XUnit.fsproj", "{335C0A9D-C11F-42B4-8FA1-F549C8F65381}"
EndProject
Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "TestableApp.UnitTests", "samples\TestableApp.UnitTests\TestableApp.UnitTests.fsproj", "{89CE91F9-AFF2-4CD2-BFD0-AC4C781887F2}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Expand Down Expand Up @@ -110,5 +116,17 @@ Global
{48A8F92E-CFAD-4B35-9DD4-D3110E259AE6}.Debug|Any CPU.Build.0 = Debug|Any CPU
{48A8F92E-CFAD-4B35-9DD4-D3110E259AE6}.Release|Any CPU.ActiveCfg = Release|Any CPU
{48A8F92E-CFAD-4B35-9DD4-D3110E259AE6}.Release|Any CPU.Build.0 = Release|Any CPU
{A9902E3A-53B8-4864-8587-5E37D9934631}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A9902E3A-53B8-4864-8587-5E37D9934631}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A9902E3A-53B8-4864-8587-5E37D9934631}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A9902E3A-53B8-4864-8587-5E37D9934631}.Release|Any CPU.Build.0 = Release|Any CPU
{335C0A9D-C11F-42B4-8FA1-F549C8F65381}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{335C0A9D-C11F-42B4-8FA1-F549C8F65381}.Debug|Any CPU.Build.0 = Debug|Any CPU
{335C0A9D-C11F-42B4-8FA1-F549C8F65381}.Release|Any CPU.ActiveCfg = Release|Any CPU
{335C0A9D-C11F-42B4-8FA1-F549C8F65381}.Release|Any CPU.Build.0 = Release|Any CPU
{89CE91F9-AFF2-4CD2-BFD0-AC4C781887F2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{89CE91F9-AFF2-4CD2-BFD0-AC4C781887F2}.Debug|Any CPU.Build.0 = Debug|Any CPU
{89CE91F9-AFF2-4CD2-BFD0-AC4C781887F2}.Release|Any CPU.ActiveCfg = Release|Any CPU
{89CE91F9-AFF2-4CD2-BFD0-AC4C781887F2}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
EndGlobal
41 changes: 41 additions & 0 deletions samples/TestableApp.Headless.XUnit/AvaloniaTests.fs
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
namespace TestableApp

open Avalonia.Controls
open Avalonia.Headless
open Avalonia.Headless.XUnit
open Avalonia.Input
open Xunit

module AvaloniaTests =
[<AvaloniaFact>]
let ``Should add numbers in the calculator`` () =
// Create a window
let window = Window()
let content = StackPanel()
window.Content <- content

// Show the window, as it's required to get layout processed:
window.Show()

// Set values to the input boxes by simulating text input:
let firstOperandInput = TextBox()
content.Children.Add(firstOperandInput)
firstOperandInput.Focus() |> ignore
window.KeyTextInput("10")

// Or directly to the control:
let secondOperandInput = TextBox()
content.Children.Add(secondOperandInput)
secondOperandInput.Focus() |> ignore
secondOperandInput.Text <- "20"

let addButton = Button()
content.Children.Add(addButton)
// Raise click event on the button:
addButton.Focus() |> ignore
window.KeyPressQwerty(PhysicalKey.Enter, RawInputModifiers.None)

let resultBox = TextBox()
resultBox.Text <- $"{int firstOperandInput.Text + int secondOperandInput.Text}"

Assert.Equal("30", resultBox.Text)
95 changes: 95 additions & 0 deletions samples/TestableApp.Headless.XUnit/FabTests.fs
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
namespace TestableApp


open Avalonia.Controls
open Avalonia.Headless
open Avalonia.Headless.XUnit
open Avalonia.Input
open Fabulous
open Fabulous.Avalonia
open Xunit

open type Fabulous.Avalonia.View

module FabTests =
/// It takes the root of the widget tree and create the corresponding Avalonia node, and recursively creating all children nodes
let mkView<'msg, 'marker, 'a when 'msg: equality> (root: WidgetBuilder<'msg, 'marker>) : 'a =
let widget = root.Compile()
let definition = WidgetDefinitionStore.get widget.Key
let logger = ProgramDefaults.defaultLogger()

let treeContext =
{ CanReuseView = ViewHelpers.canReuseView
GetViewNode = ViewNode.get
GetComponent = Component.get
SetComponent = Component.set
SyncAction = ViewHelpers.defaultSyncAction
Logger = logger
Dispatch = ignore }

let envContext = new EnvironmentContext(logger)

let struct (_, view) =
definition.CreateView(widget, envContext, treeContext, ValueNone)

(view :?> 'a)

[<AvaloniaFact>]
let ``Should increment counter`` () =
let window = App.view() |> mkView<_, _, Window>

window.Show()

let content = window.Content :?> ReversibleStackPanel |> _.Children


let counter = content[0] :?> TextBlock
let incrementButton = content[1] :?> Button

Assert.Equal("0", counter.Text)

incrementButton.Focus() |> ignore

window.KeyPressQwerty(PhysicalKey.Enter, RawInputModifiers.None)

Assert.Equal("1", counter.Text)

[<AvaloniaFact>]
let ``Should decrement counter`` () =
let window = App.view() |> mkView<_, _, Window>

window.Show()

let content = window.Content :?> ReversibleStackPanel |> _.Children

let counter = content[0] :?> TextBlock
let decrementButton = content[2] :?> Button

Assert.Equal("0", counter.Text)

decrementButton.Focus() |> ignore

window.KeyPressQwerty(PhysicalKey.Enter, RawInputModifiers.None)

Assert.Equal("-1", counter.Text)

[<AvaloniaFact>]
let ``Should reset counter`` () =
let window = App.view() |> mkView<_, _, Window>

window.Show()

let content = window.Content :?> ReversibleStackPanel |> _.Children

let counter = content[0] :?> TextBlock
let incrementButton = content[1] :?> Button

incrementButton.Focus() |> ignore
window.KeyPressQwerty(PhysicalKey.Enter, RawInputModifiers.None)
Assert.Equal("1", counter.Text)

let resetButton = content[5] :?> Button
resetButton.Focus() |> ignore
window.KeyPressQwerty(PhysicalKey.Enter, RawInputModifiers.None)

Assert.Equal("0", counter.Text)
6 changes: 6 additions & 0 deletions samples/TestableApp.Headless.XUnit/Program.fs
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
namespace TestableApp

module Program =

[<EntryPoint>]
let main _ = 0
15 changes: 15 additions & 0 deletions samples/TestableApp.Headless.XUnit/TestAppBuilder.fs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
namespace TestableApp

open Fabulous.Avalonia
open Avalonia
open Avalonia.Headless

type TestAppBuilder() =
static member BuildAvaloniaApp() =
AppBuilder
.Configure<FabApplication>()
.UseSkia()
.UseHeadless(AvaloniaHeadlessPlatformOptions(UseHeadlessDrawing = false))

[<assembly: AvaloniaTestApplication(typeof<TestAppBuilder>)>]
do ()
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<OutputType>Exe</OutputType>
<IsPackable>false</IsPackable>
<GenerateProgramFile>false</GenerateProgramFile>
<WarnOn>$(WarnOn);3390</WarnOn>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
<NoWarn>$(NoWarn);FS3186;NETSDK1206;NU1507;NU1903</NoWarn>
</PropertyGroup>

<ItemGroup>
<Compile Include="FabTests.fs" />
<Compile Include="AvaloniaTests.fs" />
<Compile Include="TestAppBuilder.fs" />
<Compile Include="Program.fs" />
</ItemGroup>

<ItemGroup>
<PackageReference Include="Avalonia.Headless" />
<PackageReference Include="Avalonia.Headless.XUnit" />
<PackageReference Include="Avalonia.Skia" />
<PackageReference Include="Avalonia.Themes.Fluent" />
<PackageReference Include="FSharp.Core" />
<PackageReference Include="Microsoft.NET.Test.Sdk" />
<PackageReference Include="xunit" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\..\src\Fabulous.Avalonia\Fabulous.Avalonia.fsproj" />
<ProjectReference Include="..\TestableApp\TestableApp.fsproj" />
</ItemGroup>

</Project>
6 changes: 6 additions & 0 deletions samples/TestableApp.UnitTests/Program.fs
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
namespace TestableApp

module Program =

[<EntryPoint>]
let main _ = 0
30 changes: 30 additions & 0 deletions samples/TestableApp.UnitTests/TestableApp.UnitTests.fsproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<OutputType>Exe</OutputType>
<IsPackable>false</IsPackable>
<GenerateProgramFile>false</GenerateProgramFile>
<WarnOn>$(WarnOn);3390</WarnOn>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
<NoWarn>$(NoWarn);FS3186;NETSDK1206;NU1507;NU1903</NoWarn>
</PropertyGroup>

<ItemGroup>
<Compile Include="Tests.fs" />
<Compile Include="Program.fs" />
</ItemGroup>

<ItemGroup>
<PackageReference Include="FSharp.Core" />
<PackageReference Include="FsUnit" />
<PackageReference Include="Microsoft.NET.Test.Sdk" />
<PackageReference Include="xunit" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\..\src\Fabulous.Avalonia\Fabulous.Avalonia.fsproj" />
<ProjectReference Include="..\TestableApp\TestableApp.fsproj" />
</ItemGroup>

</Project>
Loading