Beispiel #1
0
 def setup_class(self):
     self.questions = []
     self.win = Window(units='height', allowStencil=True, autoLog=False)
     # create some questions
     self.genderItem = {
         "questionText": "What is your gender?",
         "questionWidth": 0.7,
         "type": "radio",
         "responseWidth": 0.3,
         "options": "Male, Female, Other",
         "layout": 'vert',
         "index": 0
     }
     self.questions.append(self.genderItem)
     # then a set of ratings
     items = ["running", "cake", "programming"]
     for idx, item in enumerate(items):
         entry = {
             "questionText": "How much you like {}".format(item),
             "questionWidth": 0.7,
             "type": "rating",
             "responseWidth": 0.3,
             "options": "Lots, some, Not a lot, Longest Option",
             "layout": 'horiz',
             "index": idx + 1
         }
         self.questions.append(entry)
     self.survey = Form(self.win,
                        items=self.questions,
                        size=(1.0, 0.3),
                        pos=(0.0, 0.0),
                        autoLog=False)
Beispiel #2
0
    def test_set_questions(self):
        survey = Form(self.win, items=[self.genderItem], size=(1.0, 0.3), pos=(0.0, 0.0), autoLog=False)
        textStim, questionHeight, questionWidth = survey._setQuestion(self.genderItem)

        assert type(textStim) == TextStim
        assert type(questionHeight) == float
        assert type(questionWidth) == float
Beispiel #3
0
    def test_set_questions(self):
        survey = Form(self.win, items=[self.genderItem], size=(1.0, 0.3), pos=(0.0, 0.0), autoLog=False)
        textStim, questionHeight, questionWidth = survey._setQuestion(self.genderItem)

        assert type(textStim) == TextStim
        assert type(questionHeight) == float
        assert type(questionWidth) == float
Beispiel #4
0
    def test_set_response(self):
        survey = Form(self.win, items=[self.genderItem], size=(1.0, 0.3), pos=(0.0, 0.0), autoLog=False)
        textStim, questionHeight, questionWidth = survey._setQuestion(self.genderItem)
        sliderStim, respHeight = survey._setResponse(self.genderItem, textStim)

        assert type(sliderStim) == Slider
        assert type(respHeight) == float
Beispiel #5
0
    def test_set_response(self):
        survey = Form(self.win, items=[self.genderItem], size=(1.0, 0.3), pos=(0.0, 0.0), autoLog=False)
        textStim, questionHeight, questionWidth = survey._setQuestion(self.genderItem)
        sliderStim, respHeight = survey._setResponse(self.genderItem, textStim)

        assert type(sliderStim) == Slider
        assert type(respHeight) == float
Beispiel #6
0
    def test_set_response(self):
        survey = Form(self.win, items=[], size=(1.0, 0.3), pos=(0.0, 0.0))
        textStim, qHeight, qWidth = survey._setQuestion(self.genderItem)
        sliderStim, aHeight = survey._setResponse(self.genderItem, textStim)

        assert type(sliderStim) == Slider
        assert type(aHeight) == float
Beispiel #7
0
    def test_importItems(self):
        wrongFields = [{"a": "What is your gender?",
                      "b": 0.7,
                      "c": "radio",
                      "d": 0.3,
                      "e": "Male, Female, Other",
                      "f": 'vert'}]

        wrongOptions = [{"questionText": "What is your gender?",
                      "questionWidth": 0.7,
                      "type": "radio",
                      "responseWidth": 0.3,
                      "options": "Other",
                      "layout": 'vert',
                      "index": 0}]

        df = DataFrame(self.questions)
        df.to_excel(fileName_xlsx, index=False)
        df.to_csv(fileName_csv, index=False)

        # Check wrong field error
        with pytest.raises(NameError):
            self.survey = Form(self.win, items=wrongFields, size=(1.0, 0.3), pos=(0.0, 0.0), autoLog=False)

        # Check options for list of dicts
        with pytest.raises(ValueError):
            self.survey = Form(self.win, items=wrongOptions, size=(1.0, 0.3), pos=(0.0, 0.0), autoLog=False)

        # Check csv
        self.survey = Form(self.win, items=fileName_csv,
                           size=(1.0, 0.3), pos=(0.0, 0.0), autoLog=False)
        # Check Excel
        self.survey = Form(self.win, items=fileName_xlsx,
                           size=(1.0, 0.3), pos=(0.0, 0.0), randomize=False, autoLog=False)
Beispiel #8
0
    def test_set_questions(self):
        survey = Form(self.win, items=[self.genderItem], size=(1.0, 0.3),
                      pos=(0.0, 0.0), autoLog=False)
        ctrl, h, w = survey._setQuestion(self.genderItem)

        assert type(ctrl) == TextBox2
        assert type(h) in [float, np.float64]
        assert type(w) in [float, np.float64]
