/* psx-generic.c: test POSIX re's independent of us using basic or
   extended syntax.  */

#include "test.h"


void
test_posix_generic ()
{
  int omit_generic_tests = 0; /* reset in debugger to skip */

  if (omit_generic_tests)
    return;
                                /* Tests somewhat in the order of P1003.2.  */
  
  /* Both posix basic and extended; should match.  */

  printf ("\nStarting generic POSIX tests.\n");
  test_grouping ();
  test_intervals ();

  test_should_match = true;
              /* Ordinary characters.  */
  printf ("\nContinuing generic POSIX tests.\n");

  MATCH_SELF ("");
  test_fastmap ("", "", 0, 0);
  test_fastmap_search ("", "", "", 0, 0, 2, 0, 0);
  TEST_REGISTERS ("", "", 0, 0, -1, -1, -1, -1);
  TEST_SEARCH ("", "", 0, 0);
  TEST_SEARCH_2 ("", "", "", 0, 1, 0);
  
  MATCH_SELF ("abc");        
  test_fastmap ("abc", "a", 0, 0);        
  TEST_REGISTERS ("abc", "abc", 0, 3, -1, -1, -1, -1);
  TEST_REGISTERS ("abc", "xabcx", 1, 4, -1, -1, -1, -1);
  
  test_match ("\\a","a");
  test_match ("\\0", "0");

  TEST_SEARCH ("a", "ab", 0, 2);
  TEST_SEARCH ("b", "ab", 0, 2);
  TEST_SEARCH ("a", "ab", 1, -2);
  TEST_SEARCH_2 ("a", "a", "b", 0, 2, 2);
  TEST_SEARCH_2 ("b", "a", "b", 0, 2, 2);
  TEST_SEARCH_2 ("a", "a", "b", 1, -2, 2);
  
  test_match ("\n", "\n");
  test_match ("a\n", "a\n");
  test_match ("\nb", "\nb");
  test_match ("a\nb", "a\nb");

  TEST_SEARCH ("b", "baaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", 236, -237);
          /* Valid use of special characters. */
  test_match ("a*", "aa");
  test_fastmap ("a*", "a", 0, 0);
  TEST_REGISTERS ("a*", "aa", 0, 2, -1, -1, -1, -1);
  
  test_match ("a*b", "aab");      
  test_fastmap ("a*b", "ab", 0, 0);

  test_match ("a*ab", "aab");
  TEST_REGISTERS ("a*a", "aa", 0, 2, -1, -1, -1, -1);
  TEST_REGISTERS ("a*a", "xaax", 1, 3, -1, -1, -1, -1);

  test_match ("\\{", "{");
  test_match ("\\^", "^");
  test_match ("\\.", ".");
  test_match ("\\*", "*");
  test_match ("\\[", "[");
  test_match ("\\$", "$");
  test_match ("\\\\", "\\");

  test_match ("ab*", "a");
  test_match ("ab*", "abb");

  /* Valid consecutive repetitions.  */
  test_match ("a**", "a");
                                                /* Valid period.  */
  test_match (".", "a");
  TEST_REGISTERS (".", "a", 0, 1, -1, -1, -1, -1);
  test_match (".", "\004");
  test_match (".", "\n");    
                                              /* Valid bracket expressions.  */
  test_match ("[ab]", "a");    
  test_match ("[ab]", "b");
  test_fastmap ("[ab]", "ab", 0, 0);
  TEST_REGISTERS ("[ab]", "a", 0, 1, -1, -1, -1, -1);
  TEST_REGISTERS ("[ab]", "xax", 1, 2, -1, -1, -1, -1);

  test_fastmap ("[^ab]", "ab", 1, 1);
  test_match ("[^ab]", "c");
  test_match ("[^a]", "\n");

  test_match ("[a]*a", "aa");    

  test_match ("[[]", "[");
  test_match ("[]]", "]");
  test_match ("[.]", ".");
  test_match ("[*]", "*");
  test_match ("[\\]", "\\");
  test_match ("[\\(]", "(");
  test_match ("[\\)]", ")");
  test_match ("[^]]", "a");
  test_match ("[a^]", "^");
  test_match ("[a$]", "$");
  test_match ("[]a]", "]");
  test_match ("[a][]]", "a]");
  test_match ("[\n]", "\n");
  test_match ("[^a]", "\n");
  test_match ("[a-]", "a");

  TEST_REGISTERS ("\\`[ \t\n]*", " karl (Karl Berry)", 0, 1, -1, -1, -1, -1);
  TEST_REGISTERS ("[ \t\n]*\\'", " karl (Karl Berry)", 18, 18, -1, -1, -1, -1);

                                                /* Collating, noncollating,
                                                  equivalence classes aren't
                                                implemented yet.  */  
          

                                                /* Character classes.  */
  test_match ("[:alpha:]", "p");  
  test_match ("[[:alpha:]]", "a");  
  test_match ("[[:alpha:]]", "z");
  test_match ("[[:alpha:]]", "A");
  test_match ("[[:alpha:]]", "Z");
  test_match ("[[:upper:]]", "A");
  test_match ("[[:upper:]]", "Z");
  test_match ("[[:lower:]]", "a");
  test_match ("[[:lower:]]", "z");

  test_match ("[[:digit:]]", "0");
  test_match ("[[:digit:]]", "9");
  test_fastmap ("[[:digit:]]", "0123456789", 0, 0);

  test_match ("[[:alnum:]]", "0");
  test_match ("[[:alnum:]]", "9");
  test_match ("[[:alnum:]]", "a");
  test_match ("[[:alnum:]]", "z");
  test_match ("[[:alnum:]]", "A");
  test_match ("[[:alnum:]]", "Z");
  test_match ("[[:xdigit:]]", "0");
  test_match ("[[:xdigit:]]", "9");
  test_match ("[[:xdigit:]]", "A");
  test_match ("[[:xdigit:]]", "F");
  test_match ("[[:xdigit:]]", "a");
  test_match ("[[:xdigit:]]", "f");
  test_match ("[[:space:]]", " ");
  test_match ("[[:print:]]", " ");
  test_match ("[[:print:]]", "~");
  test_match ("[[:punct:]]", ",");
  test_match ("[[:graph:]]", "!");
  test_match ("[[:graph:]]", "~");
  test_match ("[[:cntrl:]]", "\177");
  test_match ("[[:digit:]a]", "a");
  test_match ("[[:digit:]a]", "2");
  test_match ("[a[:digit:]]", "a");
  test_match ("[a[:digit:]]", "2");
  test_match ("[[:]", "[");
  test_match ("[:]", ":");
  test_match ("[[:a]", "[");
  test_match ("[[:alpha:a]", "[");
              /* Valid ranges.  */
  test_match ("[a-a]", "a");
  test_fastmap ("[a-a]", "a", 0, 0);
  TEST_REGISTERS ("[a-a]", "xax", 1, 2, -1, -1, -1, -1);

  test_match ("[a-z]", "z");
  test_fastmap ("[a-z]", "abcdefghijklmnopqrstuvwxyz", 0, 0);
  test_match ("[-a]", "-");    /* First  */
  test_match ("[-a]", "a");
  test_match ("[a-]", "-");    /* Last  */
  test_match ("[a-]", "a");
  test_match ("[--@]", "@");    /* First and starting point.  */
  
  test_match ("[%--a]", "%");    /* Ending point.  */
  test_match ("[%--a]", "-");    /* Ditto.  */
  
  test_match ("[a%--]", "%");    /* Both ending point and last.  */
  test_match ("[a%--]", "-");
  test_match ("[%--a]", "a");    /* Ending point only.  */
  test_match ("[a-c-f]", "e");    /* Piggyback.  */

  test_match ("[)-+--/]", "*");
  test_match ("[)-+--/]", ",");
  test_match ("[)-+--/]", "/");
  test_match ("[[:digit:]-]", "-");
                                        /* Concatenation  ????*/
  test_match ("[ab][cd]", "ac");      
  test_fastmap ("[ab][cd]", "ab", 0, 0);
  TEST_REGISTERS ("[ab][cd]", "ad", 0, 2, -1, -1, -1, -1);
  TEST_REGISTERS ("[ab][cd]", "xadx", 1, 3, -1, -1, -1, -1);
  
                                             /* Valid expression anchoring.  */
  test_match ("^a", "a");
  test_fastmap ("^a", "a", 0, 0);
  TEST_REGISTERS ("^a", "ax", 0, 1, -1, -1, -1, -1);
  
  test_match ("^", "");
  TEST_REGISTERS ("^", "", 0, 0, -1, -1, -1, -1);
  test_match ("$", "");
  TEST_REGISTERS ("$", "", 0, 0, -1, -1, -1, -1);
  
  test_match ("a$", "a");
  test_fastmap ("a$", "a", 0, 0);
  TEST_REGISTERS ("a$", "xa", 1, 2, -1, -1, -1, -1);
  
  test_match ("^ab$", "ab");
  test_fastmap ("^ab$", "a", 0, 0);
  TEST_REGISTERS ("^a$", "a", 0, 1, -1, -1, -1, -1);
  
  test_fastmap ("^$", "", 0, 0);
  test_match ("^$", "");
  TEST_REGISTERS ("^$", "", 0, 0, -1, -1, -1, -1);

  TEST_SEARCH (PARENS_TO_OPS ("(^a)"), "ab", 0, 2);
  TEST_SEARCH (PARENS_TO_OPS ("(a$)"), "ba", 0, 2);
  TEST_SEARCH (PARENS_TO_OPS ("^(^a)"), "ab", 0, 2);
  TEST_SEARCH (PARENS_TO_OPS ("(a$)$"), "ba", 0, 2);

                                                /* Two strings.  */
  test_match_2 ("ab", "a", "b");
  TEST_REGISTERS_2 ("ab", "a", "b", 0, 2, -1, -1, -1, -1);
  
  test_match_2 ("a", "", "a");
  test_match_2 ("a", "a", "");
  test_match_2 ("ab", "a", "b");
            /* (start)pos.  */
  TEST_POSITIONED_MATCH ("b", "ab", 1);
              /* mstop.  */
  TEST_TRUNCATED_MATCH ("a", "ab", 1);


  /* Both basic and extended, continued; should not match.  */

  test_should_match = false;
                                          /* Ordinary characters.  */
  test_match ("abc", "ab");      
  
  TEST_SEARCH ("c", "ab", 0, 2);
  TEST_SEARCH ("c", "ab", 0, 2);
  TEST_SEARCH ("c", "ab", 1, -2);
  TEST_SEARCH ("c", "ab", 0, 10);
  TEST_SEARCH ("c", "ab", 1, -10);
  TEST_SEARCH_2 ("c", "a", "b", 0, 2, 2);
  TEST_SEARCH_2 ("c", "a", "b", 0, 2, 2);
  TEST_SEARCH_2 ("c", "a", "b", 0, 2, 2);
  TEST_SEARCH_2 ("c", "a", "b", 1, -2, 2);
  TEST_SEARCH_2 ("c", "a", "b", 1, -2, 2);

  TEST_SEARCH ("c", "baaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", 236, -237);

        /* Invalid use of special characters.  */
  invalid_pattern (REG_EESCAPE, "\\");
  invalid_pattern (REG_EESCAPE, "a\\");
  invalid_pattern (REG_EESCAPE, "a*\\");
              /* Invalid period.  */
  test_match (".", "");
            /* Invalid bracket expressions.  */
  test_match ("[ab]", "c");        
  test_match ("[^b]", "b");      
  test_match ("[^]]", "]");

  invalid_pattern (REG_EBRACK, "[");
  invalid_pattern (REG_EBRACK, "[^");
  invalid_pattern (REG_EBRACK, "[a");
  invalid_pattern (REG_EBRACK, "[]");
  invalid_pattern (REG_EBRACK, "[]a");
  invalid_pattern (REG_EBRACK, "a[]a");
  

  test_match ("[:alpha:]", "q");         /* Character classes.  */
  test_match ("[[:alpha:]]", "2");
  test_match ("[[:upper:]]", "a");
  test_match ("[[:lower:]]", "A");
  test_match ("[[:digit:]]", "a");
  test_match ("[[:alnum:]]", ":");
  test_match ("[[:xdigit:]]", "g");
  test_match ("[[:space:]]", "a");
  test_match ("[[:print:]]", "\177");
  test_match ("[[:punct:]]", "a");
  test_match ("[[:graph:]]", " ");
  test_match ("[[:cntrl:]]", "a");
  invalid_pattern (REG_EBRACK, "[[:");
  invalid_pattern (REG_EBRACK, "[[:alpha:");
  invalid_pattern (REG_EBRACK, "[[:alpha:]");
  invalid_pattern (REG_ECTYPE, "[[::]]");
  invalid_pattern (REG_ECTYPE, "[[:a:]]");
  invalid_pattern (REG_ECTYPE, "[[:alpo:]]");
  invalid_pattern (REG_ECTYPE, "[[:a:]");
  
  test_match ("[a-z]", "2");      /* Invalid ranges.  */
  test_match ("[^-a]", "-");    
  test_match ("[^a-]", "-");    
  test_match ("[)-+--/]", ".");
  invalid_pattern (REG_ERANGE, "[z-a]");    /* Empty  */
  invalid_pattern (REG_ERANGE, "[a--]");    /* Empty  */
  invalid_pattern (REG_ERANGE, "[[:digit:]-9]");
  invalid_pattern (REG_ERANGE, "[a-[:alpha:]]");
  invalid_pattern (REG_ERANGE, "[a-");
  invalid_pattern (REG_EBRACK, "[a-z");

  test_match ("[ab][cd]", "ae");    /* Concatenation.  */
  test_match ("b*c", "b");      /* Star.  */

                                          /* Invalid anchoring.  */
  test_match ("^", "a");
  test_match ("^a", "ba");
  test_match ("$", "b");
  test_match ("a$", "ab");
  test_match ("^$", "a");
  test_match ("^ab$", "a");

  TEST_SEARCH ("^a", "b\na", 0, 3);
  TEST_SEARCH ("b$", "b\na", 0, 3);

  test_match_2 ("^a", "\n", "a");
  test_match_2 ("a$", "a", "\n");

  TEST_SEARCH (PARENS_TO_OPS ("(^a)"), "ba", 0, 2);
  TEST_SEARCH (PARENS_TO_OPS ("(a$)"), "ab", 0, 2);
  TEST_SEARCH (PARENS_TO_OPS ("^(^a)"), "ba", 0, 2);
  TEST_SEARCH (PARENS_TO_OPS ("(a$)$"), "ab", 0, 2);

  printf ("\nFinished generic POSIX tests.\n");
}



/*
Local variables:
make-backup-files: t
version-control: t
trim-versions-without-asking: nil
End:
*/
