123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506 |
- #include <config.h>
- #include <util/csv_file.h>
- #include <boost/scoped_ptr.hpp>
- #include <gtest/gtest.h>
- #include <fstream>
- #include <sstream>
- #include <string>
- namespace {
- using namespace isc::util;
- TEST(CSVRow, parse) {
- CSVRow row0("foo,bar,foo-bar");
- ASSERT_EQ(3, row0.getValuesCount());
- EXPECT_EQ("foo", row0.readAt(0));
- EXPECT_EQ("bar", row0.readAt(1));
- EXPECT_EQ("foo-bar", row0.readAt(2));
- row0.parse("bar,,foo-bar");
- ASSERT_EQ(3, row0.getValuesCount());
- EXPECT_EQ("bar", row0.readAt(0));
- EXPECT_TRUE(row0.readAt(1).empty());
- EXPECT_EQ("foo-bar", row0.readAt(2));
- CSVRow row1("foo-bar|foo|bar|", '|');
- ASSERT_EQ(4, row1.getValuesCount());
- EXPECT_EQ("foo-bar", row1.readAt(0));
- EXPECT_EQ("foo", row1.readAt(1));
- EXPECT_EQ("bar", row1.readAt(2));
- EXPECT_TRUE(row1.readAt(3).empty());
- row1.parse("");
- ASSERT_EQ(1, row1.getValuesCount());
- EXPECT_TRUE(row1.readAt(0).empty());
- }
- TEST(CSVRow, render) {
- CSVRow row0(3);
- row0.writeAt(0, "foo");
- row0.writeAt(1, "foo-bar");
- row0.writeAt(2, "bar");
- std::string text;
- ASSERT_NO_THROW(text = row0.render());
- EXPECT_EQ(text, "foo,foo-bar,bar");
- CSVRow row1(4, ';');
- row1.writeAt(0, "foo");
- row1.writeAt(2, "bar");
- row1.writeAt(3, 10);
- ASSERT_NO_THROW(text = row1.render());
- EXPECT_EQ(text, "foo;;bar;10");
- CSVRow row2(0);
- ASSERT_NO_THROW(text = row2.render());
- EXPECT_TRUE(text.empty());
- }
- TEST(CSVRow, writeAt) {
- CSVRow row(3);
- row.writeAt(0, 10);
- row.writeAt(1, "foo");
- row.writeAt(2, "bar");
- EXPECT_EQ("10", row.readAt(0));
- EXPECT_EQ("foo", row.readAt(1));
- EXPECT_EQ("bar", row.readAt(2));
- EXPECT_THROW(row.writeAt(3, 20), CSVFileError);
- EXPECT_THROW(row.writeAt(3, "foo"), CSVFileError);
- }
- TEST(CSVRow, append) {
- CSVRow row(3);
- EXPECT_EQ(3, row.getValuesCount());
- row.writeAt(0, "alpha");
- ASSERT_NO_THROW(row.append("delta"));
- EXPECT_EQ(4, row.getValuesCount());
- row.writeAt(1, "beta");
- row.writeAt(2, "gamma");
- ASSERT_NO_THROW(row.append("epsilon"));
- EXPECT_EQ(5, row.getValuesCount());
- std::string text;
- ASSERT_NO_THROW(text = row.render());
- EXPECT_EQ("alpha,beta,gamma,delta,epsilon", text);
- }
- class CSVFileTest : public ::testing::Test {
- public:
-
-
-
-
-
-
-
- CSVFileTest();
-
-
-
- virtual ~CSVFileTest();
-
-
-
-
-
- static std::string absolutePath(const std::string& filename);
-
- bool exists() const;
-
-
-
- std::string readFile() const;
-
- int removeFile() const;
-
-
-
- void writeFile(const std::string& contents) const;
-
- std::string testfile_;
- };
- CSVFileTest::CSVFileTest()
- : testfile_(absolutePath("test.csv")) {
- static_cast<void>(removeFile());
- }
- CSVFileTest::~CSVFileTest() {
- static_cast<void>(removeFile());
- }
- std::string
- CSVFileTest::absolutePath(const std::string& filename) {
- std::ostringstream s;
- s << TEST_DATA_BUILDDIR << "/" << filename;
- return (s.str());
- }
- bool
- CSVFileTest::exists() const {
- std::ifstream fs(testfile_.c_str());
- bool ok = fs.good();
- fs.close();
- return (ok);
- }
- std::string
- CSVFileTest::readFile() const {
- std::ifstream fs(testfile_.c_str());
- if (!fs.is_open()) {
- return ("");
- }
- std::string contents((std::istreambuf_iterator<char>(fs)),
- std::istreambuf_iterator<char>());
- fs.close();
- return (contents);
- }
- int
- CSVFileTest::removeFile() const {
- return (remove(testfile_.c_str()));
- }
- void
- CSVFileTest::writeFile(const std::string& contents) const {
- std::ofstream fs(testfile_.c_str(), std::ofstream::out);
- if (fs.is_open()) {
- fs << contents;
- fs.close();
- }
- }
- TEST_F(CSVFileTest, addColumn) {
- boost::scoped_ptr<CSVFile> csv(new CSVFile(testfile_));
-
- ASSERT_NO_THROW(csv->addColumn("animal"));
- ASSERT_NO_THROW(csv->addColumn("color"));
-
- EXPECT_THROW(csv->addColumn("animal"), CSVFileError);
- EXPECT_THROW(csv->addColumn("color"), CSVFileError);
-
- EXPECT_NO_THROW(csv->addColumn("age"));
- EXPECT_NO_THROW(csv->addColumn("comments"));
-
-
- ASSERT_NO_THROW(csv->recreate());
- ASSERT_TRUE(exists());
-
- ASSERT_THROW(csv->addColumn("zoo"), CSVFileError);
-
- ASSERT_NO_THROW(csv->close());
-
- EXPECT_NO_THROW(csv->addColumn("zoo"));
- }
- TEST_F(CSVFileTest, getFilename) {
- CSVFile csv(testfile_);
- EXPECT_EQ(testfile_, csv.getFilename());
- }
- TEST_F(CSVFileTest, openReadAllWrite) {
-
- writeFile("animal,age,color\n"
- "cat,10,white\n"
- "lion,15,yellow\n");
-
- boost::scoped_ptr<CSVFile> csv(new CSVFile(testfile_));
- ASSERT_NO_THROW(csv->open());
- ASSERT_EQ(3, csv->getColumnCount());
- EXPECT_EQ("animal", csv->getColumnName(0));
- EXPECT_EQ("age", csv->getColumnName(1));
- EXPECT_EQ("color", csv->getColumnName(2));
-
- CSVRow row;
- ASSERT_TRUE(csv->next(row));
- ASSERT_EQ(3, row.getValuesCount());
- EXPECT_EQ("cat", row.readAt(0));
- EXPECT_EQ("10", row.readAt(1));
- EXPECT_EQ("white", row.readAt(2));
-
- ASSERT_TRUE(csv->next(row));
- ASSERT_EQ(3, row.getValuesCount());
- EXPECT_EQ("lion", row.readAt(0));
- EXPECT_EQ("15", row.readAt(1));
- EXPECT_EQ("yellow", row.readAt(2));
-
- ASSERT_TRUE(csv->next(row));
- EXPECT_EQ(CSVFile::EMPTY_ROW(), row);
-
- ASSERT_TRUE(csv->next(row));
- EXPECT_EQ(CSVFile::EMPTY_ROW(), row);
-
- CSVRow row_write(3);
- row_write.writeAt(0, "dog");
- row_write.writeAt(1, 2);
- row_write.writeAt(2, "blue");
- ASSERT_NO_THROW(csv->append(row_write));
-
- ASSERT_NO_THROW(csv->flush());
- csv->close();
-
- EXPECT_EQ("animal,age,color\n"
- "cat,10,white\n"
- "lion,15,yellow\n"
- "dog,2,blue\n",
- readFile());
-
- EXPECT_FALSE(csv->next(row));
- EXPECT_THROW(csv->append(row_write), CSVFileError);
- CSVRow row_write2(3);
- row_write2.writeAt(0, "bird");
- row_write2.writeAt(1, 3);
- row_write2.writeAt(2, "purple");
-
-
- ASSERT_NO_THROW(csv->open(true));
-
-
- ASSERT_TRUE(csv->next(row));
- EXPECT_EQ(CSVFile::EMPTY_ROW(), row);
-
- ASSERT_NO_THROW(csv->append(row_write2));
- ASSERT_NO_THROW(csv->flush());
- csv->close();
-
- EXPECT_EQ("animal,age,color\n"
- "cat,10,white\n"
- "lion,15,yellow\n"
- "dog,2,blue\n"
- "bird,3,purple\n",
- readFile());
- }
- TEST_F(CSVFileTest, openReadPartialWrite) {
-
- writeFile("animal,age,color\n"
- "cat,10,white\n"
- "lion,15,yellow\n");
-
- boost::scoped_ptr<CSVFile> csv(new CSVFile(testfile_));
- ASSERT_NO_THROW(csv->open());
-
- CSVRow row0(0);
- ASSERT_NO_THROW(csv->next(row0));
- ASSERT_EQ(3, row0.getValuesCount());
- EXPECT_EQ("cat", row0.readAt(0));
- EXPECT_EQ("10", row0.readAt(1));
- EXPECT_EQ("white", row0.readAt(2));
-
-
- CSVRow row_write(3);
- row_write.writeAt(0, "dog");
- row_write.writeAt(1, 2);
- row_write.writeAt(2, "blue");
- ASSERT_NO_THROW(csv->append(row_write));
-
-
- CSVRow row1(0);
- ASSERT_NO_THROW(csv->next(row1));
- EXPECT_EQ(CSVFile::EMPTY_ROW(), row1);
-
- ASSERT_NO_THROW(csv->flush());
- csv->close();
-
- EXPECT_EQ("animal,age,color\n"
- "cat,10,white\n"
- "lion,15,yellow\n"
- "dog,2,blue\n",
- readFile());
- }
- TEST_F(CSVFileTest, recreate) {
- boost::scoped_ptr<CSVFile> csv(new CSVFile(testfile_));
- csv->addColumn("animal");
- csv->addColumn("color");
- csv->addColumn("age");
- csv->addColumn("comments");
- ASSERT_NO_THROW(csv->recreate());
- ASSERT_TRUE(exists());
- CSVRow row0(4);
- row0.writeAt(0, "dog");
- row0.writeAt(1, "grey");
- row0.writeAt(2, 3);
- row0.writeAt(3, "nice one");
- ASSERT_NO_THROW(csv->append(row0));
- CSVRow row1(4);
- row1.writeAt(0, "cat");
- row1.writeAt(1, "black");
- row1.writeAt(2, 2);
- ASSERT_NO_THROW(csv->append(row1));
- ASSERT_NO_THROW(csv->flush());
- csv->close();
- EXPECT_EQ("animal,color,age,comments\n"
- "dog,grey,3,nice one\n"
- "cat,black,2,\n",
- readFile());
- }
- TEST_F(CSVFileTest, validate) {
-
-
-
- writeFile("animal,age,color\n"
- "cat,10,white\n"
- "lion,15,yellow,black\n"
- "dog,3,green\n"
- "elephant,11\n");
- boost::scoped_ptr<CSVFile> csv(new CSVFile(testfile_));
- ASSERT_NO_THROW(csv->open());
-
- CSVRow row0;
- ASSERT_TRUE(csv->next(row0));
- EXPECT_EQ("cat", row0.readAt(0));
- EXPECT_EQ("10", row0.readAt(1));
- EXPECT_EQ("white", row0.readAt(2));
- EXPECT_EQ("success", csv->getReadMsg());
-
- CSVRow row1;
- EXPECT_FALSE(csv->next(row1));
- EXPECT_NE("success", csv->getReadMsg());
-
- CSVRow row2;
- ASSERT_TRUE(csv->next(row2));
- EXPECT_EQ("dog", row2.readAt(0));
- EXPECT_EQ("3", row2.readAt(1));
- EXPECT_EQ("green", row2.readAt(2));
- EXPECT_EQ("success", csv->getReadMsg());
-
- CSVRow row3;
- EXPECT_FALSE(csv->next(row3));
- EXPECT_NE("success", csv->getReadMsg());
- }
- TEST_F(CSVFileTest, validateHeader) {
-
- writeFile("animal,age,color\n"
- "cat,10,white\n"
- "lion,15,yellow,black\n");
-
- boost::scoped_ptr<CSVFile> csv(new CSVFile(testfile_));
- csv->addColumn("color");
- csv->addColumn("animal");
- csv->addColumn("age");
- EXPECT_THROW(csv->open(), CSVFileError);
-
- csv.reset(new CSVFile(testfile_));
- csv->addColumn("animal");
- csv->addColumn("age");
- csv->addColumn("color");
- csv->addColumn("notes");
- EXPECT_THROW(csv->open(), CSVFileError);
-
- csv.reset(new CSVFile(testfile_));
- csv->addColumn("animal");
- csv->addColumn("age");
- EXPECT_THROW(csv->open(), CSVFileError);
- }
- TEST_F(CSVFileTest, exists) {
-
- writeFile("animal,age,color\n"
- "cat,10,white\n"
- "lion,15,yellow\n");
- boost::scoped_ptr<CSVFile> csv(new CSVFile(testfile_));
-
-
- EXPECT_TRUE(csv->exists());
-
- ASSERT_NO_THROW(csv->open());
- EXPECT_TRUE(csv->exists());
-
- csv->close();
- EXPECT_EQ(0, removeFile());
-
- EXPECT_FALSE(csv->exists());
- }
- }
|