Branch :
#include <cppunit/extensions/HelperMacros.h>
#include <cppunit/TestCaller.h>
#include <cppunit/TestCase.h>
#include <cppunit/TestSuite.h>
#include <assert.h>
#include <ft2build.h>
#include FT_FREETYPE_H
#include FT_GLYPH_H
#include "Fontdefs.h"
#include "FTBBox.h"
class FTBBoxTest : public CppUnit::TestCase
{
CPPUNIT_TEST_SUITE( FTBBoxTest);
CPPUNIT_TEST( testDefaultConstructor);
CPPUNIT_TEST( testGlyphConstructor);
CPPUNIT_TEST( testBitmapConstructor);
CPPUNIT_TEST( testMoveBBox);
CPPUNIT_TEST( testPlusEquals);
CPPUNIT_TEST( testSetDepth);
CPPUNIT_TEST_SUITE_END();
public:
FTBBoxTest() : CppUnit::TestCase( "FTBBox Test")
{}
FTBBoxTest( const std::string& name) : CppUnit::TestCase(name) {}
void testDefaultConstructor()
{
FTBBox boundingBox;
CPPUNIT_ASSERT( boundingBox.lowerX == 0.0f);
CPPUNIT_ASSERT( boundingBox.lowerY == 0.0f);
CPPUNIT_ASSERT( boundingBox.lowerZ == 0.0f);
CPPUNIT_ASSERT( boundingBox.upperX == 0.0f);
CPPUNIT_ASSERT( boundingBox.upperY == 0.0f);
CPPUNIT_ASSERT( boundingBox.upperZ == 0.0f);
}
void testGlyphConstructor()
{
setUpFreetype( GOOD_FONT_FILE);
// FTBBox boundingBox2( (FT_GlyphSlot)(0));
// CPPUNIT_ASSERT( boundingBox2.lowerX == 0.0f);
// CPPUNIT_ASSERT( boundingBox2.lowerY == 0.0f);
// CPPUNIT_ASSERT( boundingBox2.lowerZ == 0.0f);
// CPPUNIT_ASSERT( boundingBox2.upperX == 0.0f);
// CPPUNIT_ASSERT( boundingBox2.upperY == 0.0f);
// CPPUNIT_ASSERT( boundingBox2.upperZ == 0.0f);
FTBBox boundingBox( face->glyph);
CPPUNIT_ASSERT_DOUBLES_EQUAL( 2, boundingBox.lowerX, 0.01);
CPPUNIT_ASSERT_DOUBLES_EQUAL( -15, boundingBox.lowerY, 0.01);
CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, boundingBox.lowerZ, 0.01);
CPPUNIT_ASSERT_DOUBLES_EQUAL( 35, boundingBox.upperX, 0.01);
CPPUNIT_ASSERT_DOUBLES_EQUAL( 38, boundingBox.upperY, 0.01);
CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, boundingBox.upperZ, 0.01);
tearDownFreetype();
}
void testBitmapConstructor()
{
setUpFreetype( GOOD_FONT_FILE);
FT_Load_Char( face, CHARACTER_CODE_G, FT_LOAD_MONOCHROME);
CPPUNIT_ASSERT( ft_glyph_format_bitmap != face->glyph->format);
FTBBox boundingBox3( face->glyph);
CPPUNIT_ASSERT_DOUBLES_EQUAL( 2, boundingBox3.lowerX, 0.01);
CPPUNIT_ASSERT_DOUBLES_EQUAL( -15, boundingBox3.lowerY, 0.01);
CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, boundingBox3.lowerZ, 0.01);
CPPUNIT_ASSERT_DOUBLES_EQUAL( 35, boundingBox3.upperX, 0.01);
CPPUNIT_ASSERT_DOUBLES_EQUAL( 38, boundingBox3.upperY, 0.01);
CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, boundingBox3.upperZ, 0.01);
}
void testMoveBBox()
{
FTBBox boundingBox;
FTPoint firstMove( 3.5f, 1.0f, -2.5f);
FTPoint secondMove( -3.5f, -1.0f, 2.5f);
boundingBox.Move( firstMove);
CPPUNIT_ASSERT( boundingBox.lowerX == 3.5f);
CPPUNIT_ASSERT( boundingBox.lowerY == 1.0f);
CPPUNIT_ASSERT( boundingBox.lowerZ == -2.5f);
CPPUNIT_ASSERT( boundingBox.upperX == 3.5f);
CPPUNIT_ASSERT( boundingBox.upperY == 1.0f);
CPPUNIT_ASSERT( boundingBox.upperZ == -2.5f);
boundingBox.Move( secondMove);
CPPUNIT_ASSERT( boundingBox.lowerX == 0.0f);
CPPUNIT_ASSERT( boundingBox.lowerY == 0.0f);
CPPUNIT_ASSERT( boundingBox.lowerZ == 0.0f);
CPPUNIT_ASSERT( boundingBox.upperX == 0.0f);
CPPUNIT_ASSERT( boundingBox.upperY == 0.0f);
CPPUNIT_ASSERT( boundingBox.upperZ == 0.0f);
}
void testPlusEquals()
{
setUpFreetype( GOOD_FONT_FILE);
FTBBox boundingBox1;
FTBBox boundingBox2( face->glyph);
boundingBox1 += boundingBox2;
CPPUNIT_ASSERT_DOUBLES_EQUAL( 2, boundingBox2.lowerX, 0.01);
CPPUNIT_ASSERT_DOUBLES_EQUAL( -15, boundingBox2.lowerY, 0.01);
CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, boundingBox2.lowerZ, 0.01);
CPPUNIT_ASSERT_DOUBLES_EQUAL( 35, boundingBox2.upperX, 0.01);
CPPUNIT_ASSERT_DOUBLES_EQUAL( 38, boundingBox2.upperY, 0.01);
CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, boundingBox2.upperZ, 0.01);
float advance = 40;
boundingBox2.Move( FTPoint( advance, 0, 0));
boundingBox1 += boundingBox2;
CPPUNIT_ASSERT_DOUBLES_EQUAL( 42, boundingBox2.lowerX, 0.01);
CPPUNIT_ASSERT_DOUBLES_EQUAL( -15, boundingBox2.lowerY, 0.01);
CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, boundingBox2.lowerZ, 0.01);
CPPUNIT_ASSERT_DOUBLES_EQUAL( 75, boundingBox2.upperX, 0.01);
CPPUNIT_ASSERT_DOUBLES_EQUAL( 38, boundingBox2.upperY, 0.01);
CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, boundingBox2.upperZ, 0.01);
tearDownFreetype();
}
void testSetDepth()
{
setUpFreetype( GOOD_FONT_FILE);
FTBBox boundingBox( face->glyph);
boundingBox.SetDepth( 37.754);
CPPUNIT_ASSERT_DOUBLES_EQUAL( 2, boundingBox.lowerX, 0.01);
CPPUNIT_ASSERT_DOUBLES_EQUAL( -15, boundingBox.lowerY, 0.01);
CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, boundingBox.lowerZ, 0.01);
CPPUNIT_ASSERT_DOUBLES_EQUAL( 35, boundingBox.upperX, 0.01);
CPPUNIT_ASSERT_DOUBLES_EQUAL( 38, boundingBox.upperY, 0.01);
CPPUNIT_ASSERT_DOUBLES_EQUAL( 37.754, boundingBox.upperZ, 0.01);
tearDownFreetype();
}
void setUp()
{}
void tearDown()
{}
private:
FT_Library library;
FT_Face face;
void setUpFreetype(const char *fontName)
{
FT_Error error = FT_Init_FreeType( &library);
CPPUNIT_ASSERT(!error);
error = FT_New_Face( library, fontName, 0, &face);
CPPUNIT_ASSERT(!error);
FT_Set_Char_Size( face, 0L, FONT_POINT_SIZE * 64, RESOLUTION, RESOLUTION);
error = FT_Load_Char( face, CHARACTER_CODE_G, FT_LOAD_RENDER);
CPPUNIT_ASSERT(!error);
}
void tearDownFreetype()
{
FT_Done_Face( face);
FT_Done_FreeType( library);
}
};
CPPUNIT_TEST_SUITE_REGISTRATION( FTBBoxTest);