#! /bin/bash

# Renumber test cases sequentially, without gaps.

# USAGE:

#    $0
#    $0 tests/cases
#    $0 tests/subdirs/*

if [ $# -eq 0 ]
then
    set tests/cases tests/outputs
fi

for CASE_DIR in "$@"
do
    for TESTED in $(ls -1 ${CASE_DIR}/*_[0-9]*.* | sed 's/_[0-9][0-9]*\..*//' | sort -u)
    do
        echo "${TESTED}"
        CURRENT_CASE=1 # The current renumbered test case
        PROCESSED=0
        for CASE in $(ls ${TESTED}_[0-9]*.*)
        do
            if [[ ${CASE} =~ \.diff$ ]]; then
                # The *.diff files do not signify existing test cases;
                # they can be a leftover from the previous test
                # runs. They will be copied when the corresponding
                # test case is indeed found. Therefore, we just skip
                # them here:
                continue
            fi
            NAME=$(echo "${CASE}" | sed 's/_[0-9][0-9]*\..*//')
            SUFX=$(echo "${CASE}" | sed 's/^.*\.//')
            NUMBER=$(echo "${CASE}" | sed 's/^.*_//; s/\..*$//; s/^00*//')
            if [ "$NUMBER" -eq $PROCESSED ]; then
                continue
            fi
            PROCESSED=$NUMBER;
            echo '#' case: "$CASE"
            ## echo $NUMBER
            if [ $CURRENT_CASE -ne "$NUMBER" ]
            then
                NEW_BASE=${NAME}_$(printf "%03d" $CURRENT_CASE)
                OLD_BASE=${NAME}_$(printf "%03d" "$NUMBER")
                for EXT in sh opt env inp chk tst out diff
                do
                    OLD_FILE=${OLD_BASE}.${EXT}
                    if [ -f "${OLD_FILE}" ]
                    then
                        NEW_FILE=${NEW_BASE}.${EXT}
                        if [[ ${OLD_FILE} =~ \.diff$ ]]
                        then
                            mv -v "${OLD_FILE}" "${NEW_FILE}"
                        else
                            svn mv "${OLD_FILE}" "${NEW_FILE}"
                        fi
                    fi
                done
            fi
            CURRENT_CASE=$(expr $CURRENT_CASE + 1)
        done
    done
done
