/***************************************************************************
* Copyright (c) Johan Mabille, Sylvain Corlay and Wolf Vollprecht *
* Copyright (c) QuantStack *
* *
* Distributed under the terms of the BSD 3-Clause License. *
* *
* The full license is in the file LICENSE, distributed with this software. *
****************************************************************************/
#include
#include "xtensor/io/xcsv.hpp"
#include "xtensor/io/xio.hpp"
#include "test_common_macros.hpp"
namespace xt
{
TEST(xcsv, load_1D)
{
const std::string source = "1, 2, 3, 4";
std::stringstream source_stream(source);
const xtensor res = load_csv(source_stream);
const xtensor exp{{1, 2, 3, 4}};
ASSERT_TRUE(all(equal(res, exp)));
}
TEST(xcsv, load_double)
{
std::string source = "1.0, 2.0, 3.0, 4.0\n"
"10.0, 12.0, 15.0, 18.0";
std::stringstream source_stream(source);
xtensor res = load_csv(source_stream);
xtensor exp{{1.0, 2.0, 3.0, 4.0}, {10.0, 12.0, 15.0, 18.0}};
ASSERT_TRUE(all(equal(res, exp)));
}
TEST(xcsv, load_binary_matrix)
{
const std::string source = "1,0,1\n"
"0,1,1";
std::stringstream source_stream(source);
const xtensor res = load_csv(source_stream);
const xtensor exp{{1, 0, 1}, {0, 1, 1}};
ASSERT_TRUE(all(equal(res, exp)));
}
TEST(xcsv, load_double_with_options)
{
std::string source = "A B C D\n"
"#0.0 1.0 1.1 1.2\n"
"1.0 2.0 3.0 4.0\n"
"10.0 12.0 15.0 18.0\n"
"9.0, 8.0, 7.0, 6.";
std::stringstream source_stream(source);
auto res = load_csv(source_stream, ' ', 1, 2, "#");
xtensor exp{{1.0, 2.0, 3.0, 4.0}, {10.0, 12.0, 15.0, 18.0}};
ASSERT_TRUE(all(equal(res, exp)));
}
TEST(xcsv, load_string_trims_cells)
{
const std::string source = " alpha , beta,gamma \n delta, epsilon , zeta ";
std::stringstream source_stream(source);
const xtensor res = load_csv(source_stream);
ASSERT_EQ(res.shape()[0], std::size_t(2));
ASSERT_EQ(res.shape()[1], std::size_t(3));
ASSERT_EQ(res(0, 0), "alpha");
ASSERT_EQ(res(0, 1), "beta");
ASSERT_EQ(res(0, 2), "gamma");
ASSERT_EQ(res(1, 0), "delta");
ASSERT_EQ(res(1, 1), "epsilon");
ASSERT_EQ(res(1, 2), "zeta");
}
TEST(xcsv, load_file_uses_config)
{
const std::string source = "metadata\n"
"//ignore this row\n"
"1;2;3\n"
"4;5;6\n"
"7;8;9";
std::stringstream source_stream(source);
xcsv_config config;
config.delimiter = ';';
config.skip_rows = 1;
config.max_rows = 2;
config.comments = "//";
xtensor res = {{0, 0, 0}};
load_file(source_stream, res, config);
const xtensor exp{{1, 2, 3}, {4, 5, 6}};
ASSERT_TRUE(all(equal(res, exp)));
}
TEST(xcsv, load_inconsistent_rows_throws)
{
const std::string source = "1,2,3\n4,5";
std::stringstream source_stream(source);
XT_EXPECT_THROW(load_csv(source_stream), std::runtime_error);
}
TEST(xcsv, dump_1D)
{
xtensor data{{1.0, 2.0, 3.0, 4.0}};
std::stringstream res;
dump_csv(res, data);
ASSERT_EQ("1,2,3,4\n", res.str());
}
TEST(xcsv, dump_double)
{
xtensor data{{1.0, 2.0, 3.0, 4.0}, {10.0, 12.0, 15.0, 18.0}};
std::stringstream res;
dump_csv(res, data);
ASSERT_EQ("1,2,3,4\n10,12,15,18\n", res.str());
}
TEST(xcsv, dump_file_matches_dump_csv)
{
xtensor data{{1, 2}, {3, 4}};
std::stringstream res;
xcsv_config config;
dump_file(res, data, config);
ASSERT_EQ("1,2\n3,4\n", res.str());
}
TEST(xcsv, dump_higher_dimension_throws)
{
xtensor data{{{1.0, 2.0}, {3.0, 4.0}}};
std::stringstream res;
XT_EXPECT_THROW(dump_csv(res, data), std::runtime_error);
}
TEST(xcsv, dump_with_config)
{
xtensor data{{1.0, 2.0, 3.0, 4.0}, {10.0, 12.0, 15.0, 18.0}};
std::stringstream res;
xcsv_config config;
config.delimiter = ' ';
dump_csv(res, data, config);
ASSERT_EQ("1 2 3 4\n10 12 15 18\n", res.str());
}
TEST(xcsv, dump_file_with_config)
{
xtensor data{{1.0, 2.0, 3.0, 4.0}, {10.0, 12.0, 15.0, 18.0}};
std::stringstream res;
xcsv_config config;
config.delimiter = ';';
dump_file(res, data, config);
ASSERT_EQ("1;2;3;4\n10;12;15;18\n", res.str());
}
}