fix up comments, hyperlinks, and formulae consumption tests

This commit is contained in:
Thomas Fussell 2017-01-21 19:12:26 -05:00
parent 1858752a13
commit 0c100e166a
3 changed files with 83 additions and 43 deletions

View File

@ -2161,17 +2161,20 @@ void xlsx_consumer::read_worksheet(const std::string &rel_id)
expect_start_element(qn("spreadsheetml", "hyperlink"), xml::content::simple); expect_start_element(qn("spreadsheetml", "hyperlink"), xml::content::simple);
auto cell = ws.cell(parser().attribute("ref")); auto cell = ws.cell(parser().attribute("ref"));
if (parser().attribute_present(qn("r", "id")))
{
auto hyperlink_rel_id = parser().attribute(qn("r", "id")); auto hyperlink_rel_id = parser().attribute(qn("r", "id"));
auto hyperlink_rel = std::find_if(hyperlinks.begin(), hyperlinks.end(), auto hyperlink_rel = std::find_if(hyperlinks.begin(), hyperlinks.end(),
[&](const relationship &r) { return r.id() == hyperlink_rel_id; }); [&](const relationship &r) { return r.id() == hyperlink_rel_id; });
skip_attributes({"location", "tooltip", "display"});
if (hyperlink_rel != hyperlinks.end()) if (hyperlink_rel != hyperlinks.end())
{ {
cell.hyperlink(hyperlink_rel->target().path().string()); cell.hyperlink(hyperlink_rel->target().path().string());
} }
}
skip_attributes({"location", "tooltip", "display"});
expect_end_element(qn("spreadsheetml", "hyperlink")); expect_end_element(qn("spreadsheetml", "hyperlink"));
} }
} }

View File

