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.

220 lines
7.1 KiB

/*
Copyright © 2010, 2011, 2012 Vladimír Vondruš <mosra@centrum.cz>
This file is part of Magnum.
Magnum is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License version 3
only, as published by the Free Software Foundation.
Magnum is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License version 3 for more details.
*/
#include <TestSuite/Tester.h>
#include "AbstractShaderProgram.h"
namespace Magnum { namespace Test {
class AbstractShaderProgramTest: public Corrade::TestSuite::Tester {
public:
explicit AbstractShaderProgramTest();
void attributeScalar();
void attributeScalarInt();
void attributeScalarUnsignedInt();
void attributeScalarDouble();
void attributeVector();
void attributeVectorInt();
void attributeVectorUnsignedInt();
void attributeVectorDouble();
void attributeVector4();
void attributeVectorBGRA();
void attributeMatrix();
void attributeMatrixDouble();
};
AbstractShaderProgramTest::AbstractShaderProgramTest() {
addTests({&AbstractShaderProgramTest::attributeScalar,
&AbstractShaderProgramTest::attributeScalarInt,
&AbstractShaderProgramTest::attributeScalarUnsignedInt,
&AbstractShaderProgramTest::attributeScalarDouble,
&AbstractShaderProgramTest::attributeVector,
&AbstractShaderProgramTest::attributeVectorInt,
&AbstractShaderProgramTest::attributeVectorUnsignedInt,
&AbstractShaderProgramTest::attributeVectorDouble,
&AbstractShaderProgramTest::attributeVector4,
&AbstractShaderProgramTest::attributeVectorBGRA,
&AbstractShaderProgramTest::attributeMatrix,
&AbstractShaderProgramTest::attributeMatrixDouble});
}
void AbstractShaderProgramTest::attributeScalar() {
typedef AbstractShaderProgram::Attribute<3, Float> Attribute;
CORRADE_COMPARE(Attribute::Location, 3);
/* Default constructor */
Attribute a;
CORRADE_COMPARE(a.components(), Attribute::Components::One);
CORRADE_VERIFY(!a.dataOptions());
CORRADE_COMPARE(a.dataSize(), 4);
CORRADE_COMPARE(a.dataType(), Attribute::DataType::Float);
/* Options */
Attribute b(Attribute::DataType::UnsignedShort, Attribute::DataOption::Normalized);
CORRADE_COMPARE(b.dataSize(), 2);
CORRADE_VERIFY(b.dataOptions() <= Attribute::DataOption::Normalized);
}
void AbstractShaderProgramTest::attributeScalarInt() {
typedef AbstractShaderProgram::Attribute<3, Int> Attribute;
/* Default constructor */
Attribute a;
CORRADE_COMPARE(a.dataSize(), 4);
/* Options */
Attribute b(Attribute::DataType::Short);
CORRADE_COMPARE(b.dataSize(), 2);
}
void AbstractShaderProgramTest::attributeScalarUnsignedInt() {
typedef AbstractShaderProgram::Attribute<3, UnsignedInt> Attribute;
/* Default constructor */
Attribute a;
CORRADE_COMPARE(a.dataSize(), 4);
/* Options */
Attribute b(Attribute::DataType::UnsignedByte);
CORRADE_COMPARE(b.dataSize(), 1);
}
void AbstractShaderProgramTest::attributeScalarDouble() {
#ifndef MAGNUM_TARGET_GLES
typedef AbstractShaderProgram::Attribute<3, Double> Attribute;
/* Default constructor */
Attribute a;
CORRADE_COMPARE(a.dataSize(), 8);
#else
CORRADE_SKIP("Double attributes are not available in OpenGL ES.");
#endif
}
void AbstractShaderProgramTest::attributeVector() {
typedef AbstractShaderProgram::Attribute<3, Vector3> Attribute;
/* Default constructor */
Attribute a;
CORRADE_COMPARE(a.components(), Attribute::Components::Three);
CORRADE_COMPARE(a.dataSize(), 3*4);
CORRADE_COMPARE(a.dataType(), Attribute::DataType::Float);
/* Options */
Attribute b(Attribute::Components::Two, Attribute::DataType::Double);
CORRADE_COMPARE(b.components(), Attribute::Components::Two);
CORRADE_COMPARE(b.dataSize(), 2*8);
}
void AbstractShaderProgramTest::attributeVectorInt() {
typedef AbstractShaderProgram::Attribute<3, Vector2i> Attribute;
/* Default constructor */
Attribute a;
CORRADE_COMPARE(a.components(), Attribute::Components::Two);
CORRADE_COMPARE(a.dataSize(), 2*4);
CORRADE_COMPARE(a.dataType(), Attribute::DataType::Int);
/* Options */
Attribute b(Attribute::Components::One, Attribute::DataType::Int);
CORRADE_COMPARE(b.dataSize(), 4);
}
void AbstractShaderProgramTest::attributeVectorUnsignedInt() {
typedef AbstractShaderProgram::Attribute<3, Vector4ui> Attribute;
/* Default constructor */
Attribute a;
CORRADE_COMPARE(a.components(), Attribute::Components::Four);
CORRADE_COMPARE(a.dataSize(), 4*4);
CORRADE_COMPARE(a.dataType(), Attribute::DataType::UnsignedInt);
/* Options */
Attribute b(Attribute::Components::Three, Attribute::DataType::UnsignedShort);
CORRADE_COMPARE(b.dataSize(), 3*2);
}
void AbstractShaderProgramTest::attributeVectorDouble() {
#ifndef MAGNUM_TARGET_GLES
typedef AbstractShaderProgram::Attribute<3, Vector2d> Attribute;
/* Default constructor */
Attribute a;
CORRADE_COMPARE(a.components(), Attribute::Components::Two);
CORRADE_COMPARE(a.dataSize(), 2*8);
CORRADE_COMPARE(a.dataType(), Attribute::DataType::Double);
/* Options */
Attribute b(Attribute::Components::One);
CORRADE_COMPARE(b.dataSize(), 8);
#else
CORRADE_SKIP("Double attributes are not available in OpenGL ES.");
#endif
}
void AbstractShaderProgramTest::attributeVector4() {
typedef AbstractShaderProgram::Attribute<3, Vector4> Attribute;
/* Custom type */
Attribute a(Attribute::DataType::UnsignedInt2101010Rev);
CORRADE_COMPARE(a.dataSize(), 4);
}
void AbstractShaderProgramTest::attributeVectorBGRA() {
#ifndef MAGNUM_TARGET_GLES
typedef AbstractShaderProgram::Attribute<3, Vector4> Attribute;
/* BGRA */
Attribute a(Attribute::Components::BGRA);
CORRADE_COMPARE(a.dataSize(), 4*4);
#else
CORRADE_SKIP("BGRA attribute component ordering is not available in OpenGL ES.");
#endif
}
void AbstractShaderProgramTest::attributeMatrix() {
typedef AbstractShaderProgram::Attribute<3, Matrix3> Attribute;
/* Default constructor */
Attribute a;
CORRADE_COMPARE(a.components(), Attribute::Components::Three);
CORRADE_COMPARE(a.dataSize(), 3*3*4);
CORRADE_COMPARE(a.dataType(), Attribute::DataType::Float);
}
void AbstractShaderProgramTest::attributeMatrixDouble() {
#ifndef MAGNUM_TARGET_GLES
typedef AbstractShaderProgram::Attribute<3, Matrix4d> Attribute;
/* Default constructor */
Attribute a;
CORRADE_COMPARE(a.components(), Attribute::Components::Four);
CORRADE_COMPARE(a.dataSize(), 4*4*8);
CORRADE_COMPARE(a.dataType(), Attribute::DataType::Double);
#else
CORRADE_SKIP("Double attributes are not available in OpenGL ES.");
#endif
}
}}
CORRADE_TEST_MAIN(Magnum::Test::AbstractShaderProgramTest)