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();
        }
Beispiel #11
0
        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();
        }
Beispiel #13
0
        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();
        }
Beispiel #16
0
        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();
        }
Beispiel #20
0
        public void CmdShouldAddNotifierConstructorWhenCanExecuteNotNull()
        {
            var notifier     = new BindingSourceModel();
            var relayCommand = CreateCommand(NodoAction, o => true, notifier);

            relayCommand.GetNotifiers().Single().ShouldEqual(notifier);
        }
Beispiel #21
0
        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();
        }
Beispiel #26
0
        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>();
        }
Beispiel #27
0
        public void ProviderShouldReturnEmptyPathObserverEmptyPath()
        {
            var target           = new BindingSourceModel();
            var observerProvider = Cretate();

            observerProvider.Observe(target, BindingPath.Empty, false, EmptyContext).ShouldBeType <EmptyPathObserver>();
        }
Beispiel #28
0
        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);
 }
Beispiel #30
0
        public void CmdShouldNotAddNotifierWhenCanExecuteNull()
        {
            var notifier     = new BindingSourceModel();
            var relayCommand = CreateCommand(NodoAction);

            relayCommand.AddNotifier(notifier).ShouldBeFalse();
            relayCommand.GetNotifiers().ShouldBeEmpty();
        }