diff --git a/test/cli/qml_test.py b/test/cli/qml_test.py index 0d1be1ebd59..81c22cf03b0 100644 --- a/test/cli/qml_test.py +++ b/test/cli/qml_test.py @@ -2,27 +2,64 @@ # python3 -m pytest test-qml.py import os -import pytest from testutils import cppcheck -PROJECT_DIR = 'QML-Samples-TableView' +__script_dir = os.path.dirname(os.path.abspath(__file__)) + +# there are unused functions. But fillSampleData is not unused because that is referenced from main.qml +__project_dir = os.path.join(__script_dir, 'QML-Samples-TableView') +__project_dir_sep = __project_dir + os.path.sep def test_unused_functions(): - ret, stdout, stderr = cppcheck(['--library=qt', '--enable=unusedFunction', PROJECT_DIR]) + ret, stdout, stderr = cppcheck(['-q', '--template=simple', '--library=qt', '--enable=unusedFunction', __project_dir]) # there are unused functions. But fillSampleData is not unused because that is referenced from main.qml - assert '[unusedFunction]' in stderr - assert 'fillSampleData' not in stderr + assert stdout.splitlines() == [] + assert stderr.splitlines() == [ + "{}samplemodel.cpp:9:0: style: The function 'rowCount' is never used. [unusedFunction]".format(__project_dir_sep), + "{}samplemodel.cpp:15:0: style: The function 'data' is never used. [unusedFunction]".format(__project_dir_sep), + "{}samplemodel.cpp:38:0: style: The function 'roleNames' is never used. [unusedFunction]".format(__project_dir_sep) + ] + assert ret == 0, stdout + +def test_unused_functions_j(): + ret, stdout, stderr = cppcheck(['-q', '--template=simple', '--library=qt', '--enable=unusedFunction', '-j2', __project_dir]) + assert stdout.splitlines() == [ + "cppcheck: unusedFunction check can't be used with '-j' option. Disabling unusedFunction check." + ] + assert stderr.splitlines() == [] + assert ret == 0, stdout # TODO: abil out on this -@pytest.mark.xfail -def test_unused_functions_j(tmpdir): + +# TODO: fillSampleData is not unused +def test_unused_functions_builddir(tmpdir): build_dir = os.path.join(tmpdir, 'b1') os.mkdir(build_dir) - ret, stdout, stderr = cppcheck(['--library=qt', '--enable=unusedFunction', '-j2', '--cppcheck-build-dir={}'.format(build_dir), PROJECT_DIR]) - # there are unused functions. But fillSampleData is not unused because that is referenced from main.qml - assert '[unusedFunction]' in stderr - assert 'fillSampleData' not in stderr + ret, stdout, stderr = cppcheck(['-q', '--template=simple', '--library=qt', '--enable=unusedFunction', '--cppcheck-build-dir={}'.format(build_dir), __project_dir]) + assert stdout.splitlines() == [] + assert stderr.splitlines() == [ + "{}samplemodel.cpp:15:0: style: The function 'data' is never used. [unusedFunction]".format(__project_dir_sep), + "{}samplemodel.cpp:47:0: style: The function 'fillSampleData' is never used. [unusedFunction]".format(__project_dir_sep), + "{}samplemodel.cpp:38:0: style: The function 'roleNames' is never used. [unusedFunction]".format(__project_dir_sep), + "{}samplemodel.cpp:9:0: style: The function 'rowCount' is never used. [unusedFunction]".format(__project_dir_sep), + ] + assert ret == 0, stdout + + +# TODO: fillSampleData is not unused +def test_unused_functions_builddir_j(tmpdir): + build_dir = os.path.join(tmpdir, 'b1') + os.mkdir(build_dir) + ret, stdout, stderr = cppcheck(['-q', '--template=simple', '--library=qt', '--enable=unusedFunction', '-j2', '--cppcheck-build-dir={}'.format(build_dir), __project_dir]) + assert stdout.splitlines() == [] + assert stderr.splitlines() == [ + "{}samplemodel.cpp:15:0: style: The function 'data' is never used. [unusedFunction]".format(__project_dir_sep), + "{}samplemodel.cpp:47:0: style: The function 'fillSampleData' is never used. [unusedFunction]".format(__project_dir_sep), + "{}samplemodel.cpp:38:0: style: The function 'roleNames' is never used. [unusedFunction]".format(__project_dir_sep), + "{}samplemodel.cpp:9:0: style: The function 'rowCount' is never used. [unusedFunction]".format(__project_dir_sep), + ] + assert ret == 0, stdout # TODO: test with project file # TODO: test with FileSettings diff --git a/test/cli/unusedFunction/1.c b/test/cli/unusedFunction/1.c new file mode 100644 index 00000000000..6e725814d2b --- /dev/null +++ b/test/cli/unusedFunction/1.c @@ -0,0 +1,7 @@ +#include "3.h" + +// cppcheck-suppress unusedFunction +void f1() +{ + f3_1(); +} \ No newline at end of file diff --git a/test/cli/unusedFunction/2.c b/test/cli/unusedFunction/2.c new file mode 100644 index 00000000000..c6bf77cea8b --- /dev/null +++ b/test/cli/unusedFunction/2.c @@ -0,0 +1,7 @@ +#include "3.h" + +// cppcheck-suppress unusedFunction +void f2() +{ + f3_2(); +} \ No newline at end of file diff --git a/test/cli/unusedFunction/3.c b/test/cli/unusedFunction/3.c new file mode 100644 index 00000000000..876803c585b --- /dev/null +++ b/test/cli/unusedFunction/3.c @@ -0,0 +1,3 @@ +void f3_1() {} +void f3_2() {} +void f3_3() {} \ No newline at end of file diff --git a/test/cli/unusedFunction/3.h b/test/cli/unusedFunction/3.h new file mode 100644 index 00000000000..3b643b42c26 --- /dev/null +++ b/test/cli/unusedFunction/3.h @@ -0,0 +1,3 @@ +void f3_1(); +void f3_2(); +void f3_3(); \ No newline at end of file diff --git a/test/cli/unusedFunction/unusedFunction.cppcheck b/test/cli/unusedFunction/unusedFunction.cppcheck new file mode 100644 index 00000000000..858bee444a6 --- /dev/null +++ b/test/cli/unusedFunction/unusedFunction.cppcheck @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/test/cli/unused_function_test.py b/test/cli/unused_function_test.py new file mode 100644 index 00000000000..b15b35540b4 --- /dev/null +++ b/test/cli/unused_function_test.py @@ -0,0 +1,213 @@ + +# python3 -m pytest test-unused_function_test.py + +import os +import json +from testutils import cppcheck + +__script_dir = os.path.dirname(os.path.abspath(__file__)) + +__project_dir = os.path.join(__script_dir, 'unusedFunction') +__project_dir_sep = __project_dir + os.path.sep + + +# TODO: make this a generic helper function +def __create_compdb(tmpdir, projpath): + compile_commands = os.path.join(tmpdir, 'compile_commands.json') + j = [ + { + 'directory': projpath, + 'file': os.path.join(projpath, '1.c'), + 'command': 'gcc -c 1.c' + }, + { + 'directory': projpath, + 'file': os.path.join(projpath, '2.c'), + 'command': 'gcc -c 2.c' + }, + { + 'directory': projpath, + 'file': os.path.join(projpath, '3.c'), + 'command': 'gcc -c 3.c' + } + ] + with open(compile_commands, 'wt') as f: + f.write(json.dumps(j, indent=4)) + return compile_commands + + +def test_unused_functions(): + ret, stdout, stderr = cppcheck(['-q', '--template=simple', '--enable=unusedFunction', '--inline-suppr', __project_dir]) + assert stdout.splitlines() == [] + assert stderr.splitlines() == [ + "{}3.c:3:0: style: The function 'f3_3' is never used. [unusedFunction]".format(__project_dir_sep) + ] + assert ret == 0, stdout + + +def test_unused_functions_j(): + ret, stdout, stderr = cppcheck(['-q', '--template=simple', '--enable=unusedFunction', '--inline-suppr', '-j2', __project_dir]) + assert stdout.splitlines() == [ + "cppcheck: unusedFunction check can't be used with '-j' option. Disabling unusedFunction check." + ] + assert stderr.splitlines() == [] + assert ret == 0, stdout + + +def test_unused_functions_project(): + ret, stdout, stderr = cppcheck(['-q', + '--template=simple', + '--enable=unusedFunction', + '--inline-suppr', + '--project={}'.format(os.path.join(__project_dir, 'unusedFunction.cppcheck'))]) + assert stdout.splitlines() == [] + assert [ + "{}3.c:3:0: style: The function 'f3_3' is never used. [unusedFunction]".format(__project_dir_sep) + ] == stderr.splitlines() + assert ret == 0, stdout + + +def test_unused_functions_project_j(): + ret, stdout, stderr = cppcheck(['-q', + '--template=simple', + '--enable=unusedFunction', + '--inline-suppr', + '--project={}'.format(os.path.join(__project_dir, 'unusedFunction.cppcheck')), + '-j2']) + assert stdout.splitlines() == [ + "cppcheck: unusedFunction check can't be used with '-j' option. Disabling unusedFunction check." + ] + assert [] == stderr.splitlines() + assert ret == 0, stdout + + +def test_unused_functions_compdb(tmpdir): + compdb_file = __create_compdb(tmpdir, __project_dir) + ret, stdout, stderr = cppcheck(['-q', + '--template=simple', + '--enable=unusedFunction', + '--inline-suppr', + '--project={}'.format(compdb_file) + ]) + assert stdout.splitlines() == [] + assert stderr.splitlines() == [ + "{}3.c:3:0: style: The function 'f3_3' is never used. [unusedFunction]".format(__project_dir_sep) + ] + assert ret == 0, stdout + + +def test_unused_functions_compdb_j(tmpdir): + compdb_file = __create_compdb(tmpdir, __project_dir) + ret, stdout, stderr = cppcheck(['-q', + '--template=simple', + '--enable=unusedFunction', + '--inline-suppr', + '--project={}'.format(compdb_file), + '-j2' + ]) + assert stdout.splitlines() == [ + "cppcheck: unusedFunction check can't be used with '-j' option. Disabling unusedFunction check." + ] + assert stderr.splitlines() == [] + assert ret == 0, stdout + + +def test_unused_functions_builddir(tmpdir): + build_dir = os.path.join(tmpdir, 'b1') + os.mkdir(build_dir) + ret, stdout, stderr = cppcheck(['-q', '--template=simple', '--enable=unusedFunction', '--inline-suppr', '--cppcheck-build-dir={}'.format(build_dir), __project_dir]) + assert stdout.splitlines() == [] + assert stderr.splitlines() == [ + "{}3.c:3:0: style: The function 'f3_3' is never used. [unusedFunction]".format(__project_dir_sep) + ] + assert ret == 0, stdout + + +# TODO: only f3_3 is unused +def test_unused_functions_builddir_j(tmpdir): + build_dir = os.path.join(tmpdir, 'b1') + os.mkdir(build_dir) + ret, stdout, stderr = cppcheck(['-q', '--template=simple', '--enable=unusedFunction', '--inline-suppr', '-j2', '--cppcheck-build-dir={}'.format(build_dir), __project_dir]) + assert stdout.splitlines() == [] + assert stderr.splitlines() == [ + "{}1.c:4:0: style: The function 'f1' is never used. [unusedFunction]".format(__project_dir_sep), + "{}2.c:4:0: style: The function 'f2' is never used. [unusedFunction]".format(__project_dir_sep), + "{}3.c:3:0: style: The function 'f3_3' is never used. [unusedFunction]".format(__project_dir_sep) + ] + assert ret == 0, stdout + + +def test_unused_functions_builddir_project(tmpdir): + build_dir = os.path.join(tmpdir, 'b1') + os.mkdir(build_dir) + ret, stdout, stderr = cppcheck(['-q', + '--template=simple', + '--enable=unusedFunction', + '--inline-suppr', + '--project={}'.format(os.path.join(__project_dir, 'unusedFunction.cppcheck')), + '--cppcheck-build-dir={}'.format(build_dir)]) + assert stdout.splitlines() == [] + assert stderr.splitlines() == [ + "{}3.c:3:0: style: The function 'f3_3' is never used. [unusedFunction]".format(__project_dir_sep) + ] + assert ret == 0, stdout + + +# TODO: only f3_3 is unused +def test_unused_functions_builddir_project_j(tmpdir): + build_dir = os.path.join(tmpdir, 'b1') + os.mkdir(build_dir) + ret, stdout, stderr = cppcheck(['-q', + '--template=simple', + '--enable=unusedFunction', + '--inline-suppr', + '--project={}'.format(os.path.join(__project_dir, 'unusedFunction.cppcheck')), + '--cppcheck-build-dir={}'.format(build_dir), + '-j2']) + assert stdout.splitlines() == [] + assert stderr.splitlines() == [ + "{}1.c:4:0: style: The function 'f1' is never used. [unusedFunction]".format(__project_dir_sep), + "{}2.c:4:0: style: The function 'f2' is never used. [unusedFunction]".format(__project_dir_sep), + "{}3.c:3:0: style: The function 'f3_3' is never used. [unusedFunction]".format(__project_dir_sep) + ] + assert ret == 0, stdout + + +def test_unused_functions_builddir_compdb(tmpdir): + compdb_file = __create_compdb(tmpdir, __project_dir) + build_dir = os.path.join(tmpdir, 'b1') + os.mkdir(build_dir) + ret, stdout, stderr = cppcheck(['-q', + '--template=simple', + '--enable=unusedFunction', + '--inline-suppr', + '--project={}'.format(compdb_file), + '--cppcheck-build-dir={}'.format(build_dir) + ]) + assert stdout.splitlines() == [] + assert stderr.splitlines() == [ + "{}3.c:3:0: style: The function 'f3_3' is never used. [unusedFunction]".format(__project_dir_sep) + ] + assert ret == 0, stdout + + +# TODO: only f3_3 is unused +def test_unused_functions_builddir_compdb_j(tmpdir): + compdb_file = __create_compdb(tmpdir, __project_dir) + build_dir = os.path.join(tmpdir, 'b1') + os.mkdir(build_dir) + ret, stdout, stderr = cppcheck(['-q', + '--template=simple', + '--enable=unusedFunction', + '--inline-suppr', + '--project={}'.format(compdb_file), + '--cppcheck-build-dir={}'.format(build_dir), + '-j2' + ]) + assert stdout.splitlines() == [] + assert stderr.splitlines() == [ + "{}1.c:4:0: style: The function 'f1' is never used. [unusedFunction]".format(__project_dir_sep), + "{}2.c:4:0: style: The function 'f2' is never used. [unusedFunction]".format(__project_dir_sep), + "{}3.c:3:0: style: The function 'f3_3' is never used. [unusedFunction]".format(__project_dir_sep) + ] + assert ret == 0, stdout