Browse Source

Merge branch 'master' into scenegraph-rename

pull/784/head
Jeremy Koritzinsky 9 years ago
committed by GitHub
parent
commit
58f0022720
  1. 5
      appveyor.yml
  2. 32
      build.cake
  3. 6
      src/Avalonia.Controls/TextBox.cs
  4. 4
      src/Skia/Avalonia.Skia/FormattedTextImpl.cs
  5. 1
      src/Windows/Avalonia.Win32/WindowImpl.cs
  6. 29
      tests/Avalonia.Controls.UnitTests/TextBoxTests.cs
  7. 1
      tests/Avalonia.LeakTests/Avalonia.LeakTests.csproj
  8. 47
      tests/Avalonia.LeakTests/MemberSelectorTests.cs
  9. 26
      tests/Avalonia.Markup.Xaml.UnitTests/Templates/MemberSelectorTests.cs

5
appveyor.yml

@ -20,6 +20,11 @@ build_script:
- ps: .\build.ps1 -Target "AppVeyor" -Platform "$env:platform" -Configuration "$env:configuration"
after_build:
- .\packages\JetBrains.dotMemoryUnit.2.1.20150828.125449\tools\dotMemoryUnit.exe -targetExecutable="%xunit20%\xunit.console.x86.exe" -returnTargetExitCode --"tests\Avalonia.LeakTests\bin\Release\Avalonia.LeakTests.dll"
- "SET PATH=C:\\Python34;C:\\Python34\\Scripts;%PATH%"
- pip install codecov
- codecov -f "./artifacts/coverage.xml"
test: off
artifacts:
- path: artifacts\nuget\*.nupkg

32
build.cake

@ -10,6 +10,7 @@
///////////////////////////////////////////////////////////////////////////////
#tool "nuget:?package=xunit.runner.console&version=2.1.0"
#tool "nuget:?package=OpenCover"
///////////////////////////////////////////////////////////////////////////////
// USINGS
@ -92,6 +93,7 @@ var artifactsDir = (DirectoryPath)Directory("./artifacts");
var nugetRoot = artifactsDir.Combine("nuget");
var zipRoot = artifactsDir.Combine("zip");
var binRoot = artifactsDir.Combine("bin");
var testsRoot = artifactsDir.Combine("tests");
var dirSuffix = configuration;
var dirSuffixSkia = (isPlatformAnyCPU ? "x86" : platform) + "/" + configuration;
@ -585,6 +587,7 @@ Task("Clean")
CleanDirectory(nugetRoot);
CleanDirectory(zipRoot);
CleanDirectory(binRoot);
CleanDirectory(testsRoot);
});
Task("Restore-NuGet-Packages")
@ -670,18 +673,35 @@ Task("Run-Unit-Tests")
"./tools/xunit.runner.console/tools/xunit.console.x86.exe" :
"./tools/xunit.runner.console/tools/xunit.console.exe";
var settings = new XUnit2Settings
var xUnitSettings = new XUnit2Settings
{
ToolPath = toolPath,
Parallelism = ParallelismOption.None
Parallelism = ParallelismOption.None,
ShadowCopy = false
};
settings.NoAppDomain = !isRunningOnWindows;
xUnitSettings.NoAppDomain = !isRunningOnWindows;
foreach (var file in unitTests)
var openCoverOutput = artifactsDir.GetFilePath(new FilePath("./coverage.xml"));
var openCoverSettings = new OpenCoverSettings()
.WithFilter("+[Avalonia.*]* -[*Test*]* -[ControlCatalog*]*")
.WithFilter("-[Avalonia.*]OmniXaml.* -[Avalonia.*]Glass.*")
.WithFilter("-[Avalonia.HtmlRenderer]TheArtOfDev.HtmlRenderer.* +[Avalonia.HtmlRenderer]TheArtOfDev.HtmlRenderer.Avalonia.* -[Avalonia.ReactiveUI]*");
foreach(var test in unitTests)
{
Information("Running test " + file.GetFilenameWithoutExtension());
XUnit2(file.FullPath, settings);
CopyDirectory(test.GetDirectory(), testsRoot);
}
if(isRunningOnWindows)
{
OpenCover(context => {
context.XUnit2(unitTests.Select(test => testsRoot.GetFilePath(test).FullPath), xUnitSettings);
}, openCoverOutput, openCoverSettings);
}
else
{
XUnit2(unitTests.Select(test => test.FullPath), xUnitSettings);
}
});

6
src/Avalonia.Controls/TextBox.cs

