323 строки
8.8 KiB
C#
323 строки
8.8 KiB
C#
using System;
|
|
using System.ComponentModel;
|
|
using System.Diagnostics;
|
|
using System.Runtime.CompilerServices;
|
|
using NUnit.Framework;
|
|
using NUnit.Framework.Constraints;
|
|
|
|
namespace Xamarin.Forms.Core.UnitTests
|
|
{
|
|
[TestFixture]
|
|
public class LabelTests : BaseTestFixture
|
|
{
|
|
[SetUp]
|
|
public override void Setup ()
|
|
{
|
|
base.Setup ();
|
|
Device.PlatformServices = new MockPlatformServices ();
|
|
}
|
|
|
|
[TearDown]
|
|
public override void TearDown ()
|
|
{
|
|
base.TearDown ();
|
|
Device.PlatformServices = null;
|
|
}
|
|
|
|
[Test]
|
|
public void TextAndAttributedTextMutuallyExclusive ()
|
|
{
|
|
var label = new Label ();
|
|
Assert.IsNull (label.Text);
|
|
Assert.IsNull (label.FormattedText);
|
|
|
|
label.Text = "Foo";
|
|
Assert.AreEqual ("Foo", label.Text);
|
|
Assert.IsNull (label.FormattedText);
|
|
|
|
var fs = new FormattedString ();
|
|
label.FormattedText = fs;
|
|
Assert.IsNull (label.Text);
|
|
Assert.AreSame (fs, label.FormattedText);
|
|
|
|
label.Text = "Foo";
|
|
Assert.AreEqual ("Foo", label.Text);
|
|
Assert.IsNull (label.FormattedText);
|
|
}
|
|
|
|
[Test]
|
|
public void InvalidateMeasureWhenTextChanges ()
|
|
{
|
|
var label = new Label();
|
|
|
|
bool fired;
|
|
label.MeasureInvalidated += (sender, args) =>
|
|
{
|
|
fired = true;
|
|
};
|
|
|
|
fired = false;
|
|
label.Text = "Foo";
|
|
Assert.IsTrue (fired);
|
|
|
|
var fs = new FormattedString ();
|
|
|
|
fired = false;
|
|
label.FormattedText = fs;
|
|
Assert.IsTrue (fired);
|
|
|
|
fired = false;
|
|
fs.Spans.Add (new Span {Text = "bar"});
|
|
Assert.IsTrue (fired);
|
|
}
|
|
|
|
[Test]
|
|
public void AssignToFontStructUpdatesFontFamily (
|
|
[Values (NamedSize.Default, NamedSize.Large, NamedSize.Medium, NamedSize.Small, NamedSize.Micro)] NamedSize size,
|
|
[Values (FontAttributes.None, FontAttributes.Bold, FontAttributes.Italic, FontAttributes.Bold | FontAttributes.Italic)] FontAttributes attributes)
|
|
{
|
|
var label = new Label {Platform = new UnitPlatform ()};
|
|
double startSize = label.FontSize;
|
|
var startAttributes = label.FontAttributes;
|
|
|
|
bool firedSizeChanged = false;
|
|
bool firedAttributesChanged = false;
|
|
label.PropertyChanged += (sender, args) => {
|
|
if (args.PropertyName == Label.FontSizeProperty.PropertyName)
|
|
firedSizeChanged = true;
|
|
if (args.PropertyName == Label.FontAttributesProperty.PropertyName)
|
|
firedAttributesChanged = true;
|
|
};
|
|
|
|
label.Font = Font.OfSize ("Testing123", size).WithAttributes (attributes);
|
|
|
|
Assert.AreEqual (Device.GetNamedSize (size, typeof (Label), true), label.FontSize);
|
|
Assert.AreEqual (attributes, label.FontAttributes);
|
|
Assert.AreEqual (startSize != label.FontSize, firedSizeChanged);
|
|
Assert.AreEqual (startAttributes != label.FontAttributes, firedAttributesChanged);
|
|
}
|
|
|
|
[Test]
|
|
public void AssignToFontFamilyUpdatesFont ()
|
|
{
|
|
var label = new Label {Platform = new UnitPlatform ()};
|
|
|
|
label.FontFamily = "CrazyFont";
|
|
Assert.AreEqual (label.Font, Font.OfSize ("CrazyFont", label.FontSize));
|
|
}
|
|
|
|
[Test]
|
|
public void AssignToFontSizeUpdatesFont ()
|
|
{
|
|
var label = new Label {Platform = new UnitPlatform ()};
|
|
|
|
label.FontSize = 1000;
|
|
Assert.AreEqual (label.Font, Font.SystemFontOfSize (1000));
|
|
}
|
|
|
|
[Test]
|
|
public void AssignedToFontSizeUpdatesFontDouble ()
|
|
{
|
|
var label = new Label {Platform = new UnitPlatform ()};
|
|
|
|
label.FontSize = 10.7;
|
|
Assert.AreEqual (label.Font, Font.SystemFontOfSize (10.7));
|
|
}
|
|
|
|
[Test]
|
|
public void AssignedToFontSizeDouble ()
|
|
{
|
|
var label = new Label {Platform = new UnitPlatform ()};
|
|
|
|
label.FontSize = 10.7;
|
|
Assert.AreEqual (label.FontSize, 10.7);
|
|
}
|
|
|
|
|
|
[Test]
|
|
public void AssignToFontAttributesUpdatesFont ()
|
|
{
|
|
var label = new Label {Platform = new UnitPlatform ()};
|
|
|
|
label.FontAttributes = FontAttributes.Italic | FontAttributes.Bold;
|
|
Assert.AreEqual (label.Font, Font.SystemFontOfSize (label.FontSize, FontAttributes.Bold | FontAttributes.Italic));
|
|
}
|
|
|
|
[Test]
|
|
public void LabelResizesWhenFontChanges ()
|
|
{
|
|
var label = new Label {Platform = new UnitPlatform ((ve, w, h) => {
|
|
var l = (Label) ve;
|
|
return new SizeRequest(new Size(l.Font.FontSize, l.Font.FontSize));
|
|
}), IsPlatformEnabled = true};
|
|
|
|
Assert.AreEqual (label.Font.FontSize, label.GetSizeRequest (double.PositiveInfinity, double.PositiveInfinity).Request.Width);
|
|
|
|
bool fired = false;
|
|
|
|
label.MeasureInvalidated += (sender, args) => {
|
|
Assert.AreEqual (25, label.GetSizeRequest (double.PositiveInfinity, double.PositiveInfinity).Request.Width);
|
|
fired = true;
|
|
};
|
|
|
|
|
|
label.FontSize = 25;
|
|
|
|
Assert.True (fired);
|
|
}
|
|
|
|
[Test]
|
|
public void FontSizeConverterTests ()
|
|
{
|
|
var converter = new FontSizeConverter ();
|
|
Assert.AreEqual (12, converter.ConvertFromInvariantString ("12"));
|
|
Assert.AreEqual (10.7, converter.ConvertFromInvariantString ("10.7"));
|
|
}
|
|
|
|
[Test]
|
|
public void FontSizeCanBeSetFromStyle ()
|
|
{
|
|
var label = new Label ();
|
|
|
|
Assert.AreEqual (10.0, label.FontSize);
|
|
|
|
label.SetValue (Label.FontSizeProperty, 1.0, true);
|
|
Assert.AreEqual (1.0, label.FontSize);
|
|
}
|
|
|
|
[Test]
|
|
public void ManuallySetFontSizeNotOverridenByStyle ()
|
|
{
|
|
var label = new Label ();
|
|
|
|
Assert.AreEqual (10.0, label.FontSize);
|
|
|
|
label.SetValue (Label.FontSizeProperty, 2.0, false);
|
|
Assert.AreEqual (2.0, label.FontSize);
|
|
|
|
label.SetValue (Label.FontSizeProperty, 1.0, true);
|
|
Assert.AreEqual (2.0, label.FontSize);
|
|
}
|
|
|
|
[Test]
|
|
public void ChangingHorizontalTextAlignmentFiresXAlignChanged ()
|
|
{
|
|
var label = new Label () { HorizontalTextAlignment = TextAlignment.Center };
|
|
|
|
var xAlignFired = false;
|
|
var horizontalTextAlignmentFired = false;
|
|
|
|
label.PropertyChanged += (sender, args) => {
|
|
if (args.PropertyName == "XAlign") {
|
|
xAlignFired = true;
|
|
} else if (args.PropertyName == Label.HorizontalTextAlignmentProperty.PropertyName) {
|
|
horizontalTextAlignmentFired = true;
|
|
}
|
|
};
|
|
|
|
label.HorizontalTextAlignment = TextAlignment.End;
|
|
|
|
Assert.True(xAlignFired);
|
|
Assert.True(horizontalTextAlignmentFired);
|
|
}
|
|
|
|
[Test]
|
|
public void ChangingVerticalTextAlignmentFiresYAlignChanged ()
|
|
{
|
|
var label = new Label () { VerticalTextAlignment = TextAlignment.Center };
|
|
|
|
var yAlignFired = false;
|
|
var verticalTextAlignmentFired = false;
|
|
|
|
label.PropertyChanged += (sender, args) => {
|
|
if (args.PropertyName == "YAlign") {
|
|
yAlignFired = true;
|
|
} else if (args.PropertyName == Label.VerticalTextAlignmentProperty.PropertyName) {
|
|
verticalTextAlignmentFired = true;
|
|
}
|
|
};
|
|
|
|
label.VerticalTextAlignment = TextAlignment.End;
|
|
|
|
Assert.True (yAlignFired);
|
|
Assert.True (verticalTextAlignmentFired);
|
|
}
|
|
|
|
[Test]
|
|
public void EntryCellXAlignBindingMatchesHorizontalTextAlignmentBinding ()
|
|
{
|
|
var vm = new ViewModel ();
|
|
vm.HorizontalAlignment = TextAlignment.Center;
|
|
|
|
var labelXAlign = new Label () { BindingContext = vm };
|
|
labelXAlign.SetBinding (Label.XAlignProperty, new Binding ("HorizontalAlignment"));
|
|
|
|
var labelHorizontalTextAlignment = new Label () { BindingContext = vm };
|
|
labelHorizontalTextAlignment.SetBinding (Label.HorizontalTextAlignmentProperty, new Binding ("HorizontalAlignment"));
|
|
|
|
Assert.AreEqual (TextAlignment.Center, labelXAlign.XAlign);
|
|
Assert.AreEqual (TextAlignment.Center, labelHorizontalTextAlignment.HorizontalTextAlignment);
|
|
|
|
vm.HorizontalAlignment = TextAlignment.End;
|
|
|
|
Assert.AreEqual (TextAlignment.End, labelXAlign.XAlign);
|
|
Assert.AreEqual (TextAlignment.End, labelHorizontalTextAlignment.HorizontalTextAlignment);
|
|
}
|
|
|
|
[Test]
|
|
public void EntryCellYAlignBindingMatchesVerticalTextAlignmentBinding ()
|
|
{
|
|
var vm = new ViewModel ();
|
|
vm.VerticalAlignment = TextAlignment.Center;
|
|
|
|
var labelYAlign = new Label () { BindingContext = vm };
|
|
labelYAlign.SetBinding (Label.YAlignProperty, new Binding ("VerticalAlignment"));
|
|
|
|
var labelVerticalTextAlignment = new Label () { BindingContext = vm };
|
|
labelVerticalTextAlignment.SetBinding (Label.VerticalTextAlignmentProperty, new Binding ("VerticalAlignment"));
|
|
|
|
Assert.AreEqual (TextAlignment.Center, labelYAlign.YAlign);
|
|
Assert.AreEqual (TextAlignment.Center, labelVerticalTextAlignment.VerticalTextAlignment);
|
|
|
|
vm.VerticalAlignment = TextAlignment.End;
|
|
|
|
Assert.AreEqual (TextAlignment.End, labelYAlign.YAlign);
|
|
Assert.AreEqual (TextAlignment.End, labelVerticalTextAlignment.VerticalTextAlignment);
|
|
}
|
|
|
|
sealed class ViewModel : INotifyPropertyChanged
|
|
{
|
|
TextAlignment horizontalAlignment;
|
|
TextAlignment verticalAlignment;
|
|
|
|
public TextAlignment HorizontalAlignment
|
|
{
|
|
get { return horizontalAlignment; }
|
|
set
|
|
{
|
|
horizontalAlignment = value;
|
|
OnPropertyChanged();
|
|
}
|
|
}
|
|
|
|
public TextAlignment VerticalAlignment
|
|
{
|
|
get { return verticalAlignment; }
|
|
set
|
|
{
|
|
verticalAlignment = value;
|
|
OnPropertyChanged();
|
|
}
|
|
}
|
|
|
|
public event PropertyChangedEventHandler PropertyChanged;
|
|
|
|
void OnPropertyChanged ([CallerMemberName] string propertyName = null)
|
|
{
|
|
PropertyChanged?.Invoke (this, new PropertyChangedEventArgs (propertyName));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|