Browse Source

Merge remote-tracking branch 'origin/master' into fixes/affect-renderer-memory-leak

pull/2331/head
Dan Walmsley 8 years ago
parent
commit
e94557012d
  1. 14
      src/Avalonia.Input/MouseDevice.cs
  2. 10
      src/Markup/Avalonia.Markup/Markup/Parsers/ExpressionParser.cs
  3. 32
      tests/Avalonia.Input.UnitTests/MouseDeviceTests.cs
  4. 33
      tests/Avalonia.Markup.UnitTests/Data/BindingTests.cs
  5. 9
      tests/Avalonia.Markup.UnitTests/Parsers/ExpressionNodeBuilderTests.cs
  6. 7
      tests/Avalonia.Markup.UnitTests/Parsers/ExpressionNodeBuilderTests_Errors.cs

14
src/Avalonia.Input/MouseDevice.cs

@ -84,18 +84,14 @@ namespace Avalonia.Input
{
Contract.Requires<ArgumentNullException>(relativeTo != null);
Point p = default(Point);
IVisual v = relativeTo;
IVisual root = null;
while (v != null)
if (relativeTo.VisualRoot == null)
{
p += v.Bounds.Position;
root = v;
v = v.VisualParent;
throw new InvalidOperationException("Control is not attached to visual tree.");
}
return root.PointToClient(Position) - p;
var rootPoint = relativeTo.VisualRoot.PointToClient(Position);
var transform = relativeTo.VisualRoot.TransformToVisual(relativeTo);
return rootPoint * transform.Value;
}
public void ProcessRawEvent(RawInputEventArgs e)

10
src/Markup/Avalonia.Markup/Markup/Parsers/ExpressionParser.cs

@ -106,6 +106,11 @@ namespace Avalonia.Markup.Parsers
{
return State.Indexer;
}
else if (ParseDot(ref r))
{
nodes.Add(new EmptyExpressionNode());
return State.End;
}
else
{
var identifier = r.ParseIdentifier();
@ -317,6 +322,11 @@ namespace Avalonia.Markup.Parsers
return !r.End && r.TakeIf('#');
}
private static bool ParseDot(ref CharacterReader r)
{
return !r.End && r.TakeIf('.');
}
private enum State
{
Start,

32
tests/Avalonia.Input.UnitTests/MouseDeviceTests.cs

@ -1,6 +1,7 @@
using Avalonia.Controls;
using Avalonia.Input.Raw;
using Avalonia.Interactivity;
using Avalonia.Media;
using Avalonia.Rendering;
using Avalonia.UnitTests;
using Avalonia.VisualTree;
@ -184,6 +185,33 @@ namespace Avalonia.Input.UnitTests
}
}
[Fact]
public void GetPosition_Should_Respect_Control_RenderTransform()
{
var renderer = new Mock<IRenderer>();
using (TestApplication(renderer.Object))
{
var inputManager = InputManager.Instance;
var root = new TestRoot
{
MouseDevice = new MouseDevice(),
Child = new Border
{
Background = Brushes.Black,
RenderTransform = new TranslateTransform(10, 0),
}
};
SendMouseMove(inputManager, root, new Point(11, 11));
var result = root.MouseDevice.GetPosition(root.Child);
Assert.Equal(new Point(1, 11), result);
}
}
private void AddEnterLeaveHandlers(
EventHandler<PointerEventArgs> handler,
params IControl[] controls)
@ -195,14 +223,14 @@ namespace Avalonia.Input.UnitTests
}
}
private void SendMouseMove(IInputManager inputManager, TestRoot root)
private void SendMouseMove(IInputManager inputManager, TestRoot root, Point p = new Point())
{
inputManager.ProcessInput(new RawMouseEventArgs(
root.MouseDevice,
0,
root,
RawMouseEventType.Move,
new Point(),
p,
InputModifiers.None));
}

33
tests/Avalonia.Markup.UnitTests/Data/BindingTests.cs

@ -273,6 +273,39 @@ namespace Avalonia.Markup.UnitTests.Data
Assert.Equal(42, target.Value);
}
[Fact]
public void Null_Path_Should_Bind_To_DataContext()
{
var target = new TextBlock { DataContext = "foo" };
var binding = new Binding();
target.Bind(TextBlock.TextProperty, binding);
Assert.Equal("foo", target.Text);
}
[Fact]
public void Empty_Path_Should_Bind_To_DataContext()
{
var target = new TextBlock { DataContext = "foo" };
var binding = new Binding { Path = string.Empty };
target.Bind(TextBlock.TextProperty, binding);
Assert.Equal("foo", target.Text);
}
[Fact]
public void Dot_Path_Should_Bind_To_DataContext()
{
var target = new TextBlock { DataContext = "foo" };
var binding = new Binding { Path = "." };
target.Bind(TextBlock.TextProperty, binding);
Assert.Equal("foo", target.Text);
}
/// <summary>
/// Tests a problem discovered with ListBox with selection.
/// </summary>

9
tests/Avalonia.Markup.UnitTests/Parsers/ExpressionNodeBuilderTests.cs

@ -36,6 +36,15 @@ namespace Avalonia.Markup.UnitTests.Parsers
AssertIsProperty(result[0], "F0o");
}
[Fact]
public void Should_Build_Dot()
{
var result = ToList(ExpressionObserverBuilder.Parse("."));
Assert.Equal(1, result.Count);
Assert.IsType<EmptyExpressionNode>(result[0]);
}
[Fact]
public void Should_Build_Property_Chain()
{

7
tests/Avalonia.Markup.UnitTests/Parsers/ExpressionNodeBuilderTests_Errors.cs

@ -30,6 +30,13 @@ namespace Avalonia.Markup.UnitTests.Parsers
() => ExpressionObserverBuilder.Parse("Foo.Bar."));
}
[Fact]
public void Expression_Cannot_Start_With_Period_Then_Token()
{
Assert.Throws<ExpressionParseException>(
() => ExpressionObserverBuilder.Parse(".Bar"));
}
[Fact]
public void Expression_Cannot_Have_Empty_Indexer()
{

Loading…
Cancel
Save