// // Created by Troldal on 2019-01-12. // #include #include #include using namespace OpenXLSX; /** * @brief The purpose of this test case is to test the creation of XLDocument objects. Each section section * tests document creation using a different method. In addition, saving, closing and copying is tested. */ TEST_CASE("XLCellValue Tests", "[XLCellValue]") { SECTION("Default Constructor") { XLCellValue value; REQUIRE(value.type() == XLValueType::Empty); REQUIRE(value.typeAsString() == "empty"); REQUIRE(value.get().empty()); REQUIRE_THROWS(value.get()); REQUIRE_THROWS(value.get()); REQUIRE_THROWS(value.get()); } SECTION("Float Constructor") { XLCellValue value(3.14159); REQUIRE(value.type() == XLValueType::Float); REQUIRE(value.typeAsString() == "float"); REQUIRE_THROWS(value.get()); REQUIRE_THROWS(value.get()); REQUIRE(value.get() == 3.14159); REQUIRE_THROWS(value.get()); } SECTION("Integer Constructor") { XLCellValue value(42); REQUIRE(value.type() == XLValueType::Integer); REQUIRE(value.typeAsString() == "integer"); REQUIRE_THROWS(value.get()); REQUIRE(value.get() == 42); REQUIRE_THROWS(value.get()); REQUIRE_THROWS(value.get()); } SECTION("Boolean Constructor") { XLCellValue value(true); REQUIRE(value.type() == XLValueType::Boolean); REQUIRE(value.typeAsString() == "boolean"); REQUIRE_THROWS(value.get()); REQUIRE_THROWS(value.get()); REQUIRE_THROWS(value.get()); REQUIRE(value.get() == true); } SECTION("String Constructor") { XLCellValue value("Hello OpenXLSX!"); REQUIRE(value.type() == XLValueType::String); REQUIRE(value.typeAsString() == "string"); REQUIRE(value.get() == "Hello OpenXLSX!"); REQUIRE_THROWS(value.get()); REQUIRE_THROWS(value.get()); REQUIRE_THROWS(value.get()); } SECTION("Copy Constructor") { XLCellValue value("Hello OpenXLSX!"); auto copy = value; REQUIRE(copy.type() == XLValueType::String); REQUIRE(value.typeAsString() == "string"); REQUIRE(copy.get() == "Hello OpenXLSX!"); REQUIRE_THROWS(copy.get()); REQUIRE_THROWS(copy.get()); REQUIRE_THROWS(copy.get()); } SECTION("Move Constructor") { XLCellValue value("Hello OpenXLSX!"); auto copy = std::move(value); REQUIRE(copy.type() == XLValueType::String); REQUIRE(value.typeAsString() == "string"); REQUIRE(copy.get() == "Hello OpenXLSX!"); REQUIRE_THROWS(copy.get()); REQUIRE_THROWS(copy.get()); REQUIRE_THROWS(copy.get()); } SECTION("Copy Assignment") { XLCellValue value("Hello OpenXLSX!"); XLCellValue copy(1); copy = value; REQUIRE(copy.type() == XLValueType::String); REQUIRE(value.typeAsString() == "string"); REQUIRE(copy.get() == "Hello OpenXLSX!"); REQUIRE_THROWS(copy.get()); REQUIRE_THROWS(copy.get()); REQUIRE_THROWS(copy.get()); } SECTION("Move Assignment") { XLCellValue value("Hello OpenXLSX!"); XLCellValue copy(1); copy = std::move(value); REQUIRE(copy.type() == XLValueType::String); REQUIRE(value.typeAsString() == "string"); REQUIRE(copy.get() == "Hello OpenXLSX!"); REQUIRE_THROWS(copy.get()); REQUIRE_THROWS(copy.get()); REQUIRE_THROWS(copy.get()); } SECTION("Float Assignment") { XLCellValue value; value = 3.14159; REQUIRE(value.type() == XLValueType::Float); REQUIRE(value.typeAsString() == "float"); REQUIRE_THROWS(value.get()); REQUIRE_THROWS(value.get()); REQUIRE(value.get() == 3.14159); REQUIRE_THROWS(value.get()); } SECTION("Integer Assignment") { XLCellValue value; value = 42; REQUIRE(value.type() == XLValueType::Integer); REQUIRE(value.typeAsString() == "integer"); REQUIRE_THROWS(value.get()); REQUIRE(value.get() == 42); REQUIRE_THROWS(value.get()); REQUIRE_THROWS(value.get()); } SECTION("Boolean Assignment") { XLCellValue value; value = true; REQUIRE(value.type() == XLValueType::Boolean); REQUIRE(value.typeAsString() == "boolean"); REQUIRE_THROWS(value.get()); REQUIRE_THROWS(value.get()); REQUIRE_THROWS(value.get()); REQUIRE(value.get() == true); } SECTION("String Assignment") { XLCellValue value; value = "Hello OpenXLSX!"; REQUIRE(value.type() == XLValueType::String); REQUIRE(value.typeAsString() == "string"); REQUIRE(value.get() == "Hello OpenXLSX!"); REQUIRE_THROWS(value.get()); REQUIRE_THROWS(value.get()); REQUIRE_THROWS(value.get()); } SECTION("XLCellValueProxy Assignment") { XLCellValue value; XLDocument doc; doc.create("./testXLCellValue.xlsx"); XLWorksheet wks = doc.workbook().sheet(1); wks.cell("A1").value() = "Hello OpenXLSX!"; value = wks.cell("A1").value(); REQUIRE(value.type() == XLValueType::String); REQUIRE(value.typeAsString() == "string"); REQUIRE(value.get() == "Hello OpenXLSX!"); REQUIRE_THROWS(value.get()); REQUIRE_THROWS(value.get()); REQUIRE_THROWS(value.get()); wks.cell("A1").value() = 3.14159; value = wks.cell("A1").value(); REQUIRE(value.type() == XLValueType::Float); REQUIRE(value.typeAsString() == "float"); REQUIRE_THROWS(value.get()); REQUIRE_THROWS(value.get()); REQUIRE(value.get() == 3.14159); REQUIRE_THROWS(value.get()); wks.cell("A1").value() = 42; value = wks.cell("A1").value(); REQUIRE(value.type() == XLValueType::Integer); REQUIRE(value.typeAsString() == "integer"); REQUIRE_THROWS(value.get()); REQUIRE(value.get() == 42); REQUIRE_THROWS(value.get()); REQUIRE_THROWS(value.get()); wks.cell("A1").value() = true; value = wks.cell("A1").value(); REQUIRE(value.type() == XLValueType::Boolean); REQUIRE(value.typeAsString() == "boolean"); REQUIRE_THROWS(value.get()); REQUIRE_THROWS(value.get()); REQUIRE_THROWS(value.get()); REQUIRE(value.get() == true); } SECTION("Set Float ") { XLCellValue value; value.set(3.14159); REQUIRE(value.type() == XLValueType::Float); REQUIRE(value.typeAsString() == "float"); REQUIRE_THROWS(value.get()); REQUIRE_THROWS(value.get()); REQUIRE(value.get() == 3.14159); REQUIRE_THROWS(value.get()); } SECTION("Set Nan Float") { XLCellValue value; value.set(std::numeric_limits::quiet_NaN()); REQUIRE(value.type() == XLValueType::Error); REQUIRE(value.typeAsString() == "error"); REQUIRE(value.get() == "#NUM!"); REQUIRE_THROWS(value.get()); // REQUIRE_THROWS(value.get()); REQUIRE_THROWS(value.get()); } SECTION("Set Inf Float") { XLCellValue value; value.set(std::numeric_limits::infinity()); REQUIRE(value.type() == XLValueType::Error); REQUIRE(value.typeAsString() == "error"); REQUIRE(value.get() == "#NUM!"); REQUIRE_THROWS(value.get()); // REQUIRE_THROWS(value.get()); REQUIRE_THROWS(value.get()); } SECTION("Set Integer") { XLCellValue value; value.set(42); REQUIRE(value.type() == XLValueType::Integer); REQUIRE(value.typeAsString() == "integer"); REQUIRE_THROWS(value.get()); REQUIRE(value.get() == 42); REQUIRE_THROWS(value.get()); REQUIRE_THROWS(value.get()); } SECTION("Set Boolean") { XLCellValue value; value.set(true); REQUIRE(value.type() == XLValueType::Boolean); REQUIRE(value.typeAsString() == "boolean"); REQUIRE_THROWS(value.get()); REQUIRE_THROWS(value.get()); REQUIRE_THROWS(value.get()); REQUIRE(value.get() == true); } SECTION("Set String") { XLCellValue value; value.set("Hello OpenXLSX!"); REQUIRE(value.type() == XLValueType::String); REQUIRE(value.typeAsString() == "string"); REQUIRE(value.get() == "Hello OpenXLSX!"); REQUIRE_THROWS(value.get()); REQUIRE_THROWS(value.get()); REQUIRE_THROWS(value.get()); } SECTION("Clear") { XLCellValue value; value.set("Hello OpenXLSX!"); value.clear(); REQUIRE(value.type() == XLValueType::Empty); REQUIRE(value.typeAsString() == "empty"); REQUIRE(value.get().empty()); REQUIRE_THROWS(value.get()); REQUIRE_THROWS(value.get()); REQUIRE_THROWS(value.get()); } SECTION("Set Error") { XLCellValue value; value.set("Hello OpenXLSX!"); value.setError("#N/A"); REQUIRE(value.type() == XLValueType::Error); REQUIRE(value.typeAsString() == "error"); REQUIRE(value.get() == "#N/A"); REQUIRE_THROWS(value.get()); // REQUIRE_THROWS(value.get()); REQUIRE_THROWS(value.get()); } SECTION("Implicit conversion to supported types") { XLCellValue value; value ="Hello OpenXLSX!"; auto result1 = value.get(); REQUIRE(result1 == "Hello OpenXLSX!"); REQUIRE_THROWS(static_cast(value)); REQUIRE_THROWS(static_cast(value)); REQUIRE_THROWS(static_cast(value)); value = 42; auto result2 = static_cast(value); REQUIRE(result2 == 42); REQUIRE_THROWS(value.get()); REQUIRE_THROWS(static_cast(value)); REQUIRE_THROWS(static_cast(value)); value = 3.14159; auto result3 = static_cast(value); REQUIRE(result3 == 3.14159); REQUIRE_THROWS(static_cast(value)); REQUIRE_THROWS(value.get()); REQUIRE_THROWS(static_cast(value)); value = true; auto result4 = static_cast(value); REQUIRE(result4 == true); REQUIRE_THROWS(static_cast(value)); REQUIRE_THROWS(static_cast(value)); REQUIRE_THROWS(value.get()); } }