# testcases
#
# This file should be filled with test cases to test applets that:
#
#  - can somehow produce output (we can't test sync or sleep)
#  - have a GNU (or other) counterpart
#  - are not interactive (don't require a ^C or anything)
#  - don't require extensive setup or cleanup (a litte setup is fine)
#  - don't have huge and possibly damaging effects (fsck, swapoff)
#
# If possible, a test case should be made that tests each option the applet
# supports. When a new option is added, a new test case should be written for
# it. When somebody reports a bug with a testcase, that testcase should be
# added here as well.
#
# Some other guidelines to follow:
#
#  - please try to keep applets alphabetized, it will make life easier
#  - use the file tester.sh or testcases when you need to do a non-destructive
#    test on a file (i.e., cat, md5sum)
#  - try to make the applet you're testing the first thing on the line (this
#    not always possible)
#  - (???) if you have to create a temporary file, call it TMPFILE
#  - pipe symbols that represent real pipes need a space in front of them
#     (so the test script can find them and add the "../busybox" after it).
#  - pipe symbols that are not used for pipes need to be shell-escaped,
#     with a double \.  See the expr test cases.


# ar

# basename
basename `pwd`

# cat
cat tester.sh
echo hello there | cat tester.sh -

# chmod
# chown
# chgrp
# chroot
# chvt - can't be tested here
# clear - can't be tested here
# cmp
# cp

# cut
echo "1234" | cut -c1
echo "1234" | cut -c 1
echo "1234567890" | cut -c2-7
echo "1234567890" | cut -c 2-7
echo "f1	f2" | cut -f2
echo "f1	f2" | cut -f 2
echo "f1	f2	f3	f4	f5" | cut -f2-4
echo "f1	f2	f3	f4	f5" | cut -f 2-4

# date
date
date -R
date -u
date +%d/%m/%y

# dc - needs an input file

# dd
# BUG: record count line goes to stdout instead of stderr
dd if=/dev/urandom of=O bs=1k count=1 ; ls -l O ; rm O

# deallocvt

# df
# XXX: minor formatting differences
df
df .
df -k
df -h
df -m

# dirname
dirname `pwd`

# dmesg (XXX: change the silly cmd business in the source)
dmesg
dmesg -n 8
dmesg -s 512
# I really don't want to do this next one
#dmesg -c

# dos2unix - needs an input file
# dpkg
# dpkg_deb

# du
# BUG: rounding behavior differs from GNU du
du
du -s
du -l
du -k
du -h
du -m

# dumpkmap - no counterprt?
# dutmp - no counterprt?

# echo
echo "foo bar baz"
echo -n "no newline"


# expr
expr 1 \\| 1
expr 1 \\| 0
expr 0 \\| 1
expr 0 \\| 0

expr 1 \\& 1
expr 1 \\& 0
expr 0 \\& 1
expr 0 \\& 0

expr 0 \\< 1
expr 1 \\< 0

expr 1 \\> 0
expr 0 \\> 1

expr 0 \\<= 1
expr 1 \\<= 0
expr 1 \\<= 1

expr 1 \\>= 0
expr 0 \\>= 1
expr 1 \\>= 1

expr 1 + 2
expr 2 - 1
expr 2 \\* 3
expr 12 / 2
expr 12 % 5

# somebody else can do all the string stuff


# fbset - can't be tested here
# fdflush
# find
find .

# free
# XXX: minor formatting differences
free

# freeramdisk
# fsck.minix - won't test
# getopt

