Browse Source

Fixed tests

Nikita Tsukanov 5 years ago
parent
commit
6c89473ca1

+ 4 - 8
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<IDesignXamlLoader>();
+                var loader = AvaloniaLocator.Current.GetService<AvaloniaXamlLoader.IRuntimeXamlLoader>();
                 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)
                 {

+ 18 - 1
src/Markup/Avalonia.Markup.Xaml/AvaloniaXamlLoader.cs

@@ -12,6 +12,11 @@ namespace Avalonia.Markup.Xaml
     /// </summary>
     public static class AvaloniaXamlLoader
     {
+        public interface IRuntimeXamlLoader
+        {
+            object Load(Stream stream, Assembly localAsm, object o, Uri baseUri, bool designMode);
+        }
+        
         /// <summary>
         /// Loads the XAML into a Avalonia component.
         /// </summary>
@@ -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<IRuntimeXamlLoader>();
+            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");
         }

+ 2 - 2
src/tools/Avalonia.Designer.HostApp/Avalonia.Designer.HostApp.csproj

@@ -20,8 +20,8 @@
   </ItemGroup>
   <Import Project="..\..\..\src\Markup\Avalonia.Markup.Xaml.Loader\IncludeXamlIlSre.props" />
   <ItemGroup>
-    <Compile Include="..\..\..\src\Markup\Avalonia.Markup.Xaml.Loader\CompilerExtensions\**\*.cs"/>
-    <Compile Include="..\..\..\src\Markup\Avalonia.Markup.Xaml.Loader\AvaloniaXamlIlRuntimeCompiler.cs"/>
+    <Compile Include="..\..\..\src\Markup\Avalonia.Markup.Xaml.Loader\CompilerExtensions\**\*.cs" />
+    <Compile Include="..\..\..\src\Markup\Avalonia.Markup.Xaml.Loader\AvaloniaXamlIlRuntimeCompiler.cs" />
   </ItemGroup>
   <Import Project="..\..\..\build\NetFX.props" />
 </Project>

+ 4 - 4
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);
         }
     }
 }

+ 2 - 1
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<DesignWindowLoader.IDesignXamlLoader>()
+            AvaloniaLocator.CurrentMutable.Bind<AvaloniaXamlLoader.IRuntimeXamlLoader>()
                 .ToConstant(new DesignXamlLoader());
             Avalonia.DesignerSupport.Remote.RemoteDesignerEntryPoint.Main(args);
         }

+ 1 - 1
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
         {

+ 11 - 0
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<AvaloniaXamlLoader.IRuntimeXamlLoader>() == null)
+                AvaloniaLocator.CurrentMutable.Bind<AvaloniaXamlLoader.IRuntimeXamlLoader>()
+                    .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);
         }
     }
 }