Chromium Code Reviews| Index: components/password_manager/core/browser/export/csv_writer_unittest.cc |
| diff --git a/components/password_manager/core/browser/export/csv_writer_unittest.cc b/components/password_manager/core/browser/export/csv_writer_unittest.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..5fc6b2884fd8870ed0a8f6f7b39e4d02a6b01cea |
| --- /dev/null |
| +++ b/components/password_manager/core/browser/export/csv_writer_unittest.cc |
| @@ -0,0 +1,190 @@ |
| +// Copyright 2014 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "components/password_manager/core/browser/export/csv_writer.h" |
| + |
| +#include "testing/gtest/include/gtest/gtest.h" |
| + |
| +#if defined(OS_WIN) |
| +#define EOL_SEQUENCE "\r\n" |
| +#else |
| +#define EOL_SEQUENCE "\n" |
| +#endif |
| + |
| +namespace password_manager { |
| + |
| +class CSVWriterTest : public testing::Test { |
| + public: |
| + CSVWriterTest() {} |
| + |
| + virtual void SetUp() OVERRIDE { |
| + column_names_.push_back("foo"); |
| + column_names_.push_back("bar"); |
| + } |
| + |
| + protected: |
| + std::vector<std::string> column_names_; |
| + std::vector<CSVWriter::ColumnNameToValueMap> records_; |
| + |
| + private: |
| + DISALLOW_COPY_AND_ASSIGN(CSVWriterTest); |
| +}; |
| + |
| +TEST_F(CSVWriterTest, EmptyData) { |
| + const char kExpectedResult[] = EOL_SEQUENCE; |
| + |
| + std::string result; |
| + CSVWriter::Write(std::vector<std::string>(), records_, &result); |
| + EXPECT_EQ(kExpectedResult, result); |
| +} |
| + |
| +TEST_F(CSVWriterTest, SingleColumn) { |
| + const char kExpectedResult[] = |
| + "foo" EOL_SEQUENCE |
| + "alpha" EOL_SEQUENCE |
| + "beta" EOL_SEQUENCE; |
| + |
| + column_names_.pop_back(); |
| + records_.resize(2); |
| + records_[0]["foo"] = "alpha"; |
| + records_[1]["foo"] = "beta"; |
| + |
| + std::string result; |
| + CSVWriter::Write(column_names_, records_, &result); |
| + EXPECT_EQ(kExpectedResult, result); |
| +} |
| + |
| +TEST_F(CSVWriterTest, HeaderOnly) { |
| + const char kExpectedResult[] = "foo,bar" EOL_SEQUENCE; |
| + |
| + std::string result; |
| + CSVWriter::Write(column_names_, records_, &result); |
| + EXPECT_EQ(kExpectedResult, result); |
| +} |
| + |
| +TEST_F(CSVWriterTest, HeaderAndSimpleRecords) { |
| + const char kExpectedResult[] = |
| + "foo,bar,baz" EOL_SEQUENCE |
| + "alpha,beta,gamma" EOL_SEQUENCE |
| + "delta,epsilon,zeta" EOL_SEQUENCE; |
| + |
| + column_names_.push_back("baz"); |
| + |
| + records_.resize(2); |
| + records_[0]["foo"] = "alpha"; |
| + records_[0]["bar"] = "beta"; |
| + records_[0]["baz"] = "gamma"; |
| + records_[1]["foo"] = "delta"; |
| + records_[1]["bar"] = "epsilon"; |
| + records_[1]["baz"] = "zeta"; |
| + |
| + // We also initialize the output argument here to be non-empty so as to verify |
|
vabr (Chromium)
2014/09/25 14:44:27
I'd suggest making this a separate test.
engedy
2014/11/06 14:55:39
Done.
|
| + // that it gets overwritten. |
| + std::string result = "this text should get erased"; |
| + CSVWriter::Write(column_names_, records_, &result); |
| + EXPECT_EQ(kExpectedResult, result); |
| +} |
| + |
| +TEST_F(CSVWriterTest, ExtraSpacesArePreserved) { |
| + const char kExpectedResult[] = |
| + "foo,bar" EOL_SEQUENCE |
| + " alpha beta , " EOL_SEQUENCE; |
| + |
| + records_.resize(1); |
| + records_[0]["foo"] = " alpha beta "; |
| + records_[0]["bar"] = " "; |
| + |
| + std::string result; |
| + CSVWriter::Write(column_names_, records_, &result); |
| + EXPECT_EQ(kExpectedResult, result); |
| +} |
| + |
| +TEST_F(CSVWriterTest, CharactersOutsideASCIIPrintableArePreservedAsIs) { |
|
vabr (Chromium)
2014/09/25 14:44:27
nit: I am not a native speaker, but "are preserved
engedy
2014/11/06 14:55:39
I have changed it to "Verbatim".
vabr (Chromium)
2014/11/06 16:16:02
Acknowledged.
|
| + const char kExpectedResult[] = |
| + "foo,bar" EOL_SEQUENCE |
| + "\x07\t\x0B\x1F,\u0024\u00A2\u20AC\U00024B62" EOL_SEQUENCE; |
| + |
| + records_.resize(1); |
| + // Characters below 0x20: bell, horizontal tab, vertical tab, unit separator. |
| + records_[0]["foo"] = "\x07\t\x0B\x1F"; |
| + // Unicode code points having 1..4 byte UTF-8 representation: dollar sign, |
| + // cent sign, euro sign, CJK unified ideograph for [ce`i] in Han script. |
|
vabr (Chromium)
2014/09/25 14:44:27
And where is the Unicode Snowman ☃? :)
engedy
2014/11/06 14:55:39
Agreed. € is boring. Replaced it with ☃.
I have a
vabr (Chromium)
2014/11/06 16:16:02
Thanks! :)
|
| + records_[0]["bar"] = "\u0024\u00A2\u20AC\U00024B62"; |
| + |
| + std::string result; |
| + CSVWriter::Write(column_names_, records_, &result); |
| + EXPECT_EQ(kExpectedResult, result); |
| +} |
| + |
| +TEST_F(CSVWriterTest, ValueWithSeparatorsIsEnclosedInDoubleQuotes) { |
| + const char kExpectedResult[] = |
| + "foo,bar" EOL_SEQUENCE |
| + "\"A\rB\",\"B\nC\"" EOL_SEQUENCE |
| + "\"C\r\nD\",\"D\n\"" EOL_SEQUENCE |
| + "\",\",\",,\"" EOL_SEQUENCE; |
| + |
| + records_.resize(3); |
| + records_[0]["foo"] = "A\rB"; |
| + records_[0]["bar"] = "B\nC"; |
| + records_[1]["foo"] = "C\r\nD"; |
| + records_[1]["bar"] = "D\n"; |
| + records_[2]["foo"] = ","; |
| + records_[2]["bar"] = ",,"; |
| + |
| + std::string result; |
| + CSVWriter::Write(column_names_, records_, &result); |
| + EXPECT_EQ(kExpectedResult, result); |
| +} |
| + |
| +TEST_F(CSVWriterTest, DoubleQuotesInValueAreEscaped) { |
| + const char kExpectedResult[] = |
| + "foo,bar" EOL_SEQUENCE |
| + "\"\"\"\",\"A\"\"B\"\"\"\"C\"" EOL_SEQUENCE; |
| + |
| + records_.resize(1); |
| + records_[0]["foo"] = "\""; |
| + records_[0]["bar"] = "A\"B\"\"C"; |
| + |
| + std::string result; |
| + CSVWriter::Write(column_names_, records_, &result); |
| + EXPECT_EQ(kExpectedResult, result); |
| +} |
| + |
| +TEST_F(CSVWriterTest, EmptyFields) { |
| + const char kExpectedResult[] = |
| + "foo,bar" EOL_SEQUENCE |
| + ",alpha" EOL_SEQUENCE |
| + "beta," EOL_SEQUENCE |
| + "," EOL_SEQUENCE; |
| + |
| + records_.resize(3); |
| + records_[0]["foo"] = ""; |
| + records_[0]["bar"] = "alpha"; |
| + records_[1]["foo"] = "beta"; |
| + records_[1]["bar"] = ""; |
| + records_[2]["foo"] = ""; |
| + records_[2]["bar"] = ""; |
| + |
| + std::string result; |
| + CSVWriter::Write(column_names_, records_, &result); |
| + EXPECT_EQ(kExpectedResult, result); |
| +} |
| + |
| +TEST_F(CSVWriterTest, MissingValuesAreTreatedAsEmptyValues) { |
| + const char kExpectedResult[] = |
| + "foo,bar" EOL_SEQUENCE |
| + ",alpha" EOL_SEQUENCE |
| + "beta," EOL_SEQUENCE |
| + "," EOL_SEQUENCE; |
| + |
| + records_.resize(3); |
| + records_[0]["bar"] = "alpha"; |
| + records_[1]["foo"] = "beta"; |
| + |
| + std::string result; |
| + CSVWriter::Write(column_names_, records_, &result); |
| + EXPECT_EQ(kExpectedResult, result); |
| +} |
| + |
| +} // namespace password_manager |
|
vabr (Chromium)
2014/09/25 14:44:27
Please add
#undef EOL_SEQUENCE
It's sort of pointl
engedy
2014/11/06 14:55:39
Hmm, nice catch. Done.
|