From 6c89473ca1c44527aab4f38bb4ade0318ead8e91 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Fri, 17 Jul 2020 16:59:22 +0300 Subject: [PATCH] Fixed tests --- .../DesignWindowLoader.cs | 12 ++++-------- .../AvaloniaXamlLoader.cs | 19 ++++++++++++++++++- .../Avalonia.Designer.HostApp.csproj | 4 ++-- .../DesignXamlLoader.cs | 8 ++++---- .../Avalonia.Designer.HostApp/Program.cs | 3 ++- .../MarkupExtensions/ResourceIncludeTests.cs | 2 +- .../XamlTestBase.cs | 11 +++++++++++ 7 files changed, 42 insertions(+), 17 deletions(-) diff --git a/src/Avalonia.DesignerSupport/DesignWindowLoader.cs b/src/Avalonia.DesignerSupport/DesignWindowLoader.cs index d7c6cc3693..59862da230 100644 --- a/src/Avalonia.DesignerSupport/DesignWindowLoader.cs +++ b/src/Avalonia.DesignerSupport/DesignWindowLoader.cs @@ -12,21 +12,17 @@ namespace Avalonia.DesignerSupport { public class DesignWindowLoader { - public interface IDesignXamlLoader - { - object Load(MemoryStream stream, Assembly localAsm, object o, Uri baseUri); - } - public static Window LoadDesignerWindow(string xaml, string assemblyPath, string xamlFileProjectPath) { Window window; Control control; using (PlatformManager.DesignerMode()) { - var loader = AvaloniaLocator.Current.GetService(); + var loader = AvaloniaLocator.Current.GetService(); var stream = new MemoryStream(Encoding.UTF8.GetBytes(xaml)); - + if (loader == null) + throw new XamlLoadException("Runtime XAML loader is not registered"); Uri baseUri = null; if (assemblyPath != null) @@ -39,7 +35,7 @@ namespace Avalonia.DesignerSupport } var localAsm = assemblyPath != null ? Assembly.LoadFile(Path.GetFullPath(assemblyPath)) : null; - var loaded = loader.Load(stream, localAsm, null, baseUri); + var loaded = loader.Load(stream, localAsm, null, baseUri, true); var style = loaded as IStyle; if (style != null) { diff --git a/src/Markup/Avalonia.Markup.Xaml/AvaloniaXamlLoader.cs b/src/Markup/Avalonia.Markup.Xaml/AvaloniaXamlLoader.cs index 0e81ca2be8..e5c6b72d12 100644 --- a/src/Markup/Avalonia.Markup.Xaml/AvaloniaXamlLoader.cs +++ b/src/Markup/Avalonia.Markup.Xaml/AvaloniaXamlLoader.cs @@ -12,6 +12,11 @@ namespace Avalonia.Markup.Xaml /// public static class AvaloniaXamlLoader { + public interface IRuntimeXamlLoader + { + object Load(Stream stream, Assembly localAsm, object o, Uri baseUri, bool designMode); + } + /// /// Loads the XAML into a Avalonia component. /// @@ -53,7 +58,19 @@ namespace Avalonia.Markup.Xaml if (compiledResult != null) return compiledResult; } - + + // This is intended for unit-tests only + var runtimeLoader = AvaloniaLocator.Current.GetService(); + if (runtimeLoader != null) + { + var asset = assetLocator.OpenAndGetAssembly(uri, baseUri); + using (var stream = asset.stream) + { + var absoluteUri = uri.IsAbsoluteUri ? uri : new Uri(baseUri, uri); + return runtimeLoader.Load(stream, asset.assembly, null, absoluteUri, false); + } + } + throw new XamlLoadException( $"No precompiled XAML found for {uri} (baseUri: {baseUri}), make sure to specify x:Class and include your XAML file as AvaloniaResource"); } diff --git a/src/tools/Avalonia.Designer.HostApp/Avalonia.Designer.HostApp.csproj b/src/tools/Avalonia.Designer.HostApp/Avalonia.Designer.HostApp.csproj index aa40f1d75a..51d18e55d1 100644 --- a/src/tools/Avalonia.Designer.HostApp/Avalonia.Designer.HostApp.csproj +++ b/src/tools/Avalonia.Designer.HostApp/Avalonia.Designer.HostApp.csproj @@ -20,8 +20,8 @@ - - + + diff --git a/src/tools/Avalonia.Designer.HostApp/DesignXamlLoader.cs b/src/tools/Avalonia.Designer.HostApp/DesignXamlLoader.cs index b873027765..7af29a56a1 100644 --- a/src/tools/Avalonia.Designer.HostApp/DesignXamlLoader.cs +++ b/src/tools/Avalonia.Designer.HostApp/DesignXamlLoader.cs @@ -1,16 +1,16 @@ using System; using System.IO; using System.Reflection; -using Avalonia.DesignerSupport; +using Avalonia.Markup.Xaml; using Avalonia.Markup.Xaml.XamlIl; namespace Avalonia.Designer.HostApp { - class DesignXamlLoader : DesignWindowLoader.IDesignXamlLoader + class DesignXamlLoader : AvaloniaXamlLoader.IRuntimeXamlLoader { - public object Load(MemoryStream stream, Assembly localAsm, object o, Uri baseUri) + public object Load(Stream stream, Assembly localAsm, object o, Uri baseUri, bool designMode) { - return AvaloniaXamlIlRuntimeCompiler.Load(stream, localAsm, o, baseUri, true); + return AvaloniaXamlIlRuntimeCompiler.Load(stream, localAsm, o, baseUri, designMode); } } } diff --git a/src/tools/Avalonia.Designer.HostApp/Program.cs b/src/tools/Avalonia.Designer.HostApp/Program.cs index 7469f946a4..4472dac4e3 100644 --- a/src/tools/Avalonia.Designer.HostApp/Program.cs +++ b/src/tools/Avalonia.Designer.HostApp/Program.cs @@ -2,6 +2,7 @@ using System.IO; using System.Reflection; using Avalonia.DesignerSupport; +using Avalonia.Markup.Xaml; namespace Avalonia.Designer.HostApp { @@ -41,7 +42,7 @@ namespace Avalonia.Designer.HostApp public static void Main(string[] args) #endif { - AvaloniaLocator.CurrentMutable.Bind() + AvaloniaLocator.CurrentMutable.Bind() .ToConstant(new DesignXamlLoader()); Avalonia.DesignerSupport.Remote.RemoteDesignerEntryPoint.Main(args); } diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/ResourceIncludeTests.cs b/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/ResourceIncludeTests.cs index d9505ba3ed..54e89ae37e 100644 --- a/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/ResourceIncludeTests.cs +++ b/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/ResourceIncludeTests.cs @@ -7,7 +7,7 @@ using Xunit; namespace Avalonia.Markup.Xaml.UnitTests.MakrupExtensions { - public class ResourceIncludeTests + public class ResourceIncludeTests : XamlTestBase { public class StaticResourceExtensionTests : XamlTestBase { diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/XamlTestBase.cs b/tests/Avalonia.Markup.Xaml.UnitTests/XamlTestBase.cs index 5172b2e830..2bc82d1353 100644 --- a/tests/Avalonia.Markup.Xaml.UnitTests/XamlTestBase.cs +++ b/tests/Avalonia.Markup.Xaml.UnitTests/XamlTestBase.cs @@ -1,5 +1,7 @@ using System; using System.Collections.Generic; +using System.IO; +using System.Reflection; using System.Text; using Avalonia.Data; @@ -11,6 +13,15 @@ namespace Avalonia.Markup.Xaml.UnitTests { // Ensure necessary assemblies are loaded. var _ = typeof(TemplateBinding); + if (AvaloniaLocator.Current.GetService() == null) + AvaloniaLocator.CurrentMutable.Bind() + .ToConstant(new TestXamlLoaderShim()); + } + + class TestXamlLoaderShim : AvaloniaXamlLoader.IRuntimeXamlLoader + { + public object Load(Stream stream, Assembly localAsm, object o, Uri baseUri, bool designMode) + => AvaloniaRuntimeXamlLoader.Load(stream, localAsm, o, baseUri, designMode); } } }