Higher-level interfaces, fixing the bugs these uncovered.
[yaz-moved-to-github.git] / test / nfatest1.c
index 3d14b30..2d4c8ab 100644 (file)
@@ -1,7 +1,7 @@
 /*  Copyright (C) 2006, Index Data ApS
  *  See the file LICENSE for details.
  *
- *  $Id: nfatest1.c,v 1.5 2006-05-05 14:02:27 heikki Exp $
+ *  $Id: nfatest1.c,v 1.6 2006-05-10 13:58:47 heikki Exp $
  *
  */
 
@@ -12,7 +12,6 @@
 #include <yaz/nmem.h>
 #include <yaz/test.h>
 
-#define VERBOSE 0
 
 char *printfunc(void *result) {
     static char buf[200];
@@ -35,26 +34,23 @@ void test_match(yaz_nfa *n,
     int i, bi;
     size_t buflen2 = buflen;
     i = yaz_nfa_match(n,&c, &buflen2,&resptr);
-#if VERBOSE    
-    printf("\n'%s' returned %d. Moved c by %d, and resulted in '%s'\n",
+    if (yaz_test_get_verbosity()>3)
+        printf("\n'%s' returned %d. Moved c by %d, and resulted in '%s'\n",
             expstr, i, (c-buf),(char*)resptr);
-#endif
     YAZ_CHECK_EQ(buflen-buflen2, c-buf);
     YAZ_CHECK_EQ(i, expcode);
-    if (i!=1)
+    if (i==0)
         YAZ_CHECK_EQ(strcmp(expstr,(char*)resptr), 0);
     i = 0;
     bi = 0;
-    while(bi!=2){
+    while((bi!=2) && (yaz_test_get_verbosity()>3)){
         bi = yaz_nfa_get_backref(n, i,&cp1,&cp2);
         if (bi==0 && ( cp1 || cp2 ) ) {
-#if VERBOSE    
             printf("  got backref %d of %d chars (%p to %p): '",
                     i, cp2-cp1+1, cp1, cp2);
             while (cp2-cp1 >= 0 )
                 printf("%c", *cp1++);
             printf("'\n");
-#endif
         }
         i++;
     }
@@ -93,7 +89,7 @@ void construction_test() {
     YAZ_CHECK_EQ(i, 0);
 
     i = yaz_nfa_set_result(n, s1, "DUPLICATE");
-    YAZ_CHECK_EQ(i, 1);
+    YAZ_CHECK_EQ(i, YAZ_NFA_ALREADY);
 
     p = yaz_nfa_get_result(n, s1);
     YAZ_CHECK(p);
@@ -143,29 +139,33 @@ void construction_test() {
     yaz_nfa_set_result(n, s, "y k+ d");
     yaz_nfa_set_backref_point(n, s, 1, 0);
 
-    s = yaz_nfa_add_sequence(n, 0, seq1 ); 
+    s = yaz_nfa_add_sequence(n, 0, seq1,6 ); 
     yaz_nfa_set_result(n, s, "PREFIX");
-    s = yaz_nfa_add_sequence(n, 0, seq2 ); 
+    s = yaz_nfa_add_sequence(n, 0, seq2,6 ); 
     yaz_nfa_set_result(n, s, "PRELIM");
 
     s = yaz_nfa_add_range(n, 0, 'x', 'x' );
-    yaz_nfa_set_backref_point(n, s, 2, 1);
-    s1 = yaz_nfa_add_sequence(n, s, tst4);
+    i=yaz_nfa_set_backref_point(n, s, 2, 0);
+    YAZ_CHECK_EQ(i,YAZ_NFA_NOSTART);
+    i=yaz_nfa_set_backref_point(n, s, 2, 1);
+    YAZ_CHECK_EQ(i,YAZ_NFA_SUCCESS);
+    i=yaz_nfa_set_backref_point(n, s, 2, 1);
+    YAZ_CHECK_EQ(i,YAZ_NFA_ALREADY);
+    s1 = yaz_nfa_add_sequence(n, s, tst4,2);
     yaz_nfa_set_backref_point(n, s1, 2, 0);
     yaz_nfa_set_result(n, s1, "xzk");
 
     /* check return codes before doing any matches */
     i = yaz_nfa_get_backref(n, 0, &cp1, &cp2 );
-    YAZ_CHECK_EQ(i, 1);
+    YAZ_CHECK_EQ(i, YAZ_NFA_NOMATCH);
     i = yaz_nfa_get_backref(n, 3, &cp1, &cp2 );
-    YAZ_CHECK_EQ(i, 2);
+    YAZ_CHECK_EQ(i, YAZ_NFA_NOSUCHBACKREF );
     i = yaz_nfa_get_backref(n, 1, &cp1, &cp2 );
-    YAZ_CHECK_EQ(i, 1);
+    YAZ_CHECK_EQ(i, YAZ_NFA_NOMATCH );
 
     
-#if VERBOSE    
-    yaz_nfa_dump(0, n, printfunc);
-#endif
+    if (yaz_test_get_verbosity()>3)
+        yaz_nfa_dump(0, n, printfunc);
 
     test_match(n, seq2, 3, YAZ_NFA_OVERRUN, "K-S");
     test_match(n, seq2, 6, YAZ_NFA_SUCCESS, "PRELIM");
@@ -184,10 +184,9 @@ void construction_test() {
     YAZ_CHECK_EQ(cp2-cp1+1,2); 
     YAZ_CHECK_EQ(*cp1, 'z' );
     YAZ_CHECK_EQ(*cp2, 'k' );
-#if VERBOSE    
-    printf("backref from %p '%c' to %p '%c' is %d long. sz is now %d\n",
+    if (yaz_test_get_verbosity()>3)
+        printf("backref from %p '%c' to %p '%c' is %d long. sz is now %d\n",
             cp1, *cp1,  cp2, *cp2,  cp2-cp1+1, sz );
-#endif
 
     yaz_nfa_destroy(n);
 }
@@ -196,7 +195,7 @@ void converter_test() {
     yaz_nfa* n= yaz_nfa_init();
     yaz_nfa_converter *c1, *c2, *c3;
     yaz_nfa_char str1[]={'a','b','c'};
-    yaz_nfa_char seq1[]={'A','B','C',0};
+    yaz_nfa_char seq1[]={'A','B','C'};
     yaz_nfa_char seq2[]={'k','m','n','m','x','P','Q','X',0};
     yaz_nfa_char outbuf[1024];
     yaz_nfa_char *outp, *cp, *cp1, *cp2;
@@ -212,7 +211,7 @@ void converter_test() {
     outp=outbuf;
     sz=1;
     i=yaz_nfa_run_converters(n, c1, &outp, &sz);
-    YAZ_CHECK_EQ(i,2); /* overrun */
+    YAZ_CHECK_EQ(i,4); /* overrun */
     YAZ_CHECK_EQ(outbuf[0],'a');
     YAZ_CHECK_EQ(outbuf[1],10000+1);
 
@@ -250,7 +249,7 @@ void converter_test() {
     s=yaz_nfa_add_state(n);
     yaz_nfa_add_empty_transition(n,0,s);
     yaz_nfa_set_backref_point(n,s,1,1);
-    s=yaz_nfa_add_sequence(n, s, seq1 ); 
+    s=yaz_nfa_add_sequence(n, s, seq1,3 ); 
     yaz_nfa_set_result(n,s,c1);
     yaz_nfa_set_backref_point(n,s,1,0);
 
@@ -268,9 +267,8 @@ void converter_test() {
     c1=yaz_nfa_create_backref_converter(n,2);
     yaz_nfa_set_result(n,s,c1);
 
-#if VERBOSE    
-    yaz_nfa_dump(0,n, printfunc2);
-#endif
+    if (yaz_test_get_verbosity()>3)
+        yaz_nfa_dump(0,n, printfunc2);
 
     cp=seq2;
     sz=18;
@@ -278,10 +276,9 @@ void converter_test() {
     c2=vp;
     YAZ_CHECK_EQ(i,YAZ_NFA_SUCCESS); 
     i=yaz_nfa_get_backref(n, 2, &cp1, &cp2 );
-#if VERBOSE    
-    printf("backref from %p '%c' to %p '%c' is %d long. sz is now %d\n",
+    if (yaz_test_get_verbosity()>3)
+        printf("backref from %p '%c' to %p '%c' is %d long. sz is now %d\n",
             cp1, *cp1,  cp2, *cp2,  cp2-cp1+1, sz );
-#endif
     YAZ_CHECK_EQ(i,0);
     YAZ_CHECK_EQ((int)c1,(int)c2);  /* got our pointer back from nfa */
     for(i=0;i<1024;i++)
@@ -316,6 +313,111 @@ void converter_test() {
     yaz_nfa_destroy(n);
 }
 
+yaz_nfa_char *makebuff(NMEM nmem, char *in) {
+    yaz_nfa_char *buff = nmem_malloc(nmem, strlen(in)*sizeof(yaz_nfa_char));
+    yaz_nfa_char *op=buff;
+    while ( (*op++ = *in++) )
+        ;
+    return buff;
+}
+
+void dumpbuff(char *msg, yaz_nfa_char *start, yaz_nfa_char *end) {
+    if (yaz_test_get_verbosity()>3) {
+        printf("%s\"",msg);
+        while (start!=end)
+            printf("%c",*start++);
+        printf("\"\n");
+    }
+}
+
+void chkbuff( yaz_nfa_char *start, yaz_nfa_char *end, char *exp) {
+    char *orig_exp=exp;
+    while (start!=end)
+        if ( *start++ != *exp++ ) {
+            if (yaz_test_get_verbosity()>3) {
+                start--;
+                exp--;
+                printf ("chkbuff: unexpected conversion '%c' != '%c' \n"
+                        "\"%s\"\n", *start, *exp, orig_exp );
+            }
+            YAZ_CHECK(!"conversion differs! ");
+            return;
+        }
+
+}
+
+void high_level_test() {
+    NMEM nmem=nmem_create();
+    yaz_nfa_char from1[] = {'f','o','o','b','a','r'};
+    yaz_nfa_char to1[] = {'f','u','b','a','r'};
+    yaz_nfa_char tospace[] = {' '};
+    yaz_nfa_char todot[] = {'.'};
+    char *fromtext =
+            "It was a Dark and Rainy Night, when alpha and beta "
+            "fixme - FIND better names ?? !! ##  - "
+            "went out to fix the foobar "
+            "that was all foo.";
+    char *expected = 
+            "IT WAS A DARK AND RAINY NIGHT. WHEN ALPHA AND b "
+            "to-be-fixed-later . FIND BETTER NAMES .. .. ..  . "
+            "WENT OUT TO (fix) THE fubar "
+            "THAT WAS ALL FOO.";
+    yaz_nfa_char *from3 = makebuff(nmem,fromtext);
+    yaz_nfa_char *to3 = nmem_malloc(nmem, 1024*sizeof(yaz_nfa_char));
+    yaz_nfa_char *fromp=from3;
+    yaz_nfa_char *top=to3;
+    size_t insize=strlen(fromtext);
+    size_t outsize=1024;
+    size_t prev_insize=0;
+
+    yaz_nfa *n = yaz_nfa_init();
+    int i;
+    i = yaz_nfa_add_string_rule(n, from1, 6, to1, 5);
+    YAZ_CHECK_EQ(i,0);
+    i = yaz_nfa_add_string_rule(n, from1, 6, to1, 5);
+    YAZ_CHECK_EQ(i,YAZ_NFA_ALREADY);
+    i = yaz_nfa_add_ascii_string_rule(n,"beta","b");
+    YAZ_CHECK_EQ(i,0);
+    i = yaz_nfa_add_ascii_string_rule(n,"fixme","to-be-fixed-later");
+    YAZ_CHECK_EQ(i,0);
+    i = yaz_nfa_add_ascii_string_rule(n,"fix","(fix)");
+    YAZ_CHECK_EQ(i,0);
+    i = yaz_nfa_add_char_range_rule(n, 'a','z','A');
+    YAZ_CHECK_EQ(i,0);
+    i = yaz_nfa_add_char_string_rule(n, 0,' ', tospace,1);
+    YAZ_CHECK_EQ(i,0);
+    i = yaz_nfa_add_char_string_rule(n, '!','/', todot,1);
+    YAZ_CHECK_EQ(i,0);
+    i = yaz_nfa_add_char_string_rule(n, ':','?', todot,1);
+    YAZ_CHECK_EQ(i,0);
+    if (yaz_test_get_verbosity()>3)
+        yaz_nfa_dump(0,n, printfunc2);
+
+    YAZ_CHECK_EQ( *from3, 'I' ); /* just to be sure my copy func works */
+    for (i=0;i<100;i++)
+        to3[i]=10000+i;
+    i=yaz_nfa_convert_slice(n, &fromp, &insize, &top, &outsize);
+    YAZ_CHECK_EQ(i,YAZ_NFA_SUCCESS);
+    YAZ_CHECK_EQ(*to3,'I');
+    YAZ_CHECK_EQ(insize, strlen(fromtext)-1);
+    YAZ_CHECK_EQ(outsize, 1024-1);
+
+    while ( (i==YAZ_NFA_SUCCESS) && (insize > 0) && (prev_insize!=insize) ) {
+        prev_insize=insize; /* detect dead loops if something goes wrong */
+        i=yaz_nfa_convert_slice(n, &fromp, &insize, &top, &outsize);
+    }
+    YAZ_CHECK_EQ(i,YAZ_NFA_SUCCESS);
+    YAZ_CHECK_EQ(insize,0);
+    YAZ_CHECK(prev_insize != insize); /* the loop would have been endless */
+
+    dumpbuff("Original text: ",from3, fromp);
+    dumpbuff("Converted text: ",to3, top);
+
+    chkbuff(to3, top, expected);
+
+    yaz_nfa_destroy(n);
+    nmem_destroy(nmem);
+}
 
 int main(int argc, char **argv)
 {
@@ -323,6 +425,7 @@ int main(int argc, char **argv)
     nmem_init ();
     construction_test(); 
     converter_test();
+    high_level_test();
     nmem_exit ();
     YAZ_CHECK_TERM;
 }