#!/bin/sh
######################################################
#
# Test refile
#
######################################################

set -e

if test -z "${MH_OBJ_DIR}"; then
    srcdir=`dirname $0`/../..
    MH_OBJ_DIR=`cd $srcdir && pwd`; export MH_OBJ_DIR
fi

. "$MH_OBJ_DIR/test/common.sh"

setup_test

check_exit '-eq 1' refile -

expected=$MH_TEST_DIR/$$.expected
actual=$MH_TEST_DIR/$$.actual

cd $MH_TEST_DIR

run_prog folder -create +other -fast >/dev/null
run_prog folder -create +another -fast >/dev/null

# check with no options and no current message
run_test 'refile' 'refile: no folder specified'

# check with current message
run_prog folder +inbox 4 >/dev/null
run_test 'refile +other' ''
run_test 'folders -noheader' \
'another  has no messages.
inbox+   has  9 messages  (1-10); cur=4.
other    has  1 message   (1- 1).

TOTAL = 10 messages in 3 folders.'

# check with specified message
run_prog folder +inbox 5 >/dev/null
run_test 'refile 5 +other' ''
run_test 'folders -noheader' \
'another  has no messages.
inbox+   has  8 messages  (1-10); cur=5.
other    has  2 messages  (1- 2).

TOTAL = 10 messages in 3 folders.'

# check multiple messages
run_test 'refile 6 7 +other' ''
run_test 'folders -noheader' \
'another  has no messages.
inbox+   has  6 messages  (1-10); cur=7.
other    has  4 messages  (1- 4).

TOTAL = 10 messages in 3 folders.'

# check multiple folders
run_test 'refile 8 +other +another' ''
run_test 'folders -noheader' \
'another  has 1 message   (1- 1).
inbox+   has 5 messages  (1-10); cur=8.
other    has 5 messages  (1- 5).

TOTAL = 11 messages in 3 folders.'

# check message number greater than highest
run_test 'refile 11 +other' "refile: message 11 doesn't exist"
run_prog folder -f +another >/dev/null

# check -src
run_test 'refile 9 -src +inbox +other' ''
run_test 'folders -noheader' \
'another  has 1 message   (1- 1).
inbox+   has 4 messages  (1-10); cur=9.
other    has 6 messages  (1- 6).

TOTAL = 11 messages in 3 folders.'

# check -file
run_test "refile -file $MH_TEST_DIR/Mail/inbox/10 +other" ''
run_test 'folders -noheader' \
'another  has 1 message   (1-1).
inbox+   has 3 messages  (1-3).
other    has 7 messages  (1-7).

TOTAL = 11 messages in 3 folders.'

# check -file -, which isn't supported
run_test "refile -file - +other <$MH_TEST_DIR/Mail/inbox/9" \
         'refile: missing argument to -file'
run_test 'folders -noheader' \
'another  has 1 message   (1-1).
inbox+   has 3 messages  (1-3).
other    has 7 messages  (1-7).

TOTAL = 11 messages in 3 folders.'

run_test "refile -src +other all +inbox"
run_test 'folders -noheader' \
'another  has  1 message   (1- 1).
inbox    has 10 messages  (1-10); cur=9.
other+   has no messages.

TOTAL = 11 messages in 3 folders.'

# check -draft
mv $MH_TEST_DIR/Mail/another/1 $MH_TEST_DIR/Mail/draft
rmdir $MH_TEST_DIR/Mail/another
run_test 'refile -draft +other' ''
run_test 'folders -noheader' \
'inbox  has 10 messages  (1-10); cur=9.
other+ has  1 message   (1- 1).

TOTAL = 11 messages in 2 folders.'

check_for_hard_links
if [ $xdir_links_supported -eq 1 ]; then
  # check -link
  run_test 'refile 7 -src +inbox +other -link' ''
  run_test 'folders -noheader' \
  'inbox+ has 10 messages  (1-10); cur=7.
other  has  2 messages  (1- 2).

