test_generateMessages.py 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. """
  2. This file will test the differents modules in generate_messages folder
  3. You must have the pip package pytest installed
  4. """
  5. import os
  6. import sys
  7. import pytest
  8. import shutil
  9. import pandas as pd
  10. import yaml
  11. import datetime
  12. fpath = os.path.join(os.path.dirname(__file__),'..', 'generate_messages')
  13. sys.path.append(fpath)
  14. import generate_messages.messages as msg
  15. TEST_DATASET_PATH = os.path.join('tests','test_dataset') #dataset to use for tests changing it
  16. DATASET_PATH = os.path.join('tests','existing_dataset') #dataset already existing, used for tests that don't change it
  17. YAML_PATH = os.path.join(DATASET_PATH, 'extra','messages','definition','metrics_messages.yaml')
  18. with open(YAML_PATH, 'r') as in_yaml:
  19. YAML = yaml.load(in_yaml, Loader=yaml.FullLoader)
  20. def set_up_dataset():
  21. if os.path.exists(TEST_DATASET_PATH):
  22. shutil.rmtree(TEST_DATASET_PATH)
  23. shutil.copytree(DATASET_PATH, TEST_DATASET_PATH)
  24. ########## generate_messages #############
  25. list_of_metrics_label = ['avg_cry_voc_dur_chi', 'avg_non_can_voc_dur_chi', 'non_can_voc_chi_ph', 'voc_chi_ph', 'mean_pitch_range_chi', 'avg_pr_pm_fem', 'mlus_fem', 'avg_can_voc_dur_chi', 'sc_fem_ph', 'chi_adu_turn_transitions', 'mean_mean_pitch_fem', 'avg_voc_dur_fem', 'lp_n', 'voc_dur_fem_ph', 'cp_n', 'cry_voc_dur_chi_ph', 'duration_acoustic', 'cp_dur', 'mean_pitch_range_fem', 'wc_fem_ph', 'duration_vcm', 'avg_voc_dur_chi', 'mean_mean_pitch_chi', 'voc_dur_chi_ph', 'voc_fem_ph', 'mluw_fem', 'can_voc_chi_ph', 'mlup_fem', 'duration_alice_vtc', 'avg_sr_pm_fem', 'lp_dur', 'duration_conversations', 'duration_vtc', 'avg_wr_pm_fem', 'can_voc_dur_chi_ph', 'pc_fem_ph', 'cry_voc_chi_ph', 'non_can_voc_dur_chi_ph']
  26. def test_get_metrics():
  27. met_rec, cols = msg.get_metrics(DATASET_PATH, os.path.join(DATASET_PATH,'extra','metrics','metrics.csv'))
  28. assert sorted(cols) == sorted(list_of_metrics_label)
  29. pd.testing.assert_frame_equal(met_rec, pd.read_csv(os.path.join('tests','data','truth','get_metrics.csv')))
  30. @pytest.mark.parametrize('key,yml,date,evol,truth',[
  31. ([False, False], YAML,'20221101', [('chi_adu_turn_transitions', 0.0, False), ('voc_chi_ph', -6.0, False)],'Gracias por enviarnos el audio. Qué bueno que hayas tomado un rato para conversar con tu hijo/a. Comunicate con <<nombre-bebe>> en todas las oportunidades que tengas – esto le hará muy bien ahora y en el futuro. La próxima vez probá practicar que haya más ida y vuelta entre ustedes, por ejemplo, haciéndole preguntas a <<nombre-bebe>>.'),
  32. ([False, True], YAML,'20221118', [('voc_chi_ph', 0.0, False), ('chi_adu_turn_transitions', 6.0, True)],'En tu último audio, hubo más ida y vuelta entre ustedes. ¡Muy bien! La próxima vez probá dejar más espacio para que <<nombre-bebe>> hable, por ejemplo, haciéndole preguntas. Comunicate con <<nombre-bebe>> en todas las oportunidades que tengas – le ayudarás a desarrollar más su capacidad de expresarse.'),
  33. ([True, True], YAML,'20221114', [('chi_adu_turn_transitions', 3.0, True), ('voc_chi_ph', 6.0, True)],'En tu último audio, hubo más ida y vuelta entre ustedes y <<nombre-bebe>> habló más que en el audio anterior. ¡Eso es excelente! Comunicate con <<nombre-bebe>> en todas las oportunidades que tengas – estarás contribuyendo a desarrollar más su cerebro.'),
  34. ([True, False], YAML,'20221201', [('voc_chi_ph', 9.0, True), ('chi_adu_turn_transitions', -6.0, False)],'En tu último audio, <<nombre-bebe>> habló más que en el audio anterior. ¡Muy bien! La próxima vez probá practicar que haya más ida y vuelta entre ustedes, por ejemplo, haciéndole preguntas a <<nombre-bebe>>. Comunicate con <<nombre-bebe>> en todas las oportunidades que tengas – le ayudarás a estimular sus habilidades sociales.'),
  35. ])
  36. def test_fill_template(key,yml,evol,truth, date):
  37. start = datetime.datetime.strptime(YAML['start_date'],'%Y-%m-%d')
  38. end = datetime.datetime.strptime(YAML['end_date'],'%Y-%m-%d')
  39. datet = datetime.datetime.strptime(date,'%Y%m%d')
  40. res = msg.fill_template(key,yml,evol,datet, start,end)
  41. #print(res)
  42. assert truth == res
  43. @pytest.mark.parametrize('yml,date,truth',[
  44. (YAML,'20221101', 'Gracias por enviarnos el audio. Qué bueno que hayas tomado un rato para conversar con tu hijo/a. Comunicate con <<nombre-bebe>> en todas las oportunidades que tengas – esto le hará muy bien ahora y en el futuro.'),
  45. (YAML,'20221118', 'Gracias por enviarnos el audio. Qué bueno que hayas tomado un rato para conversar con tu hijo/a. Comunicate con <<nombre-bebe>> en todas las oportunidades que tengas – le ayudarás a desarrollar más su capacidad de expresarse.'),
  46. (YAML,'20221114', 'Gracias por enviarnos el audio. Qué bueno que hayas tomado un rato para conversar con tu hijo/a. Comunicate con <<nombre-bebe>> en todas las oportunidades que tengas – estarás contribuyendo a desarrollar más su cerebro.'),
  47. (YAML,'20221201', 'Gracias por enviarnos el audio. Qué bueno que hayas tomado un rato para conversar con tu hijo/a. Comunicate con <<nombre-bebe>> en todas las oportunidades que tengas – le ayudarás a estimular sus habilidades sociales.'),
  48. ])
  49. def test_fill_default(yml,truth, date):
  50. start = datetime.datetime.strptime(YAML['start_date'],'%Y-%m-%d')
  51. end = datetime.datetime.strptime(YAML['end_date'],'%Y-%m-%d')
  52. datet = datetime.datetime.strptime(date,'%Y%m%d')
  53. res = msg.fill_default(yml,datet, start,end)
  54. #print(res)
  55. assert truth == res
  56. #dependent on get_metrics - fill_template
  57. @pytest.mark.parametrize('date,dateThrow',[
  58. ('20220117',False),
  59. ('20220207',False),
  60. ('14000202',False),
  61. ('2022-01-01',True),
  62. ])
  63. def test_build_messages(date, dateThrow):
  64. if dateThrow:
  65. with pytest.raises(ValueError):
  66. msg.build_messages(pd.DataFrame(),[],YAML_PATH,date) #wrong date format will throw ValueError
  67. else:
  68. metrics = pd.read_csv(os.path.join('tests' ,'data','mockup_messages','metrics.csv'))
  69. columns = list(set(metrics.columns) - set(['recording_filename', 'child_id']))
  70. recordings = pd.read_csv(os.path.join('tests', 'data', 'mockup_messages','recordings.csv'))
  71. metrics_recordings = pd.merge(metrics, recordings, on='recording_filename', suffixes=('', '_drop'))
  72. metrics_recordings.drop([col for col in metrics_recordings.columns if 'drop' in col], axis=1, inplace=True)
  73. # Handle file with the same child_id that have the same date -> keep the longest one
  74. metrics_recordings = (metrics_recordings.groupby(['child_id', 'date_iso'], as_index=False)
  75. # Keep only the first segment for each candidate speaker
  76. .apply(lambda rows: (rows.sort_values(by='start_time', ascending=False) # take last instead
  77. .head(n=1))))
  78. messages = msg.build_messages(metrics_recordings, columns, YAML_PATH, date)
  79. truth = pd.read_csv(os.path.join('tests', 'data', 'mockup_messages', 'messages_{}.csv'.format(date)), sep=';')
  80. pd.testing.assert_frame_equal(messages, truth, check_like=True)
  81. #dependent on build_messages - get_metrics - fill_template
  82. def test_generate_messages():
  83. set_up_dataset()
  84. data_path = os.path.join('tests','data', 'mockup_messages')
  85. metadata_path = os.path.join(TEST_DATASET_PATH,'metadata')
  86. shutil.copyfile(os.path.join(data_path,'recordings.csv'), os.path.join(metadata_path, 'recordings.csv'))
  87. shutil.copyfile(os.path.join(data_path,'children.csv'), os.path.join(metadata_path,'children.csv'))
  88. shutil.copyfile(os.path.join(data_path,'annotations.csv'), os.path.join(metadata_path,'annotations.csv'))
  89. date1 = '20220117'
  90. msg.generate_messages(TEST_DATASET_PATH, os.path.join(data_path,'metrics.csv'), YAML_PATH, date1)
  91. messages1 = pd.read_csv(os.path.join(TEST_DATASET_PATH, 'extra','messages','generated','messages_{}.csv'.format(date1)), sep=';')
  92. date2 = '20220207'
  93. msg.generate_messages(TEST_DATASET_PATH, os.path.join(data_path,'metrics.csv'), YAML_PATH, date2)
  94. messages2 = pd.read_csv(os.path.join(TEST_DATASET_PATH, 'extra','messages','generated','messages_{}.csv'.format(date2)), sep=';')
  95. truth1 = pd.read_csv(os.path.join('tests', 'data', 'mockup_messages', 'messages_{}.csv'.format(date1)), sep=';')
  96. truth2 = pd.read_csv(os.path.join('tests', 'data', 'mockup_messages', 'messages_{}.csv'.format(date2)), sep=';')
  97. pd.testing.assert_frame_equal(messages1, truth1, check_like=True)
  98. pd.testing.assert_frame_equal(messages2, truth2, check_like=True)
  99. ##########################################