Browse Source

Reinstate Descendent selector tests.

Now we have logical tree back.
pull/39/head
Steven Kirk 11 years ago
parent
commit
09c1f41cd4
  1. 1
      Perspex.Controls/Perspex.Controls.csproj
  2. 3
      Perspex.SceneGraph/ILogical.cs
  3. 1
      Perspex.SceneGraph/Perspex.SceneGraph.csproj
  4. 96
      Perspex.Styling.UnitTests/SelectorTests_Descendent.cs
  5. 5
      Perspex.Styling/Selectors.cs

1
Perspex.Controls/Perspex.Controls.csproj

@ -36,7 +36,6 @@
<ItemGroup>
<Compile Include="Border.cs" />
<Compile Include="Button.cs" />
<Compile Include="ILogical.cs" />
<Compile Include="RadioButton.cs" />
<Compile Include="CheckBox.cs" />
<Compile Include="ColumnDefinition.cs" />

3
Perspex.Controls/ILogical.cs → Perspex.SceneGraph/ILogical.cs

@ -4,9 +4,8 @@
// </copyright>
// -----------------------------------------------------------------------
namespace Perspex.Controls
namespace Perspex
{
using System.Collections.Generic;
using Perspex.Collections;
/// <summary>

1
Perspex.SceneGraph/Perspex.SceneGraph.csproj

@ -45,6 +45,7 @@
</ProjectReference>
</ItemGroup>
<ItemGroup>
<Compile Include="ILogical.cs" />
<Compile Include="Media\Brush.cs" />
<Compile Include="Media\Brushes.cs" />
<Compile Include="Media\Color.cs" />

96
Perspex.Styling.UnitTests/SelectorTests_Descendent.cs

@ -11,6 +11,7 @@ namespace Perspex.Styling.UnitTests
using System.Reactive.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Moq;
using Perspex.Collections;
using Perspex.Styling;
[TestClass]
@ -19,67 +20,64 @@ namespace Perspex.Styling.UnitTests
[TestMethod]
public void Descendent_Matches_Control_When_It_Is_Child_OfType()
{
Assert.Inconclusive("Need to implement logical tree.");
////var parent = new Mock<TestLogical1>();
////var child = new Mock<TestLogical2>();
////child.Setup(x => x.LogicalParent).Returns(parent.Object);
var parent = new Mock<TestLogical1>();
var child = new Mock<TestLogical2>();
var childStyleable = child.As<IStyleable>();
////var selector = new Selector().OfType(parent.Object.GetType()).Descendent().OfType(child.Object.GetType());
child.Setup(x => x.LogicalParent).Returns(parent.Object);
////Assert.IsTrue(ActivatorValue(selector, child.Object));
var selector = new Selector().OfType(parent.Object.GetType()).Descendent().OfType(child.Object.GetType());
Assert.IsTrue(ActivatorValue(selector, childStyleable.Object));
}
[TestMethod]
public void Descendent_Matches_Control_When_It_Is_Descendent_OfType()
{
Assert.Inconclusive("Need to implement logical tree.");
////var grandparent = new Mock<TestLogical1>();
////var parent = new Mock<TestLogical2>();
////var child = new Mock<TestLogical3>();
var grandparent = new Mock<TestLogical1>();
var parent = new Mock<TestLogical2>();
var child = new Mock<TestLogical3>();
////parent.Setup(x => x.LogicalParent).Returns(grandparent.Object);
////child.Setup(x => x.LogicalParent).Returns(parent.Object);
parent.Setup(x => x.LogicalParent).Returns(grandparent.Object);
child.Setup(x => x.LogicalParent).Returns(parent.Object);
////var selector = new Selector().OfType(grandparent.Object.GetType()).Descendent().OfType(child.Object.GetType());
var selector = new Selector().OfType(grandparent.Object.GetType()).Descendent().OfType(child.Object.GetType());
////Assert.IsTrue(ActivatorValue(selector, child.Object));
Assert.IsTrue(ActivatorValue(selector, child.Object));
}
[TestMethod]
public void Descendent_Matches_Control_When_It_Is_Descendent_OfType_And_Class()
{
Assert.Inconclusive("Need to implement logical tree.");
////var grandparent = new Mock<TestLogical1>();
////var parent = new Mock<TestLogical2>();
////var child = new Mock<TestLogical3>();
var grandparent = new Mock<TestLogical1>();
var parent = new Mock<TestLogical2>();
var child = new Mock<TestLogical3>();
////grandparent.Setup(x => x.Classes).Returns(new Classes("foo"));
////parent.Setup(x => x.LogicalParent).Returns(grandparent.Object);
////parent.Setup(x => x.Classes).Returns(new Classes());
////child.Setup(x => x.LogicalParent).Returns(parent.Object);
grandparent.Setup(x => x.Classes).Returns(new Classes("foo"));
parent.Setup(x => x.LogicalParent).Returns(grandparent.Object);
parent.Setup(x => x.Classes).Returns(new Classes());
child.Setup(x => x.LogicalParent).Returns(parent.Object);
////var selector = new Selector().OfType(grandparent.Object.GetType()).Class("foo").Descendent().OfType(child.Object.GetType());
var selector = new Selector().OfType(grandparent.Object.GetType()).Class("foo").Descendent().OfType(child.Object.GetType());
////Assert.IsTrue(ActivatorValue(selector, child.Object));
Assert.IsTrue(ActivatorValue(selector, child.Object));
}
[TestMethod]
public void Descendent_Doesnt_Match_Control_When_It_Is_Descendent_OfType_But_Wrong_Class()
{
Assert.Inconclusive("Need to implement logical tree.");
////var grandparent = new Mock<TestLogical1>();
////var parent = new Mock<TestLogical2>();
////var child = new Mock<TestLogical3>();
var grandparent = new Mock<TestLogical1>();
var parent = new Mock<TestLogical2>();
var child = new Mock<TestLogical3>();
////grandparent.Setup(x => x.Classes).Returns(new Classes("bar"));
////parent.Setup(x => x.LogicalParent).Returns(grandparent.Object);
////parent.Setup(x => x.Classes).Returns(new Classes("foo"));
////child.Setup(x => x.LogicalParent).Returns(parent.Object);
grandparent.Setup(x => x.Classes).Returns(new Classes("bar"));
parent.Setup(x => x.LogicalParent).Returns(grandparent.Object);
parent.Setup(x => x.Classes).Returns(new Classes("foo"));
child.Setup(x => x.LogicalParent).Returns(parent.Object);
////var selector = new Selector().OfType<TestLogical1>().Class("foo").Descendent().OfType<TestLogical3>();
var selector = new Selector().OfType<TestLogical1>().Class("foo").Descendent().OfType<TestLogical3>();
////Assert.IsFalse(ActivatorValue(selector, child.Object));
Assert.IsFalse(ActivatorValue(selector, child.Object));
}
private static bool ActivatorValue(Selector selector, IStyleable control)
@ -87,16 +85,26 @@ namespace Perspex.Styling.UnitTests
return selector.GetActivator(control).Take(1).ToEnumerable().Single();
}
////public abstract class TestLogical1 : TestLogical
////{
////}
public abstract class TestLogical : ILogical, IStyleable
{
public abstract Classes Classes { get; }
public abstract string Id { get; }
public abstract IReadOnlyPerspexList<ILogical> LogicalChildren { get; }
public abstract ILogical LogicalParent { get; }
public abstract ITemplatedControl TemplatedParent { get; }
public abstract IDisposable Bind(PerspexProperty property, IObservable<object> source, BindingPriority priority = BindingPriority.LocalValue);
}
public abstract class TestLogical1 : TestLogical
{
}
////public abstract class TestLogical2 : TestLogical
////{
////}
public abstract class TestLogical2 : TestLogical
{
}
////public abstract class TestLogical3 : TestLogical
////{
////}
public abstract class TestLogical3 : TestLogical
{
}
}
}

5
Perspex.Styling/Selectors.cs

@ -33,13 +33,12 @@ namespace Perspex.Styling
SelectorString = " ",
GetObservable = control =>
{
// TODO: This needs to traverse the logical tree, not the visual.
IVisual c = (IVisual)control;
ILogical c = (ILogical)control;
List<IObservable<bool>> descendentMatches = new List<IObservable<bool>>();
while (c != null)
{
c = c.VisualParent;
c = c.LogicalParent;
if (c is IStyleable)
{

Loading…
Cancel
Save