17 std::stringstream target;
21 CHECK(target.str().empty());
24 SUBCASE(
"one element") {
28 CHECK(target.str() ==
"2.5");
31 SUBCASE(
"three elements") {
35 CHECK(target.str() ==
"2.5 -1 8e+12");
43 std::stringstream source;
49 SUBCASE(
"one element") {
53 CHECK(v.coeff(0) == 2.5);
56 SUBCASE(
"three elements") {
58 source.str(
"2.5 -1 8e+12");
60 CHECK(v.coeff(0) == 2.5);
61 CHECK(v.coeff(1) == -1);
62 CHECK(v.coeff(2) == doctest::Approx(8e+12));
76 std::vector<long> expect_ids;
77 std::vector<double> expect_vals;
79 auto run_test = [&](std::string source) {
80 REQUIRE(expect_ids.size() == expect_vals.size());
85 CHECK(expect_ids.at(pos) == i);
86 CHECK(expect_vals.at(pos) == v);
89 }
catch (std::runtime_error &err) {
90 FAIL(
"parsing failed");
92 CHECK(expect_ids.size() == pos);
95 SUBCASE(
"no leading space") {
97 expect_vals = {2.6, 4.4};
98 run_test(
"12:2.6 7:4.4");
101 SUBCASE(
"simple valid features") {
102 expect_ids = {12, 7};
103 expect_vals = {2.6, 4.4};
104 run_test(
" 12:2.6 7:4.4");
107 SUBCASE(
"leading space in front of values") {
108 expect_ids = {12, 7};
109 expect_vals = {2.6, 4.4};
110 run_test(
" 12: 2.6 7: 4.4");
113 SUBCASE(
"tab separation") {
114 expect_ids = {12, 7};
115 expect_vals = {2.6, 4.4};
116 run_test(
"\t12:2.6\t7:4.4");
119 SUBCASE(
"scientific notation") {
120 expect_ids = {12, 7};
121 expect_vals = {2.6e-5, 4.4e4};
122 run_test(
" 12:2.6e-5 7:4.4e4");
125 SUBCASE(
"ends with space") {
126 expect_ids = {12, 7};
127 expect_vals = {2, 4};
128 run_test(
" 12:2 7:4\t ");
152 "Error parsing feature index. Expected ':' at position 2, got ' '");
154 "Error parsing feature index. Expected ':' at position 2, got '\\0'");
156 "Error parsing feature index. Expected ':' at position 7, got '\\0'");
164 std::stringbuf buffer;
165 std::vector<float> data = {4.0, 2.0, 8.0, -2.0};
167 CHECK(buffer.pubseekoff(0, std::ios_base::cur, std::ios_base::out) ==
sizeof(
float) * data.size());
168 buffer.pubseekpos(0);
169 std::vector<float> load(data.size());
171 for(
int i = 0; i <
ssize(data); ++i) {
172 CHECK(data[i] == load[i]);
182 SUBCASE(
"trailing space") {
185 SUBCASE(
"tab separated") {
building blocks for io procedures that are used by multiple io subsystems
TEST_CASE("check write dense vector")
std::ostream & write_vector_as_text(std::ostream &stream, const Eigen::Ref< const DenseRealVector > &data)
Writes the given vector as space-separated human-readable numbers.
std::istream & read_vector_from_text(std::istream &stream, Eigen::Ref< DenseRealVector > data)
Reads the given vector as space-separated human-readable numbers.
void binary_dump(std::streambuf &target, const T *begin, const T *end)
MatrixHeader parse_header(const std::string &content)
void binary_load(std::streambuf &target, T *begin, T *end)
void parse_sparse_vector_from_text(const char *feature_part, F &&callback)
parses sparse features given in index:value text format.
Main namespace in which all types, classes, and functions are defined.
constexpr auto ssize(const C &c) -> std::common_type_t< std::ptrdiff_t, std::make_signed_t< decltype(c.size())>>
signed size free function. Taken from https://en.cppreference.com/w/cpp/iterator/size
types::DenseVector< real_t > DenseRealVector
Any dense, real values vector.