doc: update copyright line for 2021
[adg.git] / src / adg / tests / test-trail.c
blob6a099157131f74af6369f8e71b5fde7d972ab2de
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.
21 #include <adg-test.h>
22 #include <adg.h>
25 static cairo_path_t *
26 _adg_path_callback(AdgTrail *trail, gpointer user_data)
28 static cairo_path_data_t data[] = {
29 { .header = { CPML_MOVE, 2 }},
30 { .point = { 0, 1 }},
31 { .header = { CPML_LINE, 2 }},
32 { .point = { 2, 3 }},
33 { .header = { CPML_LINE, 2 }},
34 { .point = { 4, 5 }}
36 static cairo_path_t path = {
37 CAIRO_STATUS_SUCCESS,
38 data,
39 G_N_ELEMENTS(data)
42 return &path;
46 static void
47 _adg_property_max_angle(void)
49 AdgTrail *trail;
50 gdouble valid_value, invalid_value;
51 gdouble max_angle;
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);
78 static void
79 _adg_method_n_segments(void)
81 AdgPath *path;
83 path = adg_path_new();
85 /* Sanity checks */
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);
104 static void
105 _adg_method_put_segment(void)
107 AdgTrail *trail;
108 AdgPath *path;
109 CpmlSegment segment;
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);
123 /* Junk */
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);
132 /* Other junk */
133 adg_path_line_to_explicit(path, 25, 26);
135 trail = ADG_TRAIL(path);
137 /* Sanity checks */
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);
179 return g_test_run();