test_human_validation.py 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. from unittest import mock
  2. import colorama
  3. from iepy.extraction.terminal import TerminalInterviewer, TerminalEvidenceFormatter
  4. from .factories import EvidenceFactory
  5. from .manager_case import ManagerTestCase
  6. class TextSegmentFormatting(ManagerTestCase):
  7. def setUp(self):
  8. self.c1 = colorama.Fore.GREEN
  9. self.c2 = colorama.Fore.RED
  10. self.reset = colorama.Style.RESET_ALL
  11. self.term = TerminalInterviewer([], lambda x: x)
  12. self.formatter = TerminalEvidenceFormatter()
  13. def test_colorized_simple(self):
  14. ev = EvidenceFactory(markup="{Peter|Person*} likes {Sarah|Person**} .")
  15. fmtted = self.formatter.colored_text(ev, self.c1, self.c2)
  16. self.assertEqual(
  17. fmtted,
  18. u' '.join([self.c1, u'Peter', self.reset, u'likes',
  19. self.c2, u'Sarah', self.reset, u'.']))
  20. def test_colorized_larger(self):
  21. ev = EvidenceFactory(markup="{Peter|Person*} likes {Sarah Jessica Parker|Person**} .")
  22. fmtted = self.formatter.colored_text(ev, self.c1, self.c2)
  23. self.assertEqual(
  24. fmtted,
  25. u' '.join([self.c1, u'Peter', self.reset, u'likes',
  26. self.c2, u'Sarah', u'Jessica', u'Parker', self.reset, u'.']))
  27. def test_colorize_when_several_more_occurrences(self):
  28. ev = EvidenceFactory(markup="{Tom|Person*} hates not {Sarah|Person} but {Peter Parker|Person**} .")
  29. fmtted = self.formatter.colored_text(ev, self.c1, self.c2)
  30. self.assertEqual(
  31. fmtted,
  32. u' '.join([self.c1, u'Tom', self.reset, u'hates not Sarah but',
  33. self.c2, u'Peter Parker', self.reset, u'.']))
  34. class HumanValidationTests(ManagerTestCase):
  35. def setUp(self):
  36. patcher = mock.patch.object(TerminalInterviewer, 'get_human_answer')
  37. self.mock_get_answer = patcher.start()
  38. self.addCleanup(patcher.stop)
  39. patcher = mock.patch.object(TerminalInterviewer, 'explain')
  40. self.mock_explain = patcher.start()
  41. self.addCleanup(patcher.stop)
  42. #def create_question(self, e1, e2, text, confidence=0.5):
  43. # """Simplistic question creator. It's going to create something that will match
  44. # data types, and just that.
  45. # Probably internal offsets will not be good, but will not cause exceptions.
  46. # Text shall not contain the keys for e1 and e2 (meaning it's not checked), but
  47. # shall have at least 4 tokens.
  48. # """
  49. # e1 = EntityFactory(key=e1)
  50. # e2 = EntityFactory(key=e2)
  51. # tokens = text.split()
  52. # ev = EvidenceFactory(
  53. # fact__e1=e1, fact__e2=e2,
  54. # occurrences__data=[(e1, 0, 1), (e2, 1, 2)],
  55. # segment__tokens=tokens)
  56. # return ev, confidence
  57. def test_questions_are_consulted_in_given_order(self):
  58. q1 = EvidenceFactory(markup='{Tom|Person*} eats {Pizza|Food**} happily .')
  59. q2 = EvidenceFactory(markup='{Tom|Person*} eats {Cheese|Food**} happily .')
  60. self.term = TerminalInterviewer([q1, q2], mock.MagicMock())
  61. self.term()
  62. self.assertEqual(self.mock_get_answer.call_count, 2)
  63. self.assertEqual(
  64. self.mock_get_answer.call_args_list,
  65. [mock.call(q1), mock.call(q2)])
  66. def test_YES_NO_answers_are_passed_with_callback_and_proceeds(self):
  67. q1 = EvidenceFactory(markup='{Tom|Person*} eats {Pizza|Food**} happily .')
  68. q2 = EvidenceFactory(markup='{Tom|Person*} eats {Cheese|Food**} happily .')
  69. callback = mock.MagicMock()
  70. self.term = TerminalInterviewer([q1, q2], callback)
  71. self.mock_get_answer.side_effect = [self.term.YES, self.term.NO]
  72. result = self.term()
  73. self.assertIsNone(result)
  74. self.assertEqual(callback.call_count, 2)
  75. self.assertEqual(
  76. callback.call_args_list,
  77. [mock.call(q1, True), mock.call(q2, False)])
  78. def test_user_can_say_he_is_tired_and_no_more_questions_are_shown(self):
  79. q1 = EvidenceFactory(markup='{Tom|Person*} eats {Pizza|Food**} happily .')
  80. q2 = EvidenceFactory(markup='{Tom|Person*} eats {Cheese|Food**} happily .')
  81. self.term = TerminalInterviewer([q1, q2], mock.MagicMock())
  82. self.mock_get_answer.side_effect = [self.term.RUN, self.term.YES]
  83. result = self.term()
  84. # after user says is tired, no more questions
  85. self.assertEqual(self.mock_get_answer.call_count, 1)
  86. self.assertIsNone(result)
  87. def test_user_is_confused_then_callback_is_not_invoken_but_next_question_goes(self):
  88. q1 = EvidenceFactory(markup='{Tom|Person*} {Cheese|Food**} happily eats.')
  89. q2 = EvidenceFactory(markup='{Tom|Person*} eats {Pizza|Food**} happily .')
  90. q3 = EvidenceFactory(markup='{Tom|Person*} eats {Cheese|Food**} happily .')
  91. callback = mock.MagicMock()
  92. self.term = TerminalInterviewer([q1, q2, q3], callback)
  93. self.mock_get_answer.side_effect = [self.term.DONT_KNOW, self.term.YES,
  94. self.term.YES]
  95. result = self.term()
  96. self.assertEqual(callback.call_count, 2)
  97. self.assertEqual(
  98. callback.call_args_list,
  99. [mock.call(q2, True), mock.call(q3, True)])
  100. self.assertEqual(self.mock_get_answer.call_count, 3)
  101. self.assertIsNone(result)
  102. def test_custom_options_stop_execution_and_are_returned(self):
  103. CUSTOM = u'custom'
  104. q1 = EvidenceFactory(markup='{Tom|Person*} eats {Pizza|Food**} happily .')
  105. q2 = EvidenceFactory(markup='{Tom|Person*} eats {Cheese|Food**} happily .')
  106. self.term = TerminalInterviewer(
  107. [q1, q2], mock.MagicMock(),
  108. extra_options=[(CUSTOM, u'some explanation')])
  109. self.mock_get_answer.side_effect = [CUSTOM, self.term.YES]
  110. result = self.term()
  111. # after user picks custom option, no more questions, and returned option
  112. self.assertEqual(self.mock_get_answer.call_count, 1)
  113. self.assertEqual(result, CUSTOM)