Beispiel #9
0
    def test_set_response(self):
        survey = Form(self.win, items=[self.genderItem], size=(1.0, 0.3),
                      pos=(0.0, 0.0), autoLog=False)
        ctrl, h, w = survey._setQuestion(self.genderItem)
        sliderStim, respHeight = survey._setResponse(self.genderItem)

        assert type(sliderStim) == Slider
        assert type(respHeight) in [float, np.float64]
Beispiel #10
0
 def test_get_data(self):
     self.survey = Form(self.win, items=self.questions, size=(1.0, 0.3), pos=(0.0, 0.0), autoLog=False)
     data = self.survey.getData()
     assert set(data['questions']) == {'What is your gender?',
                                       'How much you like running',
                                       'How much you like cake',
                                       'How much you like programming',}
     assert set(data['ratings']) == {None}
     assert set(data['rt']) == {None}
     assert set(data['itemIndex']) == {0, 1, 2, 3}
Beispiel #11
0
 def test_get_data(self):
     self.survey = Form(self.win, items=self.questions, size=(1.0, 0.3),
                        pos=(0.0, 0.0), autoLog=False)
     data = self.survey.getData()
     Qs = [this['itemText'] for this in data]
     indices = [item['index'] for item in data]
     assert Qs == ['What is your gender?',
                   'How much you like running',
                   'How much you like cake',
                   'How much you like programming',]
     assert all([item['response'] is None for item in data])
     assert all([item['rt'] is None for item in data])
     assert list(indices) == list(range(4))
Beispiel #12
0
    def test_baseYpositions(self):
        survey = Form(self.win, items=self.questions, size=(1.0, 0.3), pos=(0.0, 0.0))
        testPositions = []
        survey.virtualHeight = 0
        for item in survey.items:
            question, qHeight, qWidth = survey._setQuestion(item)
            response, aHeight, = survey._setResponse(item, question)
            testPositions.append(survey.virtualHeight
                                 - max(aHeight, qHeight)
                                 + (aHeight / 2)
                                 - survey.textHeight)
            survey.virtualHeight -= max(aHeight, qHeight) + survey.itemPadding

        for idx, pos in enumerate(survey._baseYpositions):
            assert testPositions[idx] == pos
Beispiel #13
0
    def test_importItems(self):
        wrongFields = [{
            "a": "What is your gender?",
            "b": 0.7,
            "c": "radio",
            "d": 0.3,
            "e": "Male, Female, Other",
            "f": 'vert',
            "g": "white",
            "h": "white"
        }]

        wrongOptions = [{
            "questionText": "What is your gender?",
            "questionWidth": 0.7,
            "type": "radio",
            "responseWidth": 0.3,
            "options": "Other",
            "layout": 'vert',
            "index": 0,
            "questionColor": "white",
            "responseColor": "white"
        }]

        reducedHeaders = [{"questionText": "What is your gender?"}]

        df = DataFrame(self.questions)
        df.to_excel(fileName_xlsx, index=False)
        df.to_csv(fileName_csv, index=False)

        # Check options for list of dicts
        with pytest.raises(ValueError):
            self.survey = Form(self.win,
                               items=wrongOptions,
                               size=(1.0, 0.3),
                               pos=(0.0, 0.0),
                               autoLog=False)

        # Check default values are applied
        self.survey = Form(self.win,
                           items=reducedHeaders,
                           size=(1.0, 0.3),
                           pos=(0.0, 0.0),
                           autoLog=False)

        # Check csv
        self.survey = Form(self.win,
                           items=fileName_csv,
                           size=(1.0, 0.3),
                           pos=(0.0, 0.0),
                           autoLog=False)
        # Check Excel
        self.survey = Form(self.win,
                           items=fileName_xlsx,
                           size=(1.0, 0.3),
                           pos=(0.0, 0.0),
                           randomize=False,
                           autoLog=False)
    def setup_class(self):
        # Create temp files for storing items
        self.temp_dir = mkdtemp()
        self.fileName_xlsx = os.path.join(self.temp_dir, 'items.xlsx')
        self.fileName_csv = os.path.join(self.temp_dir, 'items.csv')

        # create some questions
        self.questions = []
        self.genderItem = {
            "questionText": "What is your gender?",
            "questionWidth": 0.7,
            "type": "radio",
            "responseWidth": 0.3,
            "options": "Male, Female, Other",
            "layout": 'vert',
            "index": 0,
            "questionColor": "white",
            "responseColor": "white"
        }
        self.questions.append(self.genderItem)
        # then a set of ratings
        items = ["running", "cake", "programming"]
        for idx, item in enumerate(items):
            entry = {
                "questionText": "How much you like {}".format(item),
                "questionWidth": 0.7,
                "type": "rating",
                "responseWidth": 0.3,
                "options": "Lots, some, Not a lot, Longest Option",
                "layout": 'horiz',
                "index": idx + 1,
                "questionColor": "white",
                "responseColor": "white"
            }
            self.questions.append(entry)

        self.win = Window(units='height', allowStencil=True, autoLog=False)
        self.survey = Form(self.win,
                           items=self.questions,
                           size=(1.0, 0.3),
                           pos=(0.0, 0.0),
                           autoLog=False)

        # Create datafiles
        df = DataFrame(self.questions)
        df.to_excel(self.fileName_xlsx, index=False)
        df.to_csv(self.fileName_csv, index=False)
