Test of xref link functions.
[gedcom-parse.git] / t / src / update_gom.c
1 /* Test program for the Gedcom library.
2    Copyright (C) 2001, 2002 The Genes Development Team
3    This file is part of the Gedcom parser library.
4    Contributed by Peter Verthez <Peter.Verthez@advalvas.be>, 2001.
5
6    The Gedcom parser library is free software; you can redistribute it
7    and/or modify it under the terms of the GNU Lesser General Public
8    License as published by the Free Software Foundation; either
9    version 2.1 of the License, or (at your option) any later version.
10
11    The Gedcom parser library is distributed in the hope that it will be
12    useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14    Lesser General Public License for more details.
15
16    You should have received a copy of the GNU Lesser General Public
17    License along with the Gedcom parser library; if not, write to the
18    Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
19    02111-1307 USA.  */
20
21 /* $Id$ */
22 /* $Name$ */
23
24 #include "gedcom.h"
25 #include "gom.h"
26 #include "output.h"
27 #include "dump_gom.h"
28 #include "portability.h"
29 #include "string.h"
30 #include <locale.h>
31 #include <stdio.h>
32
33 void gedcom_message_handler(Gedcom_msg_type type, char *msg)
34 {
35   if (type == MESSAGE)
36     output(1, "MESSAGE: ");
37   else if (type == WARNING)
38     output(1, "WARNING: ");
39   else if (type == ERROR)
40     output(1, "ERROR: ");
41   output(1, "%s\n", msg);
42 }
43
44 void show_help ()
45 {
46   printf("gedcom-parse test program for libgedcom\n\n");
47   printf("Usage:  updategomtest [options]\n");
48   printf("Options:\n");
49   printf("  -h    Show this help text\n");
50   printf("  -q    No output to standard output\n");
51   printf("  -o <outfile>  File to generate output to (def. testgedcom.out)\n");
52 }
53
54 int test_string_functions()
55 {
56   struct header* head;
57   struct submitter* subm;
58   struct xref_value* xref;
59   char* value;
60   int conv_fails = 0;
61   const char* orig_source_id = "GEDCOM_PARSE";
62   const char* new_source_id = "TEST_UPDATE";
63   const char* new_submitter_name_utf8 = "Belgi\xC3\xAB";
64   const char* new_submitter_name_ansi = "Belgi\xEB";
65
66   head = gom_get_header();
67   if (head == NULL)
68     return 10;
69   
70   value = gom_get_string(head->source.id);
71   if (value == NULL)
72     return 11;
73   if (strcmp(value, orig_source_id))
74     return 12;
75
76   value = gom_set_string(&head->source.id, new_source_id);
77   if (value == NULL)
78     return 13;
79   if (strcmp(value, new_source_id))
80     return 14;
81
82   value = gom_get_string(head->source.id);
83   if (value == NULL)
84     return 15;
85   if (strcmp(value, new_source_id))
86     return 16;
87
88   xref = head->submitter;
89   if (xref == NULL)
90     return 17;
91   
92   subm = gom_get_submitter_by_xref(xref->string);
93   if (subm == NULL)
94     return 18;
95
96   value = gom_set_string(&subm->name, new_submitter_name_utf8);
97   if (value == NULL)
98     return 19;
99   if (strcmp(value, new_submitter_name_utf8))
100     return 20;
101
102   value = gom_get_string_for_locale(subm->name, &conv_fails);
103   if (value == NULL)
104     return 21;
105   if (!strcmp(value, new_submitter_name_utf8))
106     return 22;
107   if (conv_fails != 1)
108     return 23;
109
110   value = gom_set_string(&subm->name, new_submitter_name_ansi);
111   if (value != NULL)
112     return 24;
113   
114   value = gom_set_string_for_locale(&subm->name, new_submitter_name_ansi);
115   if (value != NULL)
116     return 25;
117
118   return 0;
119 }
120
121 char* print_date(const char* message, struct date_value* dv)
122 {
123   char* date_str;
124   output(0, "\n%s:", message);
125   show_date(dv);
126   date_str = gedcom_date_to_string(dv);
127   output(0, "String: '%s'\n", str_val(date_str));
128   return date_str;
129 }
130
131 int test_date_functions()
132 {
133   struct header* head;
134   struct date_value* dv;
135   char* date_str;
136   int normalized;
137   
138   head = gom_get_header();
139   if (head == NULL)
140     return 100;
141
142   dv = head->date;
143   if (dv != NULL)
144     return 101;
145
146   dv = gedcom_new_date_value(NULL);
147   if (dv == NULL)
148     return 102;
149
150   head->date = dv;
151   date_str = print_date("Initial date value", dv);
152   if (date_str[0])
153     return 103;
154
155   dv->date1.cal = CAL_GREGORIAN;
156   strcpy(dv->date1.year_str, "1990");
157   normalized = gedcom_normalize_date(DI_FROM_STRINGS, dv);
158   if (normalized != 0)
159     return 104;
160   date_str = print_date("Setting only year string", dv);
161   if (! date_str[0])
162     return 105;
163
164   dv->date1.year = 1989;
165   normalized = gedcom_normalize_date(DI_FROM_NUMBERS, dv);
166   if (normalized != 0)
167     return 106;
168   date_str = print_date("Setting only year number", dv);
169   if (! date_str[0])
170     return 107;
171
172   dv->date1.type = DATE_EXACT;
173   dv->date1.sdn1 = 2500000;
174   dv->date1.sdn2 = -1;
175   normalized = gedcom_normalize_date(DI_FROM_SDN, dv);
176   if (normalized != 0)
177     return 108;
178   date_str = print_date("Setting only SDN 1", dv);
179   if (! date_str[0])
180     return 109;
181
182   dv->date1.cal = CAL_HEBREW;
183   normalized = gedcom_normalize_date(DI_FROM_SDN, dv);  
184   if (normalized != 0)
185     return 110;
186   date_str = print_date("Same date in Hebrew calendar", dv);
187   if (! date_str[0])
188     return 111;
189
190   dv->date1.cal = CAL_FRENCH_REV;
191   normalized = gedcom_normalize_date(DI_FROM_SDN, dv);  
192   if (normalized == 0)
193     return 112;
194   date_str = print_date("Same date in French revolution calendar", dv);
195   if (date_str[0])
196     return 113;
197
198   dv->date1.cal = CAL_GREGORIAN;
199   dv->date1.day = 4;
200   dv->date1.month = 2;
201   dv->date1.year = 1799;
202   normalized = gedcom_normalize_date(DI_FROM_NUMBERS, dv);
203   if (normalized != 0)
204     return 114;
205   dv->date1.cal = CAL_FRENCH_REV;
206   normalized = gedcom_normalize_date(DI_FROM_SDN, dv);
207   if (normalized != 0)
208     return 115;
209   date_str = print_date("Valid French revolution date", dv);
210   if (! date_str[0])
211     return 116;
212
213   return 0;
214 }
215
216 int test_record_add_delete_functions()
217 {
218   struct family* fam1;
219   struct individual* ind1;
220   struct multimedia* mm1;
221   struct note* note1;
222   struct repository* repo1;
223   struct source* sour1;
224   struct submitter* subm2;
225   struct submission* subn1;
226   struct user_rec* user1;
227   struct xref_value* xr;
228   int result;
229   char* value;
230   const char* new_nr_of_children = "3";
231   const char* note_text = "This is some text";
232
233   fam1 = gom_add_family("@FAM1@");
234   if (!fam1) return 201;
235   
236   value = gom_set_string(&fam1->nr_of_children, new_nr_of_children);
237   if (value == NULL)
238     return 202;
239   if (strcmp(value, new_nr_of_children))
240     return 203;
241
242   ind1 = gom_add_individual("@FAM1@");
243   if (ind1) return 204;
244
245   ind1 = gom_add_individual("@IND1@");
246   if (!ind1) return 205;
247
248   mm1 = gom_add_multimedia("@OBJ1@");
249   if (!mm1) return 206;
250
251   note1 = gom_add_note("@NOTE1@");
252   if (!note1) return 207;
253   
254   value = gom_set_string(&note1->text, note_text);
255   if (value == NULL)
256     return 208;
257   if (strcmp(value, note_text))
258     return 209;
259
260   repo1 = gom_add_repository("@REPO1@");
261   if (!repo1) return 210;
262
263   sour1 = gom_add_source("@SOUR1@");
264   if (!sour1) return 211;
265
266   subm2 = gom_add_submitter("@SUBMITTER@");
267   if (subm2) return 212;
268
269   subm2 = gom_add_submitter("@SUBM2@");
270   if (!subm2) return 213;
271
272   subn1 = gom_add_submission("@SUBMISSION@");
273   if (!subn1) return 214;
274
275   user1 = gom_add_user_rec("@USER1@", "WRTAG");
276   if (user1) return 215;
277
278   user1 = gom_add_user_rec("@USER1@", "_TAG");
279   if (!user1) return 216;
280
281   xr = gom_make_individual_link(ind1);
282   if (!xr) return 217;
283
284   xr = gom_set_xref_value(&(fam1->husband), xr);
285   if (!xr) return 218;
286
287   output(0, "Intermediate output:\n");
288   show_data();
289
290   result = gom_delete_individual(ind1);
291   if (result == 0) return 251;
292
293   xr = gom_set_xref_value(&(fam1->husband), NULL);
294   if (xr) return 252;
295
296   result = gom_delete_individual(ind1);
297   if (result != 0) return 253;
298
299   result = gom_delete_family(fam1);
300   if (result != 0) return 250;
301
302   result = gom_delete_multimedia(mm1);
303   if (result != 0) return 254;
304
305   result = gom_delete_note(note1);
306   if (result != 0) return 255;
307
308   result = gom_delete_repository(repo1);
309   if (result != 0) return 256;
310
311   result = gom_delete_source(sour1);
312   if (result != 0) return 257;
313
314   result = gom_delete_submitter(subm2);
315   if (result != 0) return 258;
316
317   result = gom_delete_submission(subn1);
318   if (result != 0) return 259;
319
320   result = gom_delete_user_rec(user1);
321   if (result != 0) return 260;
322   
323   return 0;
324 }
325
326 int main(int argc, char* argv[])
327 {
328   int result;
329   char* outfilename = NULL;
330   
331   if (argc > 1) {
332     int i;
333     for (i=1; i<argc; i++) {
334       if (!strncmp(argv[i], "-h", 3)) {
335         show_help();
336         exit(1);
337       }
338       else if (!strncmp(argv[i], "-q", 3)) {
339         output_set_quiet(1);
340       }
341       else if (!strncmp(argv[i], "-o", 3)) {
342         i++;
343         if (i < argc) {
344           outfilename = argv[i];
345         }
346         else {
347           printf ("Missing output file name\n");
348           show_help();
349           exit(1);
350         }
351       }
352       else {
353         printf ("Unrecognized option: %s\n", argv[i]);
354         show_help();
355         exit(1);
356       }
357     }
358   }
359   
360   gedcom_init();
361   setlocale(LC_ALL, "");
362   gedcom_set_message_handler(gedcom_message_handler);
363
364   output_open(outfilename);
365   
366   result = gom_new_model();
367   if (result == 0)
368     result |= test_string_functions();
369   if (result == 0)
370     result |= test_date_functions();
371   if (result == 0)
372     result |= test_record_add_delete_functions();
373   if (result == 0) {
374     output(1, "Test succeeded\n");
375   }
376   else {
377     output(1, "Test failed: %d\n", result);
378   }
379
380   show_data();
381   output_close();
382   return result;
383 }