Module Name:    src
Committed By:   rillig
Date:           Thu Oct 14 18:55:41 UTC 2021

Modified Files:
        src/tests/usr.bin/indent: t_errors.sh t_misc.sh

Log Message:
tests/indent: cover more error cases and inline indentation


To generate a diff of this commit:
cvs rdiff -u -r1.2 -r1.3 src/tests/usr.bin/indent/t_errors.sh
cvs rdiff -u -r1.1 -r1.2 src/tests/usr.bin/indent/t_misc.sh

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/tests/usr.bin/indent/t_errors.sh
diff -u src/tests/usr.bin/indent/t_errors.sh:1.2 src/tests/usr.bin/indent/t_errors.sh:1.3
--- src/tests/usr.bin/indent/t_errors.sh:1.2	Thu Oct 14 17:42:13 2021
+++ src/tests/usr.bin/indent/t_errors.sh	Thu Oct 14 18:55:41 2021
@@ -1,5 +1,5 @@
 #! /bin/sh
-# $NetBSD: t_errors.sh,v 1.2 2021/10/14 17:42:13 rillig Exp $
+# $NetBSD: t_errors.sh,v 1.3 2021/10/14 18:55:41 rillig Exp $
 #
 # Copyright (c) 2021 The NetBSD Foundation, Inc.
 # All rights reserved.
@@ -85,6 +85,48 @@ option_typedefs_not_found_body()
 	    -U./nonexistent
 }
 
+atf_test_case 'option_tabsize_negative'
+option_tabsize_negative_body()
+{
+	expect_error \
+	    'indent: Command line: option "-ts" requires an integer parameter' \
+	    -ts-1
+}
+
+atf_test_case 'option_tabsize_zero'
+option_tabsize_zero_body()
+{
+	expect_error \
+	    'indent: invalid tabsize 0' \
+	    -ts0
+}
+
+atf_test_case 'option_tabsize_large'
+option_tabsize_large_body()
+{
+	# Integer overflow, on both ILP32 and LP64 platforms.
+	expect_error \
+	    'indent: invalid tabsize 81' \
+	    -ts81
+}
+
+atf_test_case 'option_tabsize_very_large'
+option_tabsize_very_large_body()
+{
+	# Integer overflow, on both ILP32 and LP64 platforms.
+	expect_error \
+	    'indent: invalid tabsize -1294967296' \
+	    -ts3000000000
+}
+
+atf_test_case 'option_indent_size_zero'
+option_indent_size_zero_body()
+{
+	expect_error \
+	    'indent: invalid indentation 0' \
+	    -i0
+}
+
 atf_test_case 'option_buffer_overflow'
 option_buffer_overflow_body()
 {
@@ -128,6 +170,168 @@ unterminated_comment_body()
 	    "$indent" -st < comment.c
 }
 
