#! /bin/sh

# This file is generated by configure from RunTest.in. Make any changes
# to that file.

# Run PCRE tests

cf=diff
testdata=@top_srcdir@/testdata

# Select which tests to run; if no selection, run all

do1=no
do2=no
do3=no
do4=no
do5=no
do6=no

while [ $# -gt 0 ] ; do
  case $1 in
    1) do1=yes;;
    2) do2=yes;;
    3) do3=yes;;
    4) do4=yes;;
    5) do5=yes;; 
    6) do6=yes;; 
    *) echo "Unknown test number $1"; exit 1;;
  esac
  shift
done

if [ "@LINK_SIZE@" != "" -a "@LINK_SIZE@" != "-DLINK_SIZE=2" ] ; then
  if [ $do2 = yes ] ; then
    echo "Can't run test 2 with an internal link size other than 2"
    exit 1  
  fi   
  if [ $do5 = yes ] ; then
    echo "Can't run test 5 with an internal link size other than 2"
    exit 1  
  fi   
  if [ $do6 = yes ] ; then
    echo "Can't run test 6 with an internal link size other than 2"
    exit 1  
  fi   
fi

if [ "@UTF8@" = "" ] ; then
  if [ $do4 = yes ] ; then
    echo "Can't run test 4 because UTF-8 support is not configured"
    exit 1
  fi   
  if [ $do5 = yes ] ; then
    echo "Can't run test 5 because UTF-8 support is not configured"
    exit 1
  fi   
  if [ $do6 = yes ] ; then
    echo "Can't run test 6 because UTF-8 support is not configured"
    exit 1
  fi   
fi    

if [ "@UCP@" = "" ] ; then
  if [ $do6 = yes ] ; then
    echo "Can't run test 6 because Unicode property support is not configured"
    exit 1
  fi
fi      

if [ $do1 = no -a $do2 = no -a $do3 = no -a $do4 = no -a \
     $do5 = no -a $do6 = no ] ; then
  do1=yes
  do2=yes 
  do3=yes
  if [ "@UTF8@" != "" ] ; then do4=yes; fi
  if [ "@UTF8@" != "" ] ; then do5=yes; fi
  if [ "@UTF8@" != "" -a "@UCP@" != "" ] ; then do6=yes; fi
fi

# Show which release

./pcretest /dev/null

# Primary test, Perl-compatible

if [ $do1 = yes ] ; then
  echo "Test 1: main functionality (Perl compatible)"
  ./pcretest $testdata/testinput1 testtry
  if [ $? = 0 ] ; then
    $cf testtry $testdata/testoutput1
    if [ $? != 0 ] ; then exit 1; fi
    echo " " 
  else exit 1
  fi
fi

# PCRE tests that are not Perl-compatible - API & error tests, mostly

if [ $do2 = yes ] ; then
  if [ "@LINK_SIZE@" = "" -o "@LINK_SIZE@" = "-DLINK_SIZE=2" ] ; then   
    echo "Test 2: API and error handling (not Perl compatible)"
    ./pcretest -i $testdata/testinput2 testtry
    if [ $? = 0 ] ; then
      $cf testtry $testdata/testoutput2
      if [ $? != 0 ] ; then exit 1; fi
    else exit 1
    fi
  else
    echo Test 2 skipped for link size other than 2 \(@LINK_SIZE@\)    
  fi   
fi

if [ $do1 = yes -a $do2 = yes ] ; then
  echo " " 
  echo "The two main tests ran OK"
  echo " " 
fi

# Locale-specific tests, provided the "fr_FR" locale is available

if [ $do3 = yes ] ; then
  locale -a | grep '^fr_FR$' >/dev/null
  if [ $? -eq 0 ] ; then
    echo "Test 3: locale-specific features (using 'fr_FR' locale)"
    ./pcretest $testdata/testinput3 testtry
    if [ $? = 0 ] ; then
      $cf testtry $testdata/testoutput3
      if [ $? != 0 ] ; then 
        echo " "
        echo "Locale test did not run entirely successfully."
        echo "This usually means that there is a problem with the locale"
        echo "settings rather than a bug in PCRE."    
      else
      echo "Locale test ran OK" 
      fi 
      echo " " 
    else exit 1
    fi
  else
    echo "Cannot test locale-specific features - 'fr_FR' locale not found,"
    echo "or the \"locale\" command is not available to check for it."
    echo " " 
  fi
fi

# Additional tests for UTF8 support

if [ $do4 = yes ] ; then
  echo "Test 4: UTF-8 support (Perl compatible)"
  ./pcretest $testdata/testinput4 testtry 
  if [ $? = 0 ] ; then
    $cf testtry $testdata/testoutput4
    if [ $? != 0 ] ; then exit 1; fi
  else exit 1
  fi
  echo "UTF8 test ran OK"
  echo " "
fi

if [ $do5 = yes ] ; then
  if [ "@LINK_SIZE@" = "" -o "@LINK_SIZE@" = "-DLINK_SIZE=2" ] ; then   
    echo "Test 5: API and internals for UTF-8 support (not Perl compatible)"
    ./pcretest $testdata/testinput5 testtry 
    if [ $? = 0 ] ; then
      $cf testtry $testdata/testoutput5
      if [ $? != 0 ] ; then exit 1; fi
    else exit 1
    fi
    echo "UTF8 internals test ran OK"
    echo " "
  else
    echo Test 5 skipped for link size other than 2 \(@LINK_SIZE@\)    
  fi   
fi

if [ $do6 = yes ] ; then
  if [ "@LINK_SIZE@" = "" -o "@LINK_SIZE@" = "-DLINK_SIZE=2" ] ; then   
    echo "Test 6: Unicode property support"
    ./pcretest $testdata/testinput6 testtry 
    if [ $? = 0 ] ; then
      $cf testtry $testdata/testoutput6
      if [ $? != 0 ] ; then exit 1; fi
    else exit 1
    fi
    echo "Unicode properties test ran OK"
    echo " "
  else   
    echo Test 6 skipped for link size other than 2 \(@LINK_SIZE@\)    
  fi   
fi

# End
