1 /* ADG - Automatic Drawing Generation
2 * Copyright (C) 2007-2021 Nicola Fontana <ntd at entidi.it>
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the
16 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17 * Boston, MA 02110-1301, USA.
26 _adg_path_callback(AdgTrail
*trail
, gpointer user_data
)
28 static cairo_path_data_t data
[] = {
29 { .header
= { CPML_MOVE
, 2 }},
31 { .header
= { CPML_LINE
, 2 }},
33 { .header
= { CPML_LINE
, 2 }},
36 static cairo_path_t path
= {
47 _adg_property_max_angle(void)
50 gdouble valid_value
, invalid_value
;
53 trail
= adg_trail_new(_adg_path_callback
, NULL
);
54 valid_value
= G_PI
/ 10;
55 invalid_value
= G_PI
+ 1;
57 /* Using the public APIs */
58 adg_trail_set_max_angle(trail
, valid_value
);
59 max_angle
= adg_trail_get_max_angle(trail
);
60 adg_assert_isapprox(max_angle
, valid_value
);
62 adg_trail_set_max_angle(trail
, invalid_value
);
63 max_angle
= adg_trail_get_max_angle(trail
);
64 g_assert_cmpfloat(max_angle
, !=, invalid_value
);
66 /* Using GObject property methods */
67 g_object_set(trail
, "max-angle", valid_value
, NULL
);
68 g_object_get(trail
, "max-angle", &max_angle
, NULL
);
69 adg_assert_isapprox(max_angle
, valid_value
);
71 g_object_set(trail
, "max-angle", invalid_value
, NULL
);
72 g_object_get(trail
, "max-angle", &max_angle
, NULL
);
73 g_assert_cmpfloat(max_angle
, !=, invalid_value
);
75 g_object_unref(trail
);
79 _adg_method_n_segments(void)
83 path
= adg_path_new();
86 g_assert_cmpuint(adg_trail_n_segments(NULL
), ==, 0);
88 /* Check empty path */
89 g_assert_cmpuint(adg_trail_n_segments(ADG_TRAIL(path
)), ==, 0);
91 /* Check single segment */
92 adg_path_move_to_explicit(path
, 0, 1);
93 adg_path_line_to_explicit(path
, 2, 3);
94 g_assert_cmpuint(adg_trail_n_segments(ADG_TRAIL(path
)), ==, 1);
96 adg_path_append_cairo_path(path
, adg_test_path());
98 /* Count segments on a more complex path */
99 g_assert_cmpuint(adg_trail_n_segments(ADG_TRAIL(path
)), ==, 5+1);
101 g_object_unref(path
);
105 _adg_method_put_segment(void)
111 path
= adg_path_new();
113 /* First segment: a simple CPML_LINE */
114 adg_path_move_to_explicit(path
, 1, 2);
115 adg_path_line_to_explicit(path
, 3, 4);
117 /* Second segment: a closed curve with a bogus CPML_MOVE prepended */
118 adg_path_move_to_explicit(path
, 5, 6);
119 adg_path_move_to_explicit(path
, 7, 8);
120 adg_path_curve_to_explicit(path
, 9, 10, 11, 12, 13, 14);
121 adg_path_close(path
);
124 adg_path_close(path
);
125 adg_path_arc_to_explicit(path
, 15, 16, 17, 18);
127 /* Third segment: a closed CPML_ARC */
128 adg_path_move_to_explicit(path
, 19, 20);
129 adg_path_arc_to_explicit(path
, 21, 22, 23, 24);
130 adg_path_close(path
);
133 adg_path_line_to_explicit(path
, 25, 26);
135 trail
= ADG_TRAIL(path
);
138 g_assert_false(adg_trail_put_segment(NULL
, 1, &segment
));
139 g_assert_false(adg_trail_put_segment(trail
, 0, &segment
));
140 g_assert_true(adg_trail_put_segment(trail
, 1, NULL
));
142 /* Check segment browsing */
143 g_assert_true(adg_trail_put_segment(trail
, 1, &segment
));
144 g_assert_cmpint(segment
.num_data
, ==, 4);
145 g_assert_cmpint(segment
.data
[0].header
.type
, ==, CPML_MOVE
);
146 g_assert_cmpint(segment
.data
[2].header
.type
, ==, CPML_LINE
);
148 g_assert_true(adg_trail_put_segment(trail
, 2, &segment
));
149 g_assert_cmpint(segment
.num_data
, ==, 7);
150 g_assert_cmpint(segment
.data
[0].header
.type
, ==, CPML_MOVE
);
151 g_assert_cmpint(segment
.data
[2].header
.type
, ==, CPML_CURVE
);
152 g_assert_cmpint(segment
.data
[6].header
.type
, ==, CPML_CLOSE
);
154 g_assert_true(adg_trail_put_segment(trail
, 3, &segment
));
155 g_assert_cmpint(segment
.num_data
, ==, 6);
156 g_assert_cmpint(segment
.data
[0].header
.type
, ==, CPML_MOVE
);
157 g_assert_cmpint(segment
.data
[2].header
.type
, ==, CPML_ARC
);
158 g_assert_cmpint(segment
.data
[5].header
.type
, ==, CPML_CLOSE
);
160 g_assert_false(adg_trail_put_segment(trail
, 4, &segment
));
162 g_object_unref(path
);
167 main(int argc
, char *argv
[])
169 adg_test_init(&argc
, &argv
);
171 adg_test_add_object_checks("/adg/trail/type/object", ADG_TYPE_TRAIL
);
172 adg_test_add_model_checks("/adg/trail/type/model", ADG_TYPE_TRAIL
);
174 g_test_add_func("/adg/trail/property/max-angle", _adg_property_max_angle
);
176 g_test_add_func("/adg/trail/method/n-segments", _adg_method_n_segments
);
177 g_test_add_func("/adg/trail/method/put-segment", _adg_method_put_segment
);