main_test.py 8.2 KB

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