@ -202,6 +202,7 @@ namespace Avalonia.Controls
{
if (!_ignoreTextChanges)
{
CaretIndex = CoerceCaretIndex(CaretIndex, value?.Length ?? 0);
SetAndRaise(TextProperty, ref _text, value);
}
}
@ -558,10 +559,11 @@ namespace Avalonia.Controls
return null;
}
private int CoerceCaretIndex(int value)
private int CoerceCaretIndex(int value) => CoerceCaretIndex(value, Text?.Length ?? 0);
private int CoerceCaretIndex(int value, int length)
{
var text = Text;
var length = text?.Length ?? 0;
if (value < 0)
{

4
src/Skia/Avalonia.Skia/FormattedTextImpl.cs

@ -522,7 +522,7 @@ namespace Avalonia.Skia
_lineHeight = mDescent - mAscent;
// Rendering is relative to baseline
_lineOffset = -metrics.Top;
_lineOffset = (-metrics.Ascent);
string subString;
@ -590,7 +590,7 @@ namespace Avalonia.Skia
else
{
var lastLine = _skiaLines[_skiaLines.Count - 1];
_size = new Size(maxX, lastLine.Top + lastLine.Height + lastLineDescent);
_size = new Size(maxX, lastLine.Top + lastLine.Height);
}
}

1
src/Windows/Avalonia.Win32/WindowImpl.cs

@ -682,6 +682,7 @@ namespace Avalonia.Win32
}
UnmanagedMethods.ShowWindow(_hwnd, command);
UnmanagedMethods.SetFocus(_hwnd);
}
public void SetIcon(IWindowIconImpl icon)

29
tests/Avalonia.Controls.UnitTests/TextBoxTests.cs

@ -1,6 +1,8 @@
// Copyright (c) The Avalonia Project. All rights reserved.
// Licensed under the MIT license. See licence.md file in the project root for full license information.
using System;
using System.Reactive.Linq;
using Avalonia.Controls.Presenters;
using Avalonia.Controls.Templates;
using Avalonia.Data;
@ -200,6 +202,33 @@ namespace Avalonia.Controls.UnitTests
}
}
[Fact]
public void Setting_Text_Updates_CaretPosition()
{
using (UnitTestApplication.Start(Services))
{
var target = new TextBox
{
Text = "Initial Text",
CaretIndex = 11
};
var invoked = false;
target.GetObservable(TextBox.TextProperty).Skip(1).Subscribe(_ =>
{
// Caret index should be set before Text changed notification, as we don't want
// to notify with an invalid CaretIndex.
Assert.Equal(7, target.CaretIndex);
invoked = true;
});
target.Text = "Changed";
Assert.True(invoked);
}
}
private static TestServices Services => TestServices.MockThreadingInterface.With(
standardCursorFactory: Mock.Of<IStandardCursorFactory>());

1
tests/Avalonia.LeakTests/Avalonia.LeakTests.csproj

@ -99,6 +99,7 @@
<Compile Include="AvaloniaObjectTests.cs" />
<Compile Include="ControlTests.cs" />
<Compile Include="ExpressionObserverTests.cs" />
<Compile Include="MemberSelectorTests.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>

47
tests/Avalonia.LeakTests/MemberSelectorTests.cs

@ -0,0 +1,47 @@
using Avalonia.Markup.Xaml.Templates;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Xunit;
namespace Avalonia.LeakTests
{
public class MemberSelectorTests
{
[Fact]
public void Should_Not_Hold_Reference_To_Object()
{
WeakReference dataRef = null;
var selector = new MemberSelector() { MemberName = "Child.StringValue" };
Action run = () =>
{
var data = new Item()
{
Child = new Item() { StringValue = "Value1" }
};
Assert.Same("Value1", selector.Select(data));
dataRef = new WeakReference(data);
};
run();
GC.Collect();
Assert.False(dataRef.IsAlive);
}
private class Item
{
public Item Child { get; set; }
public int IntValue { get; set; }
public string StringValue { get; set; }
}
}
}

26
tests/Avalonia.Markup.Xaml.UnitTests/Templates/MemberSelectorTests.cs

@ -9,32 +9,6 @@ namespace Avalonia.Markup.Xaml.UnitTests.Templates
{
public class MemberSelectorTests
{
[Fact]
public void Should_Not_Hold_Reference_To_Object()
{
WeakReference dataRef = null;
var selector = new MemberSelector() { MemberName = "Child.StringValue" };
Action run = () =>
{
var data = new Item()
{
Child = new Item() { StringValue = "Value1" }
};
Assert.Same("Value1", selector.Select(data));
dataRef = new WeakReference(data);
};
run();
GC.Collect();
Assert.False(dataRef.IsAlive);
}
[Fact]
public void Should_Select_Child_Property_Value()
{

Loading…
Cancel
Save