tests: complete cpml-gobject coverage
[adg.git] / src / cpml / tests / test-gobject.c
blob40ad170237bc4503f4f87f49ba1e69318964268c
1 /* ADG - Automatic Drawing Generation
2 * Copyright (C) 2007-2015 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 <cpml.h>
25 static cairo_path_data_t data[] = {
26 { .header = { CPML_MOVE, 2 } },
27 { .point = { 1, 2 } },
28 { .header = { CPML_LINE, 2 } },
29 { .point = { 3, 4 } }
31 static cairo_path_t path = {
32 CAIRO_STATUS_SUCCESS,
33 data,
34 G_N_ELEMENTS(data)
38 static void
39 _cpml_test_primitive_deep_dup(void)
41 CpmlSegment segment = { &path, data, G_N_ELEMENTS(data) };
42 CpmlPrimitive primitive, *dup_primitive;
44 g_assert_null(cpml_primitive_deep_dup(NULL));
46 /* Test full duplication */
47 primitive.segment = &segment;
48 primitive.org = &data[1];
49 primitive.data = &data[2];
51 dup_primitive = cpml_primitive_deep_dup(&primitive);
52 g_assert_nonnull(dup_primitive);
53 g_assert_nonnull(dup_primitive->segment);
54 g_assert_nonnull(dup_primitive->org);
55 g_assert_nonnull(dup_primitive->data);
56 g_assert_false(dup_primitive->segment == primitive.segment);
57 g_assert_false(dup_primitive->org == primitive.org);
58 g_assert_false(dup_primitive->data == primitive.data);
59 g_free(dup_primitive);
61 /* Test duplication with NULL fields */
62 primitive.segment = NULL;
64 dup_primitive = cpml_primitive_deep_dup(&primitive);
65 g_assert_nonnull(dup_primitive);
66 g_assert_null(dup_primitive->segment);
67 g_assert_nonnull(dup_primitive->org);
68 g_assert_nonnull(dup_primitive->data);
69 g_free(dup_primitive);
71 primitive.org = NULL;
73 dup_primitive = cpml_primitive_deep_dup(&primitive);
74 g_assert_nonnull(dup_primitive);
75 g_assert_null(dup_primitive->segment);
76 g_assert_null(dup_primitive->org);
77 g_assert_nonnull(dup_primitive->data);
78 g_free(dup_primitive);
80 primitive.data = NULL;
82 dup_primitive = cpml_primitive_deep_dup(&primitive);
83 g_assert_nonnull(dup_primitive);
84 g_assert_null(dup_primitive->segment);
85 g_assert_null(dup_primitive->org);
86 g_assert_null(dup_primitive->data);
87 g_free(dup_primitive);
90 static void
91 _cpml_test_segment_deep_dup(void)
93 CpmlSegment segment, *dup_segment;
95 g_assert_null(cpml_segment_deep_dup(NULL));
97 /* Test full duplication */
98 segment.path = &path;
99 segment.data = data;
100 segment.num_data = G_N_ELEMENTS(data);
102 dup_segment = cpml_segment_deep_dup(&segment);
103 g_assert_nonnull(dup_segment);
104 g_assert_null(dup_segment->path);
105 g_assert_nonnull(dup_segment->data);
106 g_assert_false(dup_segment->data == segment.data);
107 g_assert_cmpint(dup_segment->num_data, ==, segment.num_data);
108 g_free(dup_segment);
110 /* Test duplication with NULL fields */
111 segment.path = NULL;
113 dup_segment = cpml_segment_deep_dup(&segment);
114 g_assert_nonnull(dup_segment);
115 g_assert_null(dup_segment->path);
116 g_assert_nonnull(dup_segment->data);
117 g_assert_false(dup_segment->data == segment.data);
118 g_assert_cmpint(dup_segment->num_data, ==, segment.num_data);
119 g_free(dup_segment);
121 segment.data = NULL;
123 dup_segment = cpml_segment_deep_dup(&segment);
124 g_assert_nonnull(dup_segment);
125 g_assert_cmpint(dup_segment->num_data, ==, 0);
126 g_assert_null(dup_segment->data);
127 g_free(dup_segment);
129 segment.data = data;
130 segment.num_data = 0;
132 dup_segment = cpml_segment_deep_dup(&segment);
133 g_assert_nonnull(dup_segment);
134 g_assert_cmpint(dup_segment->num_data, ==, 0);
135 g_assert_null(dup_segment->data);
136 g_free(dup_segment);
139 static void
140 _cpml_test_segment_deep_copy(void)
142 CpmlSegment original, *segment, *dup_segment;
144 original.path = &path;
145 original.data = data;
146 original.num_data = G_N_ELEMENTS(data);
148 /* Check it does not crash with NULL values */
149 cpml_segment_deep_copy(NULL, NULL);
150 cpml_segment_deep_copy(NULL, &original);
151 cpml_segment_deep_copy(&original, NULL);
153 /* Test full deep copy */
154 segment = cpml_segment_deep_dup(&original);
155 dup_segment = cpml_segment_deep_dup(segment);
156 dup_segment->data[0].point.x = 123;
157 dup_segment->data[0].point.y = 456;
158 dup_segment->data[2].point.x = 789;
159 dup_segment->data[2].point.y = 101;
160 cpml_segment_deep_copy(segment, dup_segment);
161 g_assert_cmpfloat(segment->data[0].point.x, ==, 123);
162 g_assert_cmpfloat(segment->data[0].point.y, ==, 456);
163 g_assert_cmpfloat(segment->data[2].point.x, ==, 789);
164 g_assert_cmpfloat(segment->data[2].point.y, ==, 101);
165 g_free(dup_segment);
166 g_free(segment);
168 /* Check segments with different num_data are not copied */
169 segment = cpml_segment_deep_dup(&original);
170 g_assert_cmpfloat(segment->data[0].point.x, !=, 123);
171 dup_segment = cpml_segment_deep_dup(segment);
172 dup_segment->num_data = 12;
173 dup_segment->data[0].point.x = 123;
174 cpml_segment_deep_copy(segment, dup_segment);
175 g_assert_cmpfloat(segment->data[0].point.x, !=, 123);
176 g_free(dup_segment);
177 g_free(segment);
182 main(int argc, char *argv[])
184 adg_test_init(&argc, &argv);
186 adg_test_add_boxed_checks("/cpml/pair/type/boxed", CPML_TYPE_PAIR, g_new0(CpmlPair, 1));
188 adg_test_add_boxed_checks("/cpml/primitive/type/boxed", CPML_TYPE_PRIMITIVE, g_new0(CpmlPrimitive, 1));
189 adg_test_add_func("/cpml/primitive/method/deep-dup", _cpml_test_primitive_deep_dup);
191 adg_test_add_boxed_checks("/cpml/segment/type/boxed", CPML_TYPE_SEGMENT, g_new0(CpmlSegment, 1));
192 adg_test_add_func("/cpml/segment/method/deep-dup", _cpml_test_segment_deep_dup);
193 adg_test_add_func("/cpml/segment/method/deep-copy", _cpml_test_segment_deep_copy);
195 adg_test_add_enum_checks("/cpml/curve-offset-algorithm/type/enum", CPML_TYPE_CURVE_OFFSET_ALGORITHM);
197 return g_test_run();