BasicTests.cs 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702
  1. // Copyright (c) The Avalonia Project. All rights reserved.
  2. // Licensed under the MIT license. See licence.md file in the project root for full license information.
  3. using Avalonia.Controls;
  4. using Avalonia.Controls.Presenters;
  5. using Avalonia.Markup.Xaml.Data;
  6. using Avalonia.Markup.Xaml.Styling;
  7. using Avalonia.Markup.Xaml.Templates;
  8. using Avalonia.Media;
  9. using Avalonia.Styling;
  10. using Avalonia.UnitTests;
  11. using System.Linq;
  12. using Xunit;
  13. namespace Avalonia.Markup.Xaml.UnitTests.Xaml
  14. {
  15. public class BasicTests
  16. {
  17. [Fact]
  18. public void Simple_Property_Is_Set()
  19. {
  20. var xaml = @"<ContentControl xmlns='https://github.com/avaloniaui' Content='Foo'/>";
  21. var target = AvaloniaXamlLoader.Parse<ContentControl>(xaml);
  22. Assert.NotNull(target);
  23. Assert.Equal("Foo", target.Content);
  24. }
  25. [Fact]
  26. public void Default_Content_Property_Is_Set()
  27. {
  28. var xaml = @"<ContentControl xmlns='https://github.com/avaloniaui'>Foo</ContentControl>";
  29. var target = AvaloniaXamlLoader.Parse<ContentControl>(xaml);
  30. Assert.NotNull(target);
  31. Assert.Equal("Foo", target.Content);
  32. }
  33. [Fact]
  34. public void Attached_Property_Is_Set()
  35. {
  36. var xaml =
  37. @"<ContentControl xmlns='https://github.com/avaloniaui' TextBlock.FontSize='21'/>";
  38. var target = AvaloniaXamlLoader.Parse<ContentControl>(xaml);
  39. Assert.NotNull(target);
  40. Assert.Equal(21.0, TextBlock.GetFontSize(target));
  41. }
  42. [Fact]
  43. public void Attached_Property_Supports_Binding()
  44. {
  45. using (UnitTestApplication.Start(TestServices.MockWindowingPlatform))
  46. {
  47. var xaml =
  48. @"<Window xmlns='https://github.com/avaloniaui' TextBlock.FontSize='{Binding}'/>";
  49. var target = AvaloniaXamlLoader.Parse<ContentControl>(xaml);
  50. target.DataContext = 21.0;
  51. Assert.Equal(21.0, TextBlock.GetFontSize(target));
  52. }
  53. }
  54. [Fact]
  55. public void Attached_Property_In_Panel_Is_Set()
  56. {
  57. var xaml = @"
  58. <Panel xmlns='https://github.com/avaloniaui'>
  59. <ToolTip.Tip>Foo</ToolTip.Tip>
  60. </Panel>";
  61. var target = AvaloniaXamlLoader.Parse<Panel>(xaml);
  62. Assert.Equal(0, target.Children.Count);
  63. Assert.Equal("Foo", ToolTip.GetTip(target));
  64. }
  65. [Fact]
  66. public void ContentControl_ContentTemplate_Is_Functional()
  67. {
  68. var xaml =
  69. @"<ContentControl xmlns='https://github.com/avaloniaui'>
  70. <ContentControl.ContentTemplate>
  71. <DataTemplate>
  72. <TextBlock Text='Foo' />
  73. </DataTemplate>
  74. </ContentControl.ContentTemplate>
  75. </ContentControl>";
  76. var contentControl = AvaloniaXamlLoader.Parse<ContentControl>(xaml);
  77. var target = contentControl.ContentTemplate;
  78. Assert.NotNull(target);
  79. var txt = (TextBlock)target.Build(null);
  80. Assert.Equal("Foo", txt.Text);
  81. }
  82. [Fact]
  83. public void Named_Control_Is_Added_To_NameScope_Simple()
  84. {
  85. var xaml = @"
  86. <UserControl xmlns='https://github.com/avaloniaui'>
  87. <Button Name='button'>Foo</Button>
  88. </UserControl>";
  89. var control = AvaloniaXamlLoader.Parse<UserControl>(xaml);
  90. var button = control.FindControl<Button>("button");
  91. Assert.Equal("Foo", button.Content);
  92. }
  93. [Fact]
  94. public void Direct_Content_In_ItemsControl_Is_Operational()
  95. {
  96. using (UnitTestApplication.Start(TestServices.StyledWindow))
  97. {
  98. var xaml = @"
  99. <Window xmlns='https://github.com/avaloniaui'>
  100. <ItemsControl Name='items'>
  101. <ContentControl>Foo</ContentControl>
  102. <ContentControl>Bar</ContentControl>
  103. </ItemsControl>
  104. </Window>";
  105. var control = AvaloniaXamlLoader.Parse<Window>(xaml);
  106. var itemsControl = control.FindControl<ItemsControl>("items");
  107. Assert.NotNull(itemsControl);
  108. var items = itemsControl.Items.Cast<ContentControl>().ToArray();
  109. Assert.Equal("Foo", items[0].Content);
  110. Assert.Equal("Bar", items[1].Content);
  111. }
  112. }
  113. [Fact]
  114. public void Panel_Children_Are_Added()
  115. {
  116. var xaml = @"
  117. <UserControl xmlns='https://github.com/avaloniaui'>
  118. <Panel Name='panel'>
  119. <ContentControl Name='Foo' />
  120. <ContentControl Name='Bar' />
  121. </Panel>
  122. </UserControl>";
  123. var control = AvaloniaXamlLoader.Parse<UserControl>(xaml);
  124. var panel = control.FindControl<Panel>("panel");
  125. Assert.Equal(2, panel.Children.Count);
  126. var foo = control.FindControl<ContentControl>("Foo");
  127. var bar = control.FindControl<ContentControl>("Bar");
  128. Assert.Contains(foo, panel.Children);
  129. Assert.Contains(bar, panel.Children);
  130. }
  131. [Fact]
  132. public void ControlTemplate_With_Nested_Child_Is_Operational()
  133. {
  134. var xaml = @"
  135. <ControlTemplate xmlns='https://github.com/avaloniaui'>
  136. <ContentControl Name='parent'>
  137. <ContentControl Name='child' />
  138. </ContentControl>
  139. </ControlTemplate>
  140. ";
  141. var template = AvaloniaXamlLoader.Parse<ControlTemplate>(xaml);
  142. var parent = (ContentControl)template.Build(new ContentControl());
  143. Assert.Equal("parent", parent.Name);
  144. var child = parent.Content as ContentControl;
  145. Assert.NotNull(child);
  146. Assert.Equal("child", child.Name);
  147. }
  148. [Fact]
  149. public void ControlTemplate_With_Panel_Children_Are_Added()
  150. {
  151. var xaml = @"
  152. <ControlTemplate xmlns='https://github.com/avaloniaui'>
  153. <Panel Name='panel'>
  154. <ContentControl Name='Foo' />
  155. <ContentControl Name='Bar' />
  156. </Panel>
  157. </ControlTemplate>
  158. ";
  159. var template = AvaloniaXamlLoader.Parse<ControlTemplate>(xaml);
  160. var panel = (Panel)template.Build(new ContentControl());
  161. Assert.Equal(2, panel.Children.Count);
  162. var foo = panel.Children[0];
  163. var bar = panel.Children[1];
  164. Assert.Equal("Foo", foo.Name);
  165. Assert.Equal("Bar", bar.Name);
  166. }
  167. [Fact]
  168. public void Named_x_Control_Is_Added_To_NameScope_Simple()
  169. {
  170. var xaml = @"
  171. <UserControl xmlns='https://github.com/avaloniaui'
  172. xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'>
  173. <Button x:Name='button'>Foo</Button>
  174. </UserControl>";
  175. var control = AvaloniaXamlLoader.Parse<UserControl>(xaml);
  176. var button = control.FindControl<Button>("button");
  177. Assert.Equal("Foo", button.Content);
  178. }
  179. [Fact]
  180. public void Standart_TypeConverter_Is_Used()
  181. {
  182. var xaml = @"<UserControl xmlns='https://github.com/avaloniaui' Width='200.5' />";
  183. var control = AvaloniaXamlLoader.Parse<UserControl>(xaml);
  184. Assert.Equal(200.5, control.Width);
  185. }
  186. [Fact]
  187. public void Avalonia_TypeConverter_Is_Used()
  188. {
  189. var xaml = @"<UserControl xmlns='https://github.com/avaloniaui' Background='White' />";
  190. var control = AvaloniaXamlLoader.Parse<UserControl>(xaml);
  191. var bk = control.Background;
  192. Assert.IsType<SolidColorBrush>(bk);
  193. Assert.Equal(Colors.White, (bk as SolidColorBrush).Color);
  194. }
  195. [Fact]
  196. public void Simple_Style_Is_Parsed()
  197. {
  198. var xaml = @"
  199. <Styles xmlns='https://github.com/avaloniaui'
  200. xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'>
  201. <Style Selector='TextBlock'>
  202. <Setter Property='Background' Value='White'/>
  203. <Setter Property='Width' Value='100'/>
  204. </Style>
  205. </Styles>";
  206. var styles = AvaloniaXamlLoader.Parse<Styles>(xaml);
  207. Assert.Equal(1, styles.Count);
  208. var style = (Style)styles[0];
  209. var setters = style.Setters.Cast<Setter>().ToArray();
  210. Assert.Equal(2, setters.Length);
  211. Assert.Equal(TextBlock.BackgroundProperty, setters[0].Property);
  212. Assert.Equal(Brushes.White, setters[0].Value);
  213. Assert.Equal(TextBlock.WidthProperty, setters[1].Property);
  214. Assert.Equal(100.0, setters[1].Value);
  215. }
  216. [Fact]
  217. public void Style_Setter_With_AttachedProperty_Is_Parsed()
  218. {
  219. var xaml = @"
  220. <Styles xmlns='https://github.com/avaloniaui'
  221. xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'>
  222. <Style Selector='ContentControl'>
  223. <Setter Property='TextBlock.FontSize' Value='21'/>
  224. </Style>
  225. </Styles>";
  226. var styles = AvaloniaXamlLoader.Parse<Styles>(xaml);
  227. Assert.Equal(1, styles.Count);
  228. var style = (Style)styles[0];
  229. var setters = style.Setters.Cast<Setter>().ToArray();
  230. Assert.Equal(1, setters.Length);
  231. Assert.Equal(TextBlock.FontSizeProperty, setters[0].Property);
  232. Assert.Equal(21.0, setters[0].Value);
  233. }
  234. [Fact]
  235. public void Complex_Style_Is_Parsed()
  236. {
  237. using (UnitTestApplication.Start(TestServices.StyledWindow))
  238. {
  239. var xaml = @"
  240. <Styles xmlns='https://github.com/avaloniaui'>
  241. <Style Selector='CheckBox'>
  242. <Setter Property='BorderBrush' Value='{StyleResource ThemeBorderMidBrush}'/>
  243. <Setter Property='BorderThickness' Value='{StyleResource ThemeBorderThickness}'/>
  244. <Setter Property='Template'>
  245. <ControlTemplate>
  246. <Grid ColumnDefinitions='Auto,*'>
  247. <Border Name='border'
  248. BorderBrush='{TemplateBinding BorderBrush}'
  249. BorderThickness='{TemplateBinding BorderThickness}'
  250. Width='18'
  251. Height='18'
  252. VerticalAlignment='Center'>
  253. <Path Name='checkMark'
  254. Fill='{StyleResource HighlightBrush}'
  255. Width='11'
  256. Height='10'
  257. Stretch='Uniform'
  258. HorizontalAlignment='Center'
  259. VerticalAlignment='Center'
  260. Data='M 1145.607177734375,430 C1145.607177734375,430 1141.449951171875,435.0772705078125 1141.449951171875,435.0772705078125 1141.449951171875,435.0772705078125 1139.232177734375,433.0999755859375 1139.232177734375,433.0999755859375 1139.232177734375,433.0999755859375 1138,434.5538330078125 1138,434.5538330078125 1138,434.5538330078125 1141.482177734375,438 1141.482177734375,438 1141.482177734375,438 1141.96875,437.9375 1141.96875,437.9375 1141.96875,437.9375 1147,431.34619140625 1147,431.34619140625 1147,431.34619140625 1145.607177734375,430 1145.607177734375,430 z'/>
  261. </Border>
  262. <ContentPresenter Name='PART_ContentPresenter'
  263. Content='{TemplateBinding Content}'
  264. ContentTemplate='{TemplateBinding ContentTemplate}'
  265. Margin='4,0,0,0'
  266. VerticalAlignment='Center'
  267. Grid.Column='1'/>
  268. </Grid>
  269. </ControlTemplate>
  270. </Setter>
  271. </Style>
  272. </Styles>
  273. ";
  274. var styles = AvaloniaXamlLoader.Parse<Styles>(xaml);
  275. Assert.Equal(1, styles.Count);
  276. var style = (Style)styles[0];
  277. var setters = style.Setters.Cast<Setter>().ToArray();
  278. Assert.Equal(3, setters.Length);
  279. Assert.Equal(CheckBox.BorderBrushProperty, setters[0].Property);
  280. Assert.Equal(CheckBox.BorderThicknessProperty, setters[1].Property);
  281. Assert.Equal(CheckBox.TemplateProperty, setters[2].Property);
  282. Assert.IsType<StyleResourceBinding>(setters[0].Value);
  283. Assert.IsType<StyleResourceBinding>(setters[1].Value);
  284. Assert.IsType<ControlTemplate>(setters[2].Value);
  285. }
  286. }
  287. [Fact]
  288. public void Style_Resources_Are_Build()
  289. {
  290. var xaml = @"
  291. <Style xmlns='https://github.com/avaloniaui'
  292. xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'
  293. xmlns:sys='clr-namespace:System;assembly=mscorlib'>
  294. <Style.Resources>
  295. <SolidColorBrush x:Key='Brush'>White</SolidColorBrush>
  296. <sys:Double x:Key='Double'>10</sys:Double>
  297. </Style.Resources>
  298. </Style>";
  299. var style = AvaloniaXamlLoader.Parse<Style>(xaml);
  300. Assert.True(style.Resources.Count > 0);
  301. var brush = style.FindResource("Brush") as SolidColorBrush;
  302. Assert.NotNull(brush);
  303. Assert.Equal(Colors.White, brush.Color);
  304. var d = (double)style.FindResource("Double");
  305. Assert.Equal(10.0, d);
  306. }
  307. [Fact]
  308. public void StyleInclude_Is_Build()
  309. {
  310. using (UnitTestApplication.Start(TestServices.StyledWindow))
  311. {
  312. var xaml = @"
  313. <Styles xmlns='https://github.com/avaloniaui'
  314. xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'>
  315. <StyleInclude Source='resm:Avalonia.Themes.Default.ContextMenu.xaml?assembly=Avalonia.Themes.Default'/>
  316. </Styles>";
  317. var styles = AvaloniaXamlLoader.Parse<Styles>(xaml);
  318. Assert.True(styles.Count == 1);
  319. var styleInclude = styles.First() as StyleInclude;
  320. Assert.NotNull(styleInclude);
  321. var style = styleInclude.Loaded;
  322. Assert.NotNull(style);
  323. }
  324. }
  325. [Fact]
  326. public void Simple_Xaml_Binding_Is_Operational()
  327. {
  328. using (UnitTestApplication.Start(TestServices.MockPlatformWrapper
  329. .With(windowingPlatform: new MockWindowingPlatform())))
  330. {
  331. var xaml =
  332. @"<Window xmlns='https://github.com/avaloniaui' Content='{Binding}'/>";
  333. var target = AvaloniaXamlLoader.Parse<ContentControl>(xaml);
  334. Assert.Null(target.Content);
  335. target.DataContext = "Foo";
  336. Assert.Equal("Foo", target.Content);
  337. }
  338. }
  339. [Fact]
  340. public void Xaml_Binding_Is_Delayed()
  341. {
  342. using (UnitTestApplication.Start(TestServices.MockWindowingPlatform))
  343. {
  344. var xaml =
  345. @"<ContentControl xmlns='https://github.com/avaloniaui' Content='{Binding}'/>";
  346. var target = AvaloniaXamlLoader.Parse<ContentControl>(xaml);
  347. Assert.Null(target.Content);
  348. target.DataContext = "Foo";
  349. Assert.Null(target.Content);
  350. DelayedBinding.ApplyBindings(target);
  351. Assert.Equal("Foo", target.Content);
  352. }
  353. }
  354. [Fact]
  355. public void Double_Xaml_Binding_Is_Operational()
  356. {
  357. using (UnitTestApplication.Start(TestServices.MockPlatformWrapper
  358. .With(windowingPlatform: new MockWindowingPlatform())))
  359. {
  360. var xaml =
  361. @"<Window xmlns='https://github.com/avaloniaui' Width='{Binding}'/>";
  362. var target = AvaloniaXamlLoader.Parse<ContentControl>(xaml);
  363. Assert.Null(target.Content);
  364. target.DataContext = 55.0;
  365. Assert.Equal(55.0, target.Width);
  366. }
  367. }
  368. [Fact]
  369. public void Collection_Xaml_Binding_Is_Operational()
  370. {
  371. using (UnitTestApplication.Start(TestServices.MockPlatformWrapper
  372. .With(windowingPlatform: new MockWindowingPlatform())))
  373. {
  374. var xaml = @"
  375. <Window xmlns='https://github.com/avaloniaui'>
  376. <ItemsControl Name='itemsControl' Items='{Binding}'>
  377. </ItemsControl>
  378. </Window>
  379. ";
  380. var target = AvaloniaXamlLoader.Parse<Window>(xaml);
  381. Assert.NotNull(target.Content);
  382. var itemsControl = target.FindControl<ItemsControl>("itemsControl");
  383. var items = new string[] { "Foo", "Bar" };
  384. //DelayedBinding.ApplyBindings(itemsControl);
  385. target.DataContext = items;
  386. Assert.Equal(items, itemsControl.Items);
  387. }
  388. }
  389. [Fact]
  390. public void Multi_Xaml_Binding_Is_Parsed()
  391. {
  392. var xaml =
  393. @"<MultiBinding xmlns='https://github.com/avaloniaui'
  394. Converter='{Static BoolConverters.And}'>
  395. <Binding Path='Foo' />
  396. <Binding Path='Bar' />
  397. </MultiBinding>";
  398. var target = AvaloniaXamlLoader.Parse<MultiBinding>(xaml);
  399. Assert.Equal(2, target.Bindings.Count);
  400. Assert.Equal(BoolConverters.And, target.Converter);
  401. var bindings = target.Bindings.Cast<Binding>().ToArray();
  402. Assert.Equal("Foo", bindings[0].Path);
  403. Assert.Equal("Bar", bindings[1].Path);
  404. }
  405. [Fact]
  406. public void Control_Template_Is_Operational()
  407. {
  408. using (UnitTestApplication.Start(TestServices.MockPlatformWrapper
  409. .With(windowingPlatform: new MockWindowingPlatform())))
  410. {
  411. var xaml = @"
  412. <Window xmlns='https://github.com/avaloniaui'
  413. xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'>
  414. <Window.Template>
  415. <ControlTemplate>
  416. <ContentPresenter Name='PART_ContentPresenter'
  417. Content='{TemplateBinding Content}'/>
  418. </ControlTemplate>
  419. </Window.Template>
  420. </Window>";
  421. var target = AvaloniaXamlLoader.Parse<ContentControl>(xaml);
  422. Assert.NotNull(target.Template);
  423. Assert.Null(target.Presenter);
  424. target.ApplyTemplate();
  425. Assert.NotNull(target.Presenter);
  426. target.Content = "Foo";
  427. Assert.Equal("Foo", target.Presenter.Content);
  428. }
  429. }
  430. [Fact]
  431. public void Style_ControlTemplate_Is_Build()
  432. {
  433. var xaml = @"
  434. <Style xmlns='https://github.com/avaloniaui' Selector='ContentControl'>
  435. <Setter Property='Template'>
  436. <ControlTemplate>
  437. <ContentPresenter Name='PART_ContentPresenter'
  438. Content='{TemplateBinding Content}'
  439. ContentTemplate='{TemplateBinding ContentTemplate}' />
  440. </ControlTemplate>
  441. </Setter>
  442. </Style> ";
  443. var style = AvaloniaXamlLoader.Parse<Style>(xaml);
  444. Assert.Equal(1, style.Setters.Count());
  445. var setter = (Setter)style.Setters.First();
  446. Assert.Equal(ContentControl.TemplateProperty, setter.Property);
  447. Assert.IsType<ControlTemplate>(setter.Value);
  448. var template = (ControlTemplate)setter.Value;
  449. var control = new ContentControl();
  450. var result = (ContentPresenter)template.Build(control);
  451. Assert.NotNull(result);
  452. }
  453. [Fact]
  454. public void Named_Control_Is_Added_To_NameScope()
  455. {
  456. using (UnitTestApplication.Start(TestServices.StyledWindow))
  457. {
  458. var xaml = @"
  459. <Window xmlns='https://github.com/avaloniaui'
  460. xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'>
  461. <Button Name='button'>Foo</Button>
  462. </Window>";
  463. var window = AvaloniaXamlLoader.Parse<Window>(xaml);
  464. var button = window.FindControl<Button>("button");
  465. Assert.Equal("Foo", button.Content);
  466. }
  467. }
  468. [Fact]
  469. public void Control_Is_Added_To_Parent_Before_Properties_Are_Set()
  470. {
  471. using (UnitTestApplication.Start(TestServices.StyledWindow))
  472. {
  473. var xaml = @"
  474. <Window xmlns='https://github.com/avaloniaui'
  475. xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'
  476. xmlns:local='clr-namespace:Avalonia.Markup.Xaml.UnitTests.Xaml;assembly=Avalonia.Markup.Xaml.UnitTests'>
  477. <local:InitializationOrderTracker Width='100'/>
  478. </Window>";
  479. var window = AvaloniaXamlLoader.Parse<Window>(xaml);
  480. var tracker = (InitializationOrderTracker)window.Content;
  481. var attached = tracker.Order.IndexOf("AttachedToLogicalTree");
  482. var widthChanged = tracker.Order.IndexOf("Property Width Changed");
  483. Assert.NotEqual(-1, attached);
  484. Assert.NotEqual(-1, widthChanged);
  485. Assert.True(attached < widthChanged);
  486. }
  487. }
  488. [Fact]
  489. public void Control_Is_Added_To_Parent_Before_Properties_Are_Set_Simple()
  490. {
  491. var xaml = @"
  492. <ContentControl xmlns='https://github.com/avaloniaui'
  493. xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'
  494. xmlns:local='clr-namespace:Avalonia.Markup.Xaml.UnitTests.Xaml;assembly=Avalonia.Markup.Xaml.UnitTests'>
  495. <local:InitializationOrderTracker Width='100'/>
  496. </ContentControl>";
  497. var window = AvaloniaXamlLoader.Parse<ContentControl>(xaml);
  498. var tracker = (InitializationOrderTracker)window.Content;
  499. var parentSet = tracker.Order.IndexOf("Property Parent Changed");
  500. var widthChanged = tracker.Order.IndexOf("Property Width Changed");
  501. Assert.Equal(0, parentSet);
  502. Assert.Equal(1, widthChanged);
  503. }
  504. [Fact]
  505. public void BeginInit_Matches_EndInit()
  506. {
  507. using (UnitTestApplication.Start(TestServices.StyledWindow))
  508. {
  509. var xaml = @"
  510. <Window xmlns='https://github.com/avaloniaui'
  511. xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'
  512. xmlns:local='clr-namespace:Avalonia.Markup.Xaml.UnitTests.Xaml;assembly=Avalonia.Markup.Xaml.UnitTests'>
  513. <local:InitializationOrderTracker />
  514. </Window>";
  515. var window = AvaloniaXamlLoader.Parse<Window>(xaml);
  516. var tracker = (InitializationOrderTracker)window.Content;
  517. Assert.Equal(0, tracker.InitState);
  518. }
  519. }
  520. [Fact]
  521. public void DeferedXamlLoader_Should_Preserve_NamespacesContext()
  522. {
  523. var xaml =
  524. @"<ContentControl xmlns='https://github.com/avaloniaui'
  525. xmlns:local='clr-namespace:Avalonia.Markup.Xaml.UnitTests.Xaml;assembly=Avalonia.Markup.Xaml.UnitTests'>
  526. <ContentControl.ContentTemplate>
  527. <DataTemplate>
  528. <TextBlock Tag='{Static local:NonControl.StringProperty}'/>
  529. </DataTemplate>
  530. </ContentControl.ContentTemplate>
  531. </ContentControl>";
  532. var contentControl = AvaloniaXamlLoader.Parse<ContentControl>(xaml);
  533. var template = contentControl.ContentTemplate;
  534. Assert.NotNull(template);
  535. var txt = (TextBlock)template.Build(null);
  536. Assert.Equal((object)NonControl.StringProperty, txt.Tag);
  537. }
  538. }
  539. }