#include #include "vkvg.h" #include "unitTest.h" #define EXPECT_CP(x, y) \ { \ vkvg_get_current_point(ctx, &a, &b); \ EXPECT_FLOAT_EQ(x, a); \ EXPECT_FLOAT_EQ(y, b); \ } #define EXPECT_NO_CP() \ { \ EXPECT_EQ(false, vkvg_has_current_point(ctx)); \ EXPECT_CP(0, 0); \ } // The fixture for testing class Foo. class ContextTest : public testing::Test { public: VkvgDevice dev; VkvgSurface surf; protected: // You can remove any or all of the following functions if their bodies would // be empty. ContextTest() { vkvg_device_create_info_t info{}; dev = vkvg_device_create(&info); surf = vkvg_surface_create(dev, 512, 512); } ~ContextTest() override { vkvg_surface_destroy(surf); vkvg_device_destroy(dev); } void SetUp() override {} void TearDown() override {} }; TEST_F(ContextTest, CtxCreate) { EXPECT_EQ(VKVG_STATUS_NULL_POINTER, vkvg_status(NULL)); VkvgContext ctx = vkvg_create(NULL); EXPECT_EQ(VKVG_STATUS_INVALID_SURFACE, vkvg_status(ctx)); ctx = vkvg_create(surf); EXPECT_EQ(VKVG_STATUS_SUCCESS, vkvg_status(ctx)); EXPECT_EQ(VKVG_STATUS_SUCCESS, vkvg_device_status(dev)); EXPECT_EQ(VKVG_STATUS_SUCCESS, vkvg_surface_status(surf)); vkvg_destroy(ctx); } TEST_F(ContextTest, CtxReference) { EXPECT_EQ(0, vkvg_get_reference_count(NULL)); VkvgContext ctx = vkvg_create(NULL); EXPECT_EQ(0, vkvg_get_reference_count(ctx)); ctx = vkvg_create(surf); EXPECT_EQ(VKVG_STATUS_SUCCESS, vkvg_status(ctx)); EXPECT_EQ(VKVG_STATUS_SUCCESS, vkvg_device_status(dev)); EXPECT_EQ(VKVG_STATUS_SUCCESS, vkvg_surface_status(surf)); EXPECT_EQ(1, vkvg_get_reference_count(ctx)); EXPECT_EQ(2, vkvg_surface_get_reference_count(surf)); EXPECT_EQ(2, vkvg_device_get_reference_count(dev)); vkvg_reference(ctx); EXPECT_EQ(2, vkvg_get_reference_count(ctx)); vkvg_destroy(ctx); EXPECT_EQ(1, vkvg_get_reference_count(ctx)); vkvg_destroy(ctx); EXPECT_EQ(VKVG_STATUS_SUCCESS, vkvg_device_status(dev)); EXPECT_EQ(VKVG_STATUS_SUCCESS, vkvg_surface_status(surf)); // EXPECT_EQ(0, vkvg_get_reference_count(ctx)); EXPECT_EQ(1, vkvg_surface_get_reference_count(surf)); EXPECT_EQ(2, vkvg_device_get_reference_count(dev)); } TEST_F(ContextTest, CtxDrawBasicNullContext) { // test method with context in error VkvgContext ctx = vkvg_create(NULL); EXPECT_NO_FATAL_FAILURE(vkvg_new_path(ctx)); EXPECT_NO_FATAL_FAILURE(vkvg_close_path(ctx)); EXPECT_NO_FATAL_FAILURE(vkvg_new_sub_path(ctx)); EXPECT_NO_FATAL_FAILURE(vkvg_path_extents(ctx, NULL, NULL, NULL, NULL)); EXPECT_NO_FATAL_FAILURE(vkvg_get_current_point(ctx, NULL, NULL)); EXPECT_NO_FATAL_FAILURE(vkvg_line_to(ctx, 0, 0)); EXPECT_NO_FATAL_FAILURE(vkvg_rel_line_to(ctx, 0, 0)); EXPECT_NO_FATAL_FAILURE(vkvg_move_to(ctx, 0, 0)); EXPECT_NO_FATAL_FAILURE(vkvg_rel_move_to(ctx, 0, 0)); EXPECT_NO_FATAL_FAILURE(vkvg_arc(ctx, 0, 0, 0, 0, 0)); EXPECT_NO_FATAL_FAILURE(vkvg_arc_negative(ctx, 0, 0, 0, 0, 0)); EXPECT_NO_FATAL_FAILURE(vkvg_curve_to(ctx, 0, 0, 0, 0, 0, 0)); EXPECT_NO_FATAL_FAILURE(vkvg_rel_curve_to(ctx, 0, 0, 0, 0, 0, 0)); EXPECT_NO_FATAL_FAILURE(vkvg_quadratic_to(ctx, 0, 0, 0, 0)); EXPECT_NO_FATAL_FAILURE(vkvg_rel_quadratic_to(ctx, 0, 0, 0, 0)); EXPECT_NO_FATAL_FAILURE(vkvg_rectangle(ctx, 0, 0, 0, 0)); EXPECT_NO_FATAL_FAILURE(vkvg_rounded_rectangle(ctx, 0, 0, 0, 0, 0)); EXPECT_NO_FATAL_FAILURE(vkvg_rounded_rectangle2(ctx, 0, 0, 0, 0, 0, 0)); EXPECT_NO_FATAL_FAILURE(vkvg_ellipse(ctx, 0, 0, 0, 0, 0)); EXPECT_NO_FATAL_FAILURE(vkvg_elliptic_arc_to(ctx, 0, 0, 0, 0, 0, 0, 0)); EXPECT_NO_FATAL_FAILURE(vkvg_rel_elliptic_arc_to(ctx, 0, 0, 0, 0, 0, 0, 0)); EXPECT_NO_FATAL_FAILURE(vkvg_stroke(ctx)); EXPECT_NO_FATAL_FAILURE(vkvg_stroke_preserve(ctx)); EXPECT_NO_FATAL_FAILURE(vkvg_fill(ctx)); EXPECT_NO_FATAL_FAILURE(vkvg_fill_preserve(ctx)); EXPECT_NO_FATAL_FAILURE(vkvg_paint(ctx)); EXPECT_NO_FATAL_FAILURE(vkvg_clear(ctx)); EXPECT_NO_FATAL_FAILURE(vkvg_reset_clip(ctx)); EXPECT_NO_FATAL_FAILURE(vkvg_clip(ctx)); EXPECT_NO_FATAL_FAILURE(vkvg_clip_preserve(ctx)); EXPECT_NO_FATAL_FAILURE(vkvg_set_opacity(ctx, 0)); EXPECT_EQ(0, vkvg_get_opacity(ctx)); EXPECT_NO_FATAL_FAILURE(vkvg_set_source_color(ctx, 0)); EXPECT_NO_FATAL_FAILURE(vkvg_set_source_rgb(ctx, 0, 0, 0)); EXPECT_NO_FATAL_FAILURE(vkvg_set_source_rgba(ctx, 0, 0, 0, 0)); EXPECT_NO_FATAL_FAILURE(vkvg_set_source_surface(ctx, NULL, 0, 0)); EXPECT_NO_FATAL_FAILURE(vkvg_set_source(ctx, NULL)); EXPECT_NO_FATAL_FAILURE(vkvg_set_line_width(ctx, 0)); EXPECT_NO_FATAL_FAILURE(vkvg_set_miter_limit(ctx, 0)); EXPECT_EQ(0, vkvg_get_miter_limit(ctx)); EXPECT_NO_FATAL_FAILURE(vkvg_set_line_cap(ctx, VKVG_LINE_CAP_ROUND)); EXPECT_NO_FATAL_FAILURE(vkvg_set_line_join(ctx, VKVG_LINE_JOIN_MITER)); EXPECT_NO_FATAL_FAILURE(vkvg_set_operator(ctx, VKVG_OPERATOR_OVER)); EXPECT_NO_FATAL_FAILURE(vkvg_set_fill_rule(ctx, VKVG_FILL_RULE_EVEN_ODD)); EXPECT_NO_FATAL_FAILURE(vkvg_set_dash(ctx, NULL, 0, 0)); EXPECT_NO_FATAL_FAILURE(vkvg_get_dash(ctx, NULL, NULL, NULL)); EXPECT_EQ(0, vkvg_get_line_width(ctx)); EXPECT_EQ(VKVG_LINE_CAP_BUTT, vkvg_get_line_cap(ctx)); EXPECT_EQ(VKVG_LINE_JOIN_MITER, vkvg_get_line_join(ctx)); EXPECT_EQ(VKVG_OPERATOR_OVER, vkvg_get_operator(ctx)); EXPECT_EQ(VKVG_FILL_RULE_NON_ZERO, vkvg_get_fill_rule(ctx)); EXPECT_NO_FATAL_FAILURE(vkvg_get_source(ctx)); EXPECT_NO_FATAL_FAILURE(vkvg_get_target(ctx)); EXPECT_EQ(false, vkvg_has_current_point(ctx)); EXPECT_NO_FATAL_FAILURE(vkvg_save(ctx)); EXPECT_NO_FATAL_FAILURE(vkvg_restore(ctx)); EXPECT_NO_FATAL_FAILURE(vkvg_translate(ctx, 0, 0)); EXPECT_NO_FATAL_FAILURE(vkvg_scale(ctx, 0, 0)); EXPECT_NO_FATAL_FAILURE(vkvg_rotate(ctx, 0)); EXPECT_NO_FATAL_FAILURE(vkvg_transform(ctx, NULL)); EXPECT_NO_FATAL_FAILURE(vkvg_set_matrix(ctx, NULL)); EXPECT_NO_FATAL_FAILURE(vkvg_get_matrix(ctx, NULL)); EXPECT_NO_FATAL_FAILURE(vkvg_identity_matrix(ctx)); EXPECT_NO_FATAL_FAILURE(vkvg_select_font_face(ctx, NULL)); EXPECT_NO_FATAL_FAILURE(vkvg_load_font_from_path(ctx, NULL, NULL)); EXPECT_NO_FATAL_FAILURE(vkvg_load_font_from_memory(ctx, NULL, 0, NULL)); EXPECT_NO_FATAL_FAILURE(vkvg_set_font_size(ctx, 0)); EXPECT_NO_FATAL_FAILURE(vkvg_show_text(ctx, NULL)); EXPECT_NO_FATAL_FAILURE(vkvg_text_extents(ctx, NULL, NULL)); EXPECT_NO_FATAL_FAILURE(vkvg_font_extents(ctx, NULL)); vkvg_text_run_create(ctx, NULL); vkvg_text_run_create_with_length(ctx, NULL, 10); // vkvg_text_run_destroy(NULL); vkvg_show_text_run(ctx, NULL); } TEST_F(ContextTest, CtxBasicPathCommands) { float a = 0.0, b = 0.0, c = 0.0, d = 0.0; VkvgContext ctx = vkvg_create(surf); EXPECT_NO_CP(); EXPECT_NO_FATAL_FAILURE(vkvg_new_path(ctx)); EXPECT_NO_FATAL_FAILURE(vkvg_close_path(ctx)); EXPECT_NO_FATAL_FAILURE(vkvg_new_sub_path(ctx)); EXPECT_NO_FATAL_FAILURE(vkvg_path_extents(ctx, &a, &b, &c, &d)); EXPECT_FLOAT_EQ(0, a && b && c && d); EXPECT_NO_CP(); vkvg_line_to(ctx, 50, 10); EXPECT_CP(50, 10); vkvg_move_to(ctx, 10, 50); EXPECT_EQ(true, vkvg_has_current_point(ctx)); EXPECT_CP(10, 50); vkvg_line_to(ctx, 50, 10); EXPECT_CP(50, 10); vkvg_rel_line_to(ctx, 10, 10); EXPECT_CP(60, 20); vkvg_close_path(ctx); EXPECT_NO_CP(); vkvg_line_to(ctx, 50, 10); vkvg_rel_line_to(ctx, 10, 10); vkvg_new_sub_path(ctx); EXPECT_NO_CP(); vkvg_line_to(ctx, 50, 10); vkvg_rel_line_to(ctx, 10, 10); vkvg_new_path(ctx); EXPECT_NO_CP(); EXPECT_EQ(VKVG_STATUS_SUCCESS, vkvg_status(ctx)); vkvg_destroy(ctx); } TEST_F(ContextTest, CtxSaveRestore) { vkvg_matrix_t mat = {1, 0, 0, 1, 0, 0}; VkvgContext ctx = vkvg_create(surf); vkvg_save(ctx); EXPECT_EQ(VKVG_STATUS_SUCCESS, vkvg_status(ctx)); vkvg_set_opacity(ctx, 0.5f); vkvg_set_line_width(ctx, 1.5f); vkvg_set_miter_limit(ctx, 0.3f); vkvg_set_line_cap(ctx, VKVG_LINE_CAP_BUTT); vkvg_set_line_join(ctx, VKVG_LINE_JOIN_BEVEL); vkvg_set_operator(ctx, VKVG_OPERATOR_SOURCE); vkvg_set_fill_rule(ctx, VKVG_FILL_RULE_NON_ZERO); const float dash[]{0.1f,0.5f}; vkvg_set_dash(ctx, dash, 2, 0.5f); vkvg_translate(ctx, 10, 10); vkvg_set_font_size(ctx, 30); vkvg_select_font_face(ctx, "mono"); vkvg_set_source_color(ctx, 0xFAFAFAFA); vkvg_move_to(ctx, 200, 250); vkvg_restore(ctx); EXPECT_EQ(VKVG_STATUS_SUCCESS, vkvg_status(ctx)); EXPECT_EQ(1, vkvg_get_opacity(ctx)); EXPECT_EQ(VKVG_LINE_CAP_BUTT, vkvg_get_line_cap(ctx)); EXPECT_EQ(VKVG_LINE_JOIN_MITER, vkvg_get_line_join(ctx)); EXPECT_EQ(VKVG_OPERATOR_OVER, vkvg_get_operator(ctx)); EXPECT_EQ(VKVG_FILL_RULE_NON_ZERO, vkvg_get_fill_rule(ctx)); EXPECT_EQ(10, vkvg_get_miter_limit(ctx)); EXPECT_EQ(1, vkvg_get_line_width(ctx)); vkvg_get_matrix(ctx, &mat); CHECK_MAT(1, 0, 0, 1, 0, 0); vkvg_save(ctx); EXPECT_EQ(VKVG_STATUS_SUCCESS, vkvg_status(ctx)); VkvgSurface surf2 = vkvg_surface_create(dev, 256, 256); vkvg_set_source_surface(ctx, surf2, 10, 10); vkvg_paint(ctx); vkvg_restore(ctx); VkvgPattern srcPat = vkvg_get_source(ctx); /*vkvg_set_source_rgb(ctx, 0.4f, 0.5f, 0.6f); vkvg_set_source_rgba(ctx, 0.4f, 0.5f, 0.6f, 0.5f); vkvg_set_source(ctx, NULL);*/ //EXPECT_EQ(VKVG_STATUS_SUCCESS, vkvg_status(ctx)); }