| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275 |
- using System;
- using Avalonia.Controls;
- using Avalonia.Styling;
- using Avalonia.Styling.Activators;
- using Xunit;
- namespace Avalonia.Base.UnitTests.Styling
- {
- public class SelectorTests_Nesting
- {
- [Fact]
- public void Nesting_Class_Doesnt_Match_Parent_OfType_Selector()
- {
- var control = new Control2();
- Style nested;
- var parent = new Style(x => x.OfType<Control1>())
- {
- Children =
- {
- (nested = new Style(x => x.Nesting().Class("foo"))),
- }
- };
- var match = nested.Selector.Match(control, parent);
- Assert.Equal(SelectorMatchResult.NeverThisType, match.Result);
- }
- [Fact]
- public void Or_Nesting_Class_Doesnt_Match_Parent_OfType_Selector()
- {
- var control = new Control2();
- Style nested;
- var parent = new Style(x => x.OfType<Control1>())
- {
- Children =
- {
- (nested = new Style(x => Selectors.Or(
- x.Nesting().Class("foo"),
- x.Nesting().Class("bar")))),
- }
- };
- var match = nested.Selector.Match(control, parent);
- Assert.Equal(SelectorMatchResult.NeverThisType, match.Result);
- }
- [Fact]
- public void Or_Nesting_Child_OfType_Doesnt_Match_Parent_OfType_Selector()
- {
- var control = new Control1();
- var panel = new DockPanel { Children = { control } };
- Style nested;
- var parent = new Style(x => x.OfType<Panel>())
- {
- Children =
- {
- (nested = new Style(x => Selectors.Or(
- x.Nesting().Child().OfType<Control1>(),
- x.Nesting().Child().OfType<Control1>()))),
- }
- };
- var match = nested.Selector.Match(control, parent);
- Assert.Equal(SelectorMatchResult.NeverThisInstance, match.Result);
- }
- [Fact]
- public void Double_Nesting_Class_Doesnt_Match_Grandparent_OfType_Selector()
- {
- var control = new Control2
- {
- Classes = { "foo", "bar" },
- };
- Style parent;
- Style nested;
- var grandparent = new Style(x => x.OfType<Control1>())
- {
- Children =
- {
- (parent = new Style(x => x.Nesting().Class("foo"))
- {
- Children =
- {
- (nested = new Style(x => x.Nesting().Class("bar")))
- }
- })
- }
- };
- var match = nested.Selector.Match(control, parent);
- Assert.Equal(SelectorMatchResult.NeverThisType, match.Result);
- }
- [Fact]
- public void Nesting_Class_Matches()
- {
- var control = new Control1 { Classes = { "foo" } };
- Style nested;
- var parent = new Style(x => x.OfType<Control1>())
- {
- Children =
- {
- (nested = new Style(x => x.Nesting().Class("foo"))),
- }
- };
- var match = nested.Selector.Match(control, parent);
- Assert.Equal(SelectorMatchResult.Sometimes, match.Result);
- var sink = new ActivatorSink(match.Activator);
- Assert.True(sink.Active);
- control.Classes.Clear();
- Assert.False(sink.Active);
- }
- [Fact]
- public void Double_Nesting_Class_Matches()
- {
- var control = new Control1
- {
- Classes = { "foo", "bar" },
- };
- Style parent;
- Style nested;
- var grandparent = new Style(x => x.OfType<Control1>())
- {
- Children =
- {
- (parent = new Style(x => x.Nesting().Class("foo"))
- {
- Children =
- {
- (nested = new Style(x => x.Nesting().Class("bar")))
- }
- })
- }
- };
- var match = nested.Selector.Match(control, parent);
- Assert.Equal(SelectorMatchResult.Sometimes, match.Result);
- var sink = new ActivatorSink(match.Activator);
- Assert.True(sink.Active);
- control.Classes.Remove("foo");
- Assert.False(sink.Active);
- }
- [Fact]
- public void Or_Nesting_Class_Matches()
- {
- var control = new Control1 { Classes = { "foo" } };
- Style nested;
- var parent = new Style(x => x.OfType<Control1>())
- {
- Children =
- {
- (nested = new Style(x => Selectors.Or(
- x.Nesting().Class("foo"),
- x.Nesting().Class("bar")))),
- }
- };
- var match = nested.Selector.Match(control, parent);
- Assert.Equal(SelectorMatchResult.Sometimes, match.Result);
- var sink = new ActivatorSink(match.Activator);
- Assert.True(sink.Active);
- control.Classes.Clear();
- Assert.False(sink.Active);
- }
- [Fact]
- public void Or_Nesting_Child_OfType_Matches()
- {
- var control = new Control1 { Classes = { "foo" } };
- var panel = new Panel { Children = { control } };
- Style nested;
- var parent = new Style(x => x.OfType<Panel>())
- {
- Children =
- {
- (nested = new Style(x => Selectors.Or(
- x.Nesting().Child().OfType<Control1>(),
- x.Nesting().Child().OfType<Control1>()))),
- }
- };
- var match = nested.Selector.Match(control, parent);
- Assert.Equal(SelectorMatchResult.AlwaysThisInstance, match.Result);
- }
- [Fact]
- public void Nesting_With_No_Parent_Style_Fails()
- {
- var control = new Control1();
- var style = new Style(x => x.Nesting().OfType<Control1>());
- Assert.Throws<InvalidOperationException>(() => style.Selector.Match(control, null));
- }
- [Fact]
- public void Nesting_With_No_Parent_Selector_Fails()
- {
- var control = new Control1();
- Style nested;
- var parent = new Style
- {
- Children =
- {
- (nested = new Style(x => x.Nesting().Class("foo"))),
- }
- };
- Assert.Throws<InvalidOperationException>(() => nested.Selector.Match(control, parent));
- }
- [Fact]
- public void Adding_Child_With_No_Nesting_Selector_Fails()
- {
- var parent = new Style(x => x.OfType<Control1>());
- var child = new Style(x => x.Class("foo"));
- Assert.Throws<InvalidOperationException>(() => parent.Children.Add(child));
- }
- [Fact]
- public void Adding_Combinator_Selector_Child_With_No_Nesting_Selector_Fails()
- {
- var parent = new Style(x => x.OfType<Control1>());
- var child = new Style(x => x.Class("foo").Descendant().Class("bar"));
- Assert.Throws<InvalidOperationException>(() => parent.Children.Add(child));
- }
- [Fact]
- public void Adding_Or_Selector_Child_With_No_Nesting_Selector_Fails()
- {
- var parent = new Style(x => x.OfType<Control1>());
- var child = new Style(x => Selectors.Or(
- x.Nesting().Class("foo"),
- x.Class("bar")));
- Assert.Throws<InvalidOperationException>(() => parent.Children.Add(child));
- }
- [Fact]
- public void Can_Add_Child_Without_Nesting_Selector_To_Style_Without_Selector()
- {
- var parent = new Style();
- var child = new Style(x => x.Class("foo"));
- parent.Children.Add(child);
- }
- public class Control1 : Control
- {
- }
- public class Control2 : Control
- {
- }
- private class ActivatorSink : IStyleActivatorSink
- {
- public ActivatorSink(IStyleActivator source) => source.Subscribe(this);
- public bool Active { get; private set; }
- public void OnNext(bool value, int tag) => Active = value;
- }
- }
- }
|