public static Task<IFile> RequestAsync(
            this InteractionRequest<SaveFileInteraction> interactionRequest,
            string title,
            string acceptButtonText,
            string cancelButtonText,
            IEnumerable<FileType> fileTypeChoices )
        {
            Arg.NotNull( interactionRequest, nameof( interactionRequest ) );
            Arg.NotNull( fileTypeChoices, nameof( fileTypeChoices ) );

            if ( string.IsNullOrEmpty( title ) )
                title = SR.SaveFileTitle;

            if ( string.IsNullOrEmpty( acceptButtonText ) )
                acceptButtonText = SR.Save;

            if ( string.IsNullOrEmpty( cancelButtonText ) )
                cancelButtonText = SR.Cancel;

            var source = new TaskCompletionSource<IFile>();
            SaveFileInteraction interaction = null;

            interaction = new SaveFileInteraction()
            {
                Title = title,
                DefaultCommandIndex = 0,
                CancelCommandIndex = 1,
                Commands =
                {
                    new NamedCommand<object>( "Save", acceptButtonText, p => source.TrySetResult( interaction.SavedFile ) ),
                    new NamedCommand<object>( "Cancel", cancelButtonText, p => source.TrySetResult( null ) )
                }
            };

            var defaultExt = ( from choice in fileTypeChoices
                               from ext in choice.Extensions
                               where !string.IsNullOrEmpty( ext )
                               select ext ).FirstOrDefault();

            // set the default file extension to the first entry with a non-null, non-empty value
            if ( !string.IsNullOrEmpty( defaultExt ) )
                interaction.DefaultFileExtension = defaultExt;

            interaction.FileTypeChoices.AddRange( fileTypeChoices );
            interactionRequest.Request( interaction );

            return source.Task;
        }
        public void FileNameShouldWriteExpectedValue()
        {
            // arrange
            var expected = "test";
            var interaction = new SaveFileInteraction();

            // act
            Assert.PropertyChanged( interaction, "FileName", () => interaction.FileName = expected );
            var actual = interaction.FileName;

            // assert
            Assert.Equal( expected, actual );
        }
        public void DefaultFileExtensionShouldWriteExpectedValue()
        {
            // arrange
            var expected = "*.txt";
            var interaction = new SaveFileInteraction();

            // act
            Assert.PropertyChanged( interaction, "DefaultFileExtension", () => interaction.DefaultFileExtension = expected );
            var actual = interaction.DefaultFileExtension;

            // assert
            Assert.Equal( expected, actual );
        }
        public void FileNameShouldNotAllowNull()
        {
            // arrange
            string value = null;
            var interaction = new SaveFileInteraction();

            // act
            var ex = Assert.Throws<ArgumentNullException>( () => interaction.FileName = value );

            // assert
            Assert.Equal( "value", ex.ParamName );
        }
        public void ConstructorShouldSetSuggestedFileName()
        {
            // arrange
            var expected = "test";

            // act
            var interaction = new SaveFileInteraction( "", "", expected );
            var actual = interaction.FileName;

            // assert
            Assert.Equal( expected, actual );
        }