# grep
grep -l strdup ../*utils/*.c
grep -c strdup ../*utils/*.c
grep -lc strdup ../*utils/*.c
grep -cv strdup ../*utils/*.c
grep -i null ../findutils/grep.c
grep -e strdup -e regcomp -e atexit ../findutils/grep.c

# gunzip

# gzip
# XXX: compressed output differs from gzip-1.2.4, but decompresses fine
echo testing 1 2 3 >tmpfile1; gzip tmpfile1; echo tmpfile*; md5sum tmpfile1.gz; rm tmpfile1.gz
echo testing 1 2 3 | gzip >tmpfile1.gz; md5sum tmpfile1.gz; rm tmpfile1.gz


# halt - won't test, dangerous

# head
head tester.sh
head -n 2 tester.sh

# hostid
hostid

# hostname
# XXX: minor formatting differences
hostname
hostname -s
hostname -i
hostname -d
# not going to do this next one
#hostname -F

# id
# BUG: Busybox id doesn't print supplemental groups
id
id -u
id -g
id -ur
id -un


# ifconfig
# requires CONFIG_FEATURE_IFCONFIG_STATUS
ifconfig
#ifconfig -a
#ifconfig eth0
#ifconfig lo

# init - won't test
# insmod - won't test

# kill
#kill -l
# not going to do any more

# length
# ln - see ln_tests.mk
# loadacm
# loadfont
# loadkmap
# logger
# logname

# ls
# XXX: minor formatting differences
ls ../e*
ls -l ../e*
ls -s ../e*
ls -h ../e*
ls -1 ../e*

# lsmod
lsmod

# makedevs

# md5sum
md5sum tester.sh

# mkdir
mkdir D ; ls -ld D ; rmdir D

# mkfifo
#
# we will test making one. actually testing pushing data through it requires
# more interaction than we can manage here.
# (these lines turn up an existing ls bug)
mkfifo F ; ls -l F ; rm F
mkfifo -m 0600 F ; ls -l F ; rm F

# mkfs.minix - won't test
# mknod
# mkswap - won't test
# mktemp
# more - can't test: interactive

# mount
# BUG: proc line starts with /proc instead of proc
mount
# not going to test mount with any args, can't be done safely or sanely

# mt
# mv - see mv_tests.mk
# nc
# nfsmount
# nslookup
# ping
ping -c 3 yahoo.com
# pivot_root
# poweroff - won't test
# printf
# ps - there's lotsa differences between busybox ps and any other ps

# pwd
pwd

# rdate - won't test

# readlink
ln -sf tester.sh L ; readlink L ; rm -f L

# reboot - won't test
# renice - won't test
# reset - can't test: no output

# rm
touch F ; rm F

# rmdir
# rmmod - won't test: dangerous

# route
# XXX: doesn't DNS resolve
route

# rpm2cpio

# sed - we can do some one-liners here, some testing is a little
# difficult to do in just this space (like a,i,c cmds).

# test ^$ matching
echo foo | sed -ne '/^$/p'
echo -e "foo\\n\\nbar" | sed -ne '/^$/p'

sed -e '/test$/d' testcases
sed -e '/^echo/d' testcases
sed -e '/test/s/dangerous/PELIGROSO/' testcases
sed -ne '1,/getopt/p' ../shellutils/pwd.c
sed -e '/getopt/r ../shellutils/pwd.c' ../editors/sed.c


# setkeycodes

# sh - note that we cannot test the shell interactively here
sh -c "echo a b c"
sh -c ">"
sh -c "a"
sh sh.testcases


# sleep - can't test: produces no output

# sort
sort tester.sh
sort -n tester.sh
sort -r tester.sh

# stty
# swapon - won't test: dangerous
# swapoff - won't test: dangerous
# sync - can't test: no output
# syslogd - won't test: too involved

# tail
tail tester.sh
tail -n 2  tester.sh

# tar

# tee
echo "please tee me!" | tee A B C ; cat A B C
echo "please tee me!" | tee A B C ; echo "tee me too!" | tee -a A B C ; cat A B C ; rm A B C

# telnet - can't test: interactive

# test
# tftp

# touch
touch tmpfile1; ls tmpfile1; rm -f tmpfile1
touch -c tmpfile1; ls tmpfile1; rm -f tmpfile1

# tr
# BUG: Busybox tr range handling minix style [a-z] instead of GNU # style a-z
echo "cbaab" | tr abc zyx
echo "TESTING A B C" | tr [A-Z] [a-z]
# not GNU compatible
echo fdhrnzvfu bffvsentr | tr [a-z] [n-z][a-m]
echo abc[] | tr a[b AXB
echo testing | tr -d aeiou

# true
true ; echo $?

# false
false ; echo $?

# tty
# umount
# uname
# uniq
# unix2dos
# update

# uptime
# BUG: doesn't print number of users
uptime

# usleep
# uudecode
# uuencode
# watchdog

# wc
wc tester.sh
wc -c tester.sh
wc -w tester.sh
wc -l tester.sh
wc -L tester.sh

# wget

# which
which ls

# whoami
whoami

# xargs
# XXX: Busygox xargs divides filenames with '\n' instead of ' '
ls -1 ../e* | xargs
ls -1 ../e* | xargs md5sum

# yes - can't test: interactive (needs ^C)

