Blame tests/test-context.cc

Packit Service e3b512
// vim: ts=2 sw=2 et
Packit Service e3b512
/*
Packit Service e3b512
 * These tests are of limited usefulness.  In fact, you might even say that
Packit Service e3b512
 * they're not really tests at all.  But I felt that it would be useful to have
Packit Service e3b512
 * some basic usage of most functions just to verify that things compile and
Packit Service e3b512
 * work generally
Packit Service e3b512
 */
Packit Service e3b512
Packit Service e3b512
#include <cfloat>
Packit Service e3b512
#include <boost/test/unit_test.hpp>
Packit Service e3b512
#include <boost/test/test_tools.hpp>
Packit Service e3b512
#include <boost/test/floating_point_comparison.hpp>
Packit Service e3b512
using namespace boost::unit_test;
Packit Service e3b512
#include <cairomm/context.h>
Packit Service e3b512
#include <cairomm/scaledfont.h>
Packit Service e3b512
Packit Service e3b512
#define CREATE_CONTEXT(varname) \
Packit Service e3b512
  auto surf = Cairo::ImageSurface::create(Cairo::FORMAT_ARGB32, 10, 10); \
Packit Service e3b512
  auto cr = Cairo::Context::create(surf);
Packit Service e3b512
Packit Service e3b512
void
Packit Service e3b512
test_dashes ()
Packit Service e3b512
{
Packit Service e3b512
  CREATE_CONTEXT(cr);
Packit Service e3b512
  std::valarray<double> dash_array(4);
Packit Service e3b512
  dash_array[0] = 0.1;
Packit Service e3b512
  dash_array[1] = 0.2;
Packit Service e3b512
  dash_array[2] = 0.04;
Packit Service e3b512
  dash_array[3] = 0.31;
Packit Service e3b512
  cr->set_dash(dash_array, 0.54);
Packit Service e3b512
Packit Service e3b512
  std::vector<double> get_array;
Packit Service e3b512
  double get_offset;
Packit Service e3b512
  cr->get_dash (get_array, get_offset);
Packit Service e3b512
  BOOST_CHECK_EQUAL (dash_array[0], get_array[0]);
Packit Service e3b512
  BOOST_CHECK_EQUAL (dash_array[1], get_array[1]);
Packit Service e3b512
  BOOST_CHECK_EQUAL (dash_array[2], get_array[2]);
Packit Service e3b512
  BOOST_CHECK_EQUAL (dash_array[3], get_array[3]);
Packit Service e3b512
  BOOST_CHECK_EQUAL (0.54, get_offset);
Packit Service e3b512
Packit Service e3b512
  std::vector<double> dash_vect(4);
Packit Service e3b512
  dash_vect[0] = 0.5;
Packit Service e3b512
  dash_vect[1] = 0.25;
Packit Service e3b512
  dash_vect[2] = 0.93;
Packit Service e3b512
  dash_vect[3] = 1.31;
Packit Service e3b512
  cr->set_dash(dash_vect, 0.4);
Packit Service e3b512
Packit Service e3b512
  cr->get_dash (get_array, get_offset);
Packit Service e3b512
  BOOST_CHECK_EQUAL (dash_vect[0], get_array[0]);
Packit Service e3b512
  BOOST_CHECK_EQUAL (dash_vect[1], get_array[1]);
Packit Service e3b512
  BOOST_CHECK_EQUAL (dash_vect[2], get_array[2]);
Packit Service e3b512
  BOOST_CHECK_EQUAL (dash_vect[3], get_array[3]);
Packit Service e3b512
  BOOST_CHECK_EQUAL (0.4, get_offset);
Packit Service e3b512
Packit Service e3b512
  cr->unset_dash ();
Packit Service e3b512
  cr->get_dash (get_array, get_offset);
Packit Service e3b512
  BOOST_CHECK (get_array.empty ());
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
void
Packit Service e3b512
test_save_restore ()
Packit Service e3b512
{
Packit Service e3b512
  CREATE_CONTEXT(cr);
Packit Service e3b512
  cr->set_line_width (2.3);
Packit Service e3b512
  cr->save ();
Packit Service e3b512
  cr->set_line_width (4.0);
Packit Service e3b512
  BOOST_CHECK_EQUAL (4.0, cr->get_line_width ());
Packit Service e3b512
  cr->restore ();
Packit Service e3b512
  BOOST_CHECK_EQUAL (2.3, cr->get_line_width ());
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
void
Packit Service e3b512
test_operator ()
Packit Service e3b512
{
Packit Service e3b512
  CREATE_CONTEXT(cr);
Packit Service e3b512
  cr->set_operator (Cairo::OPERATOR_ATOP);
Packit Service e3b512
  BOOST_CHECK_EQUAL (Cairo::OPERATOR_ATOP, cr->get_operator ());
Packit Service e3b512
  cr->set_operator (Cairo::OPERATOR_CLEAR);
Packit Service e3b512
  BOOST_CHECK_EQUAL (Cairo::OPERATOR_CLEAR, cr->get_operator ());
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
void
Packit Service e3b512
test_source ()
Packit Service e3b512
{
Packit Service e3b512
  CREATE_CONTEXT(cr);
Packit Service e3b512
  auto solid_pattern =
Packit Service e3b512
    Cairo::SolidPattern::create_rgb (1.0, 0.5, 0.25);
Packit Service e3b512
  auto gradient_pattern =
Packit Service e3b512
    Cairo::LinearGradient::create (0.0, 0.0, 1.0, 1.0);
Packit Service e3b512
Packit Service e3b512
  cr->set_source (solid_pattern);
Packit Service e3b512
  {
Packit Service e3b512
    auto retrieved_solid =
Packit Service e3b512
      Cairo::RefPtr<Cairo::SolidPattern>::cast_dynamic(cr->get_source ());
Packit Service e3b512
    BOOST_REQUIRE (retrieved_solid);
Packit Service e3b512
    double r, g, b, a;
Packit Service e3b512
    retrieved_solid->get_rgba (r, g, b, a);
Packit Service e3b512
    BOOST_CHECK_EQUAL (1.0, r);
Packit Service e3b512
    BOOST_CHECK_EQUAL (0.5, g);
Packit Service e3b512
    BOOST_CHECK_EQUAL (0.25, b);
Packit Service e3b512
Packit Service e3b512
    // now try for const objects..
Packit Service e3b512
    auto cr2 = cr;
Packit Service e3b512
    auto retrieved_solid2 =
Packit Service e3b512
      Cairo::RefPtr<const Cairo::SolidPattern>::cast_dynamic(cr2->get_source ());
Packit Service e3b512
    BOOST_REQUIRE (retrieved_solid2);
Packit Service e3b512
  }
Packit Service e3b512
Packit Service e3b512
  cr->set_source (gradient_pattern);
Packit Service e3b512
  {
Packit Service e3b512
    auto retrieved_linear =
Packit Service e3b512
      Cairo::RefPtr<Cairo::LinearGradient>::cast_dynamic(cr->get_source ());
Packit Service e3b512
    BOOST_REQUIRE (retrieved_linear);
Packit Service e3b512
    double x0, x1, y0, y1;
Packit Service e3b512
    retrieved_linear->get_linear_points (x0, y0, x1, y1);
Packit Service e3b512
    BOOST_CHECK_EQUAL (0.0, x0);
Packit Service e3b512
    BOOST_CHECK_EQUAL (0.0, y0);
Packit Service e3b512
    BOOST_CHECK_EQUAL (1.0, x1);
Packit Service e3b512
    BOOST_CHECK_EQUAL (1.0, y1);
Packit Service e3b512
  }
Packit Service e3b512
Packit Service e3b512
  cr->set_source_rgb (1.0, 0.5, 0.25);
Packit Service e3b512
  {
Packit Service e3b512
    auto solid =
Packit Service e3b512
      Cairo::RefPtr<Cairo::SolidPattern>::cast_dynamic(cr->get_source ());
Packit Service e3b512
    BOOST_REQUIRE (solid);
Packit Service e3b512
    double rx, gx, bx, ax;
Packit Service e3b512
    solid->get_rgba (rx, gx, bx, ax);
Packit Service e3b512
    BOOST_CHECK_EQUAL (1.0, rx);
Packit Service e3b512
    BOOST_CHECK_EQUAL (0.5, gx);
Packit Service e3b512
    BOOST_CHECK_EQUAL (0.25, bx);
Packit Service e3b512
  }
Packit Service e3b512
  cr->set_source_rgba (0.1, 0.3, 0.5, 0.7);
Packit Service e3b512
  {
Packit Service e3b512
    auto solid =
Packit Service e3b512
      Cairo::RefPtr<Cairo::SolidPattern>::cast_dynamic(cr->get_source ());
Packit Service e3b512
    BOOST_REQUIRE (solid);
Packit Service e3b512
    double rx, gx, bx, ax;
Packit Service e3b512
    solid->get_rgba (rx, gx, bx, ax);
Packit Service e3b512
    BOOST_CHECK_EQUAL (0.1, rx);
Packit Service e3b512
    BOOST_CHECK_EQUAL (0.3, gx);
Packit Service e3b512
    BOOST_CHECK_EQUAL (0.5, bx);
Packit Service e3b512
    BOOST_CHECK_EQUAL (0.7, ax);
Packit Service e3b512
  }
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
void
Packit Service e3b512
test_tolerance ()
Packit Service e3b512
{
Packit Service e3b512
  CREATE_CONTEXT(cr);
Packit Service e3b512
  cr->set_tolerance (3.0);
Packit Service e3b512
  BOOST_CHECK_EQUAL (3.0, cr->get_tolerance ());
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
void
Packit Service e3b512
test_antialias ()
Packit Service e3b512
{
Packit Service e3b512
  CREATE_CONTEXT(cr);
Packit Service e3b512
  cr->set_antialias (Cairo::ANTIALIAS_GRAY);
Packit Service e3b512
  BOOST_CHECK_EQUAL (Cairo::ANTIALIAS_GRAY, cr->get_antialias ());
Packit Service e3b512
Packit Service e3b512
  cr->set_antialias (Cairo::ANTIALIAS_SUBPIXEL);
Packit Service e3b512
  BOOST_CHECK_EQUAL (Cairo::ANTIALIAS_SUBPIXEL, cr->get_antialias ());
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
void
Packit Service e3b512
test_fill_rule ()
Packit Service e3b512
{
Packit Service e3b512
  CREATE_CONTEXT(cr);
Packit Service e3b512
  cr->set_fill_rule (Cairo::FILL_RULE_EVEN_ODD);
Packit Service e3b512
  BOOST_CHECK_EQUAL (Cairo::FILL_RULE_EVEN_ODD, cr->get_fill_rule ());
Packit Service e3b512
  cr->set_fill_rule (Cairo::FILL_RULE_WINDING);
Packit Service e3b512
  BOOST_CHECK_EQUAL (Cairo::FILL_RULE_WINDING, cr->get_fill_rule ());
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
void
Packit Service e3b512
test_line_width ()
Packit Service e3b512
{
Packit Service e3b512
  CREATE_CONTEXT(cr);
Packit Service e3b512
  cr->set_line_width (1.0);
Packit Service e3b512
  BOOST_CHECK_EQUAL (1.0, cr->get_line_width ());
Packit Service e3b512
  cr->set_line_width (4.0);
Packit Service e3b512
  BOOST_CHECK_EQUAL (4.0, cr->get_line_width ());
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
void
Packit Service e3b512
test_line_cap ()
Packit Service e3b512
{
Packit Service e3b512
  CREATE_CONTEXT(cr);
Packit Service e3b512
  cr->set_line_cap (Cairo::LINE_CAP_BUTT);
Packit Service e3b512
  BOOST_CHECK_EQUAL (Cairo::LINE_CAP_BUTT, cr->get_line_cap ());
Packit Service e3b512
  cr->set_line_cap (Cairo::LINE_CAP_ROUND);
Packit Service e3b512
  BOOST_CHECK_EQUAL (Cairo::LINE_CAP_ROUND, cr->get_line_cap ());
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
void
Packit Service e3b512
test_line_join ()
Packit Service e3b512
{
Packit Service e3b512
  CREATE_CONTEXT(cr);
Packit Service e3b512
  cr->set_line_join (Cairo::LINE_JOIN_BEVEL);
Packit Service e3b512
  BOOST_CHECK_EQUAL (Cairo::LINE_JOIN_BEVEL, cr->get_line_join ());
Packit Service e3b512
  cr->set_line_join (Cairo::LINE_JOIN_MITER);
Packit Service e3b512
  BOOST_CHECK_EQUAL (Cairo::LINE_JOIN_MITER, cr->get_line_join ());
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
void
Packit Service e3b512
test_miter_limit ()
Packit Service e3b512
{
Packit Service e3b512
  CREATE_CONTEXT (cr);
Packit Service e3b512
  cr->set_miter_limit (1.3);
Packit Service e3b512
  BOOST_CHECK_EQUAL (1.3, cr->get_miter_limit ());
Packit Service e3b512
  cr->set_miter_limit (4.12);
Packit Service e3b512
  BOOST_CHECK_EQUAL (4.12, cr->get_miter_limit ());
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
void
Packit Service e3b512
test_matrix ()
Packit Service e3b512
{
Packit Service e3b512
  // just excercise the functionality
Packit Service e3b512
  CREATE_CONTEXT (cr);
Packit Service e3b512
  Cairo::Matrix matrix;
Packit Service e3b512
  cairo_matrix_init (&matrix, 1.0, 0.1, 0.1, 1.0, 1.5, 1.5);
Packit Service e3b512
  cr->transform(matrix);
Packit Service e3b512
  cairo_matrix_init (&matrix, 1.0, -0.1, -0.1, 1.0, 1.5, 1.5);
Packit Service e3b512
  cr->set_matrix(matrix);
Packit Service e3b512
  cr->set_identity_matrix ();
Packit Service e3b512
  cr->get_matrix (matrix);
Packit Service e3b512
  auto m2 = cr->get_matrix ();
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
void
Packit Service e3b512
test_user_device ()
Packit Service e3b512
{
Packit Service e3b512
  // scale / transform a context, and then verify that user-to-device and
Packit Service e3b512
  // device-to-user things work.
Packit Service e3b512
  CREATE_CONTEXT (cr);
Packit Service e3b512
  cr->scale (2.3, 2.3);
Packit Service e3b512
  double x = 1.8, y = 1.8;
Packit Service e3b512
  cr->user_to_device (x, y);
Packit Service e3b512
  // x = (0.0 + x) * 2.3 => 1.8 * 2.3 = 5.29
Packit Service e3b512
  BOOST_CHECK_EQUAL (4.14, x);
Packit Service e3b512
  BOOST_CHECK_EQUAL (4.14, y);
Packit Service e3b512
  cr->device_to_user (x, y);
Packit Service e3b512
  BOOST_CHECK_EQUAL (1.8, x);
Packit Service e3b512
  BOOST_CHECK_EQUAL (1.8, y);
Packit Service e3b512
  cr->translate (0.5, 0.5);
Packit Service e3b512
  cr->user_to_device (x, y);
Packit Service e3b512
  // x = (0.5 + x) * 2.3 => 2.3 * 2.3 = 5.29
Packit Service e3b512
  BOOST_CHECK_CLOSE (5.29, x, FLT_EPSILON);
Packit Service e3b512
  BOOST_CHECK_CLOSE (5.29, y, FLT_EPSILON);
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
void
Packit Service e3b512
test_draw ()
Packit Service e3b512
{
Packit Service e3b512
  CREATE_CONTEXT (cr);
Packit Service e3b512
  // just call a bunch of drawing functions to excercise them a bit.  There's no
Packit Service e3b512
  // rhyme or reason to this, don't expect it to draw anything interesting.
Packit Service e3b512
  cr->begin_new_path ();
Packit Service e3b512
  cr->move_to (1.0, 1.0);
Packit Service e3b512
  cr->line_to (2.0, 2.0);
Packit Service e3b512
  cr->curve_to (0.5, 0.5, 0.5, 0.5, 1.0, 1.0);
Packit Service e3b512
  cr->arc (1.5, 0.5, 0.5, 0, 2 * M_PI);
Packit Service e3b512
  cr->stroke ();
Packit Service e3b512
  cr->arc_negative (1.5, 0.5, 0.5, 0, 2 * M_PI);
Packit Service e3b512
  cr->rel_move_to (0.1, 0.1);
Packit Service e3b512
  cr->rel_line_to (0.5, -0.5);
Packit Service e3b512
  cr->rel_curve_to (0.5, 0.5, 0.5, 0.5, 1.0, 1.0);
Packit Service e3b512
  cr->rectangle (0.0, 0.0, 1.0, 1.0);
Packit Service e3b512
  cr->close_path ();
Packit Service e3b512
  cr->paint ();
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
void
Packit Service e3b512
test_clip ()
Packit Service e3b512
{
Packit Service e3b512
  CREATE_CONTEXT (cr);
Packit Service e3b512
  cr->rectangle (0.0, 0.0, 1.0, 1.0);
Packit Service e3b512
  cr->clip ();
Packit Service e3b512
  double x1, y1, x2, y2;
Packit Service e3b512
  cr->get_clip_extents (x1, y1, x2, y2);
Packit Service e3b512
  BOOST_CHECK (x1 == 0.0);
Packit Service e3b512
  BOOST_CHECK (y1 == 0.0);
Packit Service e3b512
  BOOST_CHECK (x2 == 1.0);
Packit Service e3b512
  BOOST_CHECK (y2 == 1.0);
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
void
Packit Service e3b512
test_current_point ()
Packit Service e3b512
{
Packit Service e3b512
  CREATE_CONTEXT (cr);
Packit Service e3b512
  cr->move_to (2.0, 3.0);
Packit Service e3b512
  double x, y;
Packit Service e3b512
  cr->get_current_point (x, y);
Packit Service e3b512
  BOOST_CHECK (x == 2.0);
Packit Service e3b512
  BOOST_CHECK (y == 3.0);
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
void
Packit Service e3b512
test_target ()
Packit Service e3b512
{
Packit Service e3b512
  auto surf = Cairo::ImageSurface::create(Cairo::FORMAT_ARGB32, 10, 10); \
Packit Service e3b512
  auto cr = Cairo::Context::create(surf);
Packit Service e3b512
Packit Service e3b512
  auto target_surface =
Packit Service e3b512
    Cairo::RefPtr<Cairo::ImageSurface>::cast_dynamic(cr->get_target ());
Packit Service e3b512
  auto bad_surface =
Packit Service e3b512
    Cairo::RefPtr<Cairo::PdfSurface>::cast_dynamic(cr->get_target ());
Packit Service e3b512
  BOOST_CHECK (target_surface);
Packit Service e3b512
  BOOST_CHECK (!bad_surface);
Packit Service e3b512
Packit Service e3b512
  // now check for const objects...
Packit Service e3b512
  auto cr2 = Cairo::Context::create(surf);
Packit Service e3b512
Packit Service e3b512
  auto target_surface2 =
Packit Service e3b512
    Cairo::RefPtr<const Cairo::ImageSurface>::cast_dynamic(cr2->get_target ());
Packit Service e3b512
  auto bad_surface2 =
Packit Service e3b512
    Cairo::RefPtr<const Cairo::PdfSurface>::cast_dynamic(cr2->get_target ());
Packit Service e3b512
  BOOST_CHECK (target_surface2);
Packit Service e3b512
  BOOST_CHECK (!bad_surface2);
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
void test_scaled_font()
Packit Service e3b512
{
Packit Service e3b512
  CREATE_CONTEXT (cr);
Packit Service e3b512
  auto face = Cairo::ToyFontFace::create("sans",
Packit Service e3b512
                                                                      Cairo::FONT_SLANT_NORMAL,
Packit Service e3b512
                                                                      Cairo::FONT_WEIGHT_NORMAL);
Packit Service e3b512
  Cairo::Matrix identity;
Packit Service e3b512
  cairo_matrix_init_identity(&identity);
Packit Service e3b512
  auto font = Cairo::ScaledFont::create(face,
Packit Service e3b512
                                                                    identity,
Packit Service e3b512
                                                                    identity,
Packit Service e3b512
                                                                    Cairo::FontOptions());
Packit Service e3b512
  BOOST_CHECK_NO_THROW(cr->set_scaled_font(font));
Packit Service e3b512
  // There's no operator== for ScaledFont, so I'm not sure if there's a way to
Packit Service e3b512
  // compare whether the font we get form get() is the same as the one we set
Packit Service e3b512
  // The following test fails
Packit Service e3b512
  //BOOST_CHECK_EQUAL(font, cr->get_scaled_font());
Packit Service e3b512
Packit Service e3b512
  //just put in a pseudo-test for now to excercise the API
Packit Service e3b512
  BOOST_CHECK(cr->get_scaled_font());
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
void test_font_options()
Packit Service e3b512
{
Packit Service e3b512
  CREATE_CONTEXT (cr);
Packit Service e3b512
  Cairo::FontOptions options;
Packit Service e3b512
  options.set_antialias(Cairo::ANTIALIAS_GRAY);
Packit Service e3b512
  cr->set_font_options(options);
Packit Service e3b512
  Cairo::FontOptions other;
Packit Service e3b512
  cr->get_font_options(other);
Packit Service e3b512
  BOOST_CHECK(options == other);
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
test_suite*
Packit Service e3b512
init_unit_test_suite(int argc, char* argv[])
Packit Service e3b512
{
Packit Service e3b512
  // compile even with -Werror
Packit Service e3b512
  if (argc && argv) {}
Packit Service e3b512
Packit Service e3b512
  test_suite* test= BOOST_TEST_SUITE( "Cairo::Context Tests" );
Packit Service e3b512
Packit Service e3b512
  test->add (BOOST_TEST_CASE (&test_dashes));
Packit Service e3b512
  test->add (BOOST_TEST_CASE (&test_save_restore));
Packit Service e3b512
  test->add (BOOST_TEST_CASE (&test_operator));
Packit Service e3b512
  test->add (BOOST_TEST_CASE (&test_source));
Packit Service e3b512
  test->add (BOOST_TEST_CASE (&test_tolerance));
Packit Service e3b512
  test->add (BOOST_TEST_CASE (&test_antialias));
Packit Service e3b512
  test->add (BOOST_TEST_CASE (&test_fill_rule));
Packit Service e3b512
  test->add (BOOST_TEST_CASE (&test_line_width));
Packit Service e3b512
  test->add (BOOST_TEST_CASE (&test_line_cap));
Packit Service e3b512
  test->add (BOOST_TEST_CASE (&test_line_join));
Packit Service e3b512
  test->add (BOOST_TEST_CASE (&test_miter_limit));
Packit Service e3b512
  test->add (BOOST_TEST_CASE (&test_matrix));
Packit Service e3b512
  test->add (BOOST_TEST_CASE (&test_user_device));
Packit Service e3b512
  test->add (BOOST_TEST_CASE (&test_draw));
Packit Service e3b512
  test->add (BOOST_TEST_CASE (&test_clip));
Packit Service e3b512
  test->add (BOOST_TEST_CASE (&test_current_point));
Packit Service e3b512
  test->add (BOOST_TEST_CASE (&test_target));
Packit Service e3b512
  test->add (BOOST_TEST_CASE (&test_scaled_font));
Packit Service e3b512
  test->add (BOOST_TEST_CASE (&test_font_options));
Packit Service e3b512
Packit Service e3b512
  return test;
Packit Service e3b512
}