XamlXNameResolverTests.cs 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. using System.Collections.Generic;
  2. using System.Threading.Tasks;
  3. using Avalonia.Controls;
  4. using Avalonia.Generators.Common;
  5. using Avalonia.Generators.Common.Domain;
  6. using Avalonia.Generators.Compiler;
  7. using Avalonia.ReactiveUI;
  8. using Avalonia.Generators.Tests.Views;
  9. using Xunit;
  10. namespace Avalonia.Generators.Tests;
  11. public class XamlXNameResolverTests
  12. {
  13. [Theory]
  14. [InlineData(View.NamedControl)]
  15. [InlineData(View.XNamedControl)]
  16. [InlineData(View.AttachedProps)]
  17. public async Task Should_Resolve_Types_From_Avalonia_Markup_File_With_Named_Control(string resource)
  18. {
  19. var xaml = await View.Load(resource);
  20. var controls = ResolveNames(xaml);
  21. Assert.NotEmpty(controls);
  22. Assert.Equal(1, controls.Count);
  23. Assert.Equal("UserNameTextBox", controls[0].Name);
  24. Assert.Contains(typeof(TextBox).FullName!, controls[0].TypeName);
  25. }
  26. [Theory]
  27. [InlineData(View.NamedControls)]
  28. [InlineData(View.XNamedControls)]
  29. public async Task Should_Resolve_Types_From_Avalonia_Markup_File_With_Named_Controls(string resource)
  30. {
  31. var xaml = await View.Load(resource);
  32. var controls = ResolveNames(xaml);
  33. Assert.NotEmpty(controls);
  34. Assert.Equal(3, controls.Count);
  35. Assert.Equal("UserNameTextBox", controls[0].Name);
  36. Assert.Equal("PasswordTextBox", controls[1].Name);
  37. Assert.Equal("SignUpButton", controls[2].Name);
  38. Assert.Contains(typeof(TextBox).FullName!, controls[0].TypeName);
  39. Assert.Contains(typeof(TextBox).FullName!, controls[1].TypeName);
  40. Assert.Contains(typeof(Button).FullName!, controls[2].TypeName);
  41. }
  42. [Fact]
  43. public async Task Should_Resolve_Types_From_Avalonia_Markup_File_With_Custom_Controls()
  44. {
  45. var xaml = await View.Load(View.CustomControls);
  46. var controls = ResolveNames(xaml);
  47. Assert.NotEmpty(controls);
  48. Assert.Equal(3, controls.Count);
  49. Assert.Equal("ClrNamespaceRoutedViewHost", controls[0].Name);
  50. Assert.Equal("UriRoutedViewHost", controls[1].Name);
  51. Assert.Equal("UserNameTextBox", controls[2].Name);
  52. Assert.Contains(typeof(RoutedViewHost).FullName!, controls[0].TypeName);
  53. Assert.Contains(typeof(RoutedViewHost).FullName!, controls[1].TypeName);
  54. Assert.Contains("Controls.CustomTextBox", controls[2].TypeName);
  55. }
  56. [Fact]
  57. public async Task Should_Resolve_Types_From_Avalonia_Markup_File_When_Types_Contains_Generic_Arguments()
  58. {
  59. var xaml = await View.Load(View.ViewWithGenericBaseView);
  60. var controls = ResolveNames(xaml);
  61. Assert.Equal(2, controls.Count);
  62. var currentControl = controls[0];
  63. Assert.Equal("Root", currentControl.Name);
  64. Assert.Equal("global::Sample.App.BaseView<global::System.String>", currentControl.TypeName);
  65. currentControl = controls[1];
  66. Assert.Equal("NotAsRootNode", currentControl.Name);
  67. Assert.Contains("Sample.App.BaseView", currentControl.TypeName);
  68. Assert.Equal("global::Sample.App.BaseView<global::System.Int32>", currentControl.TypeName);
  69. }
  70. [Fact]
  71. public async Task Should_Not_Resolve_Named_Controls_From_Avalonia_Markup_File_Without_Named_Controls()
  72. {
  73. var xaml = await View.Load(View.NoNamedControls);
  74. var controls = ResolveNames(xaml);
  75. Assert.Empty(controls);
  76. }
  77. [Fact]
  78. public async Task Should_Not_Resolve_Elements_From_DataTemplates()
  79. {
  80. var xaml = await View.Load(View.DataTemplates);
  81. var controls = ResolveNames(xaml);
  82. Assert.NotEmpty(controls);
  83. Assert.Equal(2, controls.Count);
  84. Assert.Equal("UserNameTextBox", controls[0].Name);
  85. Assert.Equal("NamedListBox", controls[1].Name);
  86. Assert.Contains(typeof(TextBox).FullName!, controls[0].TypeName);
  87. Assert.Contains(typeof(ListBox).FullName!, controls[1].TypeName);
  88. }
  89. [Fact]
  90. public async Task Should_Resolve_Names_From_Complex_Views()
  91. {
  92. var xaml = await View.Load(View.SignUpView);
  93. var controls = ResolveNames(xaml);
  94. Assert.NotEmpty(controls);
  95. Assert.Equal(10, controls.Count);
  96. Assert.Equal("UserNameTextBox", controls[0].Name);
  97. Assert.Equal("UserNameValidation", controls[1].Name);
  98. Assert.Equal("PasswordTextBox", controls[2].Name);
  99. Assert.Equal("PasswordValidation", controls[3].Name);
  100. Assert.Equal("AwesomeListView", controls[4].Name);
  101. Assert.Equal("ConfirmPasswordTextBox", controls[5].Name);
  102. Assert.Equal("ConfirmPasswordValidation", controls[6].Name);
  103. Assert.Equal("SignUpButtonDescription", controls[7].Name);
  104. Assert.Equal("SignUpButton", controls[8].Name);
  105. Assert.Equal("CompoundValidation", controls[9].Name);
  106. }
  107. private static IReadOnlyList<ResolvedName> ResolveNames(string xaml)
  108. {
  109. var compilation =
  110. View.CreateAvaloniaCompilation()
  111. .WithCustomTextBox()
  112. .WithBaseView();
  113. var classResolver = new XamlXViewResolver(
  114. new RoslynTypeSystem(compilation),
  115. MiniCompiler.CreateDefault(
  116. new RoslynTypeSystem(compilation),
  117. MiniCompiler.AvaloniaXmlnsDefinitionAttribute));
  118. var classInfo = classResolver.ResolveView(xaml);
  119. var nameResolver = new XamlXNameResolver();
  120. return nameResolver.ResolveNames(classInfo.Xaml);
  121. }
  122. }