Beispiel #15
0
 def test_get_data(self):
     self.survey = Form(self.win, items=self.questions, size=(1.0, 0.3), pos=(0.0, 0.0), autoLog=False)
     data = self.survey.getData()
     assert set(data['questions']) == {'What is your gender?',
                                       'How much you like running',
                                       'How much you like cake',
                                       'How much you like programming',}
     assert set(data['ratings']) == {None}
     assert set(data['rt']) == {None}
     assert set(data['itemIndex']) == {0, 1, 2, 3}
Beispiel #16
0
 def test_font(self):
     exemplars = [
         {"file": "form_font_demographics.xlsx", "font": "Open Sans",
          "screenshot": "form_font_demographics.png"},
     ]
     tykes = [
         {"file": "form_font_demographics.xlsx", "font": "Indie Flower",
          "screenshot": "form_font_nonstandard.png"},
         {"file": "form_font_languages.xlsx", "font": "Rubrik",
          "screenshot": "form_font_languages.png"},
     ]
     for case in exemplars + tykes:
         survey = Form(self.win, items=str(Path(utils.TESTS_DATA_PATH) / case['file']), size=(1, 1), font=case['font'],
                       fillColor=None, borderColor=None, itemColor="white", responseColor="white", markerColor="red",
                       pos=(0, 0), autoLog=False)
         survey.draw()
         self.win.flip()
         # self.win.getMovieFrame(buffer='front').save(Path(utils.TESTS_DATA_PATH) / case['screenshot'])
         utils.compareScreenshot(Path(utils.TESTS_DATA_PATH) / case['screenshot'], self.win, crit=20)
Beispiel #17
0
    def test_importItems(self):
        wrongFields = [{"a": "What is your gender?",
                      "b": 0.7,
                      "c": "radio",
                      "d": 0.3,
                      "e": "Male, Female, Other",
                      "f": 'vert',
                      "g": "white",
                      "h": "white"
                        }]

        # this doesn't include a itemText or questionText so should get an err
        missingHeader = [{"qText": "What is your gender?",
                      "questionWidth": 0.7,
                      "type": "radio",
                      "responseWidth": 0.3,
                      "options": "Other",
                      "layout": 'vert',
                      "index": 0,
                      "questionColor": "white",
                      "responseColor": "white"}]


        # Check options for list of dicts
        with pytest.raises(ValueError):
            self.survey = Form(self.win, items=missingHeader, size=(1.0, 0.3), pos=(0.0, 0.0), autoLog=False)

        # Check csv
        self.survey = Form(self.win, items=self.fileName_csv,
                           size=(1.0, 0.3), pos=(0.0, 0.0), autoLog=False)
        # Check Excel
        self.survey = Form(self.win, items=self.fileName_xlsx,
                           size=(1.0, 0.3), pos=(0.0, 0.0), randomize=False, autoLog=False)
Beispiel #18
0
 def setup_class(self):
     self.questions = []
     self.win = Window(units='height', allowStencil=True)
     # create some questions
     self.genderItem = {"qText": "What is your gender?",
                   "qWidth": 0.7,
                   "aType": "choice",
                   "aWidth": 0.3,
                   "aOptions": ["Male", "Female", "Other"],
                   "aLayout": 'vert'}
     self.questions.append(self.genderItem)
     # then a set of ratings
     items = ["running", "cake"]
     for item in items:
         entry = {"qText": "How much do you like {}".format(item),
                  "qWidth": 0.7,
                  "aType": "rating",
                  "aWidth": 0.3,
                  "aOptions": ["Lots", "Not a lot"],
                  "aLayout": 'horiz'}
         self.questions.append(entry)
     self.survey = Form(self.win, items=self.questions, size=(1.0, 0.3), pos=(0.0, 0.0))
