1 /* Copyright (C) 2013-2020 Roland Lutz
3 This program is free software; you can redistribute it and/or modify
4 it under the terms of the GNU General Public License as published by
5 the Free Software Foundation; either version 2 of the License, or
6 (at your option) any later version.
8 This program is distributed in the hope that it will be useful,
9 but WITHOUT ANY WARRANTY; without even the implied warranty of
10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 GNU General Public License for more details.
13 You should have received a copy of the GNU General Public License
14 along with this program; if not, write to the Free Software Foundation,
15 Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
17 #include <xornstorage.h>
22 #define NO_ERROR ((xorn_error_t) -1)
25 static void check_not_attached(xorn_revision_t rev
,
26 xorn_object_t ob0
, xorn_object_t ob1
)
28 xorn_object_t
*objects
;
31 assert(xorn_get_objects(rev
, &objects
, &count
) == 0);
32 assert(objects
!= NULL
);
34 assert(objects
[0] == ob0
);
35 assert(objects
[1] == ob1
);
38 assert(xorn_relocate_object(rev
, ob0
, NULL
, NULL
, NULL
) == 0);
40 assert(xorn_get_objects(rev
, &objects
, &count
) == 0);
41 assert(objects
!= NULL
);
43 assert(objects
[0] == ob1
);
44 assert(objects
[1] == ob0
);
47 assert(xorn_relocate_object(rev
, ob0
, NULL
, ob1
, NULL
) == 0);
50 static void check_attached(xorn_revision_t rev
,
51 xorn_object_t ob0
, xorn_object_t ob1
)
53 xorn_object_t
*objects
;
56 assert(xorn_get_objects(rev
, &objects
, &count
) == 0);
57 assert(objects
!= NULL
);
59 assert(objects
[0] == ob0
);
60 assert(objects
[1] == ob1
);
63 assert(xorn_relocate_object(rev
, ob0
, NULL
, NULL
, NULL
) == 0);
65 assert(xorn_get_objects(rev
, &objects
, &count
) == 0);
66 assert(objects
!= NULL
);
68 assert(objects
[0] == ob0
);
69 assert(objects
[1] == ob1
);
76 xorn_object_t ob0
, ob1
;
79 struct xornsch_line line_data
;
80 struct xornsch_net net_data
;
81 struct xornsch_component component_data
;
82 struct xornsch_text text_data
;
84 memset(&line_data
, 0, sizeof line_data
);
85 memset(&net_data
, 0, sizeof net_data
);
86 memset(&component_data
, 0, sizeof component_data
);
87 memset(&text_data
, 0, sizeof text_data
);
89 assert(rev
= xorn_new_revision(NULL
));
90 assert(ob0
= xornsch_add_line(rev
, &line_data
, NULL
));
91 assert(ob1
= xornsch_add_line(rev
, &line_data
, NULL
));
93 assert(xornsch_set_net_data(rev
, ob0
, &net_data
, NULL
) == 0);
94 assert(xornsch_set_text_data(rev
, ob1
, &text_data
, NULL
) == 0);
96 check_not_attached(rev
, ob0
, ob1
);
99 /* data can be set without the object being reordered */
101 assert(xornsch_set_line_data(rev
, ob0
, &line_data
, NULL
) == 0);
102 check_not_attached(rev
, ob0
, ob1
);
103 assert(xornsch_set_net_data(rev
, ob0
, &net_data
, NULL
) == 0);
104 check_not_attached(rev
, ob0
, ob1
);
106 assert(xornsch_set_line_data(rev
, ob1
, &line_data
, NULL
) == 0);
107 check_not_attached(rev
, ob0
, ob1
);
108 assert(xornsch_set_net_data(rev
, ob1
, &net_data
, NULL
) == 0);
109 check_not_attached(rev
, ob0
, ob1
);
111 /* objects are re-added at the end */
113 assert(xorn_delete_object(rev
, ob0
, NULL
) == 0);
114 assert(xornsch_set_line_data(rev
, ob0
, &line_data
, NULL
) == 0);
115 check_not_attached(rev
, ob1
, ob0
);
116 assert(xorn_delete_object(rev
, ob0
, NULL
) == 0);
117 assert(xornsch_set_line_data(rev
, ob0
, &line_data
, NULL
) == 0);
118 check_not_attached(rev
, ob1
, ob0
);
120 assert(xorn_delete_object(rev
, ob1
, NULL
) == 0);
121 assert(xornsch_set_line_data(rev
, ob1
, &line_data
, NULL
) == 0);
122 check_not_attached(rev
, ob0
, ob1
);
123 assert(xorn_delete_object(rev
, ob1
, NULL
) == 0);
124 assert(xornsch_set_line_data(rev
, ob1
, &line_data
, NULL
) == 0);
125 check_not_attached(rev
, ob0
, ob1
);
127 assert(xorn_delete_object(rev
, ob0
, NULL
) == 0);
128 assert(xornsch_set_net_data(rev
, ob0
, &net_data
, NULL
) == 0);
129 check_not_attached(rev
, ob1
, ob0
);
130 assert(xorn_delete_object(rev
, ob0
, NULL
) == 0);
131 assert(xornsch_set_net_data(rev
, ob0
, &net_data
, NULL
) == 0);
132 check_not_attached(rev
, ob1
, ob0
);
134 assert(xorn_delete_object(rev
, ob1
, NULL
) == 0);
135 assert(xornsch_set_net_data(rev
, ob1
, &net_data
, NULL
) == 0);
136 check_not_attached(rev
, ob0
, ob1
);
137 assert(xorn_delete_object(rev
, ob1
, NULL
) == 0);
138 assert(xornsch_set_net_data(rev
, ob1
, &net_data
, NULL
) == 0);
139 check_not_attached(rev
, ob0
, ob1
);
142 /* can change ob0 to any type while no object is attached */
145 assert(xornsch_set_line_data(rev
, ob0
, &line_data
, &err
) == 0);
146 assert(err
== NO_ERROR
);
147 check_not_attached(rev
, ob0
, ob1
);
150 assert(xornsch_set_component_data(
151 rev
, ob0
, &component_data
, &err
) == 0);
152 assert(err
== NO_ERROR
);
153 check_not_attached(rev
, ob0
, ob1
);
156 assert(xornsch_set_text_data(rev
, ob0
, &text_data
, &err
) == 0);
157 assert(err
== NO_ERROR
);
158 check_not_attached(rev
, ob0
, ob1
);
161 assert(xornsch_set_net_data(rev
, ob0
, &net_data
, &err
) == 0);
162 assert(err
== NO_ERROR
);
163 check_not_attached(rev
, ob0
, ob1
);
165 /* can change type of ob1 while not attached */
168 assert(xornsch_set_line_data(rev
, ob1
, &line_data
, &err
) == 0);
169 assert(err
== NO_ERROR
);
170 check_not_attached(rev
, ob0
, ob1
);
173 assert(xornsch_set_net_data(rev
, ob1
, &net_data
, &err
) == 0);
174 assert(err
== NO_ERROR
);
175 check_not_attached(rev
, ob0
, ob1
);
178 assert(xornsch_set_component_data(
179 rev
, ob1
, &component_data
, &err
) == 0);
180 assert(err
== NO_ERROR
);
181 check_not_attached(rev
, ob0
, ob1
);
184 assert(xornsch_set_text_data(rev
, ob1
, &text_data
, &err
) == 0);
185 assert(err
== NO_ERROR
);
186 check_not_attached(rev
, ob0
, ob1
);
189 assert(xorn_relocate_object(rev
, ob1
, ob0
, NULL
, NULL
) == 0);
190 check_attached(rev
, ob0
, ob1
);
193 /* can't change ob0 to line or text while an object is attached */
196 assert(xornsch_set_line_data(rev
, ob0
, &line_data
, &err
) == -1);
197 assert(err
== xorn_error_invalid_existing_child
);
198 check_attached(rev
, ob0
, ob1
);
201 assert(xornsch_set_net_data(rev
, ob0
, &net_data
, &err
) == 0);
202 assert(err
== NO_ERROR
);
203 check_attached(rev
, ob0
, ob1
);
206 assert(xornsch_set_component_data(
207 rev
, ob0
, &component_data
, &err
) == 0);
208 assert(err
== NO_ERROR
);
209 check_attached(rev
, ob0
, ob1
);
212 assert(xornsch_set_text_data(rev
, ob0
, &text_data
, &err
) == -1);
213 assert(err
== xorn_error_invalid_existing_child
);
214 check_attached(rev
, ob0
, ob1
);
216 /* can't change type of ob1 while attached */
219 assert(xornsch_set_line_data(rev
, ob1
, &line_data
, &err
) == -1);
220 assert(err
== xorn_error_invalid_parent
);
221 check_attached(rev
, ob0
, ob1
);
224 assert(xornsch_set_net_data(rev
, ob1
, &net_data
, &err
) == -1);
225 assert(err
== xorn_error_invalid_parent
);
226 check_attached(rev
, ob0
, ob1
);
229 assert(xornsch_set_component_data(
230 rev
, ob1
, &component_data
, &err
) == -1);
231 assert(err
== xorn_error_invalid_parent
);
232 check_attached(rev
, ob0
, ob1
);
235 assert(xornsch_set_text_data(rev
, ob1
, &text_data
, &err
) == 0);
236 assert(err
== NO_ERROR
);
237 check_attached(rev
, ob0
, ob1
);
240 xorn_free_revision(rev
);