| // Copyright 2013 The Flutter Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| #ifndef PACKAGES_FILE_SELECTOR_FILE_SELECTOR_WINDOWS_WINDOWS_TEST_TEST_FILE_DIALOG_CONTROLLER_H_ |
| #define PACKAGES_FILE_SELECTOR_FILE_SELECTOR_WINDOWS_WINDOWS_TEST_TEST_FILE_DIALOG_CONTROLLER_H_ |
| |
| #include <comdef.h> |
| #include <comip.h> |
| #include <windows.h> |
| |
| #include <functional> |
| #include <memory> |
| #include <variant> |
| #include <vector> |
| |
| #include "file_dialog_controller.h" |
| #include "test/test_utils.h" |
| |
| _COM_SMARTPTR_TYPEDEF(IFileDialog, IID_IFileDialog); |
| |
| namespace file_selector_windows { |
| namespace test { |
| |
| class TestFileDialogController; |
| |
| // A value to use for GetResult(s) in TestFileDialogController. The type depends |
| // on whether the dialog is an open or save dialog. |
| using MockShowResult = |
| std::variant<std::monostate, IShellItemPtr, IShellItemArrayPtr>; |
| // Called for TestFileDialogController::Show, to do validation and provide a |
| // mock return value for GetResult(s). |
| using MockShow = |
| std::function<MockShowResult(const TestFileDialogController&, HWND)>; |
| |
| // A C++-friendly version of a COMDLG_FILTERSPEC. |
| struct DialogFilter { |
| std::wstring name; |
| std::wstring spec; |
| |
| DialogFilter(const wchar_t* name, const wchar_t* spec) |
| : name(name), spec(spec) {} |
| }; |
| |
| // An extension of the normal file dialog controller that: |
| // - Allows for inspection of set values. |
| // - Allows faking the 'Show' interaction, providing tests an opportunity to |
| // validate the dialog settings and provide a return value, via MockShow. |
| class TestFileDialogController : public FileDialogController { |
| public: |
| TestFileDialogController(IFileDialog* dialog, MockShow mock_show); |
| ~TestFileDialogController(); |
| |
| // FileDialogController: |
| HRESULT SetFileTypes(UINT count, COMDLG_FILTERSPEC* filters) override; |
| HRESULT SetOkButtonLabel(const wchar_t* text) override; |
| HRESULT Show(HWND parent) override; |
| HRESULT GetResult(IShellItem** out_item) const override; |
| HRESULT GetResults(IShellItemArray** out_items) const override; |
| |
| // Accessors for validating IFileDialogController setter calls. |
| std::wstring GetDefaultFolderPath() const; |
| std::wstring GetFileName() const; |
| const std::vector<DialogFilter>& GetFileTypes() const; |
| std::wstring GetOkButtonLabel() const; |
| |
| private: |
| IFileDialogPtr dialog_; |
| MockShow mock_show_; |
| MockShowResult mock_result_; |
| |
| // The last set values, for IFileDialog properties that have setters but no |
| // corresponding getters. |
| std::wstring ok_button_label_; |
| std::vector<DialogFilter> filter_groups_; |
| }; |
| |
| // A controller factory that vends TestFileDialogController instances. |
| class TestFileDialogControllerFactory : public FileDialogControllerFactory { |
| public: |
| // Creates a factory whose instances use mock_show for the Show callback. |
| TestFileDialogControllerFactory(MockShow mock_show); |
| virtual ~TestFileDialogControllerFactory(); |
| |
| // Disallow copy and assign. |
| TestFileDialogControllerFactory(const TestFileDialogControllerFactory&) = |
| delete; |
| TestFileDialogControllerFactory& operator=( |
| const TestFileDialogControllerFactory&) = delete; |
| |
| // FileDialogControllerFactory: |
| std::unique_ptr<FileDialogController> CreateController( |
| IFileDialog* dialog) const override; |
| |
| private: |
| MockShow mock_show_; |
| }; |
| |
| } // namespace test |
| } // namespace file_selector_windows |
| |
| #endif // PACKAGES_FILE_SELECTOR_FILE_SELECTOR_WINDOWS_WINDOWS_TEST_TEST_FILE_DIALOG_CONTROLLER_H_ |