Beispiel #19
0
 def setup_class(self):
     self.questions = []
     self.win = Window(units='height', allowStencil=True, autoLog=False)
     # create some questions
     self.genderItem = {"questionText": "What is your gender?",
                        "questionWidth": 0.7,
                        "type": "radio",
                        "responseWidth": 0.3,
                        "options": "Male, Female, Other",
                        "layout": 'vert',
                        "index": 0}
     self.questions.append(self.genderItem)
     # then a set of ratings
     items = ["running", "cake", "programming"]
     for idx, item in enumerate(items):
         entry = {"questionText": "How much you like {}".format(item),
                  "questionWidth": 0.7,
                  "type": "rating",
                  "responseWidth": 0.3,
                  "options":"Lots, some, Not a lot, Longest Option",
                  "layout": 'horiz',
                  "index": idx+1}
         self.questions.append(entry)
     self.survey = Form(self.win, items=self.questions, size=(1.0, 0.3), pos=(0.0, 0.0), autoLog=False)
class Test_Form(object):
    """Test suite for Form component"""
    def setup_class(self):
        # Create temp files for storing items
        self.temp_dir = mkdtemp()
        self.fileName_xlsx = os.path.join(self.temp_dir, 'items.xlsx')
        self.fileName_csv = os.path.join(self.temp_dir, 'items.csv')

        # create some questions
        self.questions = []
        self.genderItem = {
            "questionText": "What is your gender?",
            "questionWidth": 0.7,
            "type": "radio",
            "responseWidth": 0.3,
            "options": "Male, Female, Other",
            "layout": 'vert',
            "index": 0,
            "questionColor": "white",
            "responseColor": "white"
        }
        self.questions.append(self.genderItem)
        # then a set of ratings
        items = ["running", "cake", "programming"]
        for idx, item in enumerate(items):
            entry = {
                "questionText": "How much you like {}".format(item),
                "questionWidth": 0.7,
                "type": "rating",
                "responseWidth": 0.3,
                "options": "Lots, some, Not a lot, Longest Option",
                "layout": 'horiz',
                "index": idx + 1,
                "questionColor": "white",
                "responseColor": "white"
            }
            self.questions.append(entry)

        self.win = Window(units='height', allowStencil=True, autoLog=False)
        self.survey = Form(self.win,
                           items=self.questions,
                           size=(1.0, 0.3),
                           pos=(0.0, 0.0),
                           autoLog=False)

        # Create datafiles
        df = DataFrame(self.questions)
        df.to_excel(self.fileName_xlsx, index=False)
        df.to_csv(self.fileName_csv, index=False)

    def test_importItems(self):
        wrongFields = [{
            "a": "What is your gender?",
            "b": 0.7,
            "c": "radio",
            "d": 0.3,
            "e": "Male, Female, Other",
            "f": 'vert',
            "g": "white",
            "h": "white"
        }]

        # this doesn't include a itemText or questionText so should get an err
        missingHeader = [{
            "qText": "What is your gender?",
            "questionWidth": 0.7,
            "type": "radio",
            "responseWidth": 0.3,
            "options": "Other",
            "layout": 'vert',
            "index": 0,
            "questionColor": "white",
            "responseColor": "white"
        }]

        # Check options for list of dicts
        with pytest.raises(ValueError):
            self.survey = Form(self.win,
                               items=missingHeader,
                               size=(1.0, 0.3),
                               pos=(0.0, 0.0),
                               autoLog=False)

        # Check csv
        self.survey = Form(self.win,
                           items=self.fileName_csv,
                           size=(1.0, 0.3),
                           pos=(0.0, 0.0),
                           autoLog=False)
        # Check Excel
        self.survey = Form(self.win,
                           items=self.fileName_xlsx,
                           size=(1.0, 0.3),
                           pos=(0.0, 0.0),
                           randomize=False,
                           autoLog=False)

    def test_set_scroll_speed(self):
        items = 2
        for multipliers in [1, 2, 3, 4]:
            assert self.survey.setScrollSpeed(
                [0] * items, multipliers) == items * multipliers
            assert self.survey.setScrollSpeed(
                [0] * items, multipliers) == items * multipliers
            assert self.survey.setScrollSpeed(
                [0] * items, multipliers) == items * multipliers

    def test_response_text_wrap(self):
        options = ['a', 'b', 'c']
        for size in [.2, .3, .4]:
            item = {"responseWidth": size, "options": options}

    def test_set_questions(self):
        survey = Form(self.win,
                      items=[self.genderItem],
                      size=(1.0, 0.3),
                      pos=(0.0, 0.0),
                      autoLog=False)
        ctrl, h, w = survey._setQuestion(self.genderItem)

        assert type(ctrl) == TextBox2
        assert type(h) in [float, np.float64]
        assert type(w) in [float, np.float64]

    def test_set_response(self):
        survey = Form(self.win,
                      items=[self.genderItem],
                      size=(1.0, 0.3),
                      pos=(0.0, 0.0),
                      autoLog=False)
        ctrl, h, w = survey._setQuestion(self.genderItem)
        sliderStim, respHeight = survey._setResponse(self.genderItem)

        assert type(sliderStim) == Slider
        assert type(respHeight) in [float, np.float64]

    def test_form_size(self):
        assert self.survey.size[0] == (1.0, 0.3)[0]  # width
        assert self.survey.size[1] == (1.0, 0.3)[1]  # height

    def test_aperture_size(self):
        assert self.survey.aperture.size[0] == self.survey.size[0]
        assert self.survey.aperture.size[1] == self.survey.size[1]

    def test_border_limits(self):
        survey = self.survey
        assert survey.leftEdge == survey.pos[0] - survey.size[0] / 2.0
        assert survey.rightEdge == survey.pos[0] + survey.size[0] / 2.0
        assert survey.topEdge == survey.pos[1] + survey.size[1] / 2.0

    def test_text_height(self):
        assert self.survey.textHeight == 0.02

    def test_item_padding(self):
        assert self.survey.itemPadding == 0.05

    def test_form_units(self):
        assert self.survey.units == 'height'

    def test_screen_status(self):
        """Test whether the object is visible"""
        assert self.survey._inRange(self.survey.items[0]['itemCtrl'])

    def test_get_data(self):
        self.survey = Form(self.win,
                           items=self.questions,
                           size=(1.0, 0.3),
                           pos=(0.0, 0.0),
                           autoLog=False)
        data = self.survey.getData()
        Qs = [this['itemText'] for this in data]
        indices = [item['index'] for item in data]
        assert Qs == [
            'What is your gender?',
            'How much you like running',
            'How much you like cake',
            'How much you like programming',
        ]
        assert all([item['response'] is None for item in data])
        assert all([item['rt'] is None for item in data])
        assert list(indices) == list(range(4))

    def teardown_class(self):
        shutil.rmtree(self.temp_dir)
        self.win.close()
