PageRenderTime 40ms CodeModel.GetById 14ms RepoModel.GetById 1ms app.codeStats 0ms

/psychopy/tests/test_all_visual/test_form.py

https://gitlab.com/braintech/psychopy-brain
Python | 194 lines | 149 code | 34 blank | 11 comment | 9 complexity | f155371d2ab40fab2a91a373a73d0b02 MD5 | raw file
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. from __future__ import division
  4. import os
  5. import pytest
  6. from pandas import DataFrame
  7. from psychopy.visual.window import Window
  8. from psychopy.visual.form import Form
  9. from psychopy.visual.text import TextStim
  10. from psychopy.visual.slider import Slider
  11. from psychopy import constants
  12. import shutil
  13. from tempfile import mkdtemp
  14. class Test_Form(object):
  15. """Test suite for Form component"""
  16. def setup_class(self):
  17. # Create temp files for storing items
  18. self.temp_dir = mkdtemp()
  19. self.fileName_xlsx = os.path.join(self.temp_dir, 'items.xlsx')
  20. self.fileName_csv = os.path.join(self.temp_dir, 'items.csv')
  21. # create some questions
  22. self.questions = []
  23. self.genderItem = {"questionText": "What is your gender?",
  24. "questionWidth": 0.7,
  25. "type": "radio",
  26. "responseWidth": 0.3,
  27. "options": "Male, Female, Other",
  28. "layout": 'vert',
  29. "index": 0,
  30. "questionColor": "white",
  31. "responseColor": "white"
  32. }
  33. self.questions.append(self.genderItem)
  34. # then a set of ratings
  35. items = ["running", "cake", "programming"]
  36. for idx, item in enumerate(items):
  37. entry = {"questionText": "How much you like {}".format(item),
  38. "questionWidth": 0.7,
  39. "type": "rating",
  40. "responseWidth": 0.3,
  41. "options":"Lots, some, Not a lot, Longest Option",
  42. "layout": 'horiz',
  43. "index": idx+1,
  44. "questionColor": "white",
  45. "responseColor": "white"
  46. }
  47. self.questions.append(entry)
  48. self.win = Window(units='height', allowStencil=True, autoLog=False)
  49. self.survey = Form(self.win, items=self.questions, size=(1.0, 0.3), pos=(0.0, 0.0), autoLog=False)
  50. # Create datafiles
  51. df = DataFrame(self.questions)
  52. df.to_excel(self.fileName_xlsx, index=False)
  53. df.to_csv(self.fileName_csv, index=False)
  54. def test_importItems(self):
  55. wrongFields = [{"a": "What is your gender?",
  56. "b": 0.7,
  57. "c": "radio",
  58. "d": 0.3,
  59. "e": "Male, Female, Other",
  60. "f": 'vert',
  61. "g": "white",
  62. "h": "white"
  63. }]
  64. wrongOptions = [{"questionText": "What is your gender?",
  65. "questionWidth": 0.7,
  66. "type": "radio",
  67. "responseWidth": 0.3,
  68. "options": "Other",
  69. "layout": 'vert',
  70. "index": 0,
  71. "questionColor": "white",
  72. "responseColor": "white"}]
  73. reducedHeaders = [{"questionText": "What is your gender?"}]
  74. # Check options for list of dicts
  75. with pytest.raises(ValueError):
  76. self.survey = Form(self.win, items=wrongOptions, size=(1.0, 0.3), pos=(0.0, 0.0), autoLog=False)
  77. # Check default values are applied
  78. self.survey = Form(self.win, items=reducedHeaders, size=(1.0, 0.3), pos=(0.0, 0.0), autoLog=False)
  79. # Check csv
  80. self.survey = Form(self.win, items=self.fileName_csv,
  81. size=(1.0, 0.3), pos=(0.0, 0.0), autoLog=False)
  82. # Check Excel
  83. self.survey = Form(self.win, items=self.fileName_xlsx,
  84. size=(1.0, 0.3), pos=(0.0, 0.0), randomize=False, autoLog=False)
  85. def test_randomize_items(self):
  86. assert self.questions == self.survey.items
  87. self.survey.randomize = True
  88. assert self.questions != self.survey.randomizeItems(self.questions)
  89. def test_set_scroll_speed(self):
  90. items = 2
  91. for multipliers in [1,2,3,4]:
  92. assert self.survey.setScrollSpeed([0] * items, multipliers) == items * multipliers
  93. assert self.survey.setScrollSpeed([0] * items, multipliers) == items * multipliers
  94. assert self.survey.setScrollSpeed([0] * items, multipliers) == items * multipliers
  95. def test_question_text_wrap(self):
  96. for size in [.2, .3, .4]:
  97. assert self.survey._questionTextWrap(size) == size * self.survey.size[0] - (self.survey.itemPadding * 2)
  98. def test_response_text_wrap(self):
  99. options = ['a', 'b', 'c']
  100. for size in [.2, .3, .4]:
  101. item = {"responseWidth": size, "options": options}
  102. assert self.survey._responseTextWrap(item) == size * self.survey.size[0] / len(options)
  103. def test_set_questions(self):
  104. survey = Form(self.win, items=[self.genderItem], size=(1.0, 0.3), pos=(0.0, 0.0), autoLog=False)
  105. textStim, questionHeight, questionWidth = survey._setQuestion(self.genderItem)
  106. assert type(textStim) == TextStim
  107. assert type(questionHeight) == float
  108. assert type(questionWidth) == float
  109. def test_set_response(self):
  110. survey = Form(self.win, items=[self.genderItem], size=(1.0, 0.3), pos=(0.0, 0.0), autoLog=False)
  111. textStim, questionHeight, questionWidth = survey._setQuestion(self.genderItem)
  112. sliderStim, respHeight = survey._setResponse(self.genderItem, textStim)
  113. assert type(sliderStim) == Slider
  114. assert type(respHeight) == float
  115. def test_form_size(self):
  116. assert self.survey.size[0] == (1.0, 0.3)[0] # width
  117. assert self.survey.size[1] == (1.0, 0.3)[1] # height
  118. def test_aperture_size(self):
  119. assert self.survey.aperture.size[0] == self.survey.size[0]
  120. assert self.survey.aperture.size[1] == self.survey.size[1]
  121. def test_border_limits(self):
  122. survey = self.survey
  123. assert survey.leftEdge == survey.pos[0] - survey.size[0]/2.0
  124. assert survey.rightEdge == survey.pos[0] + survey.size[0]/2.0
  125. assert survey.topEdge == survey.pos[1] + survey.size[1]/2.0
  126. def test_text_height(self):
  127. assert self.survey.textHeight == 0.02
  128. def test_item_padding(self):
  129. assert self.survey.itemPadding == 0.05
  130. def test_form_units(self):
  131. assert self.survey.units == 'height'
  132. def test_scroll_offset(self):
  133. for idx, positions in enumerate([1, 0]): # 1 is start position
  134. self.survey.scrollbar.markerPos = positions
  135. posZeroOffset = (self.survey.size[1]
  136. - self.survey.itemPadding
  137. + min(self.survey._baseYpositions))
  138. assert self.survey._getScrollOffset() == [0., posZeroOffset][idx]
  139. def test_screen_status(self):
  140. assert self.survey._inRange(self.survey.formElements['question'][0])
  141. if constants.PY3:
  142. with pytest.raises(AssertionError):
  143. assert self.survey._inRange(self.survey.formElements['question'][3])
  144. def test_get_data(self):
  145. self.survey = Form(self.win, items=self.questions, size=(1.0, 0.3), pos=(0.0, 0.0), autoLog=False)
  146. data = self.survey.getData()
  147. assert set(data['questions']) == {'What is your gender?',
  148. 'How much you like running',
  149. 'How much you like cake',
  150. 'How much you like programming',}
  151. assert set(data['ratings']) == {None}
  152. assert set(data['rt']) == {None}
  153. assert set(data['itemIndex']) == {0, 1, 2, 3}
  154. def teardown_class(self):
  155. shutil.rmtree(self.temp_dir)
  156. self.win.close()
  157. if __name__ == "__main__":
  158. test = Test_Form()
  159. test.setup_class()
  160. test.teardown_class()