testing.py 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556
  1. #!/usr/bin/python
  2. # Copyright 2008 Jurko Gospodnetic
  3. # Copyright 2017 Steven Watanabe
  4. # Distributed under the Boost Software License, Version 1.0.
  5. # (See accompanying file LICENSE.txt or https://www.bfgroup.xyz/b2/LICENSE.txt)
  6. # Tests different aspects of Boost Builds automated testing support.
  7. import BoostBuild
  8. import TestCmd
  9. def test_run():
  10. t = BoostBuild.Tester(use_test_config=False)
  11. t.write("pass.cpp", "int main() {}\n")
  12. t.write("fail-compile.cpp", "#error expected to fail\n")
  13. t.write("fail-link.cpp", "int f();\nint main() { return f(); }\n")
  14. t.write("fail-run.cpp", "int main() { return 1; }\n")
  15. t.write("Jamroot.jam", """import testing ;
  16. run pass.cpp ;
  17. run fail-compile.cpp ;
  18. run fail-link.cpp ;
  19. run fail-run.cpp ;
  20. """)
  21. t.run_build_system(status=1)
  22. t.expect_addition("bin/pass.test/$toolset/debug*/pass.obj")
  23. t.expect_addition("bin/pass.test/$toolset/debug*/pass.exe")
  24. t.expect_addition("bin/pass.test/$toolset/debug*/pass.output")
  25. t.expect_addition("bin/pass.test/$toolset/debug*/pass.run")
  26. t.expect_addition("bin/pass.test/$toolset/debug*/pass.test")
  27. t.expect_addition("bin/fail-link.test/$toolset/debug*/fail-link.obj")
  28. t.expect_addition("bin/fail-run.test/$toolset/debug*/fail-run.obj")
  29. t.expect_addition("bin/fail-run.test/$toolset/debug*/fail-run.exe")
  30. t.expect_addition("bin/fail-run.test/$toolset/debug*/fail-run.output")
  31. t.ignore_addition("bin/pass.test/*/pass.rsp")
  32. t.ignore_addition("bin/fail-link.test/*/fail-link.rsp")
  33. t.ignore_addition("bin/fail-run.test/*/fail-run.rsp")
  34. t.expect_nothing_more()
  35. t.cleanup()
  36. def test_run_fail():
  37. t = BoostBuild.Tester(use_test_config=False)
  38. t.write("pass.cpp", "int main() {}\n")
  39. t.write("fail-compile.cpp", "#error expected to fail\n")
  40. t.write("fail-link.cpp", "int f();\nint main() { return f(); }\n")
  41. t.write("fail-run.cpp", "int main() { return 1; }\n")
  42. t.write("Jamroot.jam", """import testing ;
  43. run-fail pass.cpp ;
  44. run-fail fail-compile.cpp ;
  45. run-fail fail-link.cpp ;
  46. run-fail fail-run.cpp ;
  47. """)
  48. t.run_build_system(status=1)
  49. t.expect_addition("bin/pass.test/$toolset/debug*/pass.obj")
  50. t.expect_addition("bin/pass.test/$toolset/debug*/pass.exe")
  51. t.expect_addition("bin/pass.test/$toolset/debug*/pass.output")
  52. t.expect_addition("bin/fail-link.test/$toolset/debug*/fail-link.obj")
  53. t.expect_addition("bin/fail-run.test/$toolset/debug*/fail-run.obj")
  54. t.expect_addition("bin/fail-run.test/$toolset/debug*/fail-run.exe")
  55. t.expect_addition("bin/fail-run.test/$toolset/debug*/fail-run.output")
  56. t.expect_addition("bin/fail-run.test/$toolset/debug*/fail-run.run")
  57. t.expect_addition("bin/fail-run.test/$toolset/debug*/fail-run.test")
  58. t.ignore_addition("bin/pass.test/*/pass.rsp")
  59. t.ignore_addition("bin/fail-link.test/*/fail-link.rsp")
  60. t.ignore_addition("bin/fail-run.test/*/fail-run.rsp")
  61. t.expect_nothing_more()
  62. t.cleanup()
  63. def test_run_change():
  64. """Tests that the test file is removed when a test fails after it
  65. previously passed."""
  66. t = BoostBuild.Tester(use_test_config=False)
  67. t.write("pass.cpp", "int main() { return 1; }\n")
  68. t.write("fail-compile.cpp", "int main() {}\n")
  69. t.write("fail-link.cpp", "int main() {}\n")
  70. t.write("fail-run.cpp", "int main() {}\n")
  71. t.write("Jamroot.jam", """import testing ;
  72. run-fail pass.cpp ;
  73. run fail-compile.cpp ;
  74. run fail-link.cpp ;
  75. run fail-run.cpp ;
  76. """)
  77. t.run_build_system()
  78. # Sanity check
  79. t.expect_addition("bin/pass.test/$toolset/debug*/pass.test")
  80. t.expect_addition("bin/fail-compile.test/$toolset/debug*/fail-compile.test")
  81. t.expect_addition("bin/fail-link.test/$toolset/debug*/fail-link.test")
  82. t.expect_addition("bin/fail-run.test/$toolset/debug*/fail-run.test")
  83. t.expect_output_lines("...failed*", False)
  84. # Now make them fail
  85. t.write("pass.cpp", "int main() {}\n")
  86. t.write("fail-compile.cpp", "#error expected to fail\n")
  87. t.write("fail-link.cpp", "int f();\nint main() { return f(); }\n")
  88. t.write("fail-run.cpp", "int main() { return 1; }\n")
  89. t.run_build_system(status=1)
  90. t.expect_removal("bin/pass.test/$toolset/debug*/pass.test")
  91. t.expect_removal("bin/fail-compile.test/$toolset/debug*/fail-compile.test")
  92. t.expect_removal("bin/fail-link.test/$toolset/debug*/fail-link.test")
  93. t.expect_removal("bin/fail-run.test/$toolset/debug*/fail-run.test")
  94. t.cleanup()
  95. def test_run_path():
  96. """Tests that run can find shared libraries even without
  97. hardcode-dll-paths. Important: The library is in neither the
  98. current working directory, nor any system path, nor the same
  99. directory as the executable, so it should never be found without
  100. help from B2."""
  101. t = BoostBuild.Tester(["hardcode-dll-paths=false"], use_test_config=False)
  102. t.write("l.cpp", """
  103. void
  104. #if defined(_WIN32)
  105. __declspec(dllexport)
  106. #endif
  107. f() {}
  108. """)
  109. t.write("pass.cpp", "void f(); int main() { f(); }\n")
  110. t.write("Jamroot.jam", """import testing ;
  111. lib l : l.cpp : <link>shared ;
  112. run pass.cpp l ;
  113. """)
  114. t.run_build_system()
  115. t.expect_addition("bin/$toolset/debug*/l.obj")
  116. t.expect_addition("bin/$toolset/debug*/l.dll")
  117. t.expect_addition("bin/pass.test/$toolset/debug*/pass.obj")
  118. t.expect_addition("bin/pass.test/$toolset/debug*/pass.exe")
  119. t.expect_addition("bin/pass.test/$toolset/debug*/pass.output")
  120. t.expect_addition("bin/pass.test/$toolset/debug*/pass.run")
  121. t.expect_addition("bin/pass.test/$toolset/debug*/pass.test")
  122. t.cleanup()
  123. def test_run_args():
  124. """Tests the handling of args and input-files"""
  125. t = BoostBuild.Tester(use_test_config=False)
  126. t.write("test.cpp", """
  127. #include <iostream>
  128. #include <fstream>
  129. int main(int argc, const char ** argv)
  130. {
  131. for(int i = 1; i < argc; ++i)
  132. {
  133. if(argv[i][0] == '-')
  134. {
  135. std::cout << argv[i] << std::endl;
  136. }
  137. else
  138. {
  139. std::ifstream ifs(argv[i]);
  140. std::cout << ifs.rdbuf();
  141. }
  142. }
  143. }
  144. """)
  145. t.write("input1.in", "first input\n")
  146. t.write("input2.in", "second input\n")
  147. t.write("Jamroot.jam", """import testing ;
  148. import common ;
  149. # FIXME: The order actually depends on the lexigraphical
  150. # ordering of the virtual target objects, which is just
  151. # crazy. Switch the order of input1.txt and input2.txt
  152. # to make this fail. Joining the arguments with && might
  153. # work, but might get a bit complicated to implement as
  154. # dependency properties do not currently support &&.
  155. make input1.txt : input1.in : @common.copy ;
  156. make input2.txt : input2.in : @common.copy ;
  157. run test.cpp : -y -a : input1.txt input2.txt ;
  158. """)
  159. t.run_build_system()
  160. t.expect_content("bin/test.test/$toolset/debug*/test.output", """\
  161. -y
  162. -a
  163. first input
  164. second input
  165. EXIT STATUS: 0
  166. """)
  167. t.cleanup()
  168. def test_link():
  169. t = BoostBuild.Tester(use_test_config=False)
  170. t.write("pass.cpp", "int main() {}\n")
  171. t.write("fail-compile.cpp", "#error expected to fail\n")
  172. t.write("fail-link.cpp", "int f();\nint main() { return f(); }\n")
  173. t.write("fail-run.cpp", "int main() { return 1; }\n")
  174. t.write("Jamroot.jam", """import testing ;
  175. link pass.cpp ;
  176. link fail-compile.cpp ;
  177. link fail-link.cpp ;
  178. link fail-run.cpp ;
  179. """)
  180. t.run_build_system(status=1)
  181. t.expect_addition("bin/pass.test/$toolset/debug*/pass.obj")
  182. t.expect_addition("bin/pass.test/$toolset/debug*/pass.exe")
  183. t.expect_addition("bin/pass.test/$toolset/debug*/pass.test")
  184. t.expect_addition("bin/fail-link.test/$toolset/debug*/fail-link.obj")
  185. t.expect_addition("bin/fail-run.test/$toolset/debug*/fail-run.obj")
  186. t.expect_addition("bin/fail-run.test/$toolset/debug*/fail-run.exe")
  187. t.expect_addition("bin/fail-run.test/$toolset/debug*/fail-run.test")
  188. t.ignore_addition("bin/pass.test/*/pass.rsp")
  189. t.ignore_addition("bin/fail-link.test/*/fail-link.rsp")
  190. t.ignore_addition("bin/fail-run.test/*/fail-run.rsp")
  191. t.expect_nothing_more()
  192. t.cleanup()
  193. def test_link_fail():
  194. t = BoostBuild.Tester(use_test_config=False)
  195. t.write("pass.cpp", "int main() {}\n")
  196. t.write("fail-compile.cpp", "#error expected to fail\n")
  197. t.write("fail-link.cpp", "int f();\nint main() { return f(); }\n")
  198. t.write("fail-run.cpp", "int main() { return 1; }\n")
  199. t.write("Jamroot.jam", """import testing ;
  200. link-fail pass.cpp ;
  201. link-fail fail-compile.cpp ;
  202. link-fail fail-link.cpp ;
  203. link-fail fail-run.cpp ;
  204. """)
  205. t.run_build_system(status=1)
  206. t.expect_addition("bin/pass.test/$toolset/debug*/pass.obj")
  207. t.expect_addition("bin/fail-link.test/$toolset/debug*/fail-link.obj")
  208. t.expect_addition("bin/fail-link.test/$toolset/debug*/fail-link.exe")
  209. t.expect_addition("bin/fail-link.test/$toolset/debug*/fail-link.test")
  210. t.expect_addition("bin/fail-run.test/$toolset/debug*/fail-run.obj")
  211. t.ignore_addition("bin/pass.test/*/pass.rsp")
  212. t.ignore_addition("bin/fail-link.test/*/fail-link.rsp")
  213. t.ignore_addition("bin/fail-run.test/*/fail-run.rsp")
  214. t.expect_nothing_more()
  215. t.cleanup()
  216. def test_link_change():
  217. """Tests that the test file is removed when a test fails after it
  218. previously passed."""
  219. t = BoostBuild.Tester(use_test_config=False)
  220. t.write("pass.cpp", "int f();\nint main() { return f(); }\n")
  221. t.write("fail-compile.cpp", "int main() {}\n")
  222. t.write("fail-link.cpp", "int main() {}\n")
  223. t.write("Jamroot.jam", """import testing ;
  224. link-fail pass.cpp ;
  225. link fail-compile.cpp ;
  226. link fail-link.cpp ;
  227. """)
  228. t.run_build_system()
  229. # Sanity check
  230. t.expect_addition("bin/pass.test/$toolset/debug*/pass.test")
  231. t.expect_addition("bin/fail-compile.test/$toolset/debug*/fail-compile.test")
  232. t.expect_addition("bin/fail-link.test/$toolset/debug*/fail-link.test")
  233. t.expect_output_lines("...failed*", False)
  234. # Now make them fail
  235. t.write("pass.cpp", "int main() {}\n")
  236. t.write("fail-compile.cpp", "#error expected to fail\n")
  237. t.write("fail-link.cpp", "int f();\nint main() { return f(); }\n")
  238. t.run_build_system(status=1)
  239. t.expect_removal("bin/pass.test/$toolset/debug*/pass.test")
  240. t.expect_removal("bin/fail-compile.test/$toolset/debug*/fail-compile.test")
  241. t.expect_removal("bin/fail-link.test/$toolset/debug*/fail-link.test")
  242. t.cleanup()
  243. def test_compile():
  244. t = BoostBuild.Tester(use_test_config=False)
  245. t.write("pass.cpp", "int main() {}\n")
  246. t.write("fail-compile.cpp", "#error expected to fail\n")
  247. t.write("fail-link.cpp", "int f();\nint main() { return f(); }\n")
  248. t.write("fail-run.cpp", "int main() { return 1; }\n")
  249. t.write("Jamroot.jam", """import testing ;
  250. compile pass.cpp ;
  251. compile fail-compile.cpp ;
  252. compile fail-link.cpp ;
  253. compile fail-run.cpp ;
  254. """)
  255. t.run_build_system(status=1)
  256. t.expect_addition("bin/pass.test/$toolset/debug*/pass.obj")
  257. t.expect_addition("bin/pass.test/$toolset/debug*/pass.test")
  258. t.expect_addition("bin/fail-link.test/$toolset/debug*/fail-link.obj")
  259. t.expect_addition("bin/fail-link.test/$toolset/debug*/fail-link.test")
  260. t.expect_addition("bin/fail-run.test/$toolset/debug*/fail-run.obj")
  261. t.expect_addition("bin/fail-run.test/$toolset/debug*/fail-run.test")
  262. t.expect_nothing_more()
  263. t.cleanup()
  264. def test_compile_fail():
  265. t = BoostBuild.Tester(use_test_config=False)
  266. t.write("pass.cpp", "int main() {}\n")
  267. t.write("fail-compile.cpp", "#error expected to fail\n")
  268. t.write("fail-link.cpp", "int f();\nint main() { return f(); }\n")
  269. t.write("fail-run.cpp", "int main() { return 1; }\n")
  270. t.write("Jamroot.jam", """import testing ;
  271. compile-fail pass.cpp ;
  272. compile-fail fail-compile.cpp ;
  273. compile-fail fail-link.cpp ;
  274. compile-fail fail-run.cpp ;
  275. """)
  276. t.run_build_system(status=1)
  277. t.expect_addition("bin/fail-compile.test/$toolset/debug*/fail-compile.obj")
  278. t.expect_addition("bin/fail-compile.test/$toolset/debug*/fail-compile.test")
  279. t.expect_nothing_more()
  280. t.cleanup()
  281. def test_compile_change():
  282. """Tests that the test file is removed when a test fails after it
  283. previously passed."""
  284. t = BoostBuild.Tester(use_test_config=False)
  285. t.write("pass.cpp", "#error expected to fail\n")
  286. t.write("fail-compile.cpp", "int main() {}\n")
  287. t.write("Jamroot.jam", """import testing ;
  288. compile-fail pass.cpp ;
  289. compile fail-compile.cpp ;
  290. """)
  291. t.run_build_system()
  292. # Sanity check
  293. t.expect_addition("bin/pass.test/$toolset/debug*/pass.test")
  294. t.expect_addition("bin/fail-compile.test/$toolset/debug*/fail-compile.test")
  295. t.expect_output_lines("...failed*", False)
  296. # Now make them fail
  297. t.write("pass.cpp", "int main() {}\n")
  298. t.write("fail-compile.cpp", "#error expected to fail\n")
  299. t.run_build_system(status=1)
  300. t.expect_removal("bin/pass.test/$toolset/debug*/pass.test")
  301. t.expect_removal("bin/fail-compile.test/$toolset/debug*/fail-compile.test")
  302. t.cleanup()
  303. def test_remove_test_targets(option):
  304. t = BoostBuild.Tester(use_test_config=False)
  305. t.write("pass-compile.cpp", "int main() {}\n")
  306. t.write("pass-link.cpp", "int main() {}\n")
  307. t.write("pass-run.cpp", "int main() {}\n")
  308. t.write("fail-compile.cpp", "#error expected to fail\n")
  309. t.write("fail-link.cpp", "int f();\nint main() { return f(); }\n")
  310. t.write("fail-run.cpp", "int main() { return 1; }\n")
  311. t.write("source.cpp", "int f();\n")
  312. t.write("Jamroot.jam", """import testing ;
  313. obj source.o : source.cpp ;
  314. compile pass-compile.cpp ;
  315. link pass-link.cpp source.o ;
  316. run pass-run.cpp source.o ;
  317. compile-fail fail-compile.cpp ;
  318. link-fail fail-link.cpp ;
  319. run-fail fail-run.cpp ;
  320. """)
  321. t.run_build_system([option])
  322. t.expect_addition("bin/$toolset/debug*/source.obj")
  323. t.expect_addition("bin/pass-compile.test/$toolset/debug*/pass-compile.test")
  324. t.expect_addition("bin/pass-link.test/$toolset/debug*/pass-link.test")
  325. t.expect_addition("bin/pass-run.test/$toolset/debug*/pass-run.output")
  326. t.expect_addition("bin/pass-run.test/$toolset/debug*/pass-run.run")
  327. t.expect_addition("bin/pass-run.test/$toolset/debug*/pass-run.test")
  328. t.expect_addition("bin/fail-compile.test/$toolset/debug*/fail-compile.test")
  329. t.expect_addition("bin/fail-link.test/$toolset/debug*/fail-link.test")
  330. t.expect_addition("bin/fail-run.test/$toolset/debug*/fail-run.output")
  331. t.expect_addition("bin/fail-run.test/$toolset/debug*/fail-run.run")
  332. t.expect_addition("bin/fail-run.test/$toolset/debug*/fail-run.test")
  333. t.ignore_addition("bin/pass-link.test/*/pass-link.rsp")
  334. t.ignore_addition("bin/pass-run.test/*/pass-run.rsp")
  335. t.ignore_addition("bin/fail-link.test/*/fail-link.rsp")
  336. t.ignore_addition("bin/fail-run.test/*/fail-run.rsp")
  337. t.expect_nothing_more()
  338. t.cleanup()
  339. def test_dump_tests():
  340. """Tests the output of the --dump-tests option"""
  341. t = BoostBuild.Tester(use_test_config=False)
  342. t.write("pass-compile.cpp", "int main() {}\n")
  343. t.write("pass-link.cpp", "int main() {}\n")
  344. t.write("pass-run.cpp", "int main() {}\n")
  345. t.write("fail-compile.cpp", "#error expected to fail\n")
  346. t.write("fail-link.cpp", "int f();\nint main() { return f(); }\n")
  347. t.write("fail-run.cpp", "int main() { return 1; }\n")
  348. t.write("Jamroot.jam", """import testing ;
  349. run pass-run.cpp ;
  350. run-fail fail-run.cpp ;
  351. link pass-link.cpp ;
  352. link-fail fail-link.cpp ;
  353. compile pass-compile.cpp ;
  354. compile-fail fail-compile.cpp ;
  355. build-project libs/any/test ;
  356. build-project libs/any/example ;
  357. build-project libs/any ;
  358. build-project tools/bcp/test ;
  359. build-project tools/bcp/example ;
  360. build-project subdir/test ;
  361. build-project status ;
  362. build-project outside/project ;
  363. """)
  364. def write_subdir(dir):
  365. t.write(dir + "/test.cpp", "int main() {}\n")
  366. t.write(dir + "/Jamfile", "run test.cpp ;")
  367. write_subdir("libs/any/test")
  368. write_subdir("libs/any/example")
  369. write_subdir("libs/any")
  370. write_subdir("tools/bcp/test")
  371. write_subdir("tools/bcp/example")
  372. write_subdir("status")
  373. write_subdir("subdir/test")
  374. t.write("outside/other/test.cpp", "int main() {}\n")
  375. t.write("outside/project/Jamroot", "run ../other/test.cpp ;")
  376. t.run_build_system(["--dump-tests", "-n", "-d0"],
  377. match=TestCmd.match_re, stdout=
  378. """boost-test\(RUN\) ".*/pass-run" : "pass-run\.cpp"
  379. boost-test\(RUN_FAIL\) ".*/fail-run" : "fail-run\.cpp"
  380. boost-test\(LINK\) ".*/pass-link" : "pass-link\.cpp"
  381. boost-test\(LINK_FAIL\) ".*/fail-link" : "fail-link\.cpp"
  382. boost-test\(COMPILE\) ".*/pass-compile" : "pass-compile\.cpp"
  383. boost-test\(COMPILE_FAIL\) ".*/fail-compile" : "fail-compile\.cpp"
  384. boost-test\(RUN\) "any/test" : "libs/any/test\.cpp"
  385. boost-test\(RUN\) "any/test" : "libs/any/test/test\.cpp"
  386. boost-test\(RUN\) "any/test" : "libs/any/example/test\.cpp"
  387. boost-test\(RUN\) "bcp/test" : "tools/bcp/test/test\.cpp"
  388. boost-test\(RUN\) "bcp/test" : "tools/bcp/example/test\.cpp"
  389. boost-test\(RUN\) ".*/subdir/test/test" : "subdir/test/test\.cpp"
  390. boost-test\(RUN\) "test" : "status/test\.cpp"
  391. boost-test\(RUN\) ".*/outside/project/test" : "../other/test.cpp"
  392. """)
  393. t.cleanup()
  394. ################################################################################
  395. #
  396. # test_files_with_spaces_in_their_name()
  397. # --------------------------------------
  398. #
  399. ################################################################################
  400. def test_files_with_spaces_in_their_name():
  401. """Regression test making sure test result files get created correctly when
  402. testing files with spaces in their name.
  403. """
  404. t = BoostBuild.Tester(use_test_config=False)
  405. t.write("valid source.cpp", "int main() {}\n");
  406. t.write("invalid source.cpp", "this is not valid source code");
  407. t.write("jamroot.jam", """
  408. import testing ;
  409. testing.compile "valid source.cpp" ;
  410. testing.compile-fail "invalid source.cpp" ;
  411. """)
  412. t.run_build_system(status=0)
  413. t.expect_addition("bin/invalid source.test/$toolset/debug*/invalid source.obj")
  414. t.expect_addition("bin/invalid source.test/$toolset/debug*/invalid source.test")
  415. t.expect_addition("bin/valid source.test/$toolset/debug*/valid source.obj")
  416. t.expect_addition("bin/valid source.test/$toolset/debug*/valid source.test")
  417. t.expect_content("bin/valid source.test/$toolset/debug*/valid source.test", \
  418. "passed" )
  419. t.expect_content( \
  420. "bin/invalid source.test/$toolset/debug*/invalid source.test", \
  421. "passed" )
  422. t.expect_content( \
  423. "bin/invalid source.test/$toolset/debug*/invalid source.obj", \
  424. "failed as expected" )
  425. t.cleanup()
  426. ################################################################################
  427. #
  428. # main()
  429. # ------
  430. #
  431. ################################################################################
  432. test_run()
  433. test_run_fail()
  434. test_run_change()
  435. test_run_path()
  436. test_run_args()
  437. test_link()
  438. test_link_fail()
  439. test_link_change()
  440. test_compile()
  441. test_compile_fail()
  442. test_compile_change()
  443. test_remove_test_targets("--remove-test-targets")
  444. test_remove_test_targets("preserve-test-targets=off")
  445. test_dump_tests()
  446. test_files_with_spaces_in_their_name()