From ca6f85634112ed5a77b4a6ef68fb7f8b7434cd78 Mon Sep 17 00:00:00 2001 From: booskander Date: Tue, 17 Jun 2025 21:15:04 -0700 Subject: [PATCH] feat: new merged app --- .../Benchmarks.Wasm/Benchmarks.Wasm.sln | 24 + .../DopeTestUno.Skia.Gtk.csproj | 2 +- src/dopesbench/.editorconfig | 167 ++++ src/dopesbench/.gitignore | 412 +++++++++ src/dopesbench/.run/Readme.md | 3 + src/dopesbench/.run/dopesbench.run.xml | 47 + src/dopesbench/.vscode/extensions.json | 5 + src/dopesbench/.vscode/launch.json | 77 ++ src/dopesbench/.vscode/settings.json | 10 + src/dopesbench/.vscode/tasks.json | 57 ++ src/dopesbench/.vsconfig | 30 + src/dopesbench/Directory.Build.props | 15 + src/dopesbench/Directory.Build.targets | 2 + src/dopesbench/Directory.Packages.props | 22 + src/dopesbench/dopesbench.sln | 90 ++ src/dopesbench/dopesbench/App.xaml | 17 + src/dopesbench/dopesbench/App.xaml.cs | 122 +++ .../dopesbench/Assets/Icons/icon.svg | 42 + .../Assets/Icons/icon_foreground.svg | 137 +++ .../dopesbench/Assets/SharedAssets.md | 32 + .../Assets/Splash/splash_screen.svg | 137 +++ .../dopesbench/Assets/wallpaper_uno.jpg | Bin 0 -> 75877 bytes .../dopesbench/Benchmarks.Shared/App.xaml | 16 + .../dopesbench/Benchmarks.Shared/App.xaml.cs | 172 ++++ .../Benchmarks.Shared/Assets/SharedAssets.md | 34 + .../Benchmarking/IAsyncUIBenchmark.cs | 9 + .../Benchmarking/IAsyncUIBenchmarkSetup.cs | 10 + .../Benchmarks.Shared.projitems | 63 ++ .../Benchmarks.Shared.shproj | 13 + .../Controls/AsyncUIBenchmarkControl.xaml | 34 + .../Controls/AsyncUIBenchmarkControl.xaml.cs | 86 ++ .../Controls/AsyncUIBenchmarkHost.cs | 9 + .../Controls/BenchmarkDotNetControl.xaml | 58 ++ .../Controls/BenchmarkDotNetControl.xaml.cs | 314 +++++++ .../Controls/BenchmarkUIHost.cs | 9 + .../Benchmarks.Shared/MainPage.xaml | 25 + .../Benchmarks.Shared/MainPage.xaml.cs | 33 + .../Strings/en/Resources.resw | 123 +++ .../Suite/SpanBench/SimpleSpanBenchmark.cs | 46 + .../XamlControlsResourcesCreationBenchmark.cs | 17 + ...rolsResourcesCreationRetrievalBenchmark.cs | 26 + .../XamlControlsResourcesReadBenchmark.cs | 46 + .../BorderBench/BorderBenchmark.cs | 37 + .../PropagationDPBenchmark.cs | 38 + .../SimpleDPBenchmark.cs | 38 + .../SpecializedDPBenchmark.cs | 25 + .../FrameworkElementBenchmark.cs | 28 + .../GridBench/SimpleGridBenchmark.cs | 129 +++ .../UIElementPerf/ControlCreationBenchmark.cs | 64 ++ .../UIElementPerf/LoadUnloadPerf.cs | 48 + .../UIElementCreationBenchmark.cs | 35 + .../ComplexUI/FormBench/FormBenchHelper.cs | 92 ++ .../FormBench/FormInitializeBenchmark.cs | 16 + .../FormBench/FormLoadedBenchmark.cs | 39 + .../BorderInitializeBenchmark.cs | 29 + .../BorderLoadedBenchmark.cs | 52 ++ .../TextBlockInitializeBenchmark.cs | 32 + .../TextBlockLoadedBenchmark.cs | 56 ++ .../TreeBench/DeepTreeLoadedBenchmark.cs | 58 ++ .../TreeBench/WideTreeLoadedBenchmark.cs | 56 ++ .../SuiteUI/NoOpBenchmark.cs | 14 + .../TextBlockBench/LoadedBenchmark.cs | 40 + .../TextBlockBench/MultipleLoadedBenchmark.cs | 45 + .../dopesbench/Components/AppBar.xaml | 25 + .../dopesbench/Components/AppBar.xaml.cs | 54 ++ src/dopesbench/dopesbench/DopesPage.xaml | 114 +++ src/dopesbench/dopesbench/DopesPage.xaml.cs | 841 ++++++++++++++++++ src/dopesbench/dopesbench/GlobalUsings.cs | 4 + src/dopesbench/dopesbench/HomePage.xaml | 14 + src/dopesbench/dopesbench/HomePage.xaml.cs | 33 + .../dopesbench/Package.appxmanifest | 31 + .../Platforms/Android/AndroidManifest.xml | 4 + .../Platforms/Android/Assets/AboutAssets.txt | 22 + .../Platforms/Android/Main.Android.cs | 35 + .../Platforms/Android/MainActivity.Android.cs | 23 + .../Android/Resources/AboutResources.txt | 47 + .../Android/Resources/values/Strings.xml | 5 + .../Android/Resources/values/Styles.xml | 25 + .../Platforms/Android/environment.conf | 2 + .../dopesbench/Platforms/Desktop/Program.cs | 21 + .../Platforms/WebAssembly/LinkerConfig.xml | 10 + .../Platforms/WebAssembly/Program.cs | 11 + .../Platforms/WebAssembly/WasmCSS/Fonts.css | 28 + .../WebAssembly/WasmScripts/AppManifest.js | 3 + .../WebAssembly/manifest.webmanifest | 10 + .../wwwroot/staticwebapp.config.json | 30 + .../Platforms/WebAssembly/wwwroot/web.config | 78 ++ .../Platforms/iOS/Entitlements.plist | 6 + .../dopesbench/Platforms/iOS/Info.plist | 43 + .../dopesbench/Platforms/iOS/Main.iOS.cs | 12 + .../LaunchImages.launchimage/Contents.json | 58 ++ .../Platforms/iOS/PrivacyInfo.xcprivacy | 41 + .../PublishProfiles/win-arm64.pubxml | 18 + .../Properties/PublishProfiles/win-x64.pubxml | 18 + .../Properties/PublishProfiles/win-x86.pubxml | 23 + src/dopesbench/dopesbench/Random2.cs | 136 +++ src/dopesbench/dopesbench/ReadMe.md | 7 + .../Services/Endpoints/DebugHandler.cs | 41 + .../dopesbench/Services/StopWatchService.cs | 5 + .../dopesbench/Strings/en/Resources.resw | 123 +++ src/dopesbench/dopesbench/app.manifest | 25 + src/dopesbench/dopesbench/dopesbench.csproj | 52 ++ src/dopesbench/global.json | 9 + 103 files changed, 5650 insertions(+), 1 deletion(-) create mode 100644 src/Benchmarks/Benchmarks.Wasm/Benchmarks.Wasm.sln create mode 100644 src/dopesbench/.editorconfig create mode 100644 src/dopesbench/.gitignore create mode 100644 src/dopesbench/.run/Readme.md create mode 100644 src/dopesbench/.run/dopesbench.run.xml create mode 100644 src/dopesbench/.vscode/extensions.json create mode 100644 src/dopesbench/.vscode/launch.json create mode 100644 src/dopesbench/.vscode/settings.json create mode 100644 src/dopesbench/.vscode/tasks.json create mode 100644 src/dopesbench/.vsconfig create mode 100644 src/dopesbench/Directory.Build.props create mode 100644 src/dopesbench/Directory.Build.targets create mode 100644 src/dopesbench/Directory.Packages.props create mode 100644 src/dopesbench/dopesbench.sln create mode 100644 src/dopesbench/dopesbench/App.xaml create mode 100644 src/dopesbench/dopesbench/App.xaml.cs create mode 100644 src/dopesbench/dopesbench/Assets/Icons/icon.svg create mode 100644 src/dopesbench/dopesbench/Assets/Icons/icon_foreground.svg create mode 100644 src/dopesbench/dopesbench/Assets/SharedAssets.md create mode 100644 src/dopesbench/dopesbench/Assets/Splash/splash_screen.svg create mode 100644 src/dopesbench/dopesbench/Assets/wallpaper_uno.jpg create mode 100644 src/dopesbench/dopesbench/Benchmarks.Shared/App.xaml create mode 100644 src/dopesbench/dopesbench/Benchmarks.Shared/App.xaml.cs create mode 100644 src/dopesbench/dopesbench/Benchmarks.Shared/Assets/SharedAssets.md create mode 100644 src/dopesbench/dopesbench/Benchmarks.Shared/Benchmarking/IAsyncUIBenchmark.cs create mode 100644 src/dopesbench/dopesbench/Benchmarks.Shared/Benchmarking/IAsyncUIBenchmarkSetup.cs create mode 100644 src/dopesbench/dopesbench/Benchmarks.Shared/Benchmarks.Shared.projitems create mode 100644 src/dopesbench/dopesbench/Benchmarks.Shared/Benchmarks.Shared.shproj create mode 100644 src/dopesbench/dopesbench/Benchmarks.Shared/Controls/AsyncUIBenchmarkControl.xaml create mode 100644 src/dopesbench/dopesbench/Benchmarks.Shared/Controls/AsyncUIBenchmarkControl.xaml.cs create mode 100644 src/dopesbench/dopesbench/Benchmarks.Shared/Controls/AsyncUIBenchmarkHost.cs create mode 100644 src/dopesbench/dopesbench/Benchmarks.Shared/Controls/BenchmarkDotNetControl.xaml create mode 100644 src/dopesbench/dopesbench/Benchmarks.Shared/Controls/BenchmarkDotNetControl.xaml.cs create mode 100644 src/dopesbench/dopesbench/Benchmarks.Shared/Controls/BenchmarkUIHost.cs create mode 100644 src/dopesbench/dopesbench/Benchmarks.Shared/MainPage.xaml create mode 100644 src/dopesbench/dopesbench/Benchmarks.Shared/MainPage.xaml.cs create mode 100644 src/dopesbench/dopesbench/Benchmarks.Shared/Strings/en/Resources.resw create mode 100644 src/dopesbench/dopesbench/Benchmarks.Shared/Suite/SpanBench/SimpleSpanBenchmark.cs create mode 100644 src/dopesbench/dopesbench/Benchmarks.Shared/Suite/Windows_UI_Xaml/ResourceDictionaryBench/XamlControlsResourcesCreationBenchmark.cs create mode 100644 src/dopesbench/dopesbench/Benchmarks.Shared/Suite/Windows_UI_Xaml/ResourceDictionaryBench/XamlControlsResourcesCreationRetrievalBenchmark.cs create mode 100644 src/dopesbench/dopesbench/Benchmarks.Shared/Suite/Windows_UI_Xaml/ResourceDictionaryBench/XamlControlsResourcesReadBenchmark.cs create mode 100644 src/dopesbench/dopesbench/Benchmarks.Shared/Suite/Windows_UI_Xaml_Controls/BorderBench/BorderBenchmark.cs create mode 100644 src/dopesbench/dopesbench/Benchmarks.Shared/Suite/Windows_UI_Xaml_Controls/DependencyPropertyBench/PropagationDPBenchmark.cs create mode 100644 src/dopesbench/dopesbench/Benchmarks.Shared/Suite/Windows_UI_Xaml_Controls/DependencyPropertyBench/SimpleDPBenchmark.cs create mode 100644 src/dopesbench/dopesbench/Benchmarks.Shared/Suite/Windows_UI_Xaml_Controls/DependencyPropertyBench/SpecializedDPBenchmark.cs create mode 100644 src/dopesbench/dopesbench/Benchmarks.Shared/Suite/Windows_UI_Xaml_Controls/FrameworkElementBench/FrameworkElementBenchmark.cs create mode 100644 src/dopesbench/dopesbench/Benchmarks.Shared/Suite/Windows_UI_Xaml_Controls/GridBench/SimpleGridBenchmark.cs create mode 100644 src/dopesbench/dopesbench/Benchmarks.Shared/Suite/Windows_UI_Xaml_Controls/UIElementPerf/ControlCreationBenchmark.cs create mode 100644 src/dopesbench/dopesbench/Benchmarks.Shared/Suite/Windows_UI_Xaml_Controls/UIElementPerf/LoadUnloadPerf.cs create mode 100644 src/dopesbench/dopesbench/Benchmarks.Shared/Suite/Windows_UI_Xaml_Controls/UIElementPerf/UIElementCreationBenchmark.cs create mode 100644 src/dopesbench/dopesbench/Benchmarks.Shared/SuiteUI/ComplexUI/FormBench/FormBenchHelper.cs create mode 100644 src/dopesbench/dopesbench/Benchmarks.Shared/SuiteUI/ComplexUI/FormBench/FormInitializeBenchmark.cs create mode 100644 src/dopesbench/dopesbench/Benchmarks.Shared/SuiteUI/ComplexUI/FormBench/FormLoadedBenchmark.cs create mode 100644 src/dopesbench/dopesbench/Benchmarks.Shared/SuiteUI/ComplexUI/MultiplePropertyBench/BorderInitializeBenchmark.cs create mode 100644 src/dopesbench/dopesbench/Benchmarks.Shared/SuiteUI/ComplexUI/MultiplePropertyBench/BorderLoadedBenchmark.cs create mode 100644 src/dopesbench/dopesbench/Benchmarks.Shared/SuiteUI/ComplexUI/MultiplePropertyBench/TextBlockInitializeBenchmark.cs create mode 100644 src/dopesbench/dopesbench/Benchmarks.Shared/SuiteUI/ComplexUI/MultiplePropertyBench/TextBlockLoadedBenchmark.cs create mode 100644 src/dopesbench/dopesbench/Benchmarks.Shared/SuiteUI/ComplexUI/TreeBench/DeepTreeLoadedBenchmark.cs create mode 100644 src/dopesbench/dopesbench/Benchmarks.Shared/SuiteUI/ComplexUI/TreeBench/WideTreeLoadedBenchmark.cs create mode 100644 src/dopesbench/dopesbench/Benchmarks.Shared/SuiteUI/NoOpBenchmark.cs create mode 100644 src/dopesbench/dopesbench/Benchmarks.Shared/SuiteUI/Windows_UI_Xaml_Controls/TextBlockBench/LoadedBenchmark.cs create mode 100644 src/dopesbench/dopesbench/Benchmarks.Shared/SuiteUI/Windows_UI_Xaml_Controls/TextBlockBench/MultipleLoadedBenchmark.cs create mode 100644 src/dopesbench/dopesbench/Components/AppBar.xaml create mode 100644 src/dopesbench/dopesbench/Components/AppBar.xaml.cs create mode 100644 src/dopesbench/dopesbench/DopesPage.xaml create mode 100644 src/dopesbench/dopesbench/DopesPage.xaml.cs create mode 100644 src/dopesbench/dopesbench/GlobalUsings.cs create mode 100644 src/dopesbench/dopesbench/HomePage.xaml create mode 100644 src/dopesbench/dopesbench/HomePage.xaml.cs create mode 100644 src/dopesbench/dopesbench/Package.appxmanifest create mode 100644 src/dopesbench/dopesbench/Platforms/Android/AndroidManifest.xml create mode 100644 src/dopesbench/dopesbench/Platforms/Android/Assets/AboutAssets.txt create mode 100644 src/dopesbench/dopesbench/Platforms/Android/Main.Android.cs create mode 100644 src/dopesbench/dopesbench/Platforms/Android/MainActivity.Android.cs create mode 100644 src/dopesbench/dopesbench/Platforms/Android/Resources/AboutResources.txt create mode 100644 src/dopesbench/dopesbench/Platforms/Android/Resources/values/Strings.xml create mode 100644 src/dopesbench/dopesbench/Platforms/Android/Resources/values/Styles.xml create mode 100644 src/dopesbench/dopesbench/Platforms/Android/environment.conf create mode 100644 src/dopesbench/dopesbench/Platforms/Desktop/Program.cs create mode 100644 src/dopesbench/dopesbench/Platforms/WebAssembly/LinkerConfig.xml create mode 100644 src/dopesbench/dopesbench/Platforms/WebAssembly/Program.cs create mode 100644 src/dopesbench/dopesbench/Platforms/WebAssembly/WasmCSS/Fonts.css create mode 100644 src/dopesbench/dopesbench/Platforms/WebAssembly/WasmScripts/AppManifest.js create mode 100644 src/dopesbench/dopesbench/Platforms/WebAssembly/manifest.webmanifest create mode 100644 src/dopesbench/dopesbench/Platforms/WebAssembly/wwwroot/staticwebapp.config.json create mode 100644 src/dopesbench/dopesbench/Platforms/WebAssembly/wwwroot/web.config create mode 100644 src/dopesbench/dopesbench/Platforms/iOS/Entitlements.plist create mode 100644 src/dopesbench/dopesbench/Platforms/iOS/Info.plist create mode 100644 src/dopesbench/dopesbench/Platforms/iOS/Main.iOS.cs create mode 100644 src/dopesbench/dopesbench/Platforms/iOS/Media.xcassets/LaunchImages.launchimage/Contents.json create mode 100644 src/dopesbench/dopesbench/Platforms/iOS/PrivacyInfo.xcprivacy create mode 100644 src/dopesbench/dopesbench/Properties/PublishProfiles/win-arm64.pubxml create mode 100644 src/dopesbench/dopesbench/Properties/PublishProfiles/win-x64.pubxml create mode 100644 src/dopesbench/dopesbench/Properties/PublishProfiles/win-x86.pubxml create mode 100644 src/dopesbench/dopesbench/Random2.cs create mode 100644 src/dopesbench/dopesbench/ReadMe.md create mode 100644 src/dopesbench/dopesbench/Services/Endpoints/DebugHandler.cs create mode 100644 src/dopesbench/dopesbench/Services/StopWatchService.cs create mode 100644 src/dopesbench/dopesbench/Strings/en/Resources.resw create mode 100644 src/dopesbench/dopesbench/app.manifest create mode 100644 src/dopesbench/dopesbench/dopesbench.csproj create mode 100644 src/dopesbench/global.json diff --git a/src/Benchmarks/Benchmarks.Wasm/Benchmarks.Wasm.sln b/src/Benchmarks/Benchmarks.Wasm/Benchmarks.Wasm.sln new file mode 100644 index 0000000..98583ec --- /dev/null +++ b/src/Benchmarks/Benchmarks.Wasm/Benchmarks.Wasm.sln @@ -0,0 +1,24 @@ +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.5.2.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Benchmarks.Wasm", "Benchmarks.Wasm.csproj", "{C139918E-4E50-FEAE-94DB-E16E9D622EA5}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {C139918E-4E50-FEAE-94DB-E16E9D622EA5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C139918E-4E50-FEAE-94DB-E16E9D622EA5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C139918E-4E50-FEAE-94DB-E16E9D622EA5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C139918E-4E50-FEAE-94DB-E16E9D622EA5}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {DB80F2C1-3FAF-489D-B214-5E86D1F3712D} + EndGlobalSection +EndGlobal diff --git a/src/dopes/Uno-dotnet6/DopeTestUno/DopeTestUno.Skia.Gtk/DopeTestUno.Skia.Gtk.csproj b/src/dopes/Uno-dotnet6/DopeTestUno/DopeTestUno.Skia.Gtk/DopeTestUno.Skia.Gtk.csproj index 04eb153..9d219be 100644 --- a/src/dopes/Uno-dotnet6/DopeTestUno/DopeTestUno.Skia.Gtk/DopeTestUno.Skia.Gtk.csproj +++ b/src/dopes/Uno-dotnet6/DopeTestUno/DopeTestUno.Skia.Gtk/DopeTestUno.Skia.Gtk.csproj @@ -12,7 +12,7 @@ - + are diff --git a/src/dopesbench/.editorconfig b/src/dopesbench/.editorconfig new file mode 100644 index 0000000..ee73562 --- /dev/null +++ b/src/dopesbench/.editorconfig @@ -0,0 +1,167 @@ +; This file is for unifying the coding style for different editors and IDEs. +; More information at http://editorconfig.org + +# This file is the top-most EditorConfig file +root = true + +########################################## +# Common Settings +########################################## + +[*] +indent_style = space +end_of_line = crlf +trim_trailing_whitespace = true +insert_final_newline = true +charset = utf-8 + +########################################## +# File Extension Settings +########################################## + +[*.{yml,yaml}] +indent_size = 2 + +[.vsconfig] +indent_size = 2 +end_of_line = lf + +[*.sln] +indent_style = tab +indent_size = 2 + +[*.{csproj,proj,projitems,shproj}] +indent_size = 4 + +[*.{json,slnf}] +indent_size = 2 +end_of_line = lf + +[*.{props,targets}] +indent_size = 4 + +[*.xaml] +indent_size = 4 +charset = utf-8-bom + +[*.xml] +indent_size = 4 +end_of_line = lf + +[*.plist] +indent_size = 4 +indent_style = tab +end_of_line = lf + +[*.manifest] +indent_size = 4 + +[*.appxmanifest] +indent_size = 4 + +[*.{json,css,webmanifest}] +indent_size = 2 +end_of_line = lf + +[web.config] +indent_size = 4 +end_of_line = lf + +[*.sh] +indent_size = 2 +end_of_line = lf + +[*.cs] +# EOL should be normalized by Git. See https://github.com/dotnet/format/issues/1099 +end_of_line = unset + +# See https://github.com/dotnet/roslyn/issues/20356#issuecomment-310143926 +trim_trailing_whitespace = false + +tab_width = 4 +indent_size = 4 + +# Sort using and Import directives with System.* appearing first +dotnet_sort_system_directives_first = true + +# Avoid "this." and "Me." if not necessary +dotnet_style_qualification_for_field = false:suggestion +dotnet_style_qualification_for_property = false:suggestion +dotnet_style_qualification_for_method = false:suggestion +dotnet_style_qualification_for_event = false:suggestion + +#### Naming styles #### + +# Naming rules + +dotnet_naming_rule.interface_should_be_begins_with_i.severity = suggestion +dotnet_naming_rule.interface_should_be_begins_with_i.symbols = interface +dotnet_naming_rule.interface_should_be_begins_with_i.style = begins_with_i + +dotnet_naming_rule.types_should_be_pascal_case.severity = suggestion +dotnet_naming_rule.types_should_be_pascal_case.symbols = types +dotnet_naming_rule.types_should_be_pascal_case.style = pascal_case + +dotnet_naming_rule.non_field_members_should_be_pascal_case.severity = suggestion +dotnet_naming_rule.non_field_members_should_be_pascal_case.symbols = non_field_members +dotnet_naming_rule.non_field_members_should_be_pascal_case.style = pascal_case + +# Symbol specifications + +dotnet_naming_symbols.interface.applicable_kinds = interface +dotnet_naming_symbols.interface.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.interface.required_modifiers = + +dotnet_naming_symbols.types.applicable_kinds = class, struct, interface, enum +dotnet_naming_symbols.types.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.types.required_modifiers = + +dotnet_naming_symbols.non_field_members.applicable_kinds = property, event, method +dotnet_naming_symbols.non_field_members.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.non_field_members.required_modifiers = + +# Naming styles + +dotnet_naming_style.begins_with_i.required_prefix = I +dotnet_naming_style.begins_with_i.required_suffix = +dotnet_naming_style.begins_with_i.word_separator = +dotnet_naming_style.begins_with_i.capitalization = pascal_case + +dotnet_naming_style.pascal_case.required_prefix = +dotnet_naming_style.pascal_case.required_suffix = +dotnet_naming_style.pascal_case.word_separator = +dotnet_naming_style.pascal_case.capitalization = pascal_case + +dotnet_naming_style.pascal_case.required_prefix = +dotnet_naming_style.pascal_case.required_suffix = +dotnet_naming_style.pascal_case.word_separator = +dotnet_naming_style.pascal_case.capitalization = pascal_case +dotnet_style_operator_placement_when_wrapping = beginning_of_line +dotnet_style_coalesce_expression = true:suggestion +dotnet_style_null_propagation = true:suggestion +dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion +dotnet_style_prefer_auto_properties = true:silent +dotnet_style_object_initializer = true:suggestion +dotnet_style_collection_initializer = true:suggestion +dotnet_style_prefer_simplified_boolean_expressions = true:suggestion +dotnet_style_prefer_conditional_expression_over_assignment = true:silent +dotnet_style_prefer_conditional_expression_over_return = true:silent +dotnet_style_explicit_tuple_names = true:suggestion +dotnet_style_prefer_inferred_tuple_names = true:suggestion + +csharp_indent_labels = one_less_than_current +csharp_using_directive_placement = outside_namespace:silent +csharp_prefer_simple_using_statement = true:suggestion +csharp_prefer_braces = true:silent +csharp_style_namespace_declarations = file_scoped:warning +csharp_style_prefer_method_group_conversion = true:silent +csharp_style_prefer_top_level_statements = true:silent +csharp_style_prefer_primary_constructors = true:suggestion +csharp_style_expression_bodied_methods = false:silent +csharp_style_expression_bodied_constructors = false:silent +csharp_style_expression_bodied_operators = false:silent +csharp_style_expression_bodied_properties = true:silent +csharp_style_expression_bodied_indexers = true:silent +csharp_style_expression_bodied_accessors = true:silent +csharp_style_expression_bodied_lambdas = true:silent +csharp_style_expression_bodied_local_functions = false:silent diff --git a/src/dopesbench/.gitignore b/src/dopesbench/.gitignore new file mode 100644 index 0000000..3860b21 --- /dev/null +++ b/src/dopesbench/.gitignore @@ -0,0 +1,412 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Ww][Ii][Nn]32/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +[Aa][Rr][Mm]64[Ee][Cc]/ +bld/ +[Bb]in/ +[Oo]bj/ +[Oo]ut/ +[Ll]og/ +[Ll]ogs/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Approval Tests result files +*.received.* + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# ASP.NET Scaffolding +ScaffoldingReadMe.txt + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.idb +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +# but not Directory.Build.rsp, as it configures directory-level build defaults +!Directory.Build.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.tlog +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Coverlet is a free, cross platform Code Coverage Tool +coverage*.json +coverage*.xml +coverage*.info + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio 6 auto-generated project file (contains which files were open etc.) +*.vbp + +# Visual Studio 6 workspace and project file (working project files containing files to include in project) +*.dsw +*.dsp + +# Visual Studio 6 technical files +*.ncb +*.aps + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# AWS SAM Build and Temporary Artifacts folder +.aws-sam + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# Visual Studio History (VSHistory) files +.vshistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ + +# Fody - auto-generated XML schema +FodyWeavers.xsd + +# VS Code files for those working on multiple tools +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +*.code-workspace + +# Local History for Visual Studio Code +.history/ + +# Windows Installer files from build outputs +*.cab +*.msi +*.msix +*.msm +*.msp + +# Single Target Config +solution-config.props +# Publish Profiles +!**/Properties/PublishProfiles/*.pubxml \ No newline at end of file diff --git a/src/dopesbench/.run/Readme.md b/src/dopesbench/.run/Readme.md new file mode 100644 index 0000000..6e72638 --- /dev/null +++ b/src/dopesbench/.run/Readme.md @@ -0,0 +1,3 @@ +# About the `.run` folder + +This folder is present to add support for the [Rider IDE](https://aka.platform.uno/rider-getstarted). You can remove this folder safely if you're not using Rider. diff --git a/src/dopesbench/.run/dopesbench.run.xml b/src/dopesbench/.run/dopesbench.run.xml new file mode 100644 index 0000000..4241677 --- /dev/null +++ b/src/dopesbench/.run/dopesbench.run.xml @@ -0,0 +1,47 @@ + + + + + + + + diff --git a/src/dopesbench/.vscode/extensions.json b/src/dopesbench/.vscode/extensions.json new file mode 100644 index 0000000..a63ad40 --- /dev/null +++ b/src/dopesbench/.vscode/extensions.json @@ -0,0 +1,5 @@ +{ + "recommendations": [ + "unoplatform.vscode" + ], +} diff --git a/src/dopesbench/.vscode/launch.json b/src/dopesbench/.vscode/launch.json new file mode 100644 index 0000000..b8be34d --- /dev/null +++ b/src/dopesbench/.vscode/launch.json @@ -0,0 +1,77 @@ +{ + // Use IntelliSense to find out which attributes exist for C# debugging + // Use hover for the description of the existing attributes + // For further information visit https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md + "version": "0.2.0", + "configurations": [ + { + "name": "Uno Platform Mobile Debug", + "type": "Uno", + "request": "launch", + // any Uno* task will do, this is simply to satisfy vscode requirement when a launch.json is present + "preLaunchTask": "Uno: android | Debug | android-x64" + }, + { + // Use IntelliSense to find out which attributes exist for C# debugging + // Use hover for the description of the existing attributes + // For further information visit https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md + "name": "Uno Platform WebAssembly Debug (Chrome)", + "type": "chrome", + "request": "launch", + "url": "http://localhost:5000", + "webRoot": "${workspaceFolder}/dopesbench", + "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", + "timeout": 30000, + "preLaunchTask": "build-wasm", + "server": { + "runtimeExecutable": "dotnet", + "program": "run", + "args": ["--no-build","-f","net9.0-browserwasm","--launch-profile", "dopesbench (WebAssembly)"], + "outputCapture": "std", + "timeout": 30000, + "cwd": "${workspaceFolder}/dopesbench" + } + }, + { + // Use IntelliSense to find out which attributes exist for C# debugging + // Use hover for the description of the existing attributes + // For further information visit https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md + "name": "Uno Platform WebAssembly Debug (Edge)", + "type": "msedge", + "request": "launch", + "url": "http://localhost:5000", + "webRoot": "${workspaceFolder}/dopesbench", + "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", + "timeout": 30000, + "preLaunchTask": "build-wasm", + "server": { + "runtimeExecutable": "dotnet", + "program": "run", + "args": ["--no-build","-f","net9.0-browserwasm","--launch-profile", "dopesbench (WebAssembly)"], + "outputCapture": "std", + "timeout": 30000, + "cwd": "${workspaceFolder}/dopesbench" + } + }, + { + // Use IntelliSense to find out which attributes exist for C# debugging + // Use hover for the description of the existing attributes + // For further information visit https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md + "name": "Uno Platform Desktop Debug", + "type": "coreclr", + "request": "launch", + "preLaunchTask": "build-desktop", + // If you have changed target frameworks, make sure to update the program path. + "program": "${workspaceFolder}/dopesbench/bin/Debug/net9.0-desktop/dopesbench.dll", + "args": [], + "launchSettingsProfile": "dopesbench (Desktop)", + "env": { + "DOTNET_MODIFIABLE_ASSEMBLIES": "debug" + }, + "cwd": "${workspaceFolder}/dopesbench", + // For more information about the 'console' field, see https://aka.ms/VSCode-CS-LaunchJson-Console + "console": "internalConsole", + "stopAtEntry": false + }, + ] +} diff --git a/src/dopesbench/.vscode/settings.json b/src/dopesbench/.vscode/settings.json new file mode 100644 index 0000000..3405922 --- /dev/null +++ b/src/dopesbench/.vscode/settings.json @@ -0,0 +1,10 @@ +{ + "explorer.fileNesting.enabled": true, + "explorer.fileNesting.expand": false, + "explorer.fileNesting.patterns": { + "*.xaml": "$(capture).xaml.cs" + }, + "files.associations": { + "global.json": "jsonc" + } +} diff --git a/src/dopesbench/.vscode/tasks.json b/src/dopesbench/.vscode/tasks.json new file mode 100644 index 0000000..ae90e9f --- /dev/null +++ b/src/dopesbench/.vscode/tasks.json @@ -0,0 +1,57 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "build-wasm", + "command": "dotnet", + "type": "process", + "args": [ + "build", + "${workspaceFolder}/dopesbench/dopesbench.csproj", + "/property:GenerateFullPaths=true", + "/property:TargetFramework=net9.0-browserwasm", + "/consoleloggerparameters:NoSummary" + ], + "problemMatcher": "$msCompile" + }, + { + "label": "publish-wasm", + "command": "dotnet", + "type": "process", + "args": [ + "publish", + "${workspaceFolder}/dopesbench/dopesbench.csproj", + "/property:GenerateFullPaths=true", + "/property:TargetFramework=net9.0-browserwasm", + "/consoleloggerparameters:NoSummary" + ], + "problemMatcher": "$msCompile" + }, + { + "label": "build-desktop", + "command": "dotnet", + "type": "process", + "args": [ + "build", + "${workspaceFolder}/dopesbench/dopesbench.csproj", + "/property:GenerateFullPaths=true", + "/property:TargetFramework=net9.0-desktop", + "/consoleloggerparameters:NoSummary" + ], + "problemMatcher": "$msCompile" + }, + { + "label": "publish-desktop", + "command": "dotnet", + "type": "process", + "args": [ + "publish", + "${workspaceFolder}/dopesbench/dopesbench.csproj", + "/property:GenerateFullPaths=true", + "/property:TargetFramework=net9.0-desktop", + "/consoleloggerparameters:NoSummary" + ], + "problemMatcher": "$msCompile" + } + ] +} diff --git a/src/dopesbench/.vsconfig b/src/dopesbench/.vsconfig new file mode 100644 index 0000000..f6ff391 --- /dev/null +++ b/src/dopesbench/.vsconfig @@ -0,0 +1,30 @@ +{ + "version": "1.0", + "components": [ + "Microsoft.VisualStudio.Component.CoreEditor", + "Microsoft.VisualStudio.Workload.CoreEditor", + "Microsoft.NetCore.Component.SDK", + "Microsoft.NetCore.Component.DevelopmentTools", + "Microsoft.Net.ComponentGroup.DevelopmentPrerequisites", + "Microsoft.VisualStudio.Component.TextTemplating", + "Microsoft.VisualStudio.ComponentGroup.WebToolsExtensions", + "Microsoft.NetCore.Component.Web", + "Microsoft.VisualStudio.Component.IISExpress", + "Component.Microsoft.Web.LibraryManager", + "Microsoft.VisualStudio.ComponentGroup.Web", + "Microsoft.VisualStudio.Component.Web", + "Microsoft.VisualStudio.ComponentGroup.Web.Client", + "Microsoft.VisualStudio.Workload.NetWeb", + "Microsoft.VisualStudio.ComponentGroup.WebToolsExtensions.TemplateEngine", + "Microsoft.VisualStudio.Component.ManagedDesktop.Prerequisites", + "Microsoft.VisualStudio.Component.Debugger.JustInTime", + "Microsoft.VisualStudio.Workload.ManagedDesktop", + "Component.Xamarin.RemotedSimulator", + "Microsoft.VisualStudio.Component.MonoDebugger", + "Microsoft.VisualStudio.ComponentGroup.Maui.All", + "Component.Android.SDK34", + "Component.OpenJDK", + "Microsoft.VisualStudio.Workload.NetCrossPlat", + "Microsoft.VisualStudio.Workload.NetCoreTools" + ] +} diff --git a/src/dopesbench/Directory.Build.props b/src/dopesbench/Directory.Build.props new file mode 100644 index 0000000..8daf569 --- /dev/null +++ b/src/dopesbench/Directory.Build.props @@ -0,0 +1,15 @@ + + + enable + enable + true + + + $(NoWarn);NU1507;NETSDK1201;PRI257 + + diff --git a/src/dopesbench/Directory.Build.targets b/src/dopesbench/Directory.Build.targets new file mode 100644 index 0000000..f75adf7 --- /dev/null +++ b/src/dopesbench/Directory.Build.targets @@ -0,0 +1,2 @@ + + diff --git a/src/dopesbench/Directory.Packages.props b/src/dopesbench/Directory.Packages.props new file mode 100644 index 0000000..f366262 --- /dev/null +++ b/src/dopesbench/Directory.Packages.props @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/dopesbench/dopesbench.sln b/src/dopesbench/dopesbench.sln new file mode 100644 index 0000000..6775273 --- /dev/null +++ b/src/dopesbench/dopesbench.sln @@ -0,0 +1,90 @@ +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.2.32210.308 +MinimumVisualStudioVersion = 15.0.26124.0 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "dopesbench", "dopesbench\dopesbench.csproj", "{F1EDEBA3-4A34-4935-8218-8230A27DCB72}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{BADA71DC-7FFD-4EDC-9F28-FB74AEADC713}" + ProjectSection(SolutionItems) = preProject + .editorconfig = .editorconfig + .gitignore = .gitignore + .vsconfig = .vsconfig + Directory.Build.props = Directory.Build.props + Directory.Build.targets = Directory.Build.targets + Directory.Packages.props = Directory.Packages.props + global.json = global.json + EndProjectSection +EndProject +Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "Benchmarks.Shared", "dopesbench\Benchmarks.Shared\Benchmarks.Shared.shproj", "{6279C845-92F8-4333-AB99-3D213163593C}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|ARM = Debug|ARM + Debug|ARM64 = Debug|ARM64 + Debug|iPhone = Debug|iPhone + Debug|iPhoneSimulator = Debug|iPhoneSimulator + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU + Release|ARM = Release|ARM + Release|ARM64 = Release|ARM64 + Release|iPhone = Release|iPhone + Release|iPhoneSimulator = Release|iPhoneSimulator + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {F1EDEBA3-4A34-4935-8218-8230A27DCB72}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F1EDEBA3-4A34-4935-8218-8230A27DCB72}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F1EDEBA3-4A34-4935-8218-8230A27DCB72}.Debug|Any CPU.Deploy.0 = Debug|Any CPU + {F1EDEBA3-4A34-4935-8218-8230A27DCB72}.Debug|ARM.ActiveCfg = Debug|Any CPU + {F1EDEBA3-4A34-4935-8218-8230A27DCB72}.Debug|ARM.Build.0 = Debug|Any CPU + {F1EDEBA3-4A34-4935-8218-8230A27DCB72}.Debug|ARM.Deploy.0 = Debug|Any CPU + {F1EDEBA3-4A34-4935-8218-8230A27DCB72}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {F1EDEBA3-4A34-4935-8218-8230A27DCB72}.Debug|ARM64.Build.0 = Debug|Any CPU + {F1EDEBA3-4A34-4935-8218-8230A27DCB72}.Debug|ARM64.Deploy.0 = Debug|Any CPU + {F1EDEBA3-4A34-4935-8218-8230A27DCB72}.Debug|iPhone.ActiveCfg = Debug|Any CPU + {F1EDEBA3-4A34-4935-8218-8230A27DCB72}.Debug|iPhone.Build.0 = Debug|Any CPU + {F1EDEBA3-4A34-4935-8218-8230A27DCB72}.Debug|iPhone.Deploy.0 = Debug|Any CPU + {F1EDEBA3-4A34-4935-8218-8230A27DCB72}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {F1EDEBA3-4A34-4935-8218-8230A27DCB72}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU + {F1EDEBA3-4A34-4935-8218-8230A27DCB72}.Debug|iPhoneSimulator.Deploy.0 = Debug|Any CPU + {F1EDEBA3-4A34-4935-8218-8230A27DCB72}.Debug|x64.ActiveCfg = Debug|Any CPU + {F1EDEBA3-4A34-4935-8218-8230A27DCB72}.Debug|x64.Build.0 = Debug|Any CPU + {F1EDEBA3-4A34-4935-8218-8230A27DCB72}.Debug|x64.Deploy.0 = Debug|Any CPU + {F1EDEBA3-4A34-4935-8218-8230A27DCB72}.Debug|x86.ActiveCfg = Debug|Any CPU + {F1EDEBA3-4A34-4935-8218-8230A27DCB72}.Debug|x86.Build.0 = Debug|Any CPU + {F1EDEBA3-4A34-4935-8218-8230A27DCB72}.Debug|x86.Deploy.0 = Debug|Any CPU + {F1EDEBA3-4A34-4935-8218-8230A27DCB72}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F1EDEBA3-4A34-4935-8218-8230A27DCB72}.Release|Any CPU.Build.0 = Release|Any CPU + {F1EDEBA3-4A34-4935-8218-8230A27DCB72}.Release|Any CPU.Deploy.0 = Release|Any CPU + {F1EDEBA3-4A34-4935-8218-8230A27DCB72}.Release|ARM.ActiveCfg = Release|Any CPU + {F1EDEBA3-4A34-4935-8218-8230A27DCB72}.Release|ARM.Build.0 = Release|Any CPU + {F1EDEBA3-4A34-4935-8218-8230A27DCB72}.Release|ARM.Deploy.0 = Release|Any CPU + {F1EDEBA3-4A34-4935-8218-8230A27DCB72}.Release|ARM64.ActiveCfg = Release|Any CPU + {F1EDEBA3-4A34-4935-8218-8230A27DCB72}.Release|ARM64.Build.0 = Release|Any CPU + {F1EDEBA3-4A34-4935-8218-8230A27DCB72}.Release|ARM64.Deploy.0 = Release|Any CPU + {F1EDEBA3-4A34-4935-8218-8230A27DCB72}.Release|iPhone.ActiveCfg = Release|Any CPU + {F1EDEBA3-4A34-4935-8218-8230A27DCB72}.Release|iPhone.Build.0 = Release|Any CPU + {F1EDEBA3-4A34-4935-8218-8230A27DCB72}.Release|iPhone.Deploy.0 = Release|Any CPU + {F1EDEBA3-4A34-4935-8218-8230A27DCB72}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {F1EDEBA3-4A34-4935-8218-8230A27DCB72}.Release|iPhoneSimulator.Build.0 = Release|Any CPU + {F1EDEBA3-4A34-4935-8218-8230A27DCB72}.Release|iPhoneSimulator.Deploy.0 = Release|Any CPU + {F1EDEBA3-4A34-4935-8218-8230A27DCB72}.Release|x64.ActiveCfg = Release|Any CPU + {F1EDEBA3-4A34-4935-8218-8230A27DCB72}.Release|x64.Build.0 = Release|Any CPU + {F1EDEBA3-4A34-4935-8218-8230A27DCB72}.Release|x64.Deploy.0 = Release|Any CPU + {F1EDEBA3-4A34-4935-8218-8230A27DCB72}.Release|x86.ActiveCfg = Release|Any CPU + {F1EDEBA3-4A34-4935-8218-8230A27DCB72}.Release|x86.Build.0 = Release|Any CPU + {F1EDEBA3-4A34-4935-8218-8230A27DCB72}.Release|x86.Deploy.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {55CBD133-33C2-4412-9634-A5983D990F39} + EndGlobalSection + GlobalSection(SharedMSBuildProjectFiles) = preSolution + dopesbench\Benchmarks.Shared\Benchmarks.Shared.projitems*{6279c845-92f8-4333-ab99-3d213163593c}*SharedItemsImports = 13 + EndGlobalSection +EndGlobal diff --git a/src/dopesbench/dopesbench/App.xaml b/src/dopesbench/dopesbench/App.xaml new file mode 100644 index 0000000..daffb58 --- /dev/null +++ b/src/dopesbench/dopesbench/App.xaml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + diff --git a/src/dopesbench/dopesbench/App.xaml.cs b/src/dopesbench/dopesbench/App.xaml.cs new file mode 100644 index 0000000..0963a5d --- /dev/null +++ b/src/dopesbench/dopesbench/App.xaml.cs @@ -0,0 +1,122 @@ +using System; +using Microsoft.Extensions.Logging; +using Uno.Resizetizer; + +namespace dopesbench; + +public partial class App : Application +{ + public static Window MainAppWindow { get; private set; } + /// + /// Initializes the singleton application object. This is the first line of authored code + /// executed, and as such is the logical equivalent of main() or WinMain(). + /// + public App() + { + this.InitializeComponent(); + } + + protected Window? MainWindow { get; private set; } + + protected override void OnLaunched(LaunchActivatedEventArgs args) + { + MainWindow = new Window(); + MainAppWindow = MainWindow; +#if DEBUG + MainWindow.UseStudio(); +#endif + + + if (MainWindow.Content is not Components.AppBar shell) + { + shell = new Components.AppBar(); + MainWindow.Content = shell; + } + + shell.Navigate(typeof(HomePage), args.Arguments); + + MainWindow.SetWindowIcon(); + // Ensure the current window is active + MainWindow.Activate(); + } + + /// + /// Invoked when Navigation to a certain page fails + /// + /// The Frame which failed navigation + /// Details about the navigation failure + void OnNavigationFailed(object sender, NavigationFailedEventArgs e) + { + throw new InvalidOperationException($"Failed to load {e.SourcePageType.FullName}: {e.Exception}"); + } + + /// + /// Configures global Uno Platform logging + /// + public static void InitializeLogging() + { +#if DEBUG + // Logging is disabled by default for release builds, as it incurs a significant + // initialization cost from Microsoft.Extensions.Logging setup. If startup performance + // is a concern for your application, keep this disabled. If you're running on the web or + // desktop targets, you can use URL or command line parameters to enable it. + // + // For more performance documentation: https://platform.uno/docs/articles/Uno-UI-Performance.html + + var factory = LoggerFactory.Create(builder => + { +#if __WASM__ + builder.AddProvider(new global::Uno.Extensions.Logging.WebAssembly.WebAssemblyConsoleLoggerProvider()); +#elif __IOS__ + builder.AddProvider(new global::Uno.Extensions.Logging.OSLogLoggerProvider()); + + // Log to the Visual Studio Debug console + builder.AddConsole(); +#else + builder.AddConsole(); +#endif + + // Exclude logs below this level + builder.SetMinimumLevel(LogLevel.Information); + + // Default filters for Uno Platform namespaces + builder.AddFilter("Uno", LogLevel.Warning); + builder.AddFilter("Windows", LogLevel.Warning); + builder.AddFilter("Microsoft", LogLevel.Warning); + + // Generic Xaml events + // builder.AddFilter("Microsoft.UI.Xaml", LogLevel.Debug ); + // builder.AddFilter("Microsoft.UI.Xaml.VisualStateGroup", LogLevel.Debug ); + // builder.AddFilter("Microsoft.UI.Xaml.StateTriggerBase", LogLevel.Debug ); + // builder.AddFilter("Microsoft.UI.Xaml.UIElement", LogLevel.Debug ); + // builder.AddFilter("Microsoft.UI.Xaml.FrameworkElement", LogLevel.Trace ); + + // Layouter specific messages + // builder.AddFilter("Microsoft.UI.Xaml.Controls", LogLevel.Debug ); + // builder.AddFilter("Microsoft.UI.Xaml.Controls.Layouter", LogLevel.Debug ); + // builder.AddFilter("Microsoft.UI.Xaml.Controls.Panel", LogLevel.Debug ); + + // builder.AddFilter("Windows.Storage", LogLevel.Debug ); + + // Binding related messages + // builder.AddFilter("Microsoft.UI.Xaml.Data", LogLevel.Debug ); + // builder.AddFilter("Microsoft.UI.Xaml.Data", LogLevel.Debug ); + + // Binder memory references tracking + // builder.AddFilter("Uno.UI.DataBinding.BinderReferenceHolder", LogLevel.Debug ); + + // DevServer and HotReload related + // builder.AddFilter("Uno.UI.RemoteControl", LogLevel.Information); + + // Debug JS interop + // builder.AddFilter("Uno.Foundation.WebAssemblyRuntime", LogLevel.Debug ); + }); + + global::Uno.Extensions.LogExtensionPoint.AmbientLoggerFactory = factory; + +#if HAS_UNO + global::Uno.UI.Adapter.Microsoft.Extensions.Logging.LoggingAdapter.Initialize(); +#endif +#endif + } +} diff --git a/src/dopesbench/dopesbench/Assets/Icons/icon.svg b/src/dopesbench/dopesbench/Assets/Icons/icon.svg new file mode 100644 index 0000000..a15af53 --- /dev/null +++ b/src/dopesbench/dopesbench/Assets/Icons/icon.svg @@ -0,0 +1,42 @@ + + + + + + diff --git a/src/dopesbench/dopesbench/Assets/Icons/icon_foreground.svg b/src/dopesbench/dopesbench/Assets/Icons/icon_foreground.svg new file mode 100644 index 0000000..8ffc41a --- /dev/null +++ b/src/dopesbench/dopesbench/Assets/Icons/icon_foreground.svg @@ -0,0 +1,137 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dopesbench/dopesbench/Assets/SharedAssets.md b/src/dopesbench/dopesbench/Assets/SharedAssets.md new file mode 100644 index 0000000..b1cc4e7 --- /dev/null +++ b/src/dopesbench/dopesbench/Assets/SharedAssets.md @@ -0,0 +1,32 @@ +# Shared Assets + +See documentation about assets here: https://github.com/unoplatform/uno/blob/master/doc/articles/features/working-with-assets.md + +## Here is a cheat sheet + +1. Add the image file to the `Assets` directory of a shared project. +2. Set the build action to `Content`. +3. (Recommended) Provide an asset for various scales/dpi + +### Examples + +```text +\Assets\Images\logo.scale-100.png +\Assets\Images\logo.scale-200.png +\Assets\Images\logo.scale-400.png + +\Assets\Images\scale-100\logo.png +\Assets\Images\scale-200\logo.png +\Assets\Images\scale-400\logo.png +``` + +### Table of scales + +| Scale | WinUI | iOS | Android | +|-------|:-----------:|:---------------:|:-------:| +| `100` | scale-100 | @1x | mdpi | +| `125` | scale-125 | N/A | N/A | +| `150` | scale-150 | N/A | hdpi | +| `200` | scale-200 | @2x | xhdpi | +| `300` | scale-300 | @3x | xxhdpi | +| `400` | scale-400 | N/A | xxxhdpi | diff --git a/src/dopesbench/dopesbench/Assets/Splash/splash_screen.svg b/src/dopesbench/dopesbench/Assets/Splash/splash_screen.svg new file mode 100644 index 0000000..8ffc41a --- /dev/null +++ b/src/dopesbench/dopesbench/Assets/Splash/splash_screen.svg @@ -0,0 +1,137 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dopesbench/dopesbench/Assets/wallpaper_uno.jpg b/src/dopesbench/dopesbench/Assets/wallpaper_uno.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1c92f790c95cf75f56078523b1001d51c2886d0f GIT binary patch literal 75877 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 literal 0 HcmV?d00001 diff --git a/src/dopesbench/dopesbench/Benchmarks.Shared/App.xaml b/src/dopesbench/dopesbench/Benchmarks.Shared/App.xaml new file mode 100644 index 0000000..13ea103 --- /dev/null +++ b/src/dopesbench/dopesbench/Benchmarks.Shared/App.xaml @@ -0,0 +1,16 @@ + + + + + + + + + + + + diff --git a/src/dopesbench/dopesbench/Benchmarks.Shared/App.xaml.cs b/src/dopesbench/dopesbench/Benchmarks.Shared/App.xaml.cs new file mode 100644 index 0000000..eaf0c58 --- /dev/null +++ b/src/dopesbench/dopesbench/Benchmarks.Shared/App.xaml.cs @@ -0,0 +1,172 @@ +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Runtime.InteropServices.WindowsRuntime; +using Uno.ApplicationModel; +using Windows.ApplicationModel.Activation; +using Uno.Foundation; +using Windows.Foundation.Collections; +using Uno.UI.Xaml; +using Uno.UI.Xaml.Controls; +using Uno.UI.Xaml.Input; +using Uno.UI.Xaml.Media; + +namespace Benchmarks +{ + ///

