1# Define fish_tests.
2add_executable(fish_tests EXCLUDE_FROM_ALL
3               src/fish_tests.cpp)
4fish_link_deps_and_sign(fish_tests)
5
6# The "test" directory.
7set(TEST_DIR ${CMAKE_CURRENT_BINARY_DIR}/test)
8
9# The directory into which fish is installed.
10set(TEST_INSTALL_DIR ${TEST_DIR}/buildroot)
11
12# The directory where the tests expect to find the fish root (./bin, etc)
13set(TEST_ROOT_DIR ${TEST_DIR}/root)
14
15# Copy tests files.
16file(GLOB TESTS_FILES tests/*)
17add_custom_target(tests_dir DEPENDS tests)
18
19if(NOT FISH_IN_TREE_BUILD)
20    add_custom_command(TARGET tests_dir
21                       COMMAND ${CMAKE_COMMAND} -E copy_directory
22                       ${CMAKE_SOURCE_DIR}/tests/ ${CMAKE_BINARY_DIR}/tests/
23                       COMMENT "Copying test files to binary dir"
24                       VERBATIM)
25
26    add_dependencies(fish_tests tests_dir)
27endif()
28
29# Copy littlecheck.py
30configure_file(build_tools/littlecheck.py littlecheck.py COPYONLY)
31
32# Copy pexpect_helper.py
33configure_file(build_tools/pexpect_helper.py pexpect_helper.py COPYONLY)
34
35# Make the directory in which to run tests.
36# Also symlink fish to where the tests expect it to be.
37# Lastly put fish_test_helper there too.
38add_custom_target(tests_buildroot_target
39                  COMMAND ${CMAKE_COMMAND} -E make_directory ${TEST_INSTALL_DIR}
40                  COMMAND DESTDIR=${TEST_INSTALL_DIR} ${CMAKE_COMMAND}
41                          --build ${CMAKE_CURRENT_BINARY_DIR} --target install
42                  COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_BINARY_DIR}/fish_test_helper
43                          ${TEST_INSTALL_DIR}/${CMAKE_INSTALL_PREFIX}/bin
44                  COMMAND ${CMAKE_COMMAND} -E create_symlink
45                          ${TEST_INSTALL_DIR}/${CMAKE_INSTALL_PREFIX}
46                          ${TEST_ROOT_DIR}
47                  DEPENDS fish fish_test_helper)
48
49if(NOT FISH_IN_TREE_BUILD)
50  # We need to symlink share/functions for the tests.
51  # This should be simplified.
52  add_custom_target(symlink_functions
53    COMMAND ${CMAKE_COMMAND} -E create_symlink
54            ${CMAKE_CURRENT_SOURCE_DIR}/share/functions
55            ${CMAKE_CURRENT_BINARY_DIR}/share/functions)
56  add_dependencies(tests_buildroot_target symlink_functions)
57else()
58  add_custom_target(symlink_functions)
59endif()
60
61# Prep the environment for running the unit tests.
62add_custom_target(test_prep
63    # Add directories hard-coded into the tests
64    COMMAND ${CMAKE_COMMAND} -E remove_directory ${TEST_DIR}/data
65    COMMAND ${CMAKE_COMMAND} -E make_directory ${TEST_DIR}/data
66    COMMAND ${CMAKE_COMMAND} -E remove_directory ${TEST_DIR}/temp
67    COMMAND ${CMAKE_COMMAND} -E make_directory ${TEST_DIR}/temp
68
69    # Add the XDG_* directories
70    COMMAND ${CMAKE_COMMAND} -E remove_directory ${TEST_DIR}/xdg_data
71    COMMAND ${CMAKE_COMMAND} -E make_directory ${TEST_DIR}/xdg_data
72    COMMAND ${CMAKE_COMMAND} -E remove_directory ${TEST_DIR}/xdg_config
73    COMMAND ${CMAKE_COMMAND} -E make_directory ${TEST_DIR}/xdg_config
74    COMMAND ${CMAKE_COMMAND} -E remove_directory ${TEST_DIR}/xdg_runtime
75    COMMAND ${CMAKE_COMMAND} -E make_directory ${TEST_DIR}/xdg_runtime
76
77    DEPENDS tests_buildroot_target tests_dir
78    USES_TERMINAL)
79
80# Define our individual tests.
81# Each test is conceptually independent.
82# However when running all tests, we want to run them serially for sanity's sake.
83# So define both a normal target, and a serial variant which enforces ordering.
84foreach(TESTTYPE test serial_test)
85  add_custom_target(${TESTTYPE}_low_level
86    COMMAND env XDG_DATA_DIRS=
87                XDG_DATA_HOME=${CMAKE_CURRENT_BINARY_DIR}/test/xdg_data
88                XDG_CONFIG_HOME=${CMAKE_CURRENT_BINARY_DIR}/test/xdg_config
89                XDG_RUNTIME_DIR=${CMAKE_CURRENT_BINARY_DIR}/test/xdg_runtime
90                ./fish_tests
91    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
92    DEPENDS fish_tests
93    USES_TERMINAL)
94
95  add_custom_target(${TESTTYPE}_fishscript
96                    COMMAND
97                        cd tests &&
98                        env XDG_DATA_DIRS=
99                            XDG_DATA_HOME=${CMAKE_CURRENT_BINARY_DIR}/test/xdg_data
100                            XDG_CONFIG_HOME=${CMAKE_CURRENT_BINARY_DIR}/test/xdg_config
101                            XDG_RUNTIME_DIR=${CMAKE_CURRENT_BINARY_DIR}/test/xdg_runtime
102                        ${TEST_ROOT_DIR}/bin/fish test.fish
103                    DEPENDS test_prep
104                    USES_TERMINAL)
105
106  add_custom_target(${TESTTYPE}_interactive
107      COMMAND cd tests &&
108                env XDG_DATA_DIRS=
109                    XDG_DATA_HOME=${CMAKE_CURRENT_BINARY_DIR}/test/xdg_data
110                    XDG_CONFIG_HOME=${CMAKE_CURRENT_BINARY_DIR}/test/xdg_config
111                    XDG_RUNTIME_DIR=${CMAKE_CURRENT_BINARY_DIR}/test/xdg_runtime
112                ${TEST_ROOT_DIR}/bin/fish interactive.fish
113      DEPENDS test_prep
114      USES_TERMINAL)
115endforeach(TESTTYPE)
116
117# Now add a dependency chain between the serial versions.
118# This ensures they run in order.
119add_dependencies(serial_test_low_level test_prep)
120add_dependencies(serial_test_fishscript serial_test_low_level)
121add_dependencies(serial_test_interactive serial_test_fishscript)
122
123
124add_custom_target(serial_test_high_level
125                  DEPENDS serial_test_interactive serial_test_fishscript)
126
127# Create the 'test' target.
128# Set a policy so CMake stops complaining about the name 'test'.
129cmake_policy(PUSH)
130
131if(${CMAKE_VERSION} VERSION_LESS 3.11.0 AND POLICY CMP0037)
132  cmake_policy(SET CMP0037 OLD)
133endif()
134add_custom_target(test)
135cmake_policy(POP)
136add_dependencies(test serial_test_high_level)
137
138# Group test targets into a TestTargets folder
139set_property(TARGET test tests_dir
140                    test_low_level
141                    test_fishscript
142                    test_interactive
143                    test_fishscript test_prep
144                    tests_buildroot_target
145                    serial_test_high_level
146                    serial_test_low_level
147                    serial_test_fishscript
148                    serial_test_interactive
149                    symlink_functions
150             PROPERTY FOLDER cmake/TestTargets)
151