public void ShouldThrowIfExecuteMethodDelegateNull()
 {
     Assert.Throws <ArgumentNullException>(
         () =>
     {
         var command = new global::Anori.WinUI.Commands.AsyncRelayCommand <object>(null);
     });
 }
        public void CanExecuteReturnsTrueWithoutCanExecuteDelegate()
        {
            var handlers = new AsyncDelegateObjectHandlers();
            var command  = new global::Anori.WinUI.Commands.AsyncRelayCommand <object>(async o => await handlers.Execute(o));

            var condition = command.CanExecute(null);

            Assert.True(condition);
        }
        public void WhenConstructedWithGenericTypeOfObject_InitializesValues()
        {
            // Prepare

            // Act
            var actual = new global::Anori.WinUI.Commands.AsyncRelayCommand <object>(async o => await Task.Yield());

            // verify
            Assert.NotNull(actual);
        }
        public void RaiseCanExecuteChangedRaisesCanExecuteChanged()
        {
            var handlers = new AsyncDelegateObjectHandlers();
            var command  = new global::Anori.WinUI.Commands.AsyncRelayCommand <object>(async o => await handlers.Execute(o), o => false);
            var canExecuteChangedRaised = false;

            command.CanExecuteChanged += delegate { canExecuteChangedRaised = true; };

            command.RaiseCanExecuteChanged();
            Assert.True(canExecuteChangedRaised);
        }
        public void GenericAsyncRelayCommandNotObservingPropertiesShouldNotRaiseOnEmptyPropertyName()
        {
            var canExecuteChangedRaised = false;
            var commandTestObject       = new CommandTestObject();
            var command = new global::Anori.WinUI.Commands.AsyncRelayCommand <object>(async o => await Task.Yield());

            command.CanExecuteChanged += delegate { canExecuteChangedRaised = true; };

            commandTestObject.RaisePropertyChanged(null);

            Assert.False(canExecuteChangedRaised);
        }
        public void CanExecuteCallsPassedInCanExecuteDelegate()
        {
            var handlers  = new AsyncDelegateObjectHandlers();
            var command   = new global::Anori.WinUI.Commands.AsyncRelayCommand <object>(async o => await handlers.Execute(o), handlers.CanExecute);
            var parameter = new object();

            handlers.CanExecuteReturnValue = true;
            var actual = command.CanExecute(parameter);

            Assert.AreSame(parameter, handlers.CanExecuteParameter);
            Assert.AreEqual(handlers.CanExecuteReturnValue, actual);
        }
        public void CanRemoveCanExecuteChangedHandler()
        {
            var command = new global::Anori.WinUI.Commands.AsyncRelayCommand <object>(async o => await Task.Yield());
            var canExecuteChangedRaised = false;

            void Handler(object s, EventArgs e) => canExecuteChangedRaised = true;

            command.CanExecuteChanged += Handler;
            command.CanExecuteChanged -= Handler;
            command.RaiseCanExecuteChanged();

            Assert.False(canExecuteChangedRaised);
        }
        public void ShouldPassParameterInstanceOnCanExecute()
        {
            var      canExecuteCalled = false;
            var      testClass        = new MyClass();
            ICommand command          = new global::Anori.WinUI.Commands.AsyncRelayCommand <MyClass>(
                async o => await Task.Yield(),
                delegate(MyClass parameter)
            {
                Assert.AreSame(testClass, parameter);
                canExecuteCalled = true;
                return(true);
            });

            command.CanExecute(testClass);
            Assert.True(canExecuteCalled);
        }
        public void ExecuteCallsPassedInExecuteDelegate()
        {
            var handlers = new AsyncDelegateObjectHandlers();

            using var waitHandle = new EventWaitHandle(false, EventResetMode.AutoReset);

            var command = new global::Anori.WinUI.Commands.AsyncRelayCommand <object>(async o =>
            {
                await handlers.Execute(o);
                waitHandle.Set();
            }) as ICommand;
            var parameter = new object();

            command.Execute(parameter);
            waitHandle.WaitOne();
            Assert.AreSame(parameter, handlers.ExecuteParameter);
        }
        public void WhenConstructedWithGenericTypeIsNonNullableValueType_Throws()
        {
            ICommand command = new global::Anori.WinUI.Commands.AsyncRelayCommand <int>(async o => await Task.Yield(), exception => { });

            Assert.Throws <InvalidCastException>(() => { command.Execute(new object()); });
        }