#! /bin/bash

do_diff()
{
	mount -t vfat ${TEST_DRIVE}1 $TEST_MOUNT_POINT > /dev/null

	if diff -rq $1 $2 >> test_log; then
		ped_test_ok
	else
		ped_test_failed
	fi

	umount $TEST_MOUNT_POINT 2>&1 > /dev/null
}

do_test_diff()
{
	ped_testing "$1"
	if ped_test_get_val "$4" "$5" "$6" "$7"; then
		ped_test_failed
		return 1
	fi
	do_diff "$2" "$3"
}

test_mkpartfs()
{
	ped_test "mkpartfs"\
		"mklabel $TEST_FS_USE_DISK_LABEL\
		mkpartfs primary fat 1 $DEFAULT_END\
		check 1"\
		""\
		"/sbin/dosfsck ${TEST_DRIVE}1"

	ped_test "mkfs"\
		"mkfs 1 fat\
		 check 1"\
		""\
		"/sbin/dosfsck ${TEST_DRIVE}1"
}

prepare_resize_tests()
{
	part_num=1
	part=$TEST_DRIVE$part_num
	hole_parent=`echo $TEST_DATA_HOLE | sed -e "s/[-_.a-zA-Z0-9]+\///g"`

	umount $TEST_MOUNT_POINT 2>&1 > /dev/null

	mount $part $TEST_MOUNT_POINT -t vfat \
	&& cp -r $TEST_DATA/* $TEST_MOUNT_POINT \
	&& cp -r $TEST_DATA $TEST_MOUNT_POINT/tmp_copy \
	&& rm -rf $TEST_MOUNT_POINT/$TEST_DATA_HOLE \
	&& mv $TEST_MOUNT_POINT/tmp_copy/$TEST_DATA_HOLE \
	      $TEST_MOUNT_POINT/$hole_parent \
	&& rm -rf $TEST_MOUNT_POINT/tmp_copy \
	&& umount $TEST_MOUNT_POINT
}

clearfat()
{
	$TEST_PARTED_CLEARFAT $TEST_DRIVE $1
}

test_resize_move_start_forward()
{
# geometry beforehand:  1 to $DEFAULT_END
	do_test_diff "resize: move start forward"\
		$TEST_DATA $TEST_MOUNT_POINT \
		"resize 1 5 $DEFAULT_END check 1"\
		"Yes"\
		"/sbin/dosfsck ${TEST_DRIVE}1"
	clearfat 1
}

test_resize_move_start_backward()
{
# geometry beforehand: 5 to $DEFAULT_END
	do_test_diff "resize: move start backward"\
		$TEST_DATA $TEST_MOUNT_POINT \
		"resize 1 1 $DEFAULT_END check 1"\
		"OK"\
		"/sbin/dosfsck ${TEST_DRIVE}1"
	clearfat 1
}

test_resize_move_end_forward()
{
# geometry beforehand: 1 to $DEFAULT_END
	do_test_diff "resize: move end forward"\
		$TEST_DATA $TEST_MOUNT_POINT \
		"resize 1 1 $[ $DEFAULT_END + 5 ] check 1"\
		"OK"\
		"/sbin/dosfsck ${TEST_DRIVE}1"
	clearfat 1
}

test_resize_move_end_backward()
{
# geometry beforehand:  1 to $[$DEFAULT_END + 5]
	do_test_diff "resize: move end backward"\
		$TEST_DATA $TEST_MOUNT_POINT \
		"resize 1 1 $DEFAULT_END check 1"\
		"Yes"\
		"/sbin/dosfsck ${TEST_DRIVE}1"
	clearfat 1
}

test_convert_fat16_fat32_shrink_cluster()
{
# geometry beforehand:  1 to $DEFAULT_END
	do_test_diff \
	"resize: convert from FAT16 to FAT32, shrinking the cluster size"\
		$TEST_DATA $TEST_MOUNT_POINT \
		"resize 1 1 $FAT32_END check 1"\
		"OK"\
		"/sbin/dosfsck ${TEST_DRIVE}1"
	clearfat 1
}

test_convert_fat32_fat16()
{
# geometry beforehand:  1 to $FAT16_SMALL_END
	do_test_diff "resize: convert from FAT32 to FAT16"\
		$TEST_DATA $TEST_MOUNT_POINT \
		"resize 1 1 $FAT32_END check 1"\
		"OK"\
		"/sbin/dosfsck ${TEST_DRIVE}1"
	clearfat 1
}

test_convert_fat16_fat32()
{
# geometry beforehand:  1 to $FAT32_END
	do_test_diff "resize: convert from FAT16 to FAT32"\
		$TEST_DATA $TEST_MOUNT_POINT \
		"resize 1 1 $FAT16_SMALL_END check 1"\
		"Yes"\
		"/sbin/dosfsck ${TEST_DRIVE}1"
	clearfat 1
}

#test_convert_fat32_fat16_shrink_cluster()
#{
#}

#test_fat16_shrink_cluster()
#{
#}

#test_fat32_shrink_cluster()
#{
#}

main()
{
	export DEFAULT_END=300
	export FAT32_END=600
	export FAT16_SMALL_END=200

	if ! test_mkpartfs; then
		return 1
	fi

	prepare_resize_tests
	test_resize_move_start_forward
	test_resize_move_start_backward
	test_resize_move_end_forward
	test_resize_move_end_backward
#
#	prepare_resize_tests
	test_convert_fat16_fat32_shrink_cluster
	test_convert_fat32_fat16
	test_convert_fat16_fat32
}

main

