コード例 #1
0
        public void RaiseCanExecuteChanged_InvokeEvent()
        {
            // Arrange
            Task Execute() => Task.CompletedTask;
            bool CanExecute() => true;

            var errorHandler = new ErrorHandlerTestImplementation((cmd,
                                                                   exception) =>
            {
            });
            object    invokedSender = null;
            EventArgs invokedArgs   = null;
            var       command       = new AsyncCommand(Execute, CanExecute, errorHandler);

            command.CanExecuteChanged += (sender,
                                          args) =>
            {
                invokedSender = sender;
                invokedArgs   = args;
            };

            // Act
            command.RaiseCanExecuteChanged();

            // Assert
            Assert.IsNotNull(invokedSender);
            Assert.AreSame(command, invokedSender);
            Assert.IsNotNull(invokedArgs);
            Assert.AreSame(EventArgs.Empty, invokedArgs);
        }
コード例 #2
0
        public void AsyncCommand_CanExecuteChanged_Test()
        {
            //Arrange
            bool canCommandExecute       = false;
            bool didCanExecuteChangeFire = false;

            AsyncCommand command = new AsyncCommand(NoParameterTask, commandCanExecute);

            command.CanExecuteChanged += handleCanExecuteChanged;

            void handleCanExecuteChanged(object?sender, EventArgs e) => didCanExecuteChangeFire = true;
            bool commandCanExecute(object?parameter) => canCommandExecute;

            Assert.False(command.CanExecute(null));

            //Act
            canCommandExecute = true;

            //Assert
            Assert.True(command.CanExecute(null));
            Assert.False(didCanExecuteChangeFire);

            //Act
            command.RaiseCanExecuteChanged();

            //Assert
            Assert.True(didCanExecuteChangeFire);
            Assert.True(command.CanExecute(null));
        }
コード例 #3
0
        public void AsyncCommand_RaiseCanExecuteChanged_MainThreadCreation_MainThreadExecution_Test()
        {
            // Arrange
            var canCommandExecute       = false;
            var didCanExecuteChangeFire = false;

            var command = new AsyncCommand(NoParameterTask, commandCanExecute);

            command.CanExecuteChanged += handleCanExecuteChanged;

            bool commandCanExecute(object parameter) => canCommandExecute;

            Assert.False(command.CanExecute(null));

            // Act
            canCommandExecute = true;

            // Assert
            Assert.True(command.CanExecute(null));
            Assert.False(didCanExecuteChangeFire);

            // Act
            command.RaiseCanExecuteChanged();

            // Assert
            Assert.True(didCanExecuteChangeFire);
            Assert.True(command.CanExecute(null));

            void handleCanExecuteChanged(object sender, EventArgs e) => didCanExecuteChangeFire = true;
        }
コード例 #4
0
        public void RaisingCanExecuteChangedRaisesCanExecuteChanged()
        {
            var command = new AsyncCommand <object>(async o => await AsyncMethod(() => { }));

            command.MonitorEvents();

            command.RaiseCanExecuteChanged();

            command.ShouldRaise("CanExecuteChanged");
        }
コード例 #5
0
        private async Task Login(object parameter)
        {
            PasswordBox passwordBox       = parameter as PasswordBox;
            string      clearTextPassword = passwordBox.Password;

            try
            {
                //Validate credentials through the authentication service
                Employee user = await Task.Factory.StartNew(() => _authenticationService.AuthenticateUser(Username, clearTextPassword));

                if (user == null)
                {
                    throw new UnauthorizedAccessException("Access denied. Please provide some valid credentials.");
                }
                //Get the current principal object
                CustomPrincipal customPrincipal = Thread.CurrentPrincipal as CustomPrincipal;
                if (customPrincipal == null)
                {
                    throw new ArgumentException("The application's default thread principal must be set to a CustomPrincipal object on startup.");
                }

                //Authenticate the user
                customPrincipal.Identity = new CustomIdentity(user.Username, user.Email, user.Role);

                //Update UI
                NotifyPropertyChanged("AuthenticatedUser");
                NotifyPropertyChanged("IsAuthenticated");
                _loginCommand.RaiseCanExecuteChanged();
                Username             = string.Empty; //reset
                passwordBox.Password = string.Empty; //reset
                Status = string.Empty;
                if (user.Role == "Administrators")
                {
                    Pages.SetPage(Pages.AdminControl);
                }
                else
                {
                    Pages.SetPage(Pages.EmployeeControl);
                }
            }
            catch (UnauthorizedAccessException)
            {
                Status = "Login failed! Please provide some valid credentials.";
            }
            catch (Exception ex)
            {
                Status = string.Format("ERROR: {0}", ex.Message);
            }
            finally
            {
                IsActive = false;
            }
        }
