#!/bin/sh
# ***************************************************************************
# *                                  _   _ ____  _
# *  Project                     ___| | | |  _ \| |
# *                             / __| | | | |_) | |
# *                            | (__| |_| |  _ <| |___
# *                             \___|\___/|_| \_\_____|
# *
# * Copyright (C) 2013 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
# *
# * This software is licensed as described in the file COPYING, which
# * you should have received as part of this distribution. The terms
# * are also available at https://curl.haxx.se/docs/copyright.html.
# *
# * You may opt to use, copy, modify, merge, publish, distribute and/or sell
# * copies of the Software, and permit persons to whom the Software is
# * furnished to do so, under the terms of the COPYING file.
# *
# * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
# * KIND, either express or implied.
# *
# ***************************************************************************

#
# This Bourne shell script file is used by test case 1221 to do
# unit testing of curl_10char_object_name() shell function which
# is defined in file objnames.inc and sourced by this file and
# any other shell script that may use it.
#

#
# argument validation
#

if test $# -eq 1; then
  :
else
  echo "Usage: ${0} srcdir"
  exit 1
fi

if test -f "${1}/runtests.pl"; then
  :
else
  echo "${0}: Wrong srcdir"
  exit 1
fi

srcdir=${1}

if test -f "$srcdir/objnames.inc"; then
  :
else
  echo "$0: Missing objnames.inc"
  exit 1
fi

#
# Some variables
#

logdir=log
tstnum=1221

list_c=$logdir/${tstnum}_list_c
list_obj=$logdir/${tstnum}_list_obj
list_obj_c=$logdir/${tstnum}_list_obj_c
list_obj_uniq=$logdir/${tstnum}_list_obj_uniq


#
# Source curl_10char_object_name() function definition
#

. $srcdir/objnames.inc

#
# Some curl_10char_object_name() unit tests
#

echo 'Testing curl_10char_object_name...'
echo ""

argstr=123__678__ABC__FGH__KLM__PQRSTUV
expect=16AFKPQRST
outstr=`curl_10char_object_name $argstr`
echo "result: $outstr expected: $expect input: $argstr"

argstr=123__678__ABC__FGH__KLM__PQ.S.UV
expect=16AFKPQ
outstr=`curl_10char_object_name $argstr`
echo "result: $outstr expected: $expect input: $argstr"

argstr=123__678__ABC..FGH..KLM..PQRSTUV
expect=16ABC
outstr=`curl_10char_object_name $argstr`
echo "result: $outstr expected: $expect input: $argstr"

argstr=123__678_.ABC._FGH__KLM__PQRSTUV
expect=16
outstr=`curl_10char_object_name $argstr`
echo "result: $outstr expected: $expect input: $argstr"

argstr=123.567.90ABCDEFGHIJKLMNOPQRSTUV
expect=123
outstr=`curl_10char_object_name $argstr`
echo "result: $outstr expected: $expect input: $argstr"

argstr=1234567.90A.CDEFGHIJKLMNOPQRSTUV
expect=1234567
outstr=`curl_10char_object_name $argstr`
echo "result: $outstr expected: $expect input: $argstr"

argstr=1234567890.BCD.FGHIJKLMNOPQRSTUV
expect=1234567890
outstr=`curl_10char_object_name $argstr`
echo "result: $outstr expected: $expect input: $argstr"

argstr=12=45-78+0AB.DE.GHIJKLMNOPQRSTUV
expect=1470AB
outstr=`curl_10char_object_name $argstr`
echo "result: $outstr expected: $expect input: $argstr"

argstr=1234567890ABCDEFGHIJKLMNOPQRSTUV
expect=1234567890
outstr=`curl_10char_object_name $argstr`
echo "result: $outstr expected: $expect input: $argstr"

argstr=123_567_90A_CDE_GHIJKLMNOPQRSTUV
expect=159CGHIJKL
outstr=`curl_10char_object_name $argstr`
echo "result: $outstr expected: $expect input: $argstr"

argstr=123_567_90A_CDEFGHIJKLMNOPQRSTUV
expect=159CDEFGHI
outstr=`curl_10char_object_name $argstr`
echo "result: $outstr expected: $expect input: $argstr"

argstr=123_567_90ABCDEFGHIJKLMNOPQRSTUV
expect=1590ABCDEF
outstr=`curl_10char_object_name $argstr`
echo "result: $outstr expected: $expect input: $argstr"

argstr=123_567890ABCDEFGHIJKLMNOPQRSTUV
expect=1567890ABC
outstr=`curl_10char_object_name $argstr`
echo "result: $outstr expected: $expect input: $argstr"

argstr=1234567890ABCDEFGHIJKLMNOPQRSTUV
expect=1234567890
outstr=`curl_10char_object_name $argstr`
echo "result: $outstr expected: $expect input: $argstr"

#
# Verify that generated object name is distinct for
# all *.c source files in lib and src subdirectories.
#

ls $srcdir/../lib/*.c > $list_c
ls $srcdir/../src/*.c >> $list_c

rm -f $list_obj

for c_fname in `cat $list_c`; do
  obj_name=`curl_10char_object_name $c_fname`
  echo "$obj_name" >> $list_obj
done

sort -u $list_obj > $list_obj_uniq

cnt_c=`cat $list_c | wc -l`
cnt_u=`cat $list_obj_uniq | wc -l`

echo ""
echo ""
echo ""
if test $cnt_c -eq $cnt_u; then
  echo "10-characters-or-less generated object names are unique."
  obj_name_clash="no"
else
  echo "10-characters-or-less generated object names are clashing..."
  obj_name_clash="yes"
fi

if test $obj_name_clash = "yes"; then
  #
  # Show clashing object names and respective source file names
  #
  echo ""
  paste $list_obj $list_c | sort > $list_obj_c
  prev_match="no"
  prev_line="unknown"
  prev_obj_name="unknown"
  while read this_line; do
    obj_name=`echo "$this_line" | cut -f1`
    if test "x$obj_name" = "x$prev_obj_name"; then
      if test "x$prev_match" != "xyes"; then
        echo "$prev_line"
        echo "$this_line"
        prev_match="yes"
      else
        echo "$this_line"
      fi
    else
      prev_match="no"
    fi
    prev_line=$this_line
    prev_obj_name=$obj_name
  done < $list_obj_c
fi

rm -f $list_c
rm -f $list_obj
rm -f $list_obj_c
rm -f $list_obj_uniq

# end of objnames-test10.sh