+ /// Provides application-specific behavior to supplement the default Application class. + /// + public sealed partial class App : Application + { + private Window _window; + + /// + /// Initializes the singleton application object. This is the first line of authored code + /// executed, and as such is the logical equivalent of main() or WinMain(). + /// + public App() + { + InitializeLogging(); + + this.InitializeComponent(); + +#if HAS_UNO || NETFX_CORE + this.Suspending += OnSuspending; +#endif + } + + /// + /// Invoked when the application is launched normally by the end user. Other entry points + /// will be used such as when the application is launched to open a specific file. + /// + /// Details about the launch request and process. + protected override void OnLaunched(Microsoft.UI.Xaml.LaunchActivatedEventArgs args) + { +#if DEBUG + if (System.Diagnostics.Debugger.IsAttached) + { + // this.DebugSettings.EnableFrameRateCounter = true; + } +#endif + +#if NET5_0 && WINDOWS + _window = new Window(); + _window.Activate(); +#else + +#endif + + var rootFrame = _window.Content as Frame; + + // Do not repeat app initialization when the Window already has content, + // just ensure that the window is active + if (rootFrame == null) + { + // Create a Frame to act as the navigation context and navigate to the first page + rootFrame = new Frame(); + + rootFrame.NavigationFailed += OnNavigationFailed; + + // Place the frame in the current Window + _window.Content = rootFrame; + } + + // Remove the problematic PrelaunchActivated check + if (rootFrame.Content == null) + { + // When the navigation stack isn't restored navigate to the first page, + // configuring the new page by passing required information as a navigation + // parameter + rootFrame.Navigate(typeof(MainPage), args.Arguments); + } + // Ensure the current window is active + _window.Activate(); + } + + /// + /// Invoked when Navigation to a certain page fails + /// + /// The Frame which failed navigation + /// Details about the navigation failure + void OnNavigationFailed(object sender, NavigationFailedEventArgs e) + { + throw new InvalidOperationException($"Failed to load {e.SourcePageType.FullName}: {e.Exception}"); + } + + /// + /// Invoked when application execution is being suspended. Application state is saved + /// without knowing whether the application will be terminated or resumed with the contents + /// of memory still intact. + /// + /// The source of the suspend request. + /// Details about the suspend request. + private void OnSuspending(object sender, SuspendingEventArgs e) + { + var deferral = e.SuspendingOperation.GetDeferral(); + // TODO: Save application state and stop any background activity + deferral.Complete(); + } + + /// + /// Configures global Uno Platform logging + /// + private static void InitializeLogging() + { + var factory = LoggerFactory.Create(builder => + { +#if __WASM__ + builder.AddProvider(new global::Uno.Extensions.Logging.WebAssembly.WebAssemblyConsoleLoggerProvider()); +#elif __IOS__ + builder.AddProvider(new global::Uno.Extensions.Logging.OSLogLoggerProvider()); +#elif NETFX_CORE + builder.AddDebug(); +#else + builder.AddConsole(); +#endif + + // Exclude logs below this level + builder.SetMinimumLevel(LogLevel.Information); + + // Default filters for Uno Platform namespaces + builder.AddFilter("Uno", LogLevel.Warning); + builder.AddFilter("Windows", LogLevel.Warning); + builder.AddFilter("Microsoft", LogLevel.Warning); + + // Generic Xaml events + // builder.AddFilter("Windows.UI.Xaml", LogLevel.Debug ); + // builder.AddFilter("Windows.UI.Xaml.VisualStateGroup", LogLevel.Debug ); + // builder.AddFilter("Windows.UI.Xaml.StateTriggerBase", LogLevel.Debug ); + // builder.AddFilter("Windows.UI.Xaml.UIElement", LogLevel.Debug ); + // builder.AddFilter("Windows.UI.Xaml.FrameworkElement", LogLevel.Trace ); + + // Layouter specific messages + // builder.AddFilter("Windows.UI.Xaml.Controls", LogLevel.Debug ); + // builder.AddFilter("Windows.UI.Xaml.Controls.Layouter", LogLevel.Debug ); + // builder.AddFilter("Windows.UI.Xaml.Controls.Panel", LogLevel.Debug ); + + // builder.AddFilter("Windows.Storage", LogLevel.Debug ); + + // Binding related messages + // builder.AddFilter("Windows.UI.Xaml.Data", LogLevel.Debug ); + // builder.AddFilter("Windows.UI.Xaml.Data", LogLevel.Debug ); + + // Binder memory references tracking + // builder.AddFilter("Uno.UI.DataBinding.BinderReferenceHolder", LogLevel.Debug ); + + // RemoteControl and HotReload related + // builder.AddFilter("Uno.UI.RemoteControl", LogLevel.Information); + + // Debug JS interop + // builder.AddFilter("Uno.Foundation.WebAssemblyRuntime", LogLevel.Debug ); + }); + + global::Uno.Extensions.LogExtensionPoint.AmbientLoggerFactory = factory; + +#if HAS_UNO + global::Uno.UI.Adapter.Microsoft.Extensions.Logging.LoggingAdapter.Initialize(); +#endif + } + } +} diff --git a/src/dopesbench/dopesbench/Benchmarks.Shared/Assets/SharedAssets.md b/src/dopesbench/dopesbench/Benchmarks.Shared/Assets/SharedAssets.md new file mode 100644 index 0000000..6d84997 --- /dev/null +++ b/src/dopesbench/dopesbench/Benchmarks.Shared/Assets/SharedAssets.md @@ -0,0 +1,34 @@ +See documentation about assets here : https://github.com/unoplatform/uno/blob/master/doc/articles/features/working-with-assets.md + +# Here is a cheat sheet: + +1. Add the image file to the `Assets` directory of a shared project. +2. Set the build action to `Content`. +3. (Recommended) Provide an asset for various scales/dpi + +## Examples + +``` +\Assets\Images\logo.scale-100.png +\Assets\Images\logo.scale-200.png +\Assets\Images\logo.scale-400.png + +\Assets\Images\scale-100\logo.png +\Assets\Images\scale-200\logo.png +\Assets\Images\scale-400\logo.png +``` + +## Table of scales + +| Scale | UWP | iOS | Android | +|-------|:-----------:|:--------:|:-------:| +| `100` | scale-100 | @1x | mdpi | +| `125` | scale-125 | N/A | N/A | +| `150` | scale-150 | N/A | hdpi | +| `200` | scale-200 | @2x | xhdpi | +| `300` | scale-300 | @3x | xxhdpi | +| `400` | scale-400 | N/A | xxxhdpi | + + + + diff --git a/src/dopesbench/dopesbench/Benchmarks.Shared/Benchmarking/IAsyncUIBenchmark.cs b/src/dopesbench/dopesbench/Benchmarks.Shared/Benchmarking/IAsyncUIBenchmark.cs new file mode 100644 index 0000000..5cca154 --- /dev/null +++ b/src/dopesbench/dopesbench/Benchmarks.Shared/Benchmarking/IAsyncUIBenchmark.cs @@ -0,0 +1,9 @@ +using System.Threading.Tasks; + +namespace Benchmarks.Shared.Benchmarking +{ + internal interface IAsyncUIBenchmark + { + Task BenchmarkAsync(); + } +} diff --git a/src/dopesbench/dopesbench/Benchmarks.Shared/Benchmarking/IAsyncUIBenchmarkSetup.cs b/src/dopesbench/dopesbench/Benchmarks.Shared/Benchmarking/IAsyncUIBenchmarkSetup.cs new file mode 100644 index 0000000..f3b1ecd --- /dev/null +++ b/src/dopesbench/dopesbench/Benchmarks.Shared/Benchmarking/IAsyncUIBenchmarkSetup.cs @@ -0,0 +1,10 @@ +using System.Threading.Tasks; + +namespace Benchmarks.Shared.Benchmarking +{ + internal interface IAsyncUIBenchmarkSetup + { + Task SetupAsync(); + Task TeardownAsync(); + } +} diff --git a/src/dopesbench/dopesbench/Benchmarks.Shared/Benchmarks.Shared.projitems b/src/dopesbench/dopesbench/Benchmarks.Shared/Benchmarks.Shared.projitems new file mode 100644 index 0000000..f0f0f2a --- /dev/null +++ b/src/dopesbench/dopesbench/Benchmarks.Shared/Benchmarks.Shared.projitems @@ -0,0 +1,63 @@ + + + + $(MSBuildAllProjects);$(MSBuildThisFileFullPath) + true + 6279c845-92f8-4333-ab99-3d213163593c + + + Benchmarks + + + + Designer + MSBuild:Compile + + + + + App.xaml + + + MainPage.xaml + + + + + Designer + MSBuild:Compile + + + + + + + + + + + + <_Globbled_Page Include="$(MSBuildThisFileDirectory)**/*.xaml" Exclude="@(Page);@(ApplicationDefinition)"> + Designer + MSBuild:Compile + + + + <_Globbed_Compile Include="$(MSBuildThisFileDirectory)**/*.xaml.cs" Exclude="@(Compile)"> + %(Filename) + + <_Globbed_Compile Include="$(MSBuildThisFileDirectory)**/*.cs" Exclude="@(Compile);@(_Globbed_Compile)" /> + + + <_Globbed_PRIResource Include="$(MSBuildThisFileDirectory)**/*.resw" Exclude="@(PRIResource)" /> + + + <_Globbed_Content Include="$(MSBuildThisFileDirectory)Assets/**/*.*" Exclude="@(Content)" /> + + + + diff --git a/src/dopesbench/dopesbench/Benchmarks.Shared/Benchmarks.Shared.shproj b/src/dopesbench/dopesbench/Benchmarks.Shared/Benchmarks.Shared.shproj new file mode 100644 index 0000000..fbfc375 --- /dev/null +++ b/src/dopesbench/dopesbench/Benchmarks.Shared/Benchmarks.Shared.shproj @@ -0,0 +1,13 @@ + + + + 6279c845-92f8-4333-ab99-3d213163593c + 14.0 + + + + + + + + diff --git a/src/dopesbench/dopesbench/Benchmarks.Shared/Controls/AsyncUIBenchmarkControl.xaml b/src/dopesbench/dopesbench/Benchmarks.Shared/Controls/AsyncUIBenchmarkControl.xaml new file mode 100644 index 0000000..c4a1c04 --- /dev/null +++ b/src/dopesbench/dopesbench/Benchmarks.Shared/Controls/AsyncUIBenchmarkControl.xaml @@ -0,0 +1,34 @@ + + + + + + + + +