def test_time_format_tuple(self):
        # Format tuple. Preset and extraction value is (hh, mm)
        widget = factory(
            'time',
            name='t',
            props={
                'format': 'tuple'
            })
        self.assertEqual(widget(), (
            '<input class="time timeinput" id="input-t" name="t" '
            'size="5" type="text" value="" />'
        ))
        data = widget.extract({'t': '2:30'})
        self.assertEqual(
            [data.name, data.value, data.extracted, data.errors],
            ['t', UNSET, (2, 30), []]
        )

        widget = factory(
            'time',
            name='t',
            value=(5, 30),
            props={
                'format': 'tuple'
            })
        self.assertEqual(widget(), (
            '<input class="time timeinput" id="input-t" name="t" size="5" '
            'type="text" value="05:30" />'
        ))
        data = widget.extract({'t': '2:30'})
        self.assertEqual(widget(data=data), (
            '<input class="time timeinput" id="input-t" name="t" size="5" '
            'type="text" value="02:30" />'
        ))

        widget = factory(
            'time',
            name='t',
            value=(0, 0),
            props={
                'format': 'tuple'
            })
        self.assertEqual(widget(), (
            '<input class="time timeinput" id="input-t" name="t" size="5" '
            'type="text" value="00:00" />'
        ))
        data = widget.extract({'t': ''})
        self.assertEqual(
            [data.name, data.value, data.extracted, data.errors],
            ['t', (0, 0), UNSET, []]
        )
        data = widget.extract({'t': '1:0'})
        self.assertEqual(
            [data.name, data.value, data.extracted, data.errors],
            ['t', (0, 0), (1, 0), []]
        )
    def test_time_display(self):
        # Render display mode without value
        widget = factory('time', 't', mode='display')
        self.assertEqual(widget(), '')

        # Render display mode with value
        widget = factory('time', 't', value='02:02', mode='display')
        self.assertEqual(widget(),
           '<div class="display-time" id="display-t">02:02</div>'
        )
    def test_datetime_without_time_input(self):
        # Widget without time input
        widget = factory(
            'datetime',
            name='dt',
            props={
                'required': 'No date given',
            })
        self.assertEqual(widget(), (
            '<input class="dateinput datetime required" id="input-dt" '
            'name="dt" size="10" type="text" value="" />'
        ))

        # Widget extraction
        request = {'dt': ''}
        data = widget.extract(request)
        self.assertEqual(
            [data.name, data.value, data.extracted, data.errors],
            ['dt', UNSET, '', [ExtractionError('No date given')]]
        )

        # Widget renders empty value
        self.assertEqual(widget(data), (
            '<input class="dateinput datetime required" id="input-dt" '
            'name="dt" size="10" type="text" value="" />'
        ))

        # Widget extraction with non-date input
        request = {'dt': 'xyz'}
        data = widget.extract(request)
        self.assertEqual(
            [data.name, data.value, data.extracted, data.errors],
            ['dt', UNSET, 'xyz', [ExtractionError('Not a valid date input.')]]
        )
        self.assertEqual(widget(data), (
            '<input class="dateinput datetime required" id="input-dt" '
            'name="dt" size="10" type="text" value="xyz" />'
        ))

        # Valid widget extraction. Returns datetime instance
        request = {'dt': '2010.1.1'}
        data = widget.extract(request)
        self.assertEqual(
            [data.name, data.value, data.extracted, data.errors],
            ['dt', UNSET, datetime.datetime(2010, 1, 1, 0, 0), []]
        )
        self.assertEqual(widget(data), (
            '<input class="dateinput datetime required" id="input-dt" '
            'name="dt" size="10" type="text" value="2010.1.1" />'
        ))
    def test_datetime_display(self):
        # display date and time
        widget = factory(
            'datetime',
            name='dt',
            value=datetime.datetime(2011, 5, 1),
            mode='display')
        self.assertEqual(widget(), (
            '<div class="display-datetime" '
            'id="display-dt">2011.05.01 00:00</div>'
        ))

        # display date only
        widget = factory(
            'datetime',
            name='dt',
            value=datetime.datetime(2011, 5, 1),
            props={
                'format': '%Y.%m.%d',
            },
            mode='display')
        self.assertEqual(widget(),
            '<div class="display-datetime" id="display-dt">2011.05.01</div>'
        )

        # no value, displays nothing
        widget = factory(
            'datetime',
            name='dt',
            mode='display')
        self.assertEqual(widget(), '')

        # display with formatter callback
        def custom_formatter(widget, data):
            return data.value.strftime('at year %Y at month %m at day %d')

        widget = factory(
            'datetime',
            name='dt',
            value=datetime.datetime(2011, 5, 1),
            props={
                'format': custom_formatter,
            },
            mode='display')
        self.assertEqual(widget(), (
            '<div class="display-datetime" id="display-dt">at year 2011 at '
            'month 05 at day 01</div>'
        ))
    def test_time_format_with_preset_value(self):
        # Number format with preset value
        widget = factory(
            'time',
            name='t',
            value=1.2,
            props={
                'format': 'number'
            })
        self.assertEqual(widget(), (
            '<input class="time timeinput" id="input-t" name="t" size="5" '
            'type="text" value="01:12" />'
        ))
        data = widget.extract({'t': '0:12'})
        self.assertEqual('%0.1f' % data.extracted, '0.2')
        self.assertEqual(widget(data), (
            '<input class="time timeinput" id="input-t" name="t" size="5" '
            'type="text" value="00:12" />'
        ))

        widget = factory(
            'time',
            name='t',
            value=0,
            props={
                'format': 'number'
            })
        self.assertEqual(widget(), (
            '<input class="time timeinput" id="input-t" name="t" size="5" '
            'type="text" value="00:00" />'
        ))
        data = widget.extract({'t': ''})
        self.assertEqual(
            [data.name, data.value, data.extracted, data.errors],
            ['t', 0, UNSET, []]
        )
        data = widget.extract({'t': '0:0'})
        self.assertEqual(
            [data.name, data.value, data.extracted, data.errors],
            ['t', 0, 0.0, []]
        )
        self.assertEqual(widget(data), (
            '<input class="time timeinput" id="input-t" name="t" size="5" '
            'type="text" value="00:00" />'
        ))
 def test_time_rendering_if_preset_and_extracted(self):
     # Value rendering if preset and extracted
     widget = factory(
         'time',
         name='t',
         value='02:02')
     self.assertEqual(widget(), (
         '<input class="time timeinput" id="input-t" name="t" size="5" '
         'type="text" value="02:02" />'
     ))
     data = widget.extract({'t': '1:12'})
     self.assertEqual(
         [data.name, data.value, data.extracted, data.errors],
         ['t', '02:02', '01:12', []]
     )
     self.assertEqual(widget(data), (
         '<input class="time timeinput" id="input-t" name="t" size="5" '
         'type="text" value="01:12" />'
     ))
 def test_time_format_without_preset_value(self):
     # Number format without preset value
     widget = factory(
         'time',
         name='t',
         props={
             'format': 'number'
         })
     self.assertEqual(widget(), (
         '<input class="time timeinput" id="input-t" name="t" size="5" '
         'type="text" value="" />'
     ))
 def test_time_format_display(self):
     widget = factory(
         'time',
         name='t',
         value=1.2,
         mode='display',
         props={
             'format': 'number'
         })
     self.assertEqual(widget(),
         '<div class="display-time" id="display-t">01:12</div>'
     )
 def test_time_display_format_unit_with_preset_value(self):
     widget = factory(
         'time',
         name='t',
         value=12,
         mode='display',
         props={
             'format': 'number',
             'unit': 'minutes'
     })
     self.assertEqual(widget(),
         '<div class="display-time" id="display-t">00:12</div>'
     )
 def test_datetime_datepicker_class(self):
     # Render datepicker class. Use this to bind a datepicker JS of your
     # choice
     widget = factory(
         'datetime',
         name='dt',
         props={
             'datepicker': True,
         })
     self.assertEqual(widget(), (
         '<input class="dateinput datepicker datetime" id="input-dt" '
         'name="dt" size="10" type="text" value="" />'
     ))
 def test_time_format_unit_with_preset_value(self):
     # Minutes unit with preset value
     widget = factory(
         'time',
         name='t',
         value=12,
         props={
             'format': 'number',
             'unit': 'minutes'
         })
     self.assertEqual(widget(), (
         '<input class="time timeinput" id="input-t" name="t" size="5" '
         'type="text" value="00:12" />'
     ))
     data = widget.extract({'t': '2:30'})
     self.assertEqual(
         [data.name, data.value, data.extracted, data.errors],
         ['t', 12, 150, []]
     )
     self.assertEqual(widget(data), (
         '<input class="time timeinput" id="input-t" name="t" size="5" '
         'type="text" value="02:30" />'
     ))
    def test_datetime_basics(self):
        # Render very basic widget
        widget = factory(
            'datetime',
            name='dt')
        self.assertEqual(widget(), (
            '<input class="dateinput datetime" id="input-dt" name="dt" '
            'size="10" type="text" value="" />'
        ))

        # Base extraction
        data = widget.extract({})
        self.assertEqual(
            [data.name, data.value, data.extracted, data.errors],
            ['dt', UNSET, '', []]
        )
    def test_time_basics(self):
        # Render base widget
        widget = factory(
            'time',
            name='t')
        self.assertEqual(widget(), (
            '<input class="time timeinput" id="input-t" name="t" size="5" '
            'type="text" value="" />'
        ))

        # Extract empty
        data = widget.extract({})
        self.assertEqual(
            [data.name, data.value, data.extracted, data.errors],
            ['t', UNSET, UNSET, []]
        )
 def test_datetime_with_preset_value(self):
     # Test widget with given datetime value
     widget = factory(
         'datetime',
         name='dt',
         value=datetime.datetime(2011, 5, 1),
         props={
             'time': True,
         })
     self.check_output("""
     <div>
       <input class="dateinput datetime" id="input-dt" name="dt" size="10"
              type="text" value="2011.5.1"/>
       <input class="timeinput" id="input-dt-time" name="dt.time" size="5"
              type="text" value="00:00"/>
     </div>
     """, fxml('<div>{}</div>'.format(widget())))
    def test_datetime_locale_callable(self):
        # Locale might be a callable
        self.locale_callback_called = False
        def callable_locale(widget, data):
            self.locale_callback_called = True
            return 'de'

        widget = factory(
            'datetime',
            name='dt',
            props={
                'locale': callable_locale
            })
        self.assertEqual(widget(), (
            '<input class="dateinput datetime" id="input-dt" name="dt" '
            'size="10" type="text" value="" />'
        ))
        self.assertTrue(self.locale_callback_called)

        del self.locale_callback_called
    def test_time_daytime_extraction(self):
        # Validate day time. triggers if ``daytime`` or ``timepicker``
        # set to ``True``
        widget = factory(
            'time',
            name='t',
            value='02:02',
            props={
                'daytime': True
            })
        data = widget.extract({'t': '25:1'})
        self.assertEqual(data.errors,
            [ExtractionError('Hours must be in range 0..23.')]
        )
        data = widget.extract({'t': '1:61'})
        self.assertEqual(data.errors,
            [ExtractionError('Minutes must be in range 0..59.')]
        )

        widget = factory(
            'time',
            name='t',
            value='02:02',
            props={
                'timepicker': True
            })
        data = widget.extract({'t': '26:1'})
        self.assertEqual(data.errors,
            [ExtractionError('Hours must be in range 0..23.')]
        )
        data = widget.extract({'t': '1:62'})
        self.assertEqual(data.errors,
            [ExtractionError('Minutes must be in range 0..59.')]
        )

        # Additional CSS class is rendered for timepicker if ``timepicker`` set
        self.assertEqual(widget(), (
            '<input class="time timeinput timepicker" id="input-t" name="t" '
            'size="5" type="text" value="02:02" />'
        ))
    def test_datetime_advanced(self):
        # Widget with more advanced configuration. Widget now renders time
        # input and input converting is locale aware. You can pass ``tzinfo``
        # property as well if you want the conversion to consider timezones
        widget = factory(
            'datetime',
            name='dt',
            props={
                'datepicker': True,
                'required': 'No date given',
                'delimiter': '.',
                'locale': 'de',
                'time': True,
                'timepicker': True,
                'tzinfo': None,
            })
        self.check_output("""
        <div>
          <input class="dateinput datepicker datetime required"
                 id="input-dt" name="dt" size="10" type="text" value=""/>
          <input class="timeinput timepicker" id="input-dt-time" name="dt.time"
                 size="5" type="text" value=""/>
        </div>
        """, fxml('<div>{}</div>'.format(widget())))

        # Widget extraction, no date input was given
        request = {'dt': '', 'dt.time': ''}
        data = widget.extract(request)
        self.assertEqual(
            [data.name, data.value, data.extracted, data.errors],
            ['dt', UNSET, '', [ExtractionError('No date given')]]
        )

        # Widget renders empty value
        self.check_output("""
        <div>
          <input class="dateinput datepicker datetime required" id="input-dt"
                 name="dt" size="10" type="text" value=""/>
          <input class="timeinput timepicker" id="input-dt-time" name="dt.time"
                 size="5" type="text" value=""/>
        </div>
        """, fxml('<div>{}</div>'.format(widget(data))))

        # Widget extraction with non-datetime input
        request = {'dt': 'xyz', 'dt.time': 'x'}
        data = widget.extract(request)
        self.assertEqual(
            [data.name, data.value, data.extracted, data.errors],
            ['dt', UNSET, 'xyz', [ExtractionError('Not a valid date input.')]]
        )
        self.check_output("""
        <div>
          <input class="dateinput datepicker datetime required" id="input-dt"
                 name="dt" size="10" type="text" value="xyz"/>
          <input class="timeinput timepicker" id="input-dt-time" name="dt.time"
                 size="5" type="text" value="x"/>
        </div>
        """, fxml('<div>{}</div>'.format(widget(data))))

        # Valid widget extraction. Returns datetime instance
        request = {'dt': '1.1.2010', 'dt.time': '10:15'}
        data = widget.extract(request)
        self.assertEqual(
            [data.name, data.value, data.extracted, data.errors],
            ['dt', UNSET, datetime.datetime(2010, 1, 1, 10, 15), []]
        )
        self.check_output("""
        <div>
          <input class="dateinput datepicker datetime required" id="input-dt"
                 name="dt" size="10" type="text" value="1.1.2010"/>
          <input class="timeinput timepicker" id="input-dt-time" name="dt.time"
                 size="5" type="text" value="10:15"/>
        </div>
        """, fxml('<div>{}</div>'.format(widget(data))))