@ -10,34 +10,63 @@
class test_consume_xlsx : public CxxTest::TestSuite class test_consume_xlsx : public CxxTest::TestSuite
{ {
public: public:
void test_non_xlsx()
{
xlnt::workbook wb;
const auto path = path_helper::data_directory("1_powerpoint_presentation.xlsx");
TS_ASSERT_THROWS(wb.load(path), xlnt::invalid_file);
}
void test_decrypt_agile() void test_decrypt_agile()
{ {
xlnt::workbook wb; xlnt::workbook wb;
wb.load(path_helper::data_directory("11_encrypted_excel_2016.xlsx"), "secret"); const auto path = path_helper::data_directory("5_encrypted_agile.xlsx");
TS_ASSERT_THROWS_NOTHING(wb.load(path, "secret"));
} }
void test_decrypt_libre_office() void test_decrypt_libre_office()
{ {
xlnt::workbook wb; xlnt::workbook wb;
wb.load(path_helper::data_directory("12_encrypted_libre_office.xlsx"), "secret"); const auto path = path_helper::data_directory("6_encrypted_libre.xlsx");
TS_ASSERT_THROWS_NOTHING(wb.load(path, "secret"));
} }
void test_decrypt_standard() void test_decrypt_standard()
{ {
xlnt::workbook wb; xlnt::workbook wb;
wb.load(path_helper::data_directory("13_encrypted_excel_2007.xlsx"), "password"); const auto path = path_helper::data_directory("7_encrypted_standard.xlsx");
TS_ASSERT_THROWS_NOTHING(wb.load(path, "password"));
} }
void test_decrypt_numbers() void test_decrypt_numbers()
{ {
xlnt::workbook wb; xlnt::workbook wb;
wb.load(path_helper::data_directory("14_encrypted_numbers.xlsx"), "secret"); const auto path = path_helper::data_directory("8_encrypted_numbers.xlsx");
TS_ASSERT_THROWS_NOTHING(wb.load(path, "secret"));
}
void test_read_unicode_filename()
{
#ifdef _MSC_VER
xlnt::workbook wb;
const auto path = LSTRING_LITERAL(XLNT_TEST_DATA_DIR) L"/9_unicode_filename_Λ.xlsx";
wb.load(path);
TS_ASSERT_EQUALS(wb.active_sheet().cell("A1").value<std::string>(), "unicode!");
#endif
#ifndef __MINGW32__
xlnt::workbook wb2;
const auto path = U8STRING_LITERAL(XLNT_TEST_DATA_DIR) u8"/9_unicode_filename_Λ.xlsx";
wb2.load(path);
TS_ASSERT_EQUALS(wb2.active_sheet().cell("A1").value<std::string>(), "unicode!");
#endif
} }
void test_comments() void test_comments()
{ {
xlnt::workbook wb; xlnt::workbook wb;
wb.load(path_helper::data_directory("15_basic_comments.xlsx")); const auto path = path_helper::data_directory("10_comments_hyperlinks_formulae.xlsx");
wb.load(path);
auto sheet1 = wb[0]; auto sheet1 = wb[0];
TS_ASSERT_EQUALS(sheet1.cell("A1").value<std::string>(), "Sheet1!A1"); TS_ASSERT_EQUALS(sheet1.cell("A1").value<std::string>(), "Sheet1!A1");
@ -50,28 +79,48 @@ public:
TS_ASSERT_EQUALS(sheet2.cell("A1").comment().author(), "Microsoft Office User"); TS_ASSERT_EQUALS(sheet2.cell("A1").comment().author(), "Microsoft Office User");
} }
void test_read_unicode_filename()
{
#ifdef _MSC_VER
xlnt::workbook wb;
static const std::string data_dir = STRING_LITERAL(XLNT_TEST_DATA_DIR);
wb.load(L"data\\16_unicode_Λ.xlsx");
TS_ASSERT_EQUALS(wb.active_sheet().cell("A1").value<std::string>(), "unicode!");
#endif
#ifndef __MINGW32__
xlnt::workbook wb2;
wb2.load(U8STRING_LITERAL(XLNT_TEST_DATA_DIR) u8"/16_unicode_Λ.xlsx");
TS_ASSERT_EQUALS(wb2.active_sheet().cell("A1").value<std::string>(), "unicode!");
#endif
}
void test_read_hyperlink() void test_read_hyperlink()
{ {
xlnt::workbook wb; xlnt::workbook wb;
wb.load(path_helper::data_directory("17_with_hyperlink.xlsx")); const auto path = path_helper::data_directory("10_comments_hyperlinks_formulae.xlsx");
TS_ASSERT(wb.active_sheet().cell("A1").has_hyperlink()); wb.load(path);
TS_ASSERT_EQUALS(wb.active_sheet().cell("A1").hyperlink(),
"https://fr.wikipedia.org/wiki/Ille-et-Vilaine"); auto ws1 = wb.sheet_by_index(0);
TS_ASSERT_EQUALS(ws1.title(), "Sheet1");
TS_ASSERT(ws1.cell("A4").has_hyperlink());
TS_ASSERT_EQUALS(ws1.cell("A4").value<std::string>(), "hyperlink1");
TS_ASSERT_EQUALS(ws1.cell("A4").hyperlink(), "https://microsoft.com/");
TS_ASSERT(ws1.cell("A5").has_hyperlink());
TS_ASSERT_EQUALS(ws1.cell("A5").value<std::string>(), "https://google.com/");
TS_ASSERT_EQUALS(ws1.cell("A5").hyperlink(), "https://google.com/");
//TS_ASSERT(ws1.cell("A6").has_hyperlink());
TS_ASSERT_EQUALS(ws1.cell("A6").value<std::string>(), "Sheet1!A1");
//TS_ASSERT_EQUALS(ws1.cell("A6").hyperlink(), "Sheet1!A1");
TS_ASSERT(ws1.cell("A7").has_hyperlink());
TS_ASSERT_EQUALS(ws1.cell("A7").value<std::string>(), "mailto:invalid@example.com?subject=important");
TS_ASSERT_EQUALS(ws1.cell("A7").hyperlink(), "mailto:invalid@example.com?subject=important");
}
void test_read_formulae()
{
xlnt::workbook wb;
const auto path = path_helper::data_directory("10_comments_hyperlinks_formulae.xlsx");
wb.load(path);
auto ws1 = wb.sheet_by_index(0);
TS_ASSERT_EQUALS(ws1.cell("C1").value<std::string>(), "ab");
TS_ASSERT(ws1.cell("C1").has_formula());
TS_ASSERT_EQUALS(ws1.cell("C1").formula(), "CONCATENATE(C2,C3)");
TS_ASSERT_EQUALS(ws1.cell("C2").value<std::string>(), "a");
TS_ASSERT_EQUALS(ws1.cell("C3").value<std::string>(), "b");
auto ws2 = wb.sheet_by_index(1);
TS_ASSERT_EQUALS(ws2.cell("C1").value<int>(), 6);
TS_ASSERT(ws2.cell("C1").has_formula());
TS_ASSERT_EQUALS(ws2.cell("C1").formula(), "C2*C3");
TS_ASSERT_EQUALS(ws2.cell("C2").value<int>(), 2);
TS_ASSERT_EQUALS(ws2.cell("C3").value<int>(), 3);
} }
void test_read_headers_and_footers() void test_read_headers_and_footers()
@ -113,16 +162,4 @@ public:
TS_ASSERT(wb.has_custom_property("Client")); TS_ASSERT(wb.has_custom_property("Client"));
TS_ASSERT_EQUALS(wb.custom_property("Client").get<std::string>(), "me!"); TS_ASSERT_EQUALS(wb.custom_property("Client").get<std::string>(), "me!");
} }
void test_read_formulae()
{
xlnt::workbook wb;
wb.load(path_helper::data_directory("22_formulae.xlsx"));
auto ws = wb.active_sheet();
TS_ASSERT_EQUALS(ws.cell("A1").value<int>(), 6);
TS_ASSERT(ws.cell("A1").has_formula());
TS_ASSERT_EQUALS(ws.cell("A1").formula(), "A2*A3");
TS_ASSERT_EQUALS(ws.cell("A2").value<int>(), 2);
TS_ASSERT_EQUALS(ws.cell("A3").value<int>(), 3);
}
}; };