You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

1360 lines
45 KiB

#include "happly.h"
#include <iostream>
#include <string>
#include <chrono>
#include <random>
#include "gtest/gtest.h"
using std::cout;
using std::endl;
// === Test helpers
void DoubleArrayVecEq(std::vector<std::array<double, 3>>& arr1, std::vector<std::array<double, 3>>& arr2) {
EXPECT_EQ(arr1.size(), arr2.size());
for (size_t i = 0; i < arr1.size(); i++) {
for (int j = 0; j < 3; j++) {
EXPECT_DOUBLE_EQ(arr1[i][j], arr2[i][j]);
}
}
}
// void VecEq(std::vector<double>& arr1, std::vector<double>& arr2) {
// EXPECT_EQ(arr1.size(), arr2.size());
// for (size_t i = 0; i < arr1.size(); i++) {
// EXPECT_DOUBLE_EQ(arr1[i], arr2[i]);
//}
//}
// == Test typed reading/writing
// = char
TEST(TypedReadWriteTest, ReadWriteCharASCII) {
// Create a simple file
happly::PLYData plyOut;
plyOut.addElement("test_elem", 5);
std::vector<char> testData{-3, 4, 11, -12, 122};
plyOut.getElement("test_elem").addProperty<char>("test_data", testData);
// ASCII read/write
plyOut.write("temp.ply", happly::DataFormat::ASCII);
happly::PLYData plyIn("temp.ply");
std::vector<char> testDataASCII = plyIn.getElement("test_elem").getProperty<char>("test_data");
EXPECT_EQ(testData, testDataASCII);
}
TEST(TypedReadWriteTest, ReadWriteCharBinary) {
// Create a simple file
happly::PLYData plyOut;
plyOut.addElement("test_elem", 5);
std::vector<char> testData{-3, 4, 11, -12, 122};
plyOut.getElement("test_elem").addProperty<char>("test_data", testData);
// Binary read/write
plyOut.write("temp.ply", happly::DataFormat::Binary);
happly::PLYData plyInB("temp.ply");
std::vector<char> testDataBinary = plyInB.getElement("test_elem").getProperty<char>("test_data");
EXPECT_EQ(testData, testDataBinary);
}
TEST(TypedReadWriteTest, ReadWriteCharBinarySwap) {
// Create a simple file
happly::PLYData plyOut;
plyOut.addElement("test_elem", 5);
std::vector<char> testData{-3, 4, 11, -12, 122};
plyOut.getElement("test_elem").addProperty<char>("test_data", testData);
// Binary read/write
plyOut.write("temp.ply", happly::DataFormat::BinaryBigEndian);
happly::PLYData plyInB("temp.ply");
std::vector<char> testDataBinary = plyInB.getElement("test_elem").getProperty<char>("test_data");
EXPECT_EQ(testData, testDataBinary);
}
// = unsigned char
TEST(TypedReadWriteTest, ReadWriteUCharASCII) {
// Create a simple file
happly::PLYData plyOut;
plyOut.addElement("test_elem", 5);
std::vector<unsigned char> testData{3, 0, 11, 255, 122};
plyOut.getElement("test_elem").addProperty<unsigned char>("test_data", testData);
// ASCII read/write
plyOut.write("temp.ply", happly::DataFormat::ASCII);
happly::PLYData plyIn("temp.ply");
std::vector<unsigned char> testDataASCII = plyIn.getElement("test_elem").getProperty<unsigned char>("test_data");
EXPECT_EQ(testData, testDataASCII);
}
TEST(TypedReadWriteTest, ReadWriteUCharBinary) {
// Create a simple file
happly::PLYData plyOut;
plyOut.addElement("test_elem", 5);
std::vector<unsigned char> testData{3, 0, 11, 255, 122};
plyOut.getElement("test_elem").addProperty<unsigned char>("test_data", testData);
// Binary read/write
plyOut.write("temp.ply", happly::DataFormat::Binary);
happly::PLYData plyInB("temp.ply");
std::vector<unsigned char> testDataBinary = plyInB.getElement("test_elem").getProperty<unsigned char>("test_data");
EXPECT_EQ(testData, testDataBinary);
}
TEST(TypedReadWriteTest, ReadWriteUCharBinarySwap) {
// Create a simple file
happly::PLYData plyOut;
plyOut.addElement("test_elem", 5);
std::vector<unsigned char> testData{3, 0, 11, 255, 122};
plyOut.getElement("test_elem").addProperty<unsigned char>("test_data", testData);
// Binary read/write
plyOut.write("temp.ply", happly::DataFormat::BinaryBigEndian);
happly::PLYData plyInB("temp.ply");
std::vector<unsigned char> testDataBinary = plyInB.getElement("test_elem").getProperty<unsigned char>("test_data");
EXPECT_EQ(testData, testDataBinary);
}
// = short
TEST(TypedReadWriteTest, ReadWriteShortASCII) {
// Create a simple file
happly::PLYData plyOut;
plyOut.addElement("test_elem", 5);
std::vector<short> testData{-3, 4, 32767, -32768, 122};
plyOut.getElement("test_elem").addProperty<short>("test_data", testData);
// ASCII read/write
plyOut.write("temp.ply", happly::DataFormat::ASCII);
happly::PLYData plyIn("temp.ply");
std::vector<short> testDataASCII = plyIn.getElement("test_elem").getProperty<short>("test_data");
EXPECT_EQ(testData, testDataASCII);
}
TEST(TypedReadWriteTest, ReadWriteShortBinary) {
// Create a simple file
happly::PLYData plyOut;
plyOut.addElement("test_elem", 5);
std::vector<short> testData{-3, 4, 32767, -32768, 122};
plyOut.getElement("test_elem").addProperty<short>("test_data", testData);
// Binary read/write
plyOut.write("temp.ply", happly::DataFormat::Binary);
happly::PLYData plyInB("temp.ply");
std::vector<short> testDataBinary = plyInB.getElement("test_elem").getProperty<short>("test_data");
EXPECT_EQ(testData, testDataBinary);
}
TEST(TypedReadWriteTest, ReadWriteShortBinarySwap) {
// Create a simple file
happly::PLYData plyOut;
plyOut.addElement("test_elem", 5);
std::vector<short> testData{-3, 4, 32767, -32768, 122};
plyOut.getElement("test_elem").addProperty<short>("test_data", testData);
// Binary read/write
plyOut.write("temp.ply", happly::DataFormat::BinaryBigEndian);
happly::PLYData plyInB("temp.ply");
std::vector<short> testDataBinary = plyInB.getElement("test_elem").getProperty<short>("test_data");
EXPECT_EQ(testData, testDataBinary);
}
// = unsigned short
TEST(TypedReadWriteTest, ReadWriteUShortASCII) {
// Create a simple file
happly::PLYData plyOut;
plyOut.addElement("test_elem", 5);
std::vector<unsigned short> testData{3, 0, 11, 65535, 122};
plyOut.getElement("test_elem").addProperty<unsigned short>("test_data", testData);
// ASCII read/write
plyOut.write("temp.ply", happly::DataFormat::ASCII);
happly::PLYData plyIn("temp.ply");
std::vector<unsigned short> testDataASCII = plyIn.getElement("test_elem").getProperty<unsigned short>("test_data");
EXPECT_EQ(testData, testDataASCII);
}
TEST(TypedReadWriteTest, ReadWriteUShortBinary) {
// Create a simple file
happly::PLYData plyOut;
plyOut.addElement("test_elem", 5);
std::vector<unsigned short> testData{3, 0, 11, 65535, 122};
plyOut.getElement("test_elem").addProperty<unsigned short>("test_data", testData);
// Binary read/write
plyOut.write("temp.ply", happly::DataFormat::Binary);
happly::PLYData plyInB("temp.ply");
std::vector<unsigned short> testDataBinary = plyInB.getElement("test_elem").getProperty<unsigned short>("test_data");
EXPECT_EQ(testData, testDataBinary);
}
TEST(TypedReadWriteTest, ReadWriteUShortBinarySwap) {
// Create a simple file
happly::PLYData plyOut;
plyOut.addElement("test_elem", 5);
std::vector<unsigned short> testData{3, 0, 11, 65535, 122};
plyOut.getElement("test_elem").addProperty<unsigned short>("test_data", testData);
// Binary read/write
plyOut.write("temp.ply", happly::DataFormat::BinaryBigEndian);
happly::PLYData plyInB("temp.ply");
std::vector<unsigned short> testDataBinary = plyInB.getElement("test_elem").getProperty<unsigned short>("test_data");
EXPECT_EQ(testData, testDataBinary);
}
// = int
TEST(TypedReadWriteTest, ReadWriteIntASCII) {
// Create a simple file
happly::PLYData plyOut;
plyOut.addElement("test_elem", 5);
std::vector<int> testData{-3, 0, 2147483647, -2147483647 - 1, 122};
plyOut.getElement("test_elem").addProperty<int>("test_data", testData);
// ASCII read/write
plyOut.write("temp.ply", happly::DataFormat::ASCII);
happly::PLYData plyIn("temp.ply");
std::vector<int> testDataASCII = plyIn.getElement("test_elem").getProperty<int>("test_data");
EXPECT_EQ(testData, testDataASCII);
}
TEST(TypedReadWriteTest, ReadWriteIntBinary) {
// Create a simple file
happly::PLYData plyOut;
plyOut.addElement("test_elem", 5);
std::vector<int> testData{-3, 0, 2147483647, -2147483647 - 1, 122};
plyOut.getElement("test_elem").addProperty<int>("test_data", testData);
// Binary read/write
plyOut.write("temp.ply", happly::DataFormat::Binary);
happly::PLYData plyInB("temp.ply");
std::vector<int> testDataBinary = plyInB.getElement("test_elem").getProperty<int>("test_data");
EXPECT_EQ(testData, testDataBinary);
}
TEST(TypedReadWriteTest, ReadWriteIntBinarySwap) {
// Create a simple file
happly::PLYData plyOut;
plyOut.addElement("test_elem", 5);
std::vector<int> testData{-3, 0, 2147483647, -2147483647 - 1, 122};
plyOut.getElement("test_elem").addProperty<int>("test_data", testData);
// Binary read/write
plyOut.write("temp.ply", happly::DataFormat::BinaryBigEndian);
happly::PLYData plyInB("temp.ply");
std::vector<int> testDataBinary = plyInB.getElement("test_elem").getProperty<int>("test_data");
EXPECT_EQ(testData, testDataBinary);
}
// = unsigned int
TEST(TypedReadWriteTest, ReadWriteUIntASCII) {
// Create a simple file
happly::PLYData plyOut;
plyOut.addElement("test_elem", 5);
std::vector<unsigned int> testData{3, 0, 4294967295, 15, 122};
plyOut.getElement("test_elem").addProperty<unsigned int>("test_data", testData);
// ASCII read/write
plyOut.write("temp.ply", happly::DataFormat::ASCII);
happly::PLYData plyIn("temp.ply");
std::vector<unsigned int> testDataASCII = plyIn.getElement("test_elem").getProperty<unsigned int>("test_data");
EXPECT_EQ(testData, testDataASCII);
}
TEST(TypedReadWriteTest, ReadWriteUIntBinary) {
// Create a simple file
happly::PLYData plyOut;
plyOut.addElement("test_elem", 5);
std::vector<unsigned int> testData{3, 0, 4294967295, 15, 122};
plyOut.getElement("test_elem").addProperty<unsigned int>("test_data", testData);
// Binary read/write
plyOut.write("temp.ply", happly::DataFormat::Binary);
happly::PLYData plyInB("temp.ply");
std::vector<unsigned int> testDataBinary = plyInB.getElement("test_elem").getProperty<unsigned int>("test_data");
EXPECT_EQ(testData, testDataBinary);
}
TEST(TypedReadWriteTest, ReadWriteUIntBinarySwap) {
// Create a simple file
happly::PLYData plyOut;
plyOut.addElement("test_elem", 5);
std::vector<unsigned int> testData{3, 0, 4294967295, 15, 122};
plyOut.getElement("test_elem").addProperty<unsigned int>("test_data", testData);
// Binary read/write
plyOut.write("temp.ply", happly::DataFormat::BinaryBigEndian);
happly::PLYData plyInB("temp.ply");
std::vector<unsigned int> testDataBinary = plyInB.getElement("test_elem").getProperty<unsigned int>("test_data");
EXPECT_EQ(testData, testDataBinary);
}
// = float
TEST(TypedReadWriteTest, ReadWriteFloatASCII) {
// Create a simple file
happly::PLYData plyOut;
std::vector<float> testData{
3.141592653589793238f,
-3.141592653589793238f,
std::numeric_limits<float>::min(),
std::numeric_limits<float>::max(),
std::numeric_limits<float>::lowest(),
std::numeric_limits<float>::epsilon(),
// std::numeric_limits<float>::infinity(), // these DO NOT work right now, due to how ostream works
//-std::numeric_limits<float>::infinity(),
0.0f,
-0.0f,
1e24f,
};
plyOut.addElement("test_elem", testData.size());
plyOut.getElement("test_elem").addProperty<float>("test_data", testData);
// ASCII read/write
plyOut.write("temp.ply", happly::DataFormat::ASCII);
happly::PLYData plyIn("temp.ply");
std::vector<float> testDataASCII = plyIn.getElement("test_elem").getProperty<float>("test_data");
EXPECT_EQ(testData, testDataASCII);
}
TEST(TypedReadWriteTest, ReadWriteFloatBinary) {
// Create a simple file
happly::PLYData plyOut;
std::vector<float> testData{
3.141592653589793238f,
-3.141592653589793238f,
std::numeric_limits<float>::min(),
std::numeric_limits<float>::max(),
std::numeric_limits<float>::lowest(),
std::numeric_limits<float>::epsilon(),
std::numeric_limits<float>::infinity(),
-std::numeric_limits<float>::infinity(),
0.0f,
-0.0f,
1e24f,
};
plyOut.addElement("test_elem", testData.size());
plyOut.getElement("test_elem").addProperty<float>("test_data", testData);
// ASCII read/write
plyOut.write("temp.ply", happly::DataFormat::Binary);
happly::PLYData plyIn("temp.ply");
std::vector<float> testDataBinary = plyIn.getElement("test_elem").getProperty<float>("test_data");
EXPECT_EQ(testData, testDataBinary);
}
TEST(TypedReadWriteTest, ReadWriteFloatBinarySwap) {
// Create a simple file
happly::PLYData plyOut;
std::vector<float> testData{
3.141592653589793238f,
-3.141592653589793238f,
std::numeric_limits<float>::min(),
std::numeric_limits<float>::max(),
std::numeric_limits<float>::lowest(),
std::numeric_limits<float>::epsilon(),
std::numeric_limits<float>::infinity(),
-std::numeric_limits<float>::infinity(),
0.0f,
-0.0f,
1e24f,
};
plyOut.addElement("test_elem", testData.size());
plyOut.getElement("test_elem").addProperty<float>("test_data", testData);
// ASCII read/write
plyOut.write("temp.ply", happly::DataFormat::BinaryBigEndian);
happly::PLYData plyIn("temp.ply");
std::vector<float> testDataBinary = plyIn.getElement("test_elem").getProperty<float>("test_data");
EXPECT_EQ(testData, testDataBinary);
}
// = double
TEST(TypedReadWriteTest, ReadWriteDoubleASCII) {
// Create a simple file
happly::PLYData plyOut;
std::vector<double> testData{
3.141592653589793238,
-3.141592653589793238,
std::numeric_limits<double>::min(),
std::numeric_limits<double>::max(),
std::numeric_limits<double>::lowest(),
std::numeric_limits<double>::epsilon(),
// std::numeric_limits<double>::infinity(), // these DO NOT work right now, due to how ostream works
//-std::numeric_limits<double>::infinity(),
0.0,
-0.0,
1e24,
};
plyOut.addElement("test_elem", testData.size());
plyOut.getElement("test_elem").addProperty<double>("test_data", testData);
// ASCII read/write
plyOut.write("temp.ply", happly::DataFormat::ASCII);
happly::PLYData plyIn("temp.ply");
std::vector<double> testDataASCII = plyIn.getElement("test_elem").getProperty<double>("test_data");
EXPECT_EQ(testData, testDataASCII);
}
TEST(TypedReadWriteTest, ReadWriteDoubleBinary) {
// Create a simple file
happly::PLYData plyOut;
std::vector<double> testData{
3.141592653589793238,
-3.141592653589793238,
std::numeric_limits<double>::min(),
std::numeric_limits<double>::max(),
std::numeric_limits<double>::lowest(),
std::numeric_limits<double>::epsilon(),
std::numeric_limits<double>::infinity(),
-std::numeric_limits<double>::infinity(),
0.0,
-0.0,
1e24,
};
plyOut.addElement("test_elem", testData.size());
plyOut.getElement("test_elem").addProperty<double>("test_data", testData);
// ASCII read/write
plyOut.write("temp.ply", happly::DataFormat::Binary);
happly::PLYData plyIn("temp.ply");
std::vector<double> testDataBinary = plyIn.getElement("test_elem").getProperty<double>("test_data");
EXPECT_EQ(testData, testDataBinary);
}
TEST(TypedReadWriteTest, ReadWriteDoubleBinarySwap) {
// Create a simple file
happly::PLYData plyOut;
std::vector<double> testData{
3.141592653589793238,
-3.141592653589793238,
std::numeric_limits<double>::min(),
std::numeric_limits<double>::max(),
std::numeric_limits<double>::lowest(),
std::numeric_limits<double>::epsilon(),
std::numeric_limits<double>::infinity(),
-std::numeric_limits<double>::infinity(),
0.0,
-0.0,
1e24,
};
plyOut.addElement("test_elem", testData.size());
plyOut.getElement("test_elem").addProperty<double>("test_data", testData);
// ASCII read/write
plyOut.write("temp.ply", happly::DataFormat::BinaryBigEndian);
happly::PLYData plyIn("temp.ply");
std::vector<double> testDataBinary = plyIn.getElement("test_elem").getProperty<double>("test_data");
EXPECT_EQ(testData, testDataBinary);
}
// = signed char list
TEST(TypedListReadWriteTest, ReadWriteCharASCII) {
// Create a simple file
happly::PLYData plyOut;
plyOut.addElement("test_elem", 5);
std::vector<std::vector<char>> testData{
{3}, {3, 0, 11, -128, 127}, {}, {}, {3, 11},
};
plyOut.getElement("test_elem").addListProperty<char>("test_data", testData);
// ASCII read/write
plyOut.write("temp.ply", happly::DataFormat::ASCII);
happly::PLYData plyIn("temp.ply");
std::vector<std::vector<char>> testDataASCII = plyIn.getElement("test_elem").getListProperty<char>("test_data");
EXPECT_EQ(testData, testDataASCII);
}
TEST(TypedListReadWriteTest, ReadWriteCharBinary) {
// Create a simple file
happly::PLYData plyOut;
plyOut.addElement("test_elem", 5);
std::vector<std::vector<char>> testData{
{3}, {3, 0, 11, -128, 127}, {}, {}, {3, 11},
};
std::cout << "size: " << testData.size() << std::endl;
for(auto& v : testData) {
std::cout << "sub size: " << v.size() << std::endl;
}
plyOut.getElement("test_elem").addListProperty<char>("test_data", testData);
// ASCII read/write
plyOut.write("temp.ply", happly::DataFormat::Binary);
happly::PLYData plyIn("temp.ply");
std::vector<std::vector<char>> testDataBinary = plyIn.getElement("test_elem").getListProperty<char>("test_data");
std::cout << "size: " << testDataBinary.size() << std::endl;
for(auto& v : testDataBinary) {
std::cout << "sub size: " << v.size() << std::endl;
}
EXPECT_EQ(testData, testDataBinary);
}
TEST(TypedListReadWriteTest, ReadWriteCharBinarySwap) {
// Create a simple file
happly::PLYData plyOut;
plyOut.addElement("test_elem", 5);
std::vector<std::vector<char>> testData{
{3}, {3, 0, 11, -128, 127}, {}, {}, {3, 11},
};
plyOut.getElement("test_elem").addListProperty<char>("test_data", testData);
// ASCII read/write
plyOut.write("temp.ply", happly::DataFormat::BinaryBigEndian);
happly::PLYData plyIn("temp.ply");
std::vector<std::vector<char>> testDataBinary = plyIn.getElement("test_elem").getListProperty<char>("test_data");
EXPECT_EQ(testData, testDataBinary);
}
// = unsigned char list
TEST(TypedListReadWriteTest, ReadWriteUCharASCII) {
// Create a simple file
happly::PLYData plyOut;
plyOut.addElement("test_elem", 5);
std::vector<std::vector<unsigned char>> testData{
{3}, {3, 0, 11, 255, 122}, {}, {}, {3, 11},
};
plyOut.getElement("test_elem").addListProperty<unsigned char>("test_data", testData);
// ASCII read/write
plyOut.write("temp.ply", happly::DataFormat::ASCII);
happly::PLYData plyIn("temp.ply");
std::vector<std::vector<unsigned char>> testDataASCII =
plyIn.getElement("test_elem").getListProperty<unsigned char>("test_data");
EXPECT_EQ(testData, testDataASCII);
}
TEST(TypedListReadWriteTest, ReadWriteUCharBinary) {
// Create a simple file
happly::PLYData plyOut;
plyOut.addElement("test_elem", 5);
std::vector<std::vector<unsigned char>> testData{
{3}, {3, 0, 11, 255, 122}, {}, {}, {3, 11},
};
plyOut.getElement("test_elem").addListProperty<unsigned char>("test_data", testData);
// ASCII read/write
plyOut.write("temp.ply", happly::DataFormat::Binary);
happly::PLYData plyIn("temp.ply");
std::vector<std::vector<unsigned char>> testDataBinary =
plyIn.getElement("test_elem").getListProperty<unsigned char>("test_data");
EXPECT_EQ(testData, testDataBinary);
}
TEST(TypedListReadWriteTest, ReadWriteUCharBinarySwap) {
// Create a simple file
happly::PLYData plyOut;
plyOut.addElement("test_elem", 5);
std::vector<std::vector<unsigned char>> testData{
{3}, {3, 0, 11, 255, 122}, {}, {}, {3, 11},
};
plyOut.getElement("test_elem").addListProperty<unsigned char>("test_data", testData);
// ASCII read/write
plyOut.write("temp.ply", happly::DataFormat::BinaryBigEndian);
happly::PLYData plyIn("temp.ply");
std::vector<std::vector<unsigned char>> testDataBinary =
plyIn.getElement("test_elem").getListProperty<unsigned char>("test_data");
EXPECT_EQ(testData, testDataBinary);
}
// = signed short list
TEST(TypedListReadWriteTest, ReadWriteShortASCII) {
// Create a simple file
happly::PLYData plyOut;
plyOut.addElement("test_elem", 5);
std::vector<std::vector<short>> testData{
{3}, {-3, 4, 32767, -32768, 122}, {}, {}, {3, 11},
};
plyOut.getElement("test_elem").addListProperty<short>("test_data", testData);
// ASCII read/write
plyOut.write("temp.ply", happly::DataFormat::ASCII);
happly::PLYData plyIn("temp.ply");
std::vector<std::vector<short>> testDataASCII = plyIn.getElement("test_elem").getListProperty<short>("test_data");
EXPECT_EQ(testData, testDataASCII);
}
TEST(TypedListReadWriteTest, ReadWriteShortBinary) {
// Create a simple file
happly::PLYData plyOut;
plyOut.addElement("test_elem", 5);
std::vector<std::vector<short>> testData{
{3}, {-3, 4, 32767, -32768, 122}, {}, {}, {3, 11},
};
plyOut.getElement("test_elem").addListProperty<short>("test_data", testData);
// ASCII read/write
plyOut.write("temp.ply", happly::DataFormat::Binary);
happly::PLYData plyIn("temp.ply");
std::vector<std::vector<short>> testDataBinary = plyIn.getElement("test_elem").getListProperty<short>("test_data");
EXPECT_EQ(testData, testDataBinary);
}
TEST(TypedListReadWriteTest, ReadWriteShortBinarySwap) {
// Create a simple file
happly::PLYData plyOut;
plyOut.addElement("test_elem", 5);
std::vector<std::vector<short>> testData{
{3}, {-3, 4, 32767, -32768, 122}, {}, {}, {3, 11},
};
plyOut.getElement("test_elem").addListProperty<short>("test_data", testData);
// ASCII read/write
plyOut.write("temp.ply", happly::DataFormat::BinaryBigEndian);
happly::PLYData plyIn("temp.ply");
std::vector<std::vector<short>> testDataBinary = plyIn.getElement("test_elem").getListProperty<short>("test_data");
EXPECT_EQ(testData, testDataBinary);
}
// = unsigned short list
TEST(TypedListReadWriteTest, ReadWriteUShortASCII) {
// Create a simple file
happly::PLYData plyOut;
plyOut.addElement("test_elem", 5);
std::vector<std::vector<unsigned short>> testData{
{3}, {3, 0, 11, 65535, 122}, {}, {}, {3, 11},
};
plyOut.getElement("test_elem").addListProperty<unsigned short>("test_data", testData);
// ASCII read/write
plyOut.write("temp.ply", happly::DataFormat::ASCII);
happly::PLYData plyIn("temp.ply");
std::vector<std::vector<unsigned short>> testDataASCII =
plyIn.getElement("test_elem").getListProperty<unsigned short>("test_data");
EXPECT_EQ(testData, testDataASCII);
}
TEST(TypedListReadWriteTest, ReadWriteUShortBinary) {
// Create a simple file
happly::PLYData plyOut;
plyOut.addElement("test_elem", 5);
std::vector<std::vector<unsigned short>> testData{
{3}, {3, 0, 11, 65535, 122}, {}, {}, {3, 11},
};
plyOut.getElement("test_elem").addListProperty<unsigned short>("test_data", testData);
// ASCII read/write
plyOut.write("temp.ply", happly::DataFormat::Binary);
happly::PLYData plyIn("temp.ply");
std::vector<std::vector<unsigned short>> testDataBinary =
plyIn.getElement("test_elem").getListProperty<unsigned short>("test_data");
EXPECT_EQ(testData, testDataBinary);
}
TEST(TypedListReadWriteTest, ReadWriteUShortBinarySwap) {
// Create a simple file
happly::PLYData plyOut;
plyOut.addElement("test_elem", 5);
std::vector<std::vector<unsigned short>> testData{
{3}, {3, 0, 11, 65535, 122}, {}, {}, {3, 11},
};
plyOut.getElement("test_elem").addListProperty<unsigned short>("test_data", testData);
// ASCII read/write
plyOut.write("temp.ply", happly::DataFormat::Binary);
happly::PLYData plyIn("temp.ply");
std::vector<std::vector<unsigned short>> testDataBinary =
plyIn.getElement("test_elem").getListProperty<unsigned short>("test_data");
EXPECT_EQ(testData, testDataBinary);
}
// = signed int list
TEST(TypedListReadWriteTest, ReadWriteIntASCII) {
// Create a simple file
happly::PLYData plyOut;
plyOut.addElement("test_elem", 5);
std::vector<std::vector<int>> testData{
{3}, {-3, 0, 2147483647, -2147483647 - 1, 122}, {}, {}, {3, 11},
};
plyOut.getElement("test_elem").addListProperty<int>("test_data", testData);
// ASCII read/write
plyOut.write("temp.ply", happly::DataFormat::ASCII);
happly::PLYData plyIn("temp.ply");
std::vector<std::vector<int>> testDataASCII = plyIn.getElement("test_elem").getListProperty<int>("test_data");
EXPECT_EQ(testData, testDataASCII);
}
TEST(TypedListReadWriteTest, ReadWriteIntBinary) {
// Create a simple file
happly::PLYData plyOut;
plyOut.addElement("test_elem", 5);
std::vector<std::vector<int>> testData{
{3}, {-3, 0, 2147483647, -2147483647 - 1, 122}, {}, {}, {3, 11},
};
plyOut.getElement("test_elem").addListProperty<int>("test_data", testData);
// ASCII read/write
plyOut.write("temp.ply", happly::DataFormat::Binary);
happly::PLYData plyIn("temp.ply");
std::vector<std::vector<int>> testDataBinary = plyIn.getElement("test_elem").getListProperty<int>("test_data");
EXPECT_EQ(testData, testDataBinary);
}
TEST(TypedListReadWriteTest, ReadWriteIntBinarySwap) {
// Create a simple file
happly::PLYData plyOut;
plyOut.addElement("test_elem", 5);
std::vector<std::vector<int>> testData{
{3}, {-3, 0, 2147483647, -2147483647 - 1, 122}, {}, {}, {3, 11},
};
plyOut.getElement("test_elem").addListProperty<int>("test_data", testData);
// ASCII read/write
plyOut.write("temp.ply", happly::DataFormat::BinaryBigEndian);
happly::PLYData plyIn("temp.ply");
std::vector<std::vector<int>> testDataBinary = plyIn.getElement("test_elem").getListProperty<int>("test_data");
EXPECT_EQ(testData, testDataBinary);
}
// = unsigned int list
TEST(TypedListReadWriteTest, ReadWriteUIntASCII) {
// Create a simple file
happly::PLYData plyOut;
plyOut.addElement("test_elem", 5);
std::vector<std::vector<unsigned int>> testData{
{3}, {3, 0, 4294967295, 15, 122}, {}, {}, {3, 11},
};
plyOut.getElement("test_elem").addListProperty<unsigned int>("test_data", testData);
// ASCII read/write
plyOut.write("temp.ply", happly::DataFormat::ASCII);
happly::PLYData plyIn("temp.ply");
std::vector<std::vector<unsigned int>> testDataASCII =
plyIn.getElement("test_elem").getListProperty<unsigned int>("test_data");
EXPECT_EQ(testData, testDataASCII);
}
TEST(TypedListReadWriteTest, ReadWriteUIntBinary) {
// Create a simple file
happly::PLYData plyOut;
plyOut.addElement("test_elem", 5);
std::vector<std::vector<unsigned int>> testData{
{3}, {3, 0, 4294967295, 15, 122}, {}, {}, {3, 11},
};
plyOut.getElement("test_elem").addListProperty<unsigned int>("test_data", testData);
// ASCII read/write
plyOut.write("temp.ply", happly::DataFormat::Binary);
happly::PLYData plyIn("temp.ply");
std::vector<std::vector<unsigned int>> testDataBinary =
plyIn.getElement("test_elem").getListProperty<unsigned int>("test_data");
EXPECT_EQ(testData, testDataBinary);
}
TEST(TypedListReadWriteTest, ReadWriteUIntBinarySwap) {
// Create a simple file
happly::PLYData plyOut;
plyOut.addElement("test_elem", 5);
std::vector<std::vector<unsigned int>> testData{
{3}, {3, 0, 4294967295, 15, 122}, {}, {}, {3, 11},
};
plyOut.getElement("test_elem").addListProperty<unsigned int>("test_data", testData);
// ASCII read/write
plyOut.write("temp.ply", happly::DataFormat::BinaryBigEndian);
happly::PLYData plyIn("temp.ply");
std::vector<std::vector<unsigned int>> testDataBinary =
plyIn.getElement("test_elem").getListProperty<unsigned int>("test_data");
EXPECT_EQ(testData, testDataBinary);
}
// = float list
TEST(TypedListReadWriteTest, ReadWriteFloatASCII) {
// Create a simple file
happly::PLYData plyOut;
plyOut.addElement("test_elem", 5);
std::vector<std::vector<float>> testData{
{3.f, 14.44f, 42.4242f},
{
3.141592653589793238f,
-3.141592653589793238f,
std::numeric_limits<float>::min(),
std::numeric_limits<float>::max(),
std::numeric_limits<float>::lowest(),
std::numeric_limits<float>::epsilon(),
0.0f,
-0.0f,
1e24f,
},
{},
{1.1f},
{-121.5f, 1.111f},
};
plyOut.getElement("test_elem").addListProperty<float>("test_data", testData);
// ASCII read/write
plyOut.write("temp.ply", happly::DataFormat::ASCII);
happly::PLYData plyIn("temp.ply");
std::vector<std::vector<float>> testDataASCII = plyIn.getElement("test_elem").getListProperty<float>("test_data");
EXPECT_EQ(testData, testDataASCII);
}
TEST(TypedListReadWriteTest, ReadWriteFloatBinary) {
// Create a simple file
happly::PLYData plyOut;
plyOut.addElement("test_elem", 5);
std::vector<std::vector<float>> testData{
{3.f, 14.44f, 42.4242f},
{
3.141592653589793238f,
-3.141592653589793238f,
std::numeric_limits<float>::min(),
std::numeric_limits<float>::max(),
std::numeric_limits<float>::lowest(),
std::numeric_limits<float>::epsilon(),
0.0f,
-0.0f,
1e24f,
},
{},
{1.1f},
{-121.5f, 1.111f},
};
plyOut.getElement("test_elem").addListProperty<float>("test_data", testData);
// ASCII read/write
plyOut.write("temp.ply", happly::DataFormat::Binary);
happly::PLYData plyIn("temp.ply");
std::vector<std::vector<float>> testDataBinary = plyIn.getElement("test_elem").getListProperty<float>("test_data");
EXPECT_EQ(testData, testDataBinary);
}
TEST(TypedListReadWriteTest, ReadWriteFloatBinarySwap) {
// Create a simple file
happly::PLYData plyOut;
plyOut.addElement("test_elem", 5);
std::vector<std::vector<float>> testData{
{3.f, 14.44f, 42.4242f},
{
3.141592653589793238f,
-3.141592653589793238f,
std::numeric_limits<float>::min(),
std::numeric_limits<float>::max(),
std::numeric_limits<float>::lowest(),
std::numeric_limits<float>::epsilon(),
0.0f,
-0.0f,
1e24f,
},
{},
{1.1f},
{-121.5f, 1.111f},
};
plyOut.getElement("test_elem").addListProperty<float>("test_data", testData);
// ASCII read/write
plyOut.write("temp.ply", happly::DataFormat::BinaryBigEndian);
happly::PLYData plyIn("temp.ply");
std::vector<std::vector<float>> testDataBinary = plyIn.getElement("test_elem").getListProperty<float>("test_data");
EXPECT_EQ(testData, testDataBinary);
}
// = double list
TEST(TypedListReadWriteTest, ReadWriteDoubleASCII) {
// Create a simple file
happly::PLYData plyOut;
plyOut.addElement("test_elem", 5);
std::vector<std::vector<double>> testData{
{3., 14.44, 42.4242},
{
3.141592653589793238,
-3.141592653589793238,
std::numeric_limits<double>::min(),
std::numeric_limits<double>::max(),
std::numeric_limits<double>::lowest(),
std::numeric_limits<double>::epsilon(),
0.0,
-0.0,
1e24,
},
{},
{1.1},
{-121.5, 1.111},
};
plyOut.getElement("test_elem").addListProperty<double>("test_data", testData);
// ASCII read/write
plyOut.write("temp.ply", happly::DataFormat::ASCII);
happly::PLYData plyIn("temp.ply");
std::vector<std::vector<double>> testDataASCII = plyIn.getElement("test_elem").getListProperty<double>("test_data");
EXPECT_EQ(testData, testDataASCII);
}
TEST(TypedListReadWriteTest, ReadWriteDoubleBinary) {
// Create a simple file
happly::PLYData plyOut;
plyOut.addElement("test_elem", 5);
std::vector<std::vector<double>> testData{
{3., 14.44, 42.4242},
{
3.141592653589793238,
-3.141592653589793238,
std::numeric_limits<double>::min(),
std::numeric_limits<double>::max(),
std::numeric_limits<double>::lowest(),
std::numeric_limits<double>::epsilon(),
0.0,
-0.0,
1e24,
},
{},
{1.1},
{-121.5, 1.111},
};
plyOut.getElement("test_elem").addListProperty<double>("test_data", testData);
// ASCII read/write
plyOut.write("temp.ply", happly::DataFormat::Binary);
happly::PLYData plyIn("temp.ply");
std::vector<std::vector<double>> testDataBinary = plyIn.getElement("test_elem").getListProperty<double>("test_data");
EXPECT_EQ(testData, testDataBinary);
}
TEST(TypedListReadWriteTest, ReadWriteDoubleBinarySwap) {
// Create a simple file
happly::PLYData plyOut;
plyOut.addElement("test_elem", 5);
std::vector<std::vector<double>> testData{
{3., 14.44, 42.4242},
{
3.141592653589793238,
-3.141592653589793238,
std::numeric_limits<double>::min(),
std::numeric_limits<double>::max(),
std::numeric_limits<double>::lowest(),
std::numeric_limits<double>::epsilon(),
0.0,
-0.0,
1e24,
},
{},
{1.1},
{-121.5, 1.111},
};
plyOut.getElement("test_elem").addListProperty<double>("test_data", testData);
// ASCII read/write
plyOut.write("temp.ply", happly::DataFormat::BinaryBigEndian);
happly::PLYData plyIn("temp.ply");
std::vector<std::vector<double>> testDataBinary = plyIn.getElement("test_elem").getListProperty<double>("test_data");
EXPECT_EQ(testData, testDataBinary);
}
// === Test error and utility behavior
// Errors get thrown
TEST(ErrorTest, NonexistantElement) {
happly::PLYData emptyPly;
EXPECT_THROW(emptyPly.getElement("test_elem");, std::runtime_error);
}
TEST(ErrorTest, NonexistantProperty) {
happly::PLYData emptyPly;
emptyPly.addElement("test_elem", 11);
EXPECT_THROW(emptyPly.getElement("test_elem").getProperty<int>("test_prop");, std::runtime_error);
}
TEST(ErrorTest, WrongSize) {
happly::PLYData emptyPly;
emptyPly.addElement("test_elem", 11);
std::vector<int> data{1, 3, 4};
EXPECT_THROW(emptyPly.getElement("test_elem").addProperty("bad_prop", data), std::runtime_error);
}
TEST(ErrorTest, WrongSizeList) {
happly::PLYData emptyPly;
emptyPly.addElement("test_elem", 11);
std::vector<std::vector<int>> data{{1}, {3}, {4, 4}};
EXPECT_THROW(emptyPly.getElement("test_elem").addListProperty("bad_prop", data), std::runtime_error);
}
TEST(ErrorTest, WhiteSpaceInElementName) {
happly::PLYData ply;
ply.addElement("test elem", 11);
EXPECT_THROW(ply.validate(), std::runtime_error);
}
TEST(ErrorTest, WhiteSpaceInPropertyName) {
happly::PLYData ply;
ply.addElement("test_elem", 3);
std::vector<int> data{1, 3, 4};
ply.getElement("test_elem").addProperty("test prop", data);
EXPECT_THROW(ply.validate(), std::runtime_error);
}
// Removal
TEST(RemovalTest, RemoveReplaceTest) {
happly::PLYData ply;
ply.addElement("test_elem", 3);
std::vector<int> data{1, 3, 4};
ply.getElement("test_elem").addProperty("data", data);
EXPECT_EQ(data, ply.getElement("test_elem").getProperty<int>("data"));
// Replace with new
std::vector<int> data2{5, 5, 5};
ply.getElement("test_elem").addProperty("data", data2);
EXPECT_EQ(data2, ply.getElement("test_elem").getProperty<int>("data"));
}
// Type promotion
TEST(TypePromotionTest, PromoteFloatToDouble) {
happly::PLYData ply;
ply.addElement("test_elem", 3);
std::vector<float> dataF{1.0, 3.0, 4.0};
std::vector<double> dataD{1.0, 3.0, 4.0};
ply.getElement("test_elem").addProperty("data", dataF);
EXPECT_EQ(dataD, ply.getElement("test_elem").getProperty<double>("data"));
}
TEST(TypePromotionTest, DontPromoteDoubleToFloat) {
happly::PLYData ply;
ply.addElement("test_elem", 3);
std::vector<float> dataF{1.0, 3.0, 4.0};
std::vector<double> dataD{1.0, 3.0, 4.0};
ply.getElement("test_elem").addProperty("data", dataD);
EXPECT_THROW(ply.getElement("test_elem").getProperty<float>("data"), std::runtime_error);
}
TEST(TypePromotionTest, PromoteUnsigned) {
happly::PLYData ply;
ply.addElement("test_elem", 3);
std::vector<unsigned char> dataC{1, 3, 5};
ply.getElement("test_elem").addProperty("data", dataC);
std::vector<unsigned short> dataS{1, 3, 5};
std::vector<unsigned int> dataI{1, 3, 5};
std::vector<unsigned long long int> dataL{1, 3, 5};
std::vector<size_t> dataSZ{1, 3, 5};
EXPECT_EQ(dataC, ply.getElement("test_elem").getProperty<unsigned char>("data"));
EXPECT_EQ(dataS, ply.getElement("test_elem").getProperty<unsigned short>("data"));
EXPECT_EQ(dataI, ply.getElement("test_elem").getProperty<unsigned int>("data"));
//EXPECT_EQ(dataL, ply.getElement("test_elem").getProperty<unsigned long long int>("data"));
EXPECT_EQ(dataSZ, ply.getElement("test_elem").getProperty<size_t>("data"));
}
TEST(TypePromotionTest, PromoteSigned) {
happly::PLYData ply;
ply.addElement("test_elem", 3);
std::vector<char> data{1, -3, 5};
ply.getElement("test_elem").addProperty("data", data);
std::vector<char> dataC{1, -3, 5};
std::vector<short> dataS{1, -3, 5};
std::vector<int> dataI{1, -3, 5};
std::vector<long long int> dataL{1, -3, 5};
std::vector<int64_t> data64{1, -3, 5};
EXPECT_EQ(dataC, ply.getElement("test_elem").getProperty<char>("data"));
EXPECT_EQ(dataS, ply.getElement("test_elem").getProperty<int16_t>("data"));
EXPECT_EQ(dataS, ply.getElement("test_elem").getProperty<short>("data"));
EXPECT_EQ(dataI, ply.getElement("test_elem").getProperty<int32_t>("data"));
EXPECT_EQ(dataI, ply.getElement("test_elem").getProperty<int>("data"));
//EXPECT_EQ(dataL, ply.getElement("test_elem").getProperty<long long int>("data"));
EXPECT_EQ(data64, ply.getElement("test_elem").getProperty<int64_t>("data"));
}
TEST(TypePromotionTest, DontPromoteAcrossSign) {
happly::PLYData ply;
ply.addElement("test_elem", 3);
std::vector<int> dataI{1, -3, 5};
std::vector<unsigned int> dataUI{1, 3, 5};
ply.getElement("test_elem").addProperty("dataI", dataI);
ply.getElement("test_elem").addProperty("dataUI", dataUI);
// Make sure data is there
EXPECT_EQ(dataI, ply.getElement("test_elem").getProperty<int>("dataI"));
EXPECT_EQ(dataUI, ply.getElement("test_elem").getProperty<unsigned int>("dataUI"));
// But throws if we cross signedness
EXPECT_THROW(ply.getElement("test_elem").getProperty<int>("dataUI"), std::runtime_error);
EXPECT_THROW(ply.getElement("test_elem").getProperty<unsigned int>("dataI"), std::runtime_error);
}
TEST(TypePromotionTest, PromoteFaceInd) {
happly::PLYData ply;
ply.addElement("face", 3);
std::vector<std::vector<unsigned short>> faceInds{{1, 3, 4}, {0, 2, 4, 5}, {1, 1, 1}};
std::vector<std::vector<size_t>> faceIndsS{{1, 3, 4}, {0, 2, 4, 5}, {1, 1, 1}};
ply.getElement("face").addListProperty("vertex_indices", faceInds);
std::vector<std::vector<size_t>> faceIndGet = ply.getFaceIndices();
EXPECT_EQ(faceIndsS, faceIndGet);
}
TEST(TypePromotionTest, FaceIndSign) {
happly::PLYData ply;
ply.addElement("face", 3);
std::vector<std::vector<short>> faceInds{{1, 3, 4}, {0, -2, 4, 5}, {1, 1, 1}};
std::vector<std::vector<int>> faceIndsI{{1, 3, 4}, {0, -2, 4, 5}, {1, 1, 1}};
std::vector<std::vector<unsigned int>> faceIndsU{{1, 3, 4}, {0, 2, 4, 5}, {1, 1, 1}};
ply.getElement("face").addListProperty("vertex_indices", faceInds);
std::vector<std::vector<int>> faceIndGetI = ply.getFaceIndices<int>();
EXPECT_EQ(faceIndsI, faceIndGetI);
std::vector<std::vector<unsigned int>> faceIndGetU = ply.getFaceIndices<unsigned int>();
EXPECT_NE(faceIndsU, faceIndGetU);
}
TEST(TypePromotionTest, FaceIndThrow) {
happly::PLYData ply;
ply.addElement("face", 3);
std::vector<std::vector<uint64_t>> faceInds{{1, 3, 1LL << 40}, {0, 2, 4, 5}, {1, 1, 1}};
EXPECT_THROW(ply.getElement("face").addListProperty("vertex_indices", faceInds), std::runtime_error);
}
// === Test reading mesh-like files
TEST(MeshTest, ReadWriteASCIIMesh) {
// = Read in an interesting mesh file
happly::PLYData plyIn("../sampledata/platonic_shelf_ascii.ply", false);
plyIn.validate();
std::vector<std::array<double, 3>> vPos = plyIn.getVertexPositions();
std::vector<std::vector<size_t>> fInd = plyIn.getFaceIndices();
// = Write out the mesh file
happly::PLYData plyOut;
plyOut.addVertexPositions(vPos);
plyOut.addFaceIndices(fInd);
plyOut.validate();
plyOut.write("temp.ply");
// = Read the mesh file in again and make sure it hasn't changed
happly::PLYData plyIn2("temp.ply", false);
plyIn2.validate();
std::vector<std::array<double, 3>> vPos2 = plyIn2.getVertexPositions();
std::vector<std::vector<size_t>> fInd2 = plyIn2.getFaceIndices();
DoubleArrayVecEq(vPos, vPos2);
EXPECT_EQ(fInd, fInd2);
}
TEST(MeshTest, ReadWriteBinaryMesh) {
// = Read in an interesting mesh file
happly::PLYData plyIn("../sampledata/platonic_shelf.ply", false);
plyIn.validate();
std::vector<std::array<double, 3>> vPos = plyIn.getVertexPositions();
std::vector<std::vector<size_t>> fInd = plyIn.getFaceIndices();
// = Write out the mesh file
happly::PLYData plyOut;
plyOut.addVertexPositions(vPos);
plyOut.addFaceIndices(fInd);
plyOut.validate();
plyOut.write("temp.ply", happly::DataFormat::Binary);
// = Read the mesh file in again and make sure it hasn't changed
happly::PLYData plyIn2("temp.ply", false);
plyIn2.validate();
std::vector<std::array<double, 3>> vPos2 = plyIn2.getVertexPositions();
std::vector<std::vector<size_t>> fInd2 = plyIn2.getFaceIndices();
DoubleArrayVecEq(vPos, vPos2);
EXPECT_EQ(fInd, fInd2);
}
TEST(MeshTest, ReadWriteBinarySwapMesh) {
// = Read in an interesting mesh file
happly::PLYData plyIn("../sampledata/platonic_shelf_big_endian.ply", false);
plyIn.validate();
std::vector<std::array<double, 3>> vPos = plyIn.getVertexPositions();
std::vector<std::vector<size_t>> fInd = plyIn.getFaceIndices();
// = Write out the mesh file
happly::PLYData plyOut;
plyOut.addVertexPositions(vPos);
plyOut.addFaceIndices(fInd);
plyOut.validate();
plyOut.write("temp.ply", happly::DataFormat::BinaryBigEndian);
// = Read the mesh file in again and make sure it hasn't changed
happly::PLYData plyIn2("temp.ply", false);
plyIn2.validate();
std::vector<std::array<double, 3>> vPos2 = plyIn2.getVertexPositions();
std::vector<std::vector<size_t>> fInd2 = plyIn2.getFaceIndices();
DoubleArrayVecEq(vPos, vPos2);
EXPECT_EQ(fInd, fInd2);
}
// === Test stream interfaces
TEST(MeshTest, ReadWriteASCIIMeshStream) {
// = Read the PLY from an input stream
std::ifstream file ("../sampledata/platonic_shelf_ascii.ply");
happly::PLYData plyIn(file, false);
plyIn.validate();
file.close();
std::vector<std::array<double, 3>> vPos = plyIn.getVertexPositions();
std::vector<std::vector<size_t>> fInd = plyIn.getFaceIndices();
// = Write the mesh file to a stringstream
std::stringstream ioBuffer;
happly::PLYData plyOut;
plyOut.addVertexPositions(vPos);
plyOut.addFaceIndices(fInd);
plyOut.validate();
plyOut.write(ioBuffer);
// = Read the mesh file in again and make sure it hasn't changed
happly::PLYData plyIn2(ioBuffer, false);
plyIn2.validate();
std::vector<std::array<double, 3>> vPos2 = plyIn2.getVertexPositions();
std::vector<std::vector<size_t>> fInd2 = plyIn2.getFaceIndices();
DoubleArrayVecEq(vPos, vPos2);
EXPECT_EQ(fInd, fInd2);
}
TEST(MeshTest, ReadWriteBinaryMeshStream) {
// = Read in an interesting mesh file
std::ifstream file ("../sampledata/platonic_shelf_ascii.ply");
happly::PLYData plyIn(file, false);
plyIn.validate();
file.close();
std::vector<std::array<double, 3>> vPos = plyIn.getVertexPositions();
std::vector<std::vector<size_t>> fInd = plyIn.getFaceIndices();
// = Write out the mesh to a stringstream
std::stringstream ioBuffer;
happly::PLYData plyOut;
plyOut.addVertexPositions(vPos);
plyOut.addFaceIndices(fInd);
plyOut.validate();
plyOut.write(ioBuffer, happly::DataFormat::Binary);
// = Read the mesh file in again and make sure it hasn't changed
happly::PLYData plyIn2(ioBuffer, false);
plyIn2.validate();
std::vector<std::array<double, 3>> vPos2 = plyIn2.getVertexPositions();
std::vector<std::vector<size_t>> fInd2 = plyIn2.getFaceIndices();
DoubleArrayVecEq(vPos, vPos2);
EXPECT_EQ(fInd, fInd2);
}
TEST(PerfTest, WriteReadFloatList) {
// Parameters
size_t innerSizeMax = 10;
size_t N = 100000;
// Random number makers
std::mt19937 gen(777);
std::uniform_int_distribution<int> distInnerSize(1, innerSizeMax);
std::uniform_int_distribution<int> distValues(0, 1000000);
// Generate a long list of junk data
std::vector<std::vector<int>> testVals;
for (size_t i = 0; i < N; i++) {
size_t innerCount = distInnerSize(gen);
std::vector<int> innerVals;
for (size_t j = 0; j < innerCount; j++) {
int val = distValues(gen);
innerVals.push_back(val);
}
testVals.push_back(innerVals);
}
// Start timing
auto tStart = std::chrono::steady_clock::now();
// Create a ply file
happly::PLYData plyOut;
plyOut.addElement("testElem", N);
plyOut.getElement("testElem").addListProperty<int>("testVals", testVals);
// Write it to a stream
std::stringstream ioBuffer;
plyOut.write(ioBuffer, happly::DataFormat::Binary);
// = Read from stream
// (note that this DOES NOT actually access the property, but simply opening the stream parses everything)
happly::PLYData plyIn(ioBuffer, false);
// Finish timing
auto tEnd = std::chrono::steady_clock::now();
std::cout << " time elapsed = " << std::chrono::duration_cast<std::chrono::microseconds>(tEnd - tStart).count() << "us" << std::endl;
}
int main(int argc, char** argv) {
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}