public void CreateEventMemberAttachTest() { bool isInvoked = false; var source = new BindingSourceModel(); IEventListener listener = new EventListenerMock(); const string path = "path"; var property = AttachedBindingMember.CreateEvent(path, (info, o, arg3) => null, (model, args) => { model.ShouldEqual(source); args.ShouldNotBeNull(); isInvoked = true; }); property.SetValue(source, new object[] { listener }); isInvoked.ShouldBeTrue(); isInvoked = false; property.SetValue(source, new object[] { null }); isInvoked.ShouldBeFalse(); source = new BindingSourceModel(); property.SetValue(source, new object[] { listener }); isInvoked.ShouldBeTrue(); }
public void CustomEqualityComparerTest() { var comparer = new CompositeEqualityComparer().AddComparer <BindingSourceModel>( (model, sourceModel) => model.IntProperty == sourceModel.IntProperty, model => model.IntProperty.GetHashCode()); var collection = Create(comparer: comparer); var item1 = new BindingSourceModel { IntProperty = 1 }; var item2 = new BindingSourceModel { IntProperty = 1 }; collection.UpdateState(item1, EntityState.Added); collection.Count.ShouldEqual(1); collection.UpdateState(item2, EntityState.Added); collection.Count.ShouldEqual(1); var changes = collection.GetChanges(EntityState.Added); changes.Count.ShouldEqual(1); changes[0].Entity.ShouldEqual(item2); }
public void CreateNotifiableMemberGenericSetterTest() { object value = null; var source = new BindingSourceModel(); const string path = "path"; Type type = typeof(string); var property = AttachedBindingMember.CreateNotifiableMember <BindingSourceModel, string>(path, null, (info, o, v) => { info.ShouldNotBeNull(); o.ShouldEqual(source); v.ShouldEqual(path); value = v; return(true); }); property.Path.ShouldEqual(path); property.Type.ShouldEqual(type); property.CanRead.ShouldBeFalse(); property.CanWrite.ShouldBeTrue(); property.MemberType.ShouldEqual(BindingMemberType.Attached); property.SetValue(source, new object[] { path }); value.ShouldEqual(path); ShouldThrow(() => property.GetValue(source, null)); }
public void CreateNotifiableMemberGenericObserveTest() { bool isInvoked = false; bool raiseEvent = true; var listenerMock = new EventListenerMock { Handle = (o, o1) => isInvoked = true }; var source = new BindingSourceModel(); const string path = "path"; var property = AttachedBindingMember.CreateNotifiableMember <BindingSourceModel, string>(path, (info, o) => null, (info, o, v) => raiseEvent); IDisposable subscriber = property.TryObserve(source, listenerMock); property.SetValue(source, new object[] { path }); isInvoked.ShouldBeTrue(); subscriber.ShouldNotBeNull(); raiseEvent = false; isInvoked = false; property.SetValue(source, new object[] { path }); isInvoked.ShouldBeFalse(); raiseEvent = true; isInvoked = false; property.SetValue(source, new object[] { null }); isInvoked.ShouldBeTrue(); subscriber.Dispose(); isInvoked = false; property.SetValue(source, new object[] { path }); isInvoked.ShouldBeFalse(); }
public void CreateNotifiableMemberGenericTest() { string value = null; var source = new BindingSourceModel(); const string path = "path"; Type type = typeof(string); var property = AttachedBindingMember.CreateNotifiableMember <BindingSourceModel, string>(path, (info, o) => value, (info, o, v) => { value = v; return(true); }, member: BindingSourceModel.IntPropertyInfo); property.Path.ShouldEqual(path); property.Type.ShouldEqual(type); property.CanRead.ShouldBeTrue(); property.CanWrite.ShouldBeTrue(); property.MemberType.ShouldEqual(BindingMemberType.Attached); property.Member.ShouldEqual(BindingSourceModel.IntPropertyInfo); property.GetValue(source, null).ShouldBeNull(); property.SetValue(source, new object[] { path }); property.GetValue(source, null).ShouldEqual(path); value.ShouldEqual(path); }
public void CreateMemberGenericObserveTest() { bool isInvoked = false; IDisposable result = null; var listenerMock = new EventListenerMock(); var source = new BindingSourceModel(); const string path = "path"; var property = AttachedBindingMember.CreateMember <BindingSourceModel, string>(path, (info, o) => null, (info, o, v) => { }, (info, o, arg3) => { isInvoked = true; info.ShouldNotBeNull(); o.ShouldEqual(source); arg3.ShouldEqual(listenerMock); return(result); }); property.TryObserve(source, listenerMock).ShouldBeNull(); isInvoked.ShouldBeTrue(); isInvoked = false; result = new ActionToken(() => { }); property.TryObserve(source, listenerMock).ShouldEqual(result); isInvoked.ShouldBeTrue(); }
public void CreateMemberGenericObserveEventTest() { bool isInvoked = false; var listenerMock = new EventListenerMock { Handle = (o, o1) => isInvoked = true }; var source = new BindingSourceModel(); const string path = "path"; source.RaiseEvent(); var property = AttachedBindingMember.CreateMember <BindingSourceModel, string>(path, (info, o) => null, (info, o, v) => { }, BindingSourceModel.EventName); IDisposable subscriber = property.TryObserve(source, listenerMock); source.RaiseEvent(); isInvoked.ShouldBeTrue(); subscriber.ShouldNotBeNull(); isInvoked = false; source.RaiseEvent(); isInvoked.ShouldBeTrue(); subscriber.Dispose(); isInvoked = false; source.RaiseEvent(); isInvoked.ShouldBeFalse(); }
public void ProviderShouldReturnSinglePathObserverSinglePath() { var target = new BindingSourceModel(); var observerProvider = Cretate(); observerProvider.Observe(target, BindingPath.Create(GetMemberPath(target, model => model.NestedModel)), false).ShouldBeType <SinglePathObserver>(); }
public void AccessorShouldUseCommandParameterCanExecuteOneTimeModeAfterDispose() { bool isInvoked = false; var parameter = new object(); var command = new RelayCommand(o => { }, o => { o.ShouldEqual(parameter); isInvoked = true; return false; }, this); var srcAccessor = new BindingSourceAccessorMock(); var source = new BindingSourceModel(); var ctx = new DataContext(BindingBuilderConstants.Behaviors.ToValue(new List<IBindingBehavior> { new OneTimeBindingMode() })); var accessor = GetAccessor(source, BindingSourceModel.EventName, ctx, false, d => parameter); srcAccessor.GetValue = (info, context, arg3) => command; accessor.SetValue(srcAccessor, EmptyContext, true); accessor.Dispose(); GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); isInvoked.ShouldBeTrue(); isInvoked = false; command.RaiseCanExecuteChanged(); isInvoked.ShouldBeTrue(); source.ToString();//TO KEEP ALIVE }
public void WeakEventManagerShouldRemoveWeakListenersPropertyChanged() { const int count = 100; const string propertyName = "test"; var model = new BindingSourceModel(); var listeners = new List <WeakReference>(); IWeakEventManager weakEventManager = CreateWeakEventManager(); for (int i = 0; i < count; i++) { var listenerMock = new EventListenerMock(); weakEventManager.Subscribe(model, propertyName, listenerMock); listeners.Add(new WeakReference(listenerMock)); listenerMock.Handle = (o, o1) => { }; } GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); model.OnPropertyChanged(propertyName + "1"); model.OnPropertyChanged(propertyName); model.OnPropertyChanged(propertyName); listeners.All(reference => reference.Target == null).ShouldBeTrue(); }
public void ObserverShouldRaiseValueChangedEventWhenPropertyChangedDoubleIndexerComplexProperty() { bool isInvoked = false; var model = new BindingSourceModel(); var propertyName = GetMemberPath(model, sourceModel => sourceModel.NestedModel["test", 0]); var observer = CreateObserver(model, propertyName, false); observer.Listener = new HandlerToDelegate((sender, args) => isInvoked = true); isInvoked = false; model.NestedModel = new BindingSourceNestedModel(); isInvoked.ShouldBeTrue(); isInvoked = false; model.NestedModel["test", 0] = "test"; isInvoked.ShouldBeFalse(); model.NestedModel.OnPropertyChanged("Item[]"); isInvoked.ShouldBeTrue(); isInvoked = false; model.NestedModel["test", 0] = "test1"; isInvoked.ShouldBeFalse(); model.NestedModel.OnPropertyChanged("Item[test,0]"); isInvoked.ShouldBeTrue(); }
public void GetValueShouldReturnValueUsingConverterTarget() { bool converterInvoked = false; var memberMock = new BindingMemberInfoMock { Type = typeof(int) }; CultureInfo culture = CultureInfo.InvariantCulture; var parameter = new object(); var sourceModel = new BindingSourceModel(); var converterMock = new ValueConverterCoreMock { ConvertBack = (o, type, arg3, arg4) => { converterInvoked = true; o.ShouldEqual(sourceModel.IntProperty); type.ShouldEqual(typeof(int)); arg3.ShouldEqual(parameter); arg4.ShouldEqual(culture); return int.MaxValue; } }; var dataContext = new DataContext { {BindingBuilderConstants.Converter, d => converterMock}, {BindingBuilderConstants.ConverterCulture, d => culture}, {BindingBuilderConstants.ConverterParameter, d => parameter} }; string propertyName = GetMemberPath<BindingSourceModel>(model => model.IntProperty); var valueAccessor = GetAccessor(sourceModel, propertyName, dataContext, false); valueAccessor.GetValue(memberMock, EmptyContext, true).ShouldEqual(int.MaxValue); converterInvoked.ShouldBeTrue(); }
public void ObserverShouldUpdateInformationWhenContextChangedHasStablePathTrueComplexPath() { var model = new BindingSourceModel { NestedModel = new BindingSourceNestedModel { StringProperty = "st" } }; var contextMock = new BindingContextMock { Value = model, Source = new object() }; var propertyName = GetMemberPath <BindingSourceModel>(sourceModel => sourceModel.NestedModel.StringProperty); var observer = CreateObserver(contextMock, propertyName, false, hasStablePath: true); var members = observer.GetPathMembers(true); members.Members.Last().Type.ShouldEqual(typeof(string)); observer.Path.Path.ShouldEqual(propertyName); members.LastMember.GetValue(members.PenultimateValue, null).ShouldEqual(model.NestedModel.StringProperty); var model2 = new BindingSourceModel { NestedModel = new BindingSourceNestedModel { StringProperty = "st1" } }; contextMock.Value = model2; members = observer.GetPathMembers(true); members.Members.Last().Type.ShouldEqual(typeof(string)); observer.Path.Path.ShouldEqual(propertyName); members.LastMember.GetValue(members.PenultimateValue, null).ShouldEqual(model2.NestedModel.StringProperty); }
public void ProviderShouldReturnMemberForBindingContext() { const string path = AttachedMemberConstants.DataContext; var model = new BindingSourceModel(); var contextMock = new BindingContextMock(); BindingServiceProvider.ContextManager = new BindingContextManagerMock { GetBindingContext = o => contextMock }; var provider = CreateMemberProvider(); var member = provider.GetBindingMember(typeof(object), path, false, true); member.CanRead.ShouldBeTrue(); member.CanWrite.ShouldBeTrue(); member.Type.ShouldEqual(typeof(object)); member.MemberType.ShouldEqual(BindingMemberType.BindingContext); member.Path.ShouldEqual(path); member.Member.ShouldBeNull(); member.GetValue(model, null).ShouldBeNull(); member.SetValue(model, new object[] { model }); member.GetValue(model, null).ShouldEqual(model); contextMock.Value.ShouldEqual(model); member.SetSingleValue(model, null); member.GetValue(model, null).ShouldBeNull(); }
public void AutoPropertyGenericDefaultValueTest() { string defaultValue = "test"; bool isInvoked = false; var source = new BindingSourceModel(); const string path = "path"; var property = AttachedBindingMember.CreateAutoProperty <BindingSourceModel, string>(path, null, null, (o, info) => { isInvoked = true; o.ShouldEqual(source); info.ShouldNotBeNull(); return(defaultValue); }); property.GetValue(source, null).ShouldEqual(defaultValue); isInvoked.ShouldBeTrue(); isInvoked = false; property.GetValue(source, null).ShouldEqual(defaultValue); isInvoked.ShouldBeFalse(); source = new BindingSourceModel(); defaultValue = path; property.GetValue(source, null).ShouldEqual(defaultValue); isInvoked.ShouldBeTrue(); }
public void ObserverShouldRaiseValueChangedEventWhenPropertyChangedIndexerComplexProperty() { bool isInvoked = false; var model = new BindingSourceModel(); var propertyName = GetMemberPath(model, sourceModel => sourceModel.NestedModel["test"]); var observer = CreateObserver(model, propertyName, false); observer.ValueChanged += (sender, args) => isInvoked = true; isInvoked = false; model.NestedModel = new BindingSourceNestedModel(); isInvoked.ShouldBeTrue(); isInvoked = false; model.NestedModel["test"] = "test"; isInvoked.ShouldBeFalse(); model.NestedModel.OnPropertyChanged(ReflectionExtensions.IndexerName); isInvoked.ShouldBeTrue(); isInvoked = false; model.NestedModel["test"] = "test1"; isInvoked.ShouldBeFalse(); model.NestedModel.OnPropertyChanged("Item[test]"); isInvoked.ShouldBeTrue(); }
public void ExecuteShouldCallCmdExecuteMethodOneTimeModeAfterDispose() { var parameter = new object(); bool isInvoked = false; var command = new RelayCommand(o => { o.ShouldEqual(parameter); isInvoked = true; }); var srcAccessor = new BindingSourceAccessorMock(); var source = new BindingSourceModel(); var ctx = new DataContext(BindingBuilderConstants.Behaviors.ToValue(new List<IBindingBehavior> { new OneTimeBindingMode() })); var accessor = GetAccessor(source, BindingSourceModel.EventName, ctx, false, d => parameter); srcAccessor.GetValue = (info, context, arg3) => command; accessor.SetValue(srcAccessor, EmptyContext, true); accessor.Dispose(); GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); source.RaiseEvent(); isInvoked.ShouldBeTrue(); isInvoked = false; source.RaiseEvent(); isInvoked.ShouldBeTrue(); }
public void AccessorShouldUseOnlyOneCmd() { bool isEnabled = false; var oldCmd = new RelayCommand(o => { }, o => false, this); var command = new RelayCommand(o => { }, o => isEnabled, this); var srcAccessor = new BindingSourceAccessorMock(); var source = new BindingSourceModel(); var accessor = GetAccessor(source, BindingSourceModel.EventName, EmptyContext, false); srcAccessor.GetValue = (info, context, arg3) => oldCmd; accessor.SetValue(srcAccessor, EmptyContext, true); source.IsEnabled.ShouldBeFalse(); oldCmd.RaiseCanExecuteChanged(); source.IsEnabled.ShouldBeFalse(); srcAccessor.GetValue = (info, context, arg3) => command; accessor.SetValue(srcAccessor, EmptyContext, true); isEnabled = true; command.RaiseCanExecuteChanged(); source.IsEnabled.ShouldEqual(isEnabled); oldCmd.RaiseCanExecuteChanged(); source.IsEnabled.ShouldEqual(isEnabled); srcAccessor.GetValue = (info, context, arg3) => null; accessor.SetValue(srcAccessor, EmptyContext, true); isEnabled = false; command.RaiseCanExecuteChanged(); source.IsEnabled.ShouldBeTrue(); }
public void ValueChangedShouldBeRaised() { int oldValue = 0; int value = int.MaxValue; bool isInvoked = false; var sourceModel = new BindingSourceModel(); var srcAccessor = new BindingSourceAccessorMock(); string propertyName = GetMemberPath<BindingSourceModel>(model => model.IntProperty); var valueAccessor = GetAccessor(sourceModel, propertyName, EmptyContext, true); valueAccessor.ValueChanged += (sender, args) => { sender.ShouldEqual(valueAccessor); args.OldValue.ShouldEqual(oldValue); args.NewValue.ShouldEqual(value); isInvoked = true; }; srcAccessor.GetValue = (info, context, arg3) => { context.ShouldEqual(EmptyContext); return value; }; valueAccessor.SetValue(srcAccessor, EmptyContext, true); isInvoked.ShouldBeTrue(); isInvoked = false; oldValue = value; value = int.MinValue; valueAccessor.SetValue(srcAccessor, EmptyContext, true); isInvoked.ShouldBeTrue(); }
public void CmdShouldAddNotifierConstructorWhenCanExecuteNotNull() { var notifier = new BindingSourceModel(); var relayCommand = CreateCommand(NodoAction, o => true, notifier); relayCommand.GetNotifiers().Single().ShouldEqual(notifier); }
public void ObserverShouldNotRaiseValueChangedEventForOldComplexProperty() { bool isInvoked = false; var model = new BindingSourceModel(); var propertyName = GetMemberPath(model, sourceModel => sourceModel.NestedModel.StringProperty); var observer = CreateObserver(model, propertyName, false); observer.Listener = new HandlerToDelegate((sender, args) => isInvoked = true); isInvoked = false; model.NestedModel = new BindingSourceNestedModel(); isInvoked.ShouldBeTrue(); isInvoked = false; model.NestedModel.StringProperty = "test"; isInvoked.ShouldBeTrue(); var oldProperty = model.NestedModel; model.NestedModel = new BindingSourceNestedModel(); isInvoked = false; oldProperty.StringProperty = string.Empty; isInvoked.ShouldBeFalse(); }
public void AutoPropertyObserveTest() { bool isInvoked = false; var listenerMock = new EventListenerMock { Handle = (o, o1) => isInvoked = true }; var source = new BindingSourceModel(); const string path = "path"; var property = AttachedBindingMember.CreateAutoProperty(path, typeof(string)); IDisposable subscriber = property.TryObserve(source, listenerMock); property.SetValue(source, new object[] { path }); isInvoked.ShouldBeTrue(); subscriber.ShouldNotBeNull(); isInvoked = false; property.SetValue(source, new object[] { path }); isInvoked.ShouldBeFalse(); isInvoked = false; property.SetValue(source, new object[] { null }); isInvoked.ShouldBeTrue(); subscriber.Dispose(); isInvoked = false; property.SetValue(source, new object[] { path }); isInvoked.ShouldBeFalse(); }
public void WeakEventManagerShouldReturnNullInvalidEvent() { var model = new BindingSourceModel(); IWeakEventManager weakEventManager = CreateWeakEventManager(); weakEventManager.TrySubscribe(model, BindingSourceModel.InvalidEventName, new EventListenerMock()).ShouldBeNull(); }
public void WeakEventManagerShouldSubscribeAndUnsubscribePropertyChangedEventSeveralSources() { const int count = 100; const string propertyName = "test"; var model = new BindingSourceModel(); var listeners = new List <EventListenerMock>(); var invokedItems = new List <EventListenerMock>(); IWeakEventManager weakEventManager = CreateWeakEventManager(); for (int i = 0; i < count; i++) { var listenerMock = new EventListenerMock(); var disposable = weakEventManager.Subscribe(model, propertyName, listenerMock); listeners.Add(listenerMock); listenerMock.Handle = (o, o1) => { invokedItems.Add(listenerMock); disposable.Dispose(); }; } model.OnPropertyChanged(propertyName + "1"); model.OnPropertyChanged(propertyName); model.OnPropertyChanged(propertyName); invokedItems.Count.ShouldEqual(count); foreach (var listener in listeners) { invokedItems.Contains(listener).ShouldBeTrue(); } }
public void GetValueShouldReturnActualValueDoubleSource() { const string value = "100"; bool isInvoked = false; var memberMock = new BindingMemberInfoMock(); var sourceModel = new BindingSourceModel(); string propertyName1 = GetMemberPath <BindingSourceModel>(model => model.IntProperty); string propertyName2 = GetMemberPath <BindingSourceModel>(model => model["test"]); var valueAccessor = new MultiBindingSourceAccessor(new[] { CreateSource(sourceModel, propertyName1), CreateSource(sourceModel, propertyName2), }, (context, list) => { list.Count.ShouldEqual(2); isInvoked = true; context.ShouldEqual(EmptyContext); list[0].ShouldEqual(sourceModel.IntProperty); list[1].ShouldEqual(sourceModel["test"]); return(value); }, EmptyContext); valueAccessor.GetValue(memberMock, EmptyContext, true).ShouldEqual(value); isInvoked.ShouldBeTrue(); isInvoked = false; sourceModel["test"] = propertyName1; sourceModel.IntProperty = int.MaxValue; valueAccessor.GetValue(memberMock, EmptyContext, true).ShouldEqual(value); isInvoked.ShouldBeTrue(); }
public void ProviderShouldReturnMultiPathObserverMultiPath() { var target = new BindingSourceModel(); var observerProvider = Cretate(); observerProvider.Observe(target, new BindingPath(GetMemberPath(target, model => model.NestedModel.IntProperty)), false, EmptyContext).ShouldBeType <MultiPathObserver>(); }
public void ProviderShouldReturnEmptyPathObserverEmptyPath() { var target = new BindingSourceModel(); var observerProvider = Cretate(); observerProvider.Observe(target, BindingPath.Empty, false, EmptyContext).ShouldBeType <EmptyPathObserver>(); }
public void CmdShouldNotAddNotifierConstructorWhenCanExecuteNull() { var notifier = new BindingSourceModel(); var relayCommand = CreateCommand(NodoAction, null, notifier); relayCommand.GetNotifiers().ShouldBeEmpty(); }
public void GetValueShouldNotThrowExceptionInvalidValueIfFlagFalse() { var memberMock = new BindingMemberInfoMock(); var sourceModel = new BindingSourceModel(); const string propertyName = "invalid"; var valueAccessor = GetAccessor(sourceModel, propertyName, EmptyContext, true); valueAccessor.GetValue(memberMock, EmptyContext, false).ShouldEqual(null); }
public void CmdShouldNotAddNotifierWhenCanExecuteNull() { var notifier = new BindingSourceModel(); var relayCommand = CreateCommand(NodoAction); relayCommand.AddNotifier(notifier).ShouldBeFalse(); relayCommand.GetNotifiers().ShouldBeEmpty(); }