XamlIlTests.cs 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Globalization;
  5. using System.Linq;
  6. using System.Runtime.CompilerServices;
  7. using Avalonia.Controls;
  8. using Avalonia.Data.Converters;
  9. using Avalonia.Media;
  10. using Avalonia.UnitTests;
  11. using Avalonia.VisualTree;
  12. using JetBrains.Annotations;
  13. using Xunit;
  14. namespace Avalonia.Markup.Xaml.UnitTests
  15. {
  16. public class XamlIlTests
  17. {
  18. [Fact]
  19. public void Binding_Button_IsPressed_ShouldWork()
  20. {
  21. var parsed = (Button)AvaloniaXamlLoader.Parse(@"
  22. <Button xmlns='https://github.com/avaloniaui' IsPressed='{Binding IsPressed, Mode=TwoWay}' />");
  23. var ctx = new XamlIlBugTestsDataContext();
  24. parsed.DataContext = ctx;
  25. parsed.SetValue(Button.IsPressedProperty, true);
  26. Assert.True(ctx.IsPressed);
  27. }
  28. [Fact]
  29. public void Transitions_Should_Be_Properly_Parsed()
  30. {
  31. var parsed = (Grid)AvaloniaXamlLoader.Parse(@"
  32. <Grid xmlns='https://github.com/avaloniaui' >
  33. <Grid.Transitions>
  34. <DoubleTransition Property='Opacity'
  35. Easing='CircularEaseIn'
  36. Duration='0:0:0.5' />
  37. </Grid.Transitions>
  38. </Grid>");
  39. Assert.Equal(1, parsed.Transitions.Count);
  40. Assert.Equal(Visual.OpacityProperty, parsed.Transitions[0].Property);
  41. }
  42. [Fact]
  43. public void Parser_Should_Override_Precompiled_Xaml()
  44. {
  45. var precompiled = new XamlIlClassWithPrecompiledXaml();
  46. Assert.Equal(Brushes.Red, precompiled.Background);
  47. Assert.Equal(1, precompiled.Opacity);
  48. var loaded = (XamlIlClassWithPrecompiledXaml)AvaloniaXamlLoader.Parse(@"
  49. <UserControl xmlns='https://github.com/avaloniaui'
  50. xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'
  51. x:Class='Avalonia.Markup.Xaml.UnitTests.XamlIlClassWithPrecompiledXaml'
  52. Opacity='0'>
  53. </UserControl>");
  54. Assert.Equal(loaded.Opacity, 0);
  55. Assert.Null(loaded.Background);
  56. }
  57. [Fact]
  58. public void RelativeSource_TemplatedParent_Works()
  59. {
  60. using (UnitTestApplication.Start(TestServices.StyledWindow))
  61. {
  62. new AvaloniaXamlLoader().Load(@"
  63. <Application
  64. xmlns='https://github.com/avaloniaui'
  65. xmlns:local='clr-namespace:Avalonia.Markup.Xaml.UnitTests;assembly=Avalonia.Markup.Xaml.UnitTests'
  66. >
  67. <Application.Styles>
  68. <Style Selector='Button'>
  69. <Setter Property='Template'>
  70. <ControlTemplate>
  71. <Grid><Grid><Grid>
  72. <Canvas>
  73. <Canvas.Background>
  74. <SolidColorBrush>
  75. <SolidColorBrush.Color>
  76. <MultiBinding>
  77. <MultiBinding.Converter>
  78. <local:XamlIlBugTestsBrushToColorConverter/>
  79. </MultiBinding.Converter>
  80. <Binding Path='Background' RelativeSource='{RelativeSource TemplatedParent}'/>
  81. <Binding Path='Background' RelativeSource='{RelativeSource TemplatedParent}'/>
  82. <Binding Path='Background' RelativeSource='{RelativeSource TemplatedParent}'/>
  83. </MultiBinding>
  84. </SolidColorBrush.Color>
  85. </SolidColorBrush>
  86. </Canvas.Background>
  87. </Canvas>
  88. </Grid></Grid></Grid>
  89. </ControlTemplate>
  90. </Setter>
  91. </Style>
  92. </Application.Styles>
  93. </Application>",
  94. null, Application.Current);
  95. var parsed = (Window)AvaloniaXamlLoader.Parse(@"
  96. <Window
  97. xmlns='https://github.com/avaloniaui'
  98. xmlns:local='clr-namespace:Avalonia.Markup.Xaml.UnitTests;assembly=Avalonia.Markup.Xaml.UnitTests'
  99. >
  100. <Button Background='Red' />
  101. </Window>
  102. ");
  103. var btn = ((Button)parsed.Content);
  104. btn.ApplyTemplate();
  105. var canvas = (Canvas)btn.GetVisualChildren().First()
  106. .VisualChildren.First()
  107. .VisualChildren.First()
  108. .VisualChildren.First();
  109. Assert.Equal(Brushes.Red, canvas.Background);
  110. }
  111. }
  112. }
  113. public class XamlIlBugTestsBrushToColorConverter : IMultiValueConverter
  114. {
  115. public object Convert(IList<object> values, Type targetType, object parameter, CultureInfo culture)
  116. {
  117. return ((ISolidColorBrush)values[0]).Color;
  118. }
  119. }
  120. public class XamlIlBugTestsDataContext : INotifyPropertyChanged
  121. {
  122. public bool IsPressed { get; set; }
  123. public event PropertyChangedEventHandler PropertyChanged;
  124. [NotifyPropertyChangedInvocator]
  125. protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
  126. {
  127. PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
  128. }
  129. }
  130. public class XamlIlClassWithPrecompiledXaml : UserControl
  131. {
  132. }
  133. }