TOTAL = 12 messages in 2 folders.'
  # inbox/7 and other/2 are linked.  Modify one and verify
  # that the other changes as well.
  echo '' >>$MH_TEST_DIR/Mail/other/2
  run_test "cmp $MH_TEST_DIR/Mail/inbox/7 $MH_TEST_DIR/Mail/other/2" ''
else
  # Hard links are not supported.  Skip the -link test but emulate
  # what it would have done using a copy instead of a link.
  cp -p Mail/inbox/7 Mail/other/2
  folder -f +inbox 7 >/dev/null
fi

# check -nolink
run_test 'refile 7 +other -link -nolink' ''
run_test 'folders -noheader' \
'inbox+ has 9 messages  (1-10); cur=7.
other  has 3 messages  (1- 3).

TOTAL = 12 messages in 2 folders.'
# inbox/7 should no longer exist because it was moved, not linked.
run_test 'scan +inbox 7' "scan: message 7 doesn't exist"

# check -preserve
run_test 'refile 10 +other -preserve' ''
run_test 'folders -noheader' \
'inbox+ has 8 messages  (1- 9).
other  has 4 messages  (1-10).

TOTAL = 12 messages in 2 folders.'
run_test 'scan +other last -format %(msg):%(decode{subject})' \
         '10:Testing message 10'

# check -nopreserve
run_test 'refile 9 -src +inbox +other -preserve -nopreserve' ''
run_test 'folders -noheader' \
'inbox+ has 7 messages  (1- 8).
other  has 5 messages  (1-11).

TOTAL = 12 messages in 2 folders.'
run_test 'scan +other last -format %(msg):%(decode{subject})' \
         '11:Testing message 9'

sbackup="`mhparam sbackup`"

# check -unlink
run_test 'refile 3 -src +inbox +other -unlink' ''
run_test 'folders -noheader' \
'inbox+ has 6 messages  (1- 8); cur=3.
other  has 6 messages  (1-12).

TOTAL = 12 messages in 2 folders.'
if test -f "$MH_TEST_DIR/Mail/inbox/${sbackup}3"; then
  echo "$0: refile -unlink failed" 1>&2
  failed=`expr ${failed:-0} + 1`
fi

# check -nounlink
run_test 'refile 2 +other -unlink -nounlink' ''
run_test 'folders -noheader' \
'inbox+ has 5 messages  (1- 8); cur=2.
other  has 7 messages  (1-13).

TOTAL = 12 messages in 2 folders.'
if test -f "$MH_TEST_DIR/Mail/inbox/${sbackup}2"; then
  :
else
  echo "$0: refile -nounlink failed" 1>&2
  failed=`expr ${failed:-0} + 1`
fi

# test folder creation when stdin is not a tty
refile first +newfolder </dev/null
run_test 'folders -noheader' \
'inbox+     has 4 messages  (4- 8).
newfolder  has 1 message   (1- 1).
other      has 7 messages  (1-13).

TOTAL = 12 messages in 3 folders.'

# test -rmmproc
run_test 'refile first +other -rmmproc echo' '4'
run_test 'folders -noheader' \
'inbox+     has 4 messages  (4- 8); cur=4.
newfolder  has 1 message   (1- 1).
other      has 8 messages  (1-14).

TOTAL = 13 messages in 3 folders.'

# test -normmproc
run_test 'refile first +other -rmmproc echo -normmproc' ''
run_test 'folders -noheader' \
'inbox+     has 3 messages  (5- 8).
newfolder  has 1 message   (1- 1).
other      has 9 messages  (1-15).

TOTAL = 13 messages in 3 folders.'

# test -retainsequences
mark first -seq seq1
mark last -seq seq2
refile first last -retainsequences +other
#### The following command changes the current folder to +other.
run_test 'mark +other -list -sequence seq1 -sequence seq2' \
         "seq1: 16
seq2: 17"

# test -retainsequences when refiling to same folder (+other)
# cur is set to the original message number of the last message refiled.
mark first -seq seq1 -zero
mark first=2 -seq seq2 -zero
refile first:2 -retainsequences +other
run_test 'mark -list' "cur: 2
seq1: 18
seq2: 19"

exit $failed