+atf_test_case 'in_place_wrong_backup'
+in_place_wrong_backup_body()
+{
+	cat <<-\EOF > code.c
+		int decl;
+	EOF
+	cp code.c code.c.orig
+
+	# Due to the strange backup suffix '/subdir', indent tries to create
+	# a file named 'code.c/subdir', but 'code.c' is already a regular
+	# file, not a directory.
+	atf_check -s 'exit:1' \
+	    -e 'inline:indent: code.c/subdir: Not a directory'"$nl" \
+	    env SIMPLE_BACKUP_SUFFIX="/subdir" "$indent" code.c
+
+	# Since there was an early error, the original file is kept as is.
+	atf_check -o 'file:code.c.orig' \
+	    cat code.c
+}
+
+atf_test_case 'argument_input_enoent'
+argument_input_enoent_body()
+{
+	atf_check -s 'exit:1' \
+	    -e 'inline:indent: ./nonexistent.c: No such file or directory'"$nl" \
+	    "$indent" ./nonexistent.c
+}
+
+atf_test_case 'argument_output_equals_input_name'
+argument_output_equals_input_name_body()
+{
+	echo '/* comment */' > code.c
+
+	atf_check -s 'exit:1' \
+	    -e 'inline:indent: input and output files must be different'"$nl" \
+	    "$indent" code.c code.c
+}
+
+atf_test_case 'argument_output_equals_input_file'
+argument_output_equals_input_file_body()
+{
+	echo '/* comment */' > code.c
+
+	atf_check \
+	    "$indent" code.c ./code.c
+
+	# Oops, the file has become empty since the output is first emptied,
+	# before reading any of the input.
+	atf_check \
+	    cat code.c
+}
+
+atf_test_case 'argument_output_enoent'
+argument_output_enoent_body()
+{
+	expect_error \
+	    'indent: subdir/nonexistent.c: No such file or directory' \
+	    /dev/null subdir/nonexistent.c
+}
+
+atf_test_case 'argument_too_many'
+argument_too_many_body()
+{
+	echo '/* comment */' > arg1.c
+
+	expect_error \
+	    'indent: unknown parameter: arg3.c' \
+	    arg1.c arg2.c arg3.c arg4.c
+}
+
+atf_test_case 'unexpected_end_of_file'
+unexpected_end_of_file_body()
+{
+	echo 'struct{' > code.c
+
+	expect_error \
+	    'Error@1: Stuff missing from end of file' \
+	    code.c
+
+	atf_check \
+	    -o 'inline:struct {'"$nl" \
+	    cat code.c
+}
+
+atf_test_case 'unexpected_closing_brace_top_level'
+unexpected_closing_brace_top_level_body()
+{
+	echo '}' > code.c
+
+	expect_error \
+	    'Error@1: Statement nesting error' \
+	    code.c
+	atf_check \
+	    -o 'inline:}'"$nl" \
+	    cat code.c
+}
+
+atf_test_case 'unexpected_closing_brace_decl'
+unexpected_closing_brace_decl_body()
+{
+	echo 'int i = 3};' > code.c
+
+	expect_error \
+	    'Error@1: Statement nesting error' \
+	    code.c
+	# Despite the error message, the original file got overwritten with a
+	# best-effort rewrite of the code.
+	atf_check \
+	    -o 'inline:int		i = 3};'"$nl" \
+	    cat code.c
+}
+
+atf_test_case 'preprocessing_overflow'
+preprocessing_overflow_body()
+{
+	cat <<-\EOF > code.c
+		#if 1
+		#if 2
+		#if 3
+		#if 4
+		#if 5
+		#if 6
+		#endif 6
+		#endif 5
+		#endif 4
+		#endif 3
+		#endif 2
+		#endif 1
+		#endif too much
+	EOF
+	cat <<-\EOF > stderr.exp
+		Error@6: #if stack overflow
+		Error@12: Unmatched #endif
+		Error@13: Unmatched #endif
+	EOF
+
+	atf_check -s 'exit:1' \
+	    -e 'file:stderr.exp' \
+	    "$indent" code.c
+}
+
+atf_test_case 'preprocessing_unrecognized'
+preprocessing_unrecognized_body()
+{
+	cat <<-\EOF > code.c
+		#unknown
+		# 3 "file.c"
+		#elif 3
+		#else
+	EOF
+	cat <<-\EOF > stderr.exp
+		Error@1: Unrecognized cpp directive
+		Error@2: Unrecognized cpp directive
+		Error@3: Unmatched #elif
+		Error@4: Unmatched #else
+	EOF
+
+	atf_check -s 'exit:1' \
+	    -e 'file:stderr.exp' \
+	    "$indent" code.c
+}
+
 atf_init_test_cases()
 {
 	atf_add_test_case 'option_unknown'
@@ -137,5 +341,21 @@ atf_init_test_cases()
 	atf_add_test_case 'option_buffer_overflow'
 	atf_add_test_case 'option_typedefs_not_found'
 	atf_add_test_case 'option_special_missing_param'
+	atf_add_test_case 'option_tabsize_negative'
+	atf_add_test_case 'option_tabsize_zero'
+	atf_add_test_case 'option_tabsize_large'
+	atf_add_test_case 'option_tabsize_very_large'
+	atf_add_test_case 'option_indent_size_zero'
 	atf_add_test_case 'unterminated_comment'
+	atf_add_test_case 'in_place_wrong_backup'
+	atf_add_test_case 'argument_input_enoent'
+	atf_add_test_case 'argument_output_equals_input_name'
+	atf_add_test_case 'argument_output_equals_input_file'
+	atf_add_test_case 'argument_output_enoent'
+	atf_add_test_case 'argument_too_many'
+	atf_add_test_case 'unexpected_end_of_file'
+	atf_add_test_case 'unexpected_closing_brace_top_level'
+	atf_add_test_case 'unexpected_closing_brace_decl'
+	atf_add_test_case 'preprocessing_overflow'
+	atf_add_test_case 'preprocessing_unrecognized'
 }

Index: src/tests/usr.bin/indent/t_misc.sh
diff -u src/tests/usr.bin/indent/t_misc.sh:1.1 src/tests/usr.bin/indent/t_misc.sh:1.2
--- src/tests/usr.bin/indent/t_misc.sh:1.1	Thu Oct 14 17:42:13 2021
+++ src/tests/usr.bin/indent/t_misc.sh	Thu Oct 14 18:55:41 2021
@@ -1,5 +1,5 @@
 #! /bin/sh
-# $NetBSD: t_misc.sh,v 1.1 2021/10/14 17:42:13 rillig Exp $
+# $NetBSD: t_misc.sh,v 1.2 2021/10/14 18:55:41 rillig Exp $
 #
 # Copyright (c) 2021 The NetBSD Foundation, Inc.
 # All rights reserved.
@@ -31,6 +31,27 @@
 # used in t_indent.
 
 indent=$(atf_config_get usr.bin.indent.test_indent /usr/bin/indent)
+nl='
+'
+
+atf_test_case 'in_place'
+in_place_body()
+{
+	cat <<-\EOF > code.c
+		int decl;
+	EOF
+	cat <<-\EOF > code.c.exp
+		int		decl;
+	EOF
+	cp code.c code.c.orig
+
+	atf_check \
+	    env SIMPLE_BACKUP_SUFFIX=".bak" "$indent" code.c
+	atf_check -o 'file:code.c.exp' \
+	    cat code.c
+	atf_check -o 'file:code.c.orig' \
+	    cat code.c.bak
+}
 
 atf_test_case 'verbose_profile'
 verbose_profile_body()
@@ -72,5 +93,6 @@ verbose_profile_body()
 
 atf_init_test_cases()
 {
+	atf_add_test_case 'in_place'
 	atf_add_test_case 'verbose_profile'
 }

Reply via email to