Index: ui/base/win/open_file_name_win_unittest.cc |
diff --git a/ui/base/win/open_file_name_win_unittest.cc b/ui/base/win/open_file_name_win_unittest.cc |
index 5c9fefb3406d12174501e71dfaeaa58c861abf39..b280f05f86b070b2b7528430a06ceb97032864a6 100644 |
--- a/ui/base/win/open_file_name_win_unittest.cc |
+++ b/ui/base/win/open_file_name_win_unittest.cc |
@@ -12,16 +12,64 @@ const HWND kHwnd = reinterpret_cast<HWND>(0xDEADBEEF); |
const DWORD kFlags = OFN_OVERWRITEPROMPT | OFN_EXPLORER | OFN_ENABLESIZING; |
void SetResult(const base::string16& result, ui::win::OpenFileName* ofn) { |
- EXPECT_GT(ofn->Get()->nMaxFile, result.size()); |
- if (ofn->Get()->nMaxFile > result.size()) { |
- if (!result.size()) { |
- ofn->Get()->lpstrFile[0] = 0; |
- } else { |
- // Because the result has embedded nulls, we must memcpy. |
- memcpy(ofn->Get()->lpstrFile, |
- result.c_str(), |
- (result.size() + 1) * sizeof(result[0])); |
- } |
+ if (ofn->Get()->nMaxFile <= result.size()) { |
+ ADD_FAILURE() << "filename buffer insufficient."; |
+ return; |
+ } |
+ if (!result.size()) { |
+ ofn->Get()->lpstrFile[0] = 0; |
+ } else { |
+ // Because the result has embedded nulls, we must memcpy. |
+ memcpy(ofn->Get()->lpstrFile, |
+ result.c_str(), |
+ (result.size() + 1) * sizeof(result[0])); |
+ } |
+} |
+ |
+void CheckFilters( |
+ const std::vector<Tuple2<base::string16, base::string16> >& expected, |
+ const std::vector<Tuple2<base::string16, base::string16> >& actual) { |
+ if (expected.size() != actual.size()) { |
+ ADD_FAILURE() << "filter count mismatch. Got " << actual.size() |
+ << " expected " << expected.size() << "."; |
+ return; |
+ } |
+ |
+ for (size_t i = 0; i < expected.size(); ++i) { |
+ EXPECT_EQ(expected[i].a, actual[i].a) << "Mismatch at index " << i; |
+ EXPECT_EQ(expected[i].b, actual[i].b) << "Mismatch at index " << i; |
+ } |
+} |
+ |
+void CheckFilterString(const base::string16& expected, |
+ const ui::win::OpenFileName& ofn) { |
+ if (!ofn.Get()->lpstrFilter) { |
+ ADD_FAILURE() << "Filter string is NULL."; |
+ return; |
+ } |
+ if (expected.size() == 0) { |
+ EXPECT_EQ(0, ofn.Get()->lpstrFilter[0]); |
+ } else { |
+ EXPECT_EQ(0, |
+ memcmp(expected.c_str(), |
+ ofn.Get()->lpstrFilter, |
+ expected.size() + 1 * sizeof(expected[0]))); |
+ } |
+} |
+ |
+void CheckResult(const base::string16& expected, |
+ const ui::win::OpenFileName& ofn) { |
+ if (!ofn.Get()->lpstrFile) { |
+ ADD_FAILURE() << "File string is NULL."; |
+ return; |
+ } |
+ if (expected.size() == 0) { |
+ EXPECT_EQ(0, ofn.Get()->lpstrFile[0]); |
+ } else { |
+ EXPECT_EQ(0, |
+ memcmp(expected.c_str(), |
+ ofn.Get()->lpstrFile, |
+ expected.size() + 1 * sizeof(expected[0]))); |
} |
} |
@@ -135,3 +183,44 @@ TEST(OpenFileNameTest, GetResult) { |
EXPECT_EQ(base::FilePath(), directory); |
ASSERT_EQ(0u, filenames.size()); |
} |
+ |
+TEST(OpenFileNameTest, SetAndGetFilters) { |
+ const base::string16 kNull(L"\0", 1); |
+ |
+ ui::win::OpenFileName ofn(kHwnd, kFlags); |
+ std::vector<Tuple2<base::string16, base::string16> > filters; |
+ ofn.SetFilters(filters); |
+ EXPECT_FALSE(ofn.Get()->lpstrFilter); |
+ CheckFilters(filters, ui::win::OpenFileName::GetFilters(ofn.Get())); |
+ |
+ filters.push_back(MakeTuple(base::string16(L"a"), base::string16(L"b"))); |
+ ofn.SetFilters(filters); |
+ CheckFilterString(L"a" + kNull + L"b" + kNull, ofn); |
+ CheckFilters(filters, ui::win::OpenFileName::GetFilters(ofn.Get())); |
+ |
+ filters.push_back(MakeTuple(base::string16(L"X"), base::string16(L"Y"))); |
+ ofn.SetFilters(filters); |
+ CheckFilterString(L"a" + kNull + L"b" + kNull + L"X" + kNull + L"Y" + kNull, |
+ ofn); |
+ CheckFilters(filters, ui::win::OpenFileName::GetFilters(ofn.Get())); |
+} |
+ |
+TEST(OpenFileNameTest, SetResult) { |
+ const base::string16 kNull(L"\0", 1); |
+ |
+ ui::win::OpenFileName ofn(kHwnd, kFlags); |
+ base::FilePath directory; |
+ std::vector<base::FilePath> filenames; |
+ |
+ ui::win::OpenFileName::SetResult(directory, filenames, ofn.Get()); |
+ CheckResult(L"", ofn); |
+ |
+ directory = base::FilePath(L"C:\\dir"); |
+ filenames.push_back(base::FilePath(L"file")); |
+ ui::win::OpenFileName::SetResult(directory, filenames, ofn.Get()); |
+ CheckResult(L"C:\\dir\\file" + kNull, ofn); |
+ |
+ filenames.push_back(base::FilePath(L"otherfile")); |
+ ui::win::OpenFileName::SetResult(directory, filenames, ofn.Get()); |
+ CheckResult(L"C:\\dir" + kNull + L"file" + kNull + L"otherfile" + kNull, ofn); |
+} |