Beispiel #21
0
class Test_Form(object):
    """Test suite for Form component"""

    def setup_class(self):
        self.questions = []
        self.win = Window(units='height', allowStencil=True, autoLog=False)
        # create some questions
        self.genderItem = {"questionText": "What is your gender?",
                           "questionWidth": 0.7,
                           "type": "radio",
                           "responseWidth": 0.3,
                           "options": "Male, Female, Other",
                           "layout": 'vert',
                           "index": 0}
        self.questions.append(self.genderItem)
        # then a set of ratings
        items = ["running", "cake", "programming"]
        for idx, item in enumerate(items):
            entry = {"questionText": "How much you like {}".format(item),
                     "questionWidth": 0.7,
                     "type": "rating",
                     "responseWidth": 0.3,
                     "options":"Lots, some, Not a lot, Longest Option",
                     "layout": 'horiz',
                     "index": idx+1}
            self.questions.append(entry)
        self.survey = Form(self.win, items=self.questions, size=(1.0, 0.3), pos=(0.0, 0.0), autoLog=False)

    def test_importItems(self):
        wrongFields = [{"a": "What is your gender?",
                      "b": 0.7,
                      "c": "radio",
                      "d": 0.3,
                      "e": "Male, Female, Other",
                      "f": 'vert'}]

        wrongOptions = [{"questionText": "What is your gender?",
                      "questionWidth": 0.7,
                      "type": "radio",
                      "responseWidth": 0.3,
                      "options": "Other",
                      "layout": 'vert',
                      "index": 0}]

        df = DataFrame(self.questions)
        df.to_excel(fileName_xlsx, index=False)
        df.to_csv(fileName_csv, index=False)

        # Check wrong field error
        with pytest.raises(NameError):
            self.survey = Form(self.win, items=wrongFields, size=(1.0, 0.3), pos=(0.0, 0.0), autoLog=False)

        # Check options for list of dicts
        with pytest.raises(ValueError):
            self.survey = Form(self.win, items=wrongOptions, size=(1.0, 0.3), pos=(0.0, 0.0), autoLog=False)

        # Check csv
        self.survey = Form(self.win, items=fileName_csv,
                           size=(1.0, 0.3), pos=(0.0, 0.0), autoLog=False)
        # Check Excel
        self.survey = Form(self.win, items=fileName_xlsx,
                           size=(1.0, 0.3), pos=(0.0, 0.0), randomize=False, autoLog=False)


    def test_randomize_items(self):
        assert self.questions == self.survey.items
        self.survey.randomize = True
        assert self.questions != self.survey.randomizeItems(self.questions)

    def test_set_scroll_speed(self):
        items = 2
        for multipliers in [1,2,3,4]:
            assert self.survey.setScrollSpeed([0] * items, multipliers) == items * multipliers
            assert self.survey.setScrollSpeed([0] * items, multipliers) == items * multipliers
            assert self.survey.setScrollSpeed([0] * items, multipliers) == items * multipliers

    def test_question_text_wrap(self):
        for size in [.2, .3, .4]:
            assert self.survey._questionTextWrap(size) == size * self.survey.size[0] - (self.survey.itemPadding * 2)

    def test_response_text_wrap(self):
        options = ['a', 'b', 'c']
        for size in [.2, .3, .4]:
            item = {"responseWidth": size, "options": options}
            assert self.survey._responseTextWrap(item) == size * self.survey.size[0] / len(options)

    def test_set_questions(self):
        survey = Form(self.win, items=[self.genderItem], size=(1.0, 0.3), pos=(0.0, 0.0), autoLog=False)
        textStim, questionHeight, questionWidth = survey._setQuestion(self.genderItem)

        assert type(textStim) == TextStim
        assert type(questionHeight) == float
        assert type(questionWidth) == float

    def test_set_response(self):
        survey = Form(self.win, items=[self.genderItem], size=(1.0, 0.3), pos=(0.0, 0.0), autoLog=False)
        textStim, questionHeight, questionWidth = survey._setQuestion(self.genderItem)
        sliderStim, respHeight = survey._setResponse(self.genderItem, textStim)

        assert type(sliderStim) == Slider
        assert type(respHeight) == float

    def test_form_size(self):
        assert self.survey.size[0] == (1.0, 0.3)[0]  # width
        assert self.survey.size[1] == (1.0, 0.3)[1]  # height

    def test_aperture_size(self):
        assert self.survey.aperture.size[0] == self.survey.size[0]
        assert self.survey.aperture.size[1] == self.survey.size[1]

    def test_border_limits(self):
        survey = self.survey
        assert survey.leftEdge == survey.pos[0] - survey.size[0]/2.0
        assert survey.rightEdge == survey.pos[0] + survey.size[0]/2.0
        assert survey.topEdge == survey.pos[1] + survey.size[1]/2.0

    def test_text_height(self):
        assert self.survey.textHeight == 0.02

    def test_item_padding(self):
        assert self.survey.itemPadding == 0.05

    def test_form_units(self):
        assert self.survey.units == 'height'

    def test_scroll_offset(self):
        for idx, positions in enumerate([1, 0]):  # 1 is start position
            self.survey.scrollbar.markerPos = positions
            posZeroOffset = (self.survey.size[1]
                             - self.survey.itemPadding
                             + min(self.survey._baseYpositions))
            assert self.survey._getScrollOffset() == [0., posZeroOffset][idx]

    def test_screen_status(self):
        assert self.survey._inRange(self.survey.formElements['question'][0])
        if constants.PY3:
            with pytest.raises(AssertionError):
                assert self.survey._inRange(self.survey.formElements['question'][3])

    def test_get_data(self):
        self.survey = Form(self.win, items=self.questions, size=(1.0, 0.3), pos=(0.0, 0.0), autoLog=False)
        data = self.survey.getData()
        assert set(data['questions']) == {'What is your gender?',
                                          'How much you like running',
                                          'How much you like cake',
                                          'How much you like programming',}
        assert set(data['ratings']) == {None}
        assert set(data['rt']) == {None}
        assert set(data['itemIndex']) == {0, 1, 2, 3}

    def teardown_class(self):
        self.win.close()
