// 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 Avalonia.Controls.Presenters; using Avalonia.Controls.Templates; using Avalonia.Data; using Avalonia.Input; using Avalonia.Markup.Xaml.Data; using Avalonia.Platform; using Avalonia.UnitTests; using Moq; using Xunit; namespace Avalonia.Controls.UnitTests { public class TextBoxTests { [Fact] public void DefaultBindingMode_Should_Be_TwoWay() { Assert.Equal( BindingMode.TwoWay, TextBox.TextProperty.GetMetadata(typeof(TextBox)).DefaultBindingMode); } [Fact] public void Typing_Beginning_With_0_Should_Not_Modify_Text_When_Bound_To_Int() { using (UnitTestApplication.Start(Services)) { var source = new Class1(); var target = new TextBox { DataContext = source, Template = CreateTemplate(), }; target.ApplyTemplate(); target.Bind(TextBox.TextProperty, new Binding(nameof(Class1.Foo), BindingMode.TwoWay)); Assert.Equal("0", target.Text); target.CaretIndex = 1; target.RaiseEvent(new TextInputEventArgs { RoutedEvent = InputElement.TextInputEvent, Text = "2", }); Assert.Equal("02", target.Text); } } private static TestServices Services => TestServices.MockThreadingInterface.With( standardCursorFactory: Mock.Of()); private IControlTemplate CreateTemplate() { return new FuncControlTemplate(control => new TextPresenter { Name = "PART_TextPresenter", [!!TextPresenter.TextProperty] = new Binding { Path = "Text", Mode = BindingMode.TwoWay, Priority = BindingPriority.TemplatedParent, RelativeSource = new RelativeSource(RelativeSourceMode.TemplatedParent), }, }); } private class Class1 : NotifyingBase { private int _foo; public int Foo { get { return _foo; } set { _foo = value; RaisePropertyChanged(); } } } } }