main_test.py 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. import io
  2. import os
  3. import subprocess
  4. import typing
  5. import unittest.mock
  6. import pandas
  7. import pandas.util.testing
  8. import pytest
  9. import freesurfer_volume_reader.__main__
  10. from conftest import SUBJECTS_DIR, assert_volume_frames_equal
  11. def assert_main_volume_frame_equals(capsys, argv: list, expected_frame: pandas.DataFrame,
  12. subjects_dir: typing.Optional[str] = None):
  13. if subjects_dir:
  14. os.environ['SUBJECTS_DIR'] = subjects_dir
  15. elif 'SUBJECTS_DIR' in os.environ:
  16. del os.environ['SUBJECTS_DIR']
  17. with unittest.mock.patch('sys.argv', [''] + argv):
  18. freesurfer_volume_reader.__main__.main()
  19. out, _ = capsys.readouterr()
  20. resulted_frame = pandas.read_csv(io.StringIO(out)).drop(columns=['source_path'])
  21. if 'correction' in resulted_frame:
  22. resulted_frame['correction'] = resulted_frame['correction'].astype('object')
  23. assert_volume_frames_equal(
  24. left=expected_frame,
  25. # pandas.DataFrame.drop(columns=[...], ...) >= pandas0.21.0
  26. right=resulted_frame,
  27. )
  28. @pytest.mark.parametrize(('args', 'root_dir_paths', 'expected_csv_path'), [
  29. ([],
  30. [os.path.join(SUBJECTS_DIR, 'alice')],
  31. os.path.join(SUBJECTS_DIR, 'alice', 'freesurfer-hippocampal-volumes.csv')),
  32. ([],
  33. [os.path.join(SUBJECTS_DIR, 'bert')],
  34. os.path.join(SUBJECTS_DIR, 'bert', 'freesurfer-hippocampal-volumes.csv')),
  35. ([],
  36. [os.path.join(SUBJECTS_DIR, 'alice'),
  37. os.path.join(SUBJECTS_DIR, 'bert')],
  38. os.path.join(SUBJECTS_DIR, 'freesurfer-hippocampal-volumes.csv')),
  39. ([],
  40. [SUBJECTS_DIR],
  41. os.path.join(SUBJECTS_DIR, 'freesurfer-hippocampal-volumes.csv')),
  42. (['--source-types', 'freesurfer-hipposf'],
  43. [os.path.join(SUBJECTS_DIR, 'alice')],
  44. os.path.join(SUBJECTS_DIR, 'alice', 'freesurfer-hippocampal-volumes.csv')),
  45. (['--source-types', 'freesurfer-hipposf'],
  46. [SUBJECTS_DIR],
  47. os.path.join(SUBJECTS_DIR, 'freesurfer-hippocampal-volumes.csv')),
  48. (['--source-types', 'ashs'],
  49. [os.path.join(SUBJECTS_DIR, 'alice')],
  50. os.path.join(SUBJECTS_DIR, 'alice', 'ashs-hippocampal-volumes.csv')),
  51. (['--source-types', 'ashs'],
  52. [os.path.join(SUBJECTS_DIR, 'bert')],
  53. os.path.join(SUBJECTS_DIR, 'bert', 'ashs-hippocampal-volumes.csv')),
  54. (['--source-types', 'ashs'],
  55. [os.path.join(SUBJECTS_DIR, 'alice'),
  56. os.path.join(SUBJECTS_DIR, 'bert')],
  57. os.path.join(SUBJECTS_DIR, 'ashs-hippocampal-volumes.csv')),
  58. (['--source-types', 'ashs'],
  59. [SUBJECTS_DIR],
  60. os.path.join(SUBJECTS_DIR, 'ashs-hippocampal-volumes.csv')),
  61. (['--source-types', 'ashs', 'freesurfer-hipposf'],
  62. [os.path.join(SUBJECTS_DIR, 'alice')],
  63. os.path.join(SUBJECTS_DIR, 'alice', 'all-hippocampal-volumes.csv')),
  64. (['--source-types', 'freesurfer-hipposf', 'ashs'],
  65. [os.path.join(SUBJECTS_DIR, 'alice')],
  66. os.path.join(SUBJECTS_DIR, 'alice', 'all-hippocampal-volumes.csv')),
  67. (['--source-types', 'ashs', 'freesurfer-hipposf'],
  68. [os.path.join(SUBJECTS_DIR, 'alice'),
  69. os.path.join(SUBJECTS_DIR, 'bert')],
  70. os.path.join(SUBJECTS_DIR, 'all-hippocampal-volumes.csv')),
  71. (['--source-types', 'ashs', 'freesurfer-hipposf'],
  72. [SUBJECTS_DIR],
  73. os.path.join(SUBJECTS_DIR, 'all-hippocampal-volumes.csv')),
  74. ])
  75. def test_main_root_dir_param(capsys, args, root_dir_paths: list, expected_csv_path):
  76. assert_main_volume_frame_equals(
  77. argv=args + ['--'] + root_dir_paths,
  78. expected_frame=pandas.read_csv(expected_csv_path),
  79. capsys=capsys,
  80. )
  81. @pytest.mark.parametrize(('args', 'root_dir_path', 'expected_csv_path'), [
  82. ([],
  83. SUBJECTS_DIR,
  84. os.path.join(SUBJECTS_DIR, 'freesurfer-hippocampal-volumes.csv')),
  85. ([],
  86. os.path.join(SUBJECTS_DIR, 'bert'),
  87. os.path.join(SUBJECTS_DIR, 'bert', 'freesurfer-hippocampal-volumes.csv')),
  88. (['--source-types', 'freesurfer-hipposf'],
  89. SUBJECTS_DIR,
  90. os.path.join(SUBJECTS_DIR, 'freesurfer-hippocampal-volumes.csv')),
  91. (['--source-types', 'freesurfer-hipposf'],
  92. os.path.join(SUBJECTS_DIR, 'bert'),
  93. os.path.join(SUBJECTS_DIR, 'bert', 'freesurfer-hippocampal-volumes.csv')),
  94. (['--source-types', 'freesurfer-hipposf'],
  95. os.path.join(SUBJECTS_DIR, 'bert', 'mri'),
  96. os.path.join(SUBJECTS_DIR, 'bert', 'freesurfer-hippocampal-volumes.csv')),
  97. (['--source-types', 'ashs'],
  98. SUBJECTS_DIR,
  99. os.path.join(SUBJECTS_DIR, 'ashs-hippocampal-volumes.csv')),
  100. (['--source-types', 'ashs'],
  101. os.path.join(SUBJECTS_DIR, 'bert'),
  102. os.path.join(SUBJECTS_DIR, 'bert', 'ashs-hippocampal-volumes.csv')),
  103. (['--source-types', 'ashs'],
  104. os.path.join(SUBJECTS_DIR, 'bert', 'final'),
  105. os.path.join(SUBJECTS_DIR, 'bert', 'ashs-hippocampal-volumes.csv')),
  106. (['--source-types', 'ashs'],
  107. os.path.join(SUBJECTS_DIR, 'alice'),
  108. os.path.join(SUBJECTS_DIR, 'alice', 'ashs-hippocampal-volumes.csv')),
  109. (['--source-types', 'ashs', 'freesurfer-hipposf'],
  110. os.path.join(SUBJECTS_DIR, 'alice'),
  111. os.path.join(SUBJECTS_DIR, 'alice', 'all-hippocampal-volumes.csv')),
  112. (['--source-types', 'freesurfer-hipposf', 'ashs'],
  113. os.path.join(SUBJECTS_DIR, 'alice'),
  114. os.path.join(SUBJECTS_DIR, 'alice', 'all-hippocampal-volumes.csv')),
  115. (['--source-types', 'freesurfer-hipposf', 'ashs'],
  116. SUBJECTS_DIR,
  117. os.path.join(SUBJECTS_DIR, 'all-hippocampal-volumes.csv')),
  118. ])
  119. def test_main_root_dir_env(capsys, args, root_dir_path, expected_csv_path):
  120. assert_main_volume_frame_equals(
  121. argv=args,
  122. subjects_dir=root_dir_path,
  123. expected_frame=pandas.read_csv(expected_csv_path),
  124. capsys=capsys,
  125. )
  126. @pytest.mark.timeout(8)
  127. @pytest.mark.parametrize(('args', 'root_dir_path', 'subjects_dir', 'expected_csv_path'), [
  128. ([],
  129. os.path.join(SUBJECTS_DIR, 'bert'),
  130. os.path.join(SUBJECTS_DIR, 'alice'),
  131. os.path.join(SUBJECTS_DIR, 'bert', 'freesurfer-hippocampal-volumes.csv')),
  132. (['--source-types', 'ashs'],
  133. os.path.join(SUBJECTS_DIR, 'bert'),
  134. os.path.join(SUBJECTS_DIR, 'alice'),
  135. os.path.join(SUBJECTS_DIR, 'bert', 'ashs-hippocampal-volumes.csv')),
  136. ([],
  137. os.path.join(SUBJECTS_DIR, 'bert'),
  138. os.path.abspath(os.sep),
  139. os.path.join(SUBJECTS_DIR, 'bert', 'freesurfer-hippocampal-volumes.csv')),
  140. ])
  141. def test_main_root_dir_overwrite_env(capsys, args, root_dir_path, subjects_dir, expected_csv_path):
  142. assert_main_volume_frame_equals(
  143. argv=args + ['--', root_dir_path],
  144. subjects_dir=subjects_dir,
  145. expected_frame=pandas.read_csv(expected_csv_path),
  146. capsys=capsys,
  147. )
  148. def test_main_root_dir_filename_regex_freesurfer(capsys):
  149. expected_volume_frame = pandas.read_csv(
  150. os.path.join(SUBJECTS_DIR, 'bert', 'freesurfer-hippocampal-volumes.csv'))
  151. assert_main_volume_frame_equals(
  152. argv=['--freesurfer-hipposf-filename-regex', r'^.*-T1-T2\.v10\.txt$',
  153. os.path.join(SUBJECTS_DIR, 'bert')],
  154. expected_frame=expected_volume_frame[expected_volume_frame['analysis_id'] == 'T2'].copy(),
  155. capsys=capsys,
  156. )
  157. def test_main_root_dir_filename_regex_ashs(capsys):
  158. expected_volume_frame = pandas.read_csv(
  159. os.path.join(SUBJECTS_DIR, 'bert', 'ashs-hippocampal-volumes.csv'))
  160. assert_main_volume_frame_equals(
  161. argv=['--ashs-filename-regex', r'_nogray_volumes.txt$',
  162. '--source-types', 'ashs', '--',
  163. os.path.join(SUBJECTS_DIR, 'bert')],
  164. expected_frame=expected_volume_frame[expected_volume_frame['correction']
  165. == 'nogray'].copy(),
  166. capsys=capsys,
  167. )
  168. def test_main_root_dir_filename_regex_combined(capsys):
  169. expected_volume_frame = pandas.read_csv(
  170. os.path.join(SUBJECTS_DIR, 'alice', 'all-hippocampal-volumes.csv'))
  171. expected_volume_frame = expected_volume_frame[
  172. # pylint: disable=singleton-comparison
  173. (expected_volume_frame['T1_input'] == True)
  174. | ((expected_volume_frame['source_type'] == 'ashs')
  175. & expected_volume_frame['correction'].isnull())
  176. ]
  177. assert_main_volume_frame_equals(
  178. argv=['--ashs-filename-regex', r'^alice_left_heur_',
  179. '--freesurfer-hipposf-filename-regex', r'hippoSfVolumes-T1.v10.txt$',
  180. '--source-types', 'ashs', 'freesurfer-hipposf',
  181. '--', os.path.join(SUBJECTS_DIR, 'alice')],
  182. expected_frame=expected_volume_frame.copy(),
  183. capsys=capsys,
  184. )
  185. def test_main_module_script():
  186. subprocess.run(['python', '-m', 'freesurfer_volume_reader', '--help'],
  187. check=True)