Beispiel #22
0
class Test_Form(object):
    """Test suite for Form component"""
    def setup_class(self):
        self.questions = []
        self.win = Window(units='height', allowStencil=True, autoLog=False)
        # create some questions
        self.genderItem = {
            "questionText": "What is your gender?",
            "questionWidth": 0.7,
            "type": "radio",
            "responseWidth": 0.3,
            "options": "Male, Female, Other",
            "layout": 'vert',
            "index": 0
        }
        self.questions.append(self.genderItem)
        # then a set of ratings
        items = ["running", "cake", "programming"]
        for idx, item in enumerate(items):
            entry = {
                "questionText": "How much you like {}".format(item),
                "questionWidth": 0.7,
                "type": "rating",
                "responseWidth": 0.3,
                "options": "Lots, some, Not a lot, Longest Option",
                "layout": 'horiz',
                "index": idx + 1
            }
            self.questions.append(entry)
        self.survey = Form(self.win,
                           items=self.questions,
                           size=(1.0, 0.3),
                           pos=(0.0, 0.0),
                           autoLog=False)

    def test_importItems(self):
        wrongFields = [{
            "a": "What is your gender?",
            "b": 0.7,
            "c": "radio",
            "d": 0.3,
            "e": "Male, Female, Other",
            "f": 'vert'
        }]

        wrongOptions = [{
            "questionText": "What is your gender?",
            "questionWidth": 0.7,
            "type": "radio",
            "responseWidth": 0.3,
            "options": "Other",
            "layout": 'vert',
            "index": 0
        }]

        df = DataFrame(self.questions)
        df.to_excel(fileName_xlsx, index=False)
        df.to_csv(fileName_csv, index=False)

        # Check wrong field error
        with pytest.raises(NameError):
            self.survey = Form(self.win,
                               items=wrongFields,
                               size=(1.0, 0.3),
                               pos=(0.0, 0.0),
                               autoLog=False)

        # Check options for list of dicts
        with pytest.raises(ValueError):
            self.survey = Form(self.win,
                               items=wrongOptions,
                               size=(1.0, 0.3),
                               pos=(0.0, 0.0),
                               autoLog=False)

        # Check csv
        self.survey = Form(self.win,
                           items=fileName_csv,
                           size=(1.0, 0.3),
                           pos=(0.0, 0.0),
                           autoLog=False)
        # Check Excel
        self.survey = Form(self.win,
                           items=fileName_xlsx,
                           size=(1.0, 0.3),
                           pos=(0.0, 0.0),
                           randomize=False,
                           autoLog=False)

    def test_randomize_items(self):
        assert self.questions == self.survey.items
        self.survey.randomize = True
        assert self.questions != self.survey.randomizeItems(self.questions)

    def test_set_scroll_speed(self):
        items = 2
        for multipliers in [1, 2, 3, 4]:
            assert self.survey.setScrollSpeed(
                [0] * items, multipliers) == items * multipliers
            assert self.survey.setScrollSpeed(
                [0] * items, multipliers) == items * multipliers
            assert self.survey.setScrollSpeed(
                [0] * items, multipliers) == items * multipliers

    def test_question_text_wrap(self):
        for size in [.2, .3, .4]:
            assert self.survey._questionTextWrap(
                size) == size * self.survey.size[0] - (
                    self.survey.itemPadding * 2)

    def test_response_text_wrap(self):
        options = ['a', 'b', 'c']
        for size in [.2, .3, .4]:
            item = {"responseWidth": size, "options": options}
            assert self.survey._responseTextWrap(
                item) == size * self.survey.size[0] / len(options)

    def test_set_questions(self):
        survey = Form(self.win,
                      items=[self.genderItem],
                      size=(1.0, 0.3),
                      pos=(0.0, 0.0),
                      autoLog=False)
        textStim, questionHeight, questionWidth = survey._setQuestion(
            self.genderItem)

        assert type(textStim) == TextStim
        assert type(questionHeight) == float
        assert type(questionWidth) == float

    def test_set_response(self):
        survey = Form(self.win,
                      items=[self.genderItem],
                      size=(1.0, 0.3),
                      pos=(0.0, 0.0),
                      autoLog=False)
        textStim, questionHeight, questionWidth = survey._setQuestion(
            self.genderItem)
        sliderStim, respHeight = survey._setResponse(self.genderItem, textStim)

        assert type(sliderStim) == Slider
        assert type(respHeight) == float

    def test_form_size(self):
        assert self.survey.size[0] == (1.0, 0.3)[0]  # width
        assert self.survey.size[1] == (1.0, 0.3)[1]  # height

    def test_aperture_size(self):
        assert self.survey.aperture.size[0] == self.survey.size[0]
        assert self.survey.aperture.size[1] == self.survey.size[1]

    def test_border_limits(self):
        survey = self.survey
        assert survey.leftEdge == survey.pos[0] - survey.size[0] / 2.0
        assert survey.rightEdge == survey.pos[0] + survey.size[0] / 2.0
        assert survey.topEdge == survey.pos[1] + survey.size[1] / 2.0

    def test_text_height(self):
        assert self.survey.textHeight == 0.02

    def test_item_padding(self):
        assert self.survey.itemPadding == 0.05

    def test_form_units(self):
        assert self.survey.units == 'height'

    def test_scroll_offset(self):
        for idx, positions in enumerate([1, 0]):  # 1 is start position
            self.survey.scrollbar.markerPos = positions
            posZeroOffset = (self.survey.size[1] - self.survey.itemPadding +
                             min(self.survey._baseYpositions))
            assert self.survey._getScrollOffset() == [0., posZeroOffset][idx]

    def test_screen_status(self):
        assert self.survey._inRange(self.survey.formElements['question'][0])
        if constants.PY3:
            with pytest.raises(AssertionError):
                assert self.survey._inRange(
                    self.survey.formElements['question'][3])

    def test_get_data(self):
        self.survey = Form(self.win,
                           items=self.questions,
                           size=(1.0, 0.3),
                           pos=(0.0, 0.0),
                           autoLog=False)
        data = self.survey.getData()
        assert set(data['questions']) == {
            'What is your gender?',
            'How much you like running',
            'How much you like cake',
            'How much you like programming',
        }
        assert set(data['ratings']) == {None}
        assert set(data['rt']) == {None}
        assert set(data['itemIndex']) == {0, 1, 2, 3}

    def teardown_class(self):
        self.win.close()