コード例 #6
0
        public async Task AsyncCommand_RaiseCanExecuteChanged_MainThreadCreation_MainThreadExecution_Test()
        {
            // Arrange
            var semaphoreSlim           = new SemaphoreSlim(1, 1);
            var canCommandExecute       = false;
            var didCanExecuteChangeFire = false;

            var handleCanExecuteChangedTCS = new TaskCompletionSource <object?>();

            var command = new AsyncCommand(NoParameterTask, commandCanExecute);

            command.CanExecuteChanged += handleCanExecuteChanged;

            bool commandCanExecute(object?parameter) => canCommandExecute;

            Assert.False(command.CanExecute(null));

            // Act
            canCommandExecute = true;

            // Assert
            Assert.IsTrue(command.CanExecute(null));
            Assert.False(didCanExecuteChangeFire);

            // Act
            command.RaiseCanExecuteChanged();
            await handleCanExecuteChangedTCS.Task.ConfigureAwait(false);

            // Assert
            Assert.IsTrue(didCanExecuteChangeFire);
            Assert.IsTrue(command.CanExecute(null));

            async void handleCanExecuteChanged(object?sender, EventArgs e)
            {
                await semaphoreSlim.WaitAsync().ConfigureAwait(false);

                try
                {
                    command.CanExecuteChanged -= handleCanExecuteChanged;
                    didCanExecuteChangeFire    = true;
                    handleCanExecuteChangedTCS.SetResult(null);
                }
                finally
                {
                    semaphoreSlim.Release();
                }
            }
        }
コード例 #7
0
        public AsyncCommandViewModel()
        {
            CounterCommand = new AsyncCommand(async() =>
            {
                await Task.Delay(2000);
                Counter++;
                OnCounterCommand.RaiseCanExecuteChanged();
                CounterCommand.RaiseCanExecuteChanged();
            }, () => Math.Abs(m_counter - m_onClickCounter) < 5);

            OnCounterCommand = new AsyncCommand <int>(async num =>
            {
                await Task.Delay(150);
                OnClickCounter = num;
                CounterCommand.RaiseCanExecuteChanged();
                OnCounterCommand.RaiseCanExecuteChanged();
            }, num => Math.Abs(num - OnClickCounter) > 2);
        }
コード例 #8
0
        public ProfileModel()
        {
            _dto = new ProfileDto()
            {
                PhoneNumber = "+79219736635"
            };
            UpdateCommand = new AsyncCommand()
            {
                Action     = OnUpdate,
                CanExecute = CanUpdate
            };

            CancelCommand = new Command()
            {
                Action     = OnCancel,
                CanExecute = (arg) => HasChanges
            };

            PropertyChanged += (sender, e) =>
            {
                CancelCommand.RaiseCanExecuteChanged();
                UpdateCommand.RaiseCanExecuteChanged();
            };
        }
コード例 #9
0
 private static void InvokeButtonCanExecuteChanged() => AsyncCommand.RaiseCanExecuteChanged();
コード例 #10
0
        public void IAsyncCommandT_CanRaiseCanExecuteChanged()
        {
            IAsyncCommand <string> command = new AsyncCommand <string>(sender => Task.CompletedTask);

            command.RaiseCanExecuteChanged();
        }
コード例 #11
0
        public void IAsyncCommand_CanRaiseCanExecuteChanged()
        {
            IAsyncCommand command = new AsyncCommand(() => Task.CompletedTask);

            command.RaiseCanExecuteChanged();
        }
コード例 #12
0
        public void RaiseCanExecuteChangedShouldRaiseEvent()
        {
            // arrange
            var raised = false;
            var command = new AsyncCommand<object>( p => Task.FromResult( 0 ) );

            command.CanExecuteChanged += ( s, e ) => raised = true;

            // act
            command.RaiseCanExecuteChanged();

            // assert
            Assert.True( raised );
        }