#include <iomanip>
#include <iostream>
#include <string>
#include <type_traits>
#include <glm/glm.hpp>
#include <glbase.hpp>
#include <gltraits.hpp>
struct GLTraitsTest : protected GLBase
{
template<typename Value>
void static test_value()
{
using Traits = GLTraits::Value<Value>;
static_assert(
std::is_empty<Traits>::value,
"GLTraits::Value must be empty"
);
#define GLTRAITS_TEST_VALUE(NAME, VALUE) \
<< std::left << std::setw(35) << " " NAME ":" << VALUE << "\n"
#define GLTRAITS_TEST_VALUE_DEC(NAME) \
GLTRAITS_TEST_VALUE(#NAME, std::dec << Traits::NAME)
#define GLTRAITS_TEST_VALUE_BOOL(NAME) \
GLTRAITS_TEST_VALUE(#NAME, std::boolalpha << Traits::NAME)
#define GLTRAITS_TEST_VALUE_HEX(NAME) \
GLTRAITS_TEST_VALUE(#NAME, str_enum_(Traits::NAME))
#define GLTRAITS_TEST_VALUE_ENUM(NAME, SUFFIX) \
GLTRAITS_TEST_VALUE( \
#NAME #SUFFIX, \
str_##NAME##_(Traits::NAME##SUFFIX) \
)
std::cout
<< "Value<" << Traits::name << ">" << "\n"
GLTRAITS_TEST_VALUE_DEC(columns)
GLTRAITS_TEST_VALUE_DEC(rows)
GLTRAITS_TEST_VALUE_ENUM(glsl,)
GLTRAITS_TEST_VALUE_ENUM(format,)
GLTRAITS_TEST_VALUE_ENUM(type,)
GLTRAITS_TEST_VALUE_ENUM(internal_format,)
GLTRAITS_TEST_VALUE_ENUM(internal_format, _srgb)
GLTRAITS_TEST_VALUE_ENUM(internal_format, _compressed)
GLTRAITS_TEST_VALUE_ENUM(internal_format, _compressed_srgb)
GLTRAITS_TEST_VALUE_BOOL(integer)
GLTRAITS_TEST_VALUE_HEX(id);
}
template<GLenum id>
void static test_value_id()
{
using Traits = GLTraits::ValueID<id>;
static_assert(
std::is_empty<Traits>::value,
"GLTraits::ValueID must be empty"
);
std::cout
<< "ValueID<" << str_enum_(id) << ">" << "\n"
<< " " << GLTraits::Value<typename Traits::Value>::name << "\n";
}
template<GLenum object_type, typename... Args>
void static test_object()
{
using Traits = GLTraits::Object<object_type>;
static_assert(
std::is_empty<Traits>::value,
"GLTraits::Object must be empty"
);
#define GLTRAITS_TEST_OBJECT(NAME) \
<< std::left << std::setw(33) \
<< " " #NAME ":" \
<< (void *)Traits::NAME \
<< "\n"
std::cout
<< "Object<" << Traits::name << ">" << "\n"
GLTRAITS_TEST_OBJECT(template gen_objects<Args...>)
GLTRAITS_TEST_OBJECT(delete_objects)
GLTRAITS_TEST_OBJECT(info_log);
}
template<std::size_t N>
void static test_texture()
{
using Traits = GLTraits::Texture<N>;
static_assert(
std::is_empty<Traits>::value,
"GLTraits::Texture must be empty"
);
#define GLTRAITS_TEST_TEXTURE(NAME) \
<< std::left << std::setw(32) \
<< " " #NAME ":" \
<< (void *)Traits::NAME \
<< "\n"
std::cout
<< "Texture<" << N << ">" << "\n"
GLTRAITS_TEST_TEXTURE(template tex_image<>)
GLTRAITS_TEST_TEXTURE(template tex_storage<>)
GLTRAITS_TEST_TEXTURE(template texture_storage<>)
GLTRAITS_TEST_TEXTURE(template tex_sub_image<>)
GLTRAITS_TEST_TEXTURE(template texture_sub_image<>)
GLTRAITS_TEST_TEXTURE(copy_tex_sub_image)
GLTRAITS_TEST_TEXTURE(copy_texture_sub_image)
GLTRAITS_TEST_TEXTURE(compressed_tex_image)
GLTRAITS_TEST_TEXTURE(compressed_tex_sub_image)
GLTRAITS_TEST_TEXTURE(compressed_texture_sub_image);
}
};
int main()
{
GLTraitsTest::test_value<GLfloat>();
GLTraitsTest::test_value<bool>();
GLTraitsTest::test_value<GLshort>();
GLTraitsTest::test_value<GLdouble>();
GLTraitsTest::test_value<glm::mat4x3>();
GLTraitsTest::test_value<glm::uvec2>();
GLTraitsTest::test_value<glm::dvec2>();
GLTraitsTest::test_value_id<GL_FLOAT>();
GLTraitsTest::test_value_id<GL_BOOL>();
GLTraitsTest::test_value_id<GL_SHORT>();
GLTraitsTest::test_value_id<GL_DOUBLE>();
GLTraitsTest::test_value_id<GL_FLOAT_MAT4x3>();
GLTraitsTest::test_value_id<GL_UNSIGNED_INT_VEC2>();
GLTraitsTest::test_value_id<GL_DOUBLE_VEC2>();
GLTraitsTest::test_object<GL_SHADER, GLenum>();
GLTraitsTest::test_object<GL_PROGRAM_PIPELINE>();
GLTraitsTest::test_texture<1>();
GLTraitsTest::test_texture<2>();
GLTraitsTest::test_texture<3>();
}