summaryrefslogtreecommitdiff
path: root/Xamarin.Forms.Core.UnitTests/TriggerTests.cs
blob: 1fe1666983b87060626bf82aa21c41925d3c4e6e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
using NUnit.Framework;

namespace Xamarin.Forms.Core.UnitTests
{
	[TestFixture]
	public class TriggerTests : BaseTestFixture
	{
		class MockElement : VisualElement
		{
		}

		[Test]
		public void SettersAppliedOnConditionChanged ()
		{
			var conditionbp = BindableProperty.Create ("foo", typeof(string), typeof(BindableObject), null);
			var setterbp = BindableProperty.Create ("bar", typeof(string), typeof(BindableObject), null);
			var element = new MockElement ();
			var trigger = new Trigger (typeof(VisualElement)) {
				Property = conditionbp,
				Value = "foobar",
				Setters = {
					new Setter { Property = setterbp, Value = "qux" },
				}
			};

			element.SetValue (setterbp, "default");
			element.Triggers.Add (trigger);

			Assert.AreEqual ("default", element.GetValue (setterbp));
			element.SetValue (conditionbp, "foobar");
			Assert.AreEqual ("qux", element.GetValue (setterbp));
			element.SetValue (conditionbp, "");
			Assert.AreEqual ("default", element.GetValue (setterbp));
		}

		[Test]
		public void SettersAppliedOnAttachIfConditionIsTrue ()
		{
			var conditionbp = BindableProperty.Create ("foo", typeof(string), typeof(BindableObject), null);
			var setterbp = BindableProperty.Create ("bar", typeof(string), typeof(BindableObject), null);
			var element = new MockElement ();
			var trigger = new Trigger (typeof(VisualElement)) {
				Property = conditionbp,
				Value = "foobar",
				Setters = {
					new Setter { Property = setterbp, Value = "qux" },
				}
			};

			element.SetValue (setterbp, "default");
			element.SetValue (conditionbp, "foobar");
			Assert.AreEqual ("default", element.GetValue (setterbp));
			element.Triggers.Add (trigger);
			Assert.AreEqual ("qux", element.GetValue (setterbp));
		}

		[Test]
		public void SettersUnappliedOnDetach ()
		{
			var conditionbp = BindableProperty.Create ("foo", typeof(string), typeof(BindableObject), null);
			var setterbp = BindableProperty.Create ("bar", typeof(string), typeof(BindableObject), null);
			var element = new MockElement ();
			var trigger = new Trigger (typeof(VisualElement)) {
				Property = conditionbp,
				Value = "foobar",
				Setters = {
					new Setter { Property = setterbp, Value = "qux" },
				}
			};

			element.SetValue (setterbp, "default");
			element.Triggers.Add (trigger);

			Assert.AreEqual ("default", element.GetValue (setterbp));
			element.SetValue (conditionbp, "foobar");
			Assert.AreEqual ("qux", element.GetValue (setterbp));
			element.Triggers.Remove (trigger);
			Assert.AreEqual ("default", element.GetValue (setterbp));
		}

		[Test]
		public void EnterAndExitActionsTriggered ()
		{
			var conditionbp = BindableProperty.Create ("foo", typeof(string), typeof(BindableObject), null);
			var element = new MockElement ();
			var enteraction = new MockTriggerAction ();
			var exitaction = new MockTriggerAction ();
			var trigger = new Trigger (typeof(VisualElement)) {
				Property = conditionbp,
				Value = "foobar",
				EnterActions = {
					enteraction
				},
				ExitActions = {
					exitaction
				}
			};

			Assert.False (enteraction.Invoked);
			Assert.False (exitaction.Invoked);
			element.Triggers.Add (trigger);
			Assert.False (enteraction.Invoked);
			Assert.False (exitaction.Invoked);
			element.SetValue (conditionbp, "foobar");
			Assert.True (enteraction.Invoked);
			Assert.False (exitaction.Invoked);

			enteraction.Invoked = exitaction.Invoked = false;
			Assert.False (enteraction.Invoked);
			Assert.False (exitaction.Invoked);
			element.SetValue (conditionbp, "");
			Assert.False (enteraction.Invoked);
			Assert.True (exitaction.Invoked);
		}
	}
}