Beispiel #23
0
class Test_Form(object):
    """Test suite for Form component"""

    def setup_class(self):
        self.questions = []
        self.win = Window(units='height', allowStencil=True)
        # create some questions
        self.genderItem = {"qText": "What is your gender?",
                      "qWidth": 0.7,
                      "aType": "choice",
                      "aWidth": 0.3,
                      "aOptions": ["Male", "Female", "Other"],
                      "aLayout": 'vert'}
        self.questions.append(self.genderItem)
        # then a set of ratings
        items = ["running", "cake"]
        for item in items:
            entry = {"qText": "How much do you like {}".format(item),
                     "qWidth": 0.7,
                     "aType": "rating",
                     "aWidth": 0.3,
                     "aOptions": ["Lots", "Not a lot"],
                     "aLayout": 'horiz'}
            self.questions.append(entry)
        self.survey = Form(self.win, items=self.questions, size=(1.0, 0.3), pos=(0.0, 0.0))

    def test_set_questions(self):
        survey = Form(self.win, items=[], size=(1.0, 0.3), pos=(0.0, 0.0))
        textStim, qHeight, qWidth = survey._setQuestion(self.genderItem)

        assert type(textStim) == TextStim
        assert type(qHeight) == float
        assert type(qWidth) == float

    def test_set_response(self):
        survey = Form(self.win, items=[], size=(1.0, 0.3), pos=(0.0, 0.0))
        textStim, qHeight, qWidth = survey._setQuestion(self.genderItem)
        sliderStim, aHeight = survey._setResponse(self.genderItem, textStim)

        assert type(sliderStim) == Slider
        assert type(aHeight) == float

    def test_questionHeight(self):
        for item in self.survey._items['question']:
            assert self.survey.getQuestionHeight(item) == item.boundingBox[1] / float(self.win.size[1] / 2)

    def test_questionWidth(self):
        for item in self.survey._items['question']:
            assert self.survey.getQuestionWidth(item) == item.boundingBox[0] / float(self.win.size[0] / 2)

    def test_respHeight(self):
        for item in self.survey.items:
            if item['aLayout'] == 'vert':
                assert self.survey.getRespHeight(item) == (len(item['aOptions']) * self.survey.textHeight)
            elif item['aLayout'] == 'horiz':
                assert self.survey.getRespHeight(item) == self.survey.textHeight

    def test_form_size(self):
        assert self.survey.size[0] == (1.0, 0.3)[0]  # width
        assert self.survey.size[1] == (1.0, 0.3)[1]  # height

    def test_aperture_size(self):
        assert self.survey.aperture.size[0] == self.survey.size[0]
        assert self.survey.aperture.size[1] == self.survey.size[1]

    def test_border_limits(self):
        survey = self.survey
        assert survey.leftEdge == survey.pos[0] - survey.size[0]/2.0
        assert survey.rightEdge == survey.pos[0] + survey.size[0]/2.0
        assert survey.topEdge == survey.pos[1] + survey.size[1]/2.0

    def test_text_height(self):
        assert self.survey.textHeight == 0.03

    def test_label_height(self):
        assert self.survey.labelHeight == 0.02

    def test_item_padding(self):
        assert self.survey.itemPadding == 0.05

    def test_form_units(self):
        assert self.survey.units == 'height'

    def test_virtual_height(self):
        assert isclose(self.survey.virtualHeight,
                       (self.survey._baseYpositions[-1]-self.survey.itemPadding),
                       atol=0.02)  # TODO: liberal atol, needs tightening up

    def test_baseYpositions(self):
        survey = Form(self.win, items=self.questions, size=(1.0, 0.3), pos=(0.0, 0.0))
        testPositions = []
        survey.virtualHeight = 0
        for item in survey.items:
            question, qHeight, qWidth = survey._setQuestion(item)
            response, aHeight, = survey._setResponse(item, question)
            testPositions.append(survey.virtualHeight
                                 - max(aHeight, qHeight)
                                 + (aHeight / 2)
                                 - survey.textHeight)
            survey.virtualHeight -= max(aHeight, qHeight) + survey.itemPadding

        for idx, pos in enumerate(survey._baseYpositions):
            assert testPositions[idx] == pos

    def test_scroll_offset(self):
        for idx, positions in enumerate([1, 0]):  # 1 is start position
            self.survey.scrollbar.markerPos = positions
            posZeroOffset = (self.survey.size[1]
                             - self.survey.itemPadding
                             + min(self.survey._baseYpositions))
            assert self.survey._getScrollOffet() == [0., posZeroOffset][idx]

    def test_screen_status(self):
        assert self.survey._inRange(self.survey._items['question'][0])
        with pytest.raises(AssertionError):
            assert self.survey._inRange(self.survey._items['question'][2])

    def teardown_class(self):
        self.win.close()