efafb8d68e69e63d6840320f4f98001a7b206a17
[yaz-moved-to-github.git] / test / nfatest1.c
1 /*  Copyright (C) 2006, Index Data ApS
2  *  See the file LICENSE for details.
3  *
4  *  $Id: nfatest1.c,v 1.1 2006-05-03 09:04:33 heikki Exp $
5  *
6  */
7
8
9 #include <stdio.h>
10 #include <string.h>
11 #include <yaz/nfa.h>
12 #include <yaz/nmem.h>
13 #include <yaz/test.h>
14
15 #define VERBOSE 1
16
17 char *printfunc(void *result) {
18     static char buf[200];
19     sprintf(buf,"\"%s\"", (char*) result);
20     return buf;
21 }
22
23 void test_match(yaz_nfa *n, 
24         yaz_nfa_char *buf, int buflen, 
25         int expcode, char *expstr) {
26     yaz_nfa_char *c=buf;
27     void *resptr=0;
28     int i;
29     i=yaz_nfa_match(n,&c,buflen,&resptr);
30 #if VERBOSE    
31     printf("\n'%s' returned %d. Moved c by %d, and resulted in '%s'\n",
32             expstr, i, (c-buf),(char*)resptr);
33 #endif
34     YAZ_CHECK_EQ(i,expcode);
35     YAZ_CHECK_EQ(strcmp(expstr,(char*)resptr),0);
36 }
37
38 void construction_test() {
39     yaz_nfa* n= yaz_nfa_init();
40     yaz_nfa_state *s,*s0,*s1,*s2,*s3,*s4,*s5;
41     int i;
42     yaz_nfa_char seq1[]={'p','r','e','f','i','x',0};
43     yaz_nfa_char seq2[]={'p','r','e','l','i','m',0};
44     yaz_nfa_char tst1[]={'c','0'};
45     yaz_nfa_char tst2[]={'c','k','0'};
46     yaz_nfa_char tst3[]={'c','x','0'};
47     yaz_nfa_char tst4[]={'z','k','0'};
48     yaz_nfa_char tst5[]={'y','k','k','k','k','k','k','y','0'};
49     void *p;
50
51     YAZ_CHECK(n);
52
53     s=yaz_nfa_get_first(n);
54     YAZ_CHECK(!s);
55
56     s0=yaz_nfa_add_state(n);
57
58     s=yaz_nfa_get_first(n);
59     YAZ_CHECK(s);
60     s=yaz_nfa_get_next(n,s);
61     YAZ_CHECK(!s);
62
63     s1=yaz_nfa_add_state(n);
64     i=yaz_nfa_set_result(n,s1,"first");
65     YAZ_CHECK_EQ(i,0);
66
67     i=yaz_nfa_set_result(n,s1,"DUPLICATE");
68     YAZ_CHECK_EQ(i,1);
69
70     p=yaz_nfa_get_result(n,s1);
71     YAZ_CHECK(p);
72     YAZ_CHECK( strcmp((char*)p,"first")==0 );
73
74     i=yaz_nfa_set_result(n,s1,0);
75     YAZ_CHECK_EQ(i,0);
76     p=yaz_nfa_get_result(n,s1);
77     YAZ_CHECK(!p);
78     i=yaz_nfa_set_result(n,s1,"first");
79     YAZ_CHECK_EQ(i,0);
80     
81     s2=yaz_nfa_add_state(n);
82     s3=yaz_nfa_add_state(n);
83     yaz_nfa_set_result(n,s3,"a-k,x-z");
84
85     s=yaz_nfa_get_first(n);
86     YAZ_CHECK(s);
87     s=yaz_nfa_get_next(n,s);
88     YAZ_CHECK(s);
89
90     
91     yaz_nfa_add_transition(n,s0,s1,'a','k');
92     yaz_nfa_add_transition(n,s1,s1,'k','k');
93     yaz_nfa_add_transition(n,s0,s2,'p','p');
94     yaz_nfa_add_transition(n,s1,s3,'x','z');
95
96     s=yaz_nfa_add_range(n, 0, 'k','s' );
97     yaz_nfa_set_result(n,s,"K-S");
98
99     s4=yaz_nfa_add_range(n, s2, 'l','r' );
100     s5=yaz_nfa_add_range(n, s2, 'l','r' );
101     YAZ_CHECK((s4==s5));
102     s=yaz_nfa_add_range(n, 0, 'c','c' );
103
104     s=yaz_nfa_add_range(n, 0, 'z','z' );
105     yaz_nfa_add_empty_transition(n,s,s);
106     yaz_nfa_set_result(n,s,"loop");
107
108     s=yaz_nfa_add_range(n, 0, 'y','y' );
109     s1=yaz_nfa_add_state(n);
110     yaz_nfa_set_backref(n,s1,1,1);
111     yaz_nfa_add_empty_transition(n,s,s1);
112     s=s1;
113     yaz_nfa_add_transition(n,s,s,'k','k');
114     s=yaz_nfa_add_range(n, s, 'y','y' );
115     yaz_nfa_set_result(n,s,"y k+ y");
116     yaz_nfa_set_backref(n,s,1,0);
117
118     s=yaz_nfa_add_sequence(n, 0, seq1 ); 
119     yaz_nfa_set_result(n,s,"PREFIX");
120     s=yaz_nfa_add_sequence(n, 0, seq2 ); 
121     yaz_nfa_set_result(n,s,"PRELIM");
122
123 #if VERBOSE    
124     yaz_nfa_dump(0,n, printfunc);
125 #endif
126
127     test_match(n,seq2,3,YAZ_NFA_OVERRUN,"K-S");
128     test_match(n,seq2,6,YAZ_NFA_SUCCESS,"PRELIM");
129     test_match(n,tst1,3,YAZ_NFA_SUCCESS,"first");
130     test_match(n,tst2,3,YAZ_NFA_SUCCESS,"first");
131     test_match(n,tst3,3,YAZ_NFA_SUCCESS,"a-k,x-z");
132     test_match(n,tst4,9,YAZ_NFA_LOOP,"loop");
133     test_match(n,tst5,9,YAZ_NFA_SUCCESS,"y k+ y");
134
135     yaz_nfa_destroy(n);
136 }
137
138 int main(int argc, char **argv)
139 {
140     YAZ_CHECK_INIT(argc, argv);
141     nmem_init ();
142     construction_test();
143     nmem_exit ();
144     YAZ_CHECK_TERM;
145 }
146