[Zope3-checkins] SVN: zope.formlib/branches/faassen-zaf/src/zope/formlib/tests/test_ Move over more widget tests from zope.app.form.

Martijn Faassen faassen at startifact.com
Wed Dec 30 16:41:42 EST 2009


Log message for revision 107394:
  Move over more widget tests from zope.app.form.
  

Changed:
  A   zope.formlib/branches/faassen-zaf/src/zope/formlib/tests/test_checkboxwidget.py
  A   zope.formlib/branches/faassen-zaf/src/zope/formlib/tests/test_filewidget.py
  A   zope.formlib/branches/faassen-zaf/src/zope/formlib/tests/test_floatwidget.py
  A   zope.formlib/branches/faassen-zaf/src/zope/formlib/tests/test_selectwidget.py
  A   zope.formlib/branches/faassen-zaf/src/zope/formlib/tests/test_sequencewidget.py
  A   zope.formlib/branches/faassen-zaf/src/zope/formlib/tests/test_textareawidget.py
  A   zope.formlib/branches/faassen-zaf/src/zope/formlib/tests/test_textwidget.py

-=-
Copied: zope.formlib/branches/faassen-zaf/src/zope/formlib/tests/test_checkboxwidget.py (from rev 107392, zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/tests/test_checkboxwidget.py)
===================================================================
--- zope.formlib/branches/faassen-zaf/src/zope/formlib/tests/test_checkboxwidget.py	                        (rev 0)
+++ zope.formlib/branches/faassen-zaf/src/zope/formlib/tests/test_checkboxwidget.py	2009-12-30 21:41:42 UTC (rev 107394)
@@ -0,0 +1,180 @@
+##############################################################################
+#
+# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""Checkbox Widget tests
+
+$Id$
+"""
+import unittest
+from zope.testing import doctest
+from zope.formlib.interfaces import IInputWidget
+from zope.formlib.widgets import CheckBoxWidget
+from zope.publisher.browser import TestRequest
+from zope.schema import Bool
+from zope.interface.verify import verifyClass
+
+from zope.formlib.interfaces import MissingInputError
+from zope.formlib.tests.test_browserwidget import SimpleInputWidgetTest
+
+
+class CheckBoxWidgetTest(SimpleInputWidgetTest):
+    """Documents and tests thec checkbox widget.
+
+        >>> verifyClass(IInputWidget, CheckBoxWidget)
+        True
+
+    The checkbox widget works with Bool fields:
+
+        >>> field = Bool(__name__='foo', title=u'on')
+        >>> request = TestRequest()
+        >>> widget = CheckBoxWidget(field, request)
+
+    hasInput returns True when the request contains the field.<name>.used
+    value:
+
+        >>> 'field.foo.used' in request.form
+        False
+        >>> widget.hasInput()
+        False
+        >>> request.form['field.foo.used'] = ''
+        >>> widget.hasInput()
+        True
+
+    getInputValue returns True when field.<name> equals (and only equals) 'on':
+
+        >>> 'field.foo' in request.form
+        False
+        >>> widget.getInputValue()
+        False
+        >>> request.form['field.foo'] = 'true'
+        >>> widget.getInputValue()
+        False
+        >>> request.form['field.foo'] = 'on'
+        >>> widget.getInputValue()
+        True
+
+    Below is HTML output of rendered checkbox widgets. We will first define
+    a helper method condense the HTML output for display in this test:
+
+        >>> def normalize(s):
+        ...   return '\\n  '.join(s.split())
+
+    Default widget rendering:
+
+        >>> print normalize( widget() )
+        <input
+          class="hiddenType"
+          id="field.foo.used"
+          name="field.foo.used"
+          type="hidden"
+          value=""
+          />
+          <input
+          class="checkboxType"
+          checked="checked"
+          id="field.foo"
+          name="field.foo"
+          type="checkbox"
+          value="on"
+          />
+
+    Hidden rendering:
+
+        >>> print normalize( widget.hidden() )
+        <input
+          class="hiddenType"
+          id="field.foo"
+          name="field.foo"
+          type="hidden"
+          value="on"
+          />
+
+    Calling setRenderedValue will change what gets output:
+
+        >>> widget.setRenderedValue(False)
+        >>> print normalize( widget() )
+        <input
+          class="hiddenType"
+          id="field.foo.used"
+          name="field.foo.used"
+          type="hidden"
+          value=""
+          />
+          <input
+          class="checkboxType"
+          id="field.foo"
+          name="field.foo"
+          type="checkbox"
+          value="on"
+          />
+
+    The checkbox widget does not support None values, so a Bool required
+    constraint will always be met with checkbox input:
+
+        >>> field.required = True
+        >>> widget.getInputValue()
+        True
+    """
+
+    _FieldFactory = Bool
+    _WidgetFactory = CheckBoxWidget
+
+    def testProperties(self):
+        self.assertEqual(self._widget.tag, 'input')
+        self.assertEqual(self._widget.type, 'checkbox')
+        self.assertEqual(self._widget.cssClass, '')
+        self.assertEqual(self._widget.extra, '')
+        self.assertEqual(self._widget.default, 0)
+
+    def testRender(self):
+        value = 1
+        self._widget.setRenderedValue(value)
+        check_list = ('type="checkbox"', 'id="field.foo"',
+                      'name="field.foo"', 'checked="checked"')
+        self.verifyResult(self._widget(), check_list)
+        value = 0
+        self._widget.setRenderedValue(value)
+        check_list = check_list[:-1]
+        self.verifyResult(self._widget(), check_list)
+        check_list = ('type="hidden"',) + check_list[1:-1]
+        self.verifyResult(self._widget.hidden(), check_list)
+        check_list = ('style="color: red"',) + check_list
+        self._widget.extra = 'style="color: red"'
+        self.verifyResult(self._widget.hidden(), check_list)
+
+    def test_getInputValue(self):
+        self._widget.request.form['field.foo'] = 'on'
+        self.assertEqual(self._widget.getInputValue(), True)
+        self._widget.request.form['field.foo'] = 'positive'
+        self.assertEqual(self._widget.getInputValue(), False)
+        del self._widget.request.form['field.foo']
+        self._widget.request.form['field.foo.used'] = ''
+        self.assertEquals(self._widget.getInputValue(), False)
+        del self._widget.request.form['field.foo.used']
+        self.assertRaises(MissingInputError, self._widget.getInputValue)
+
+    def test_required(self):
+        # checkbox widgets are never required, since there's no way to
+        # set it to "no value"
+        self.failIf(self._widget.required)
+        self.assert_(self._widget.context.required)
+
+
+def test_suite():
+    return unittest.TestSuite((
+        unittest.makeSuite(CheckBoxWidgetTest),
+        doctest.DocTestSuite(),
+        ))
+
+if __name__=='__main__':
+    unittest.main(defaultTest='test_suite')

Copied: zope.formlib/branches/faassen-zaf/src/zope/formlib/tests/test_filewidget.py (from rev 107392, zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/tests/test_filewidget.py)
===================================================================
--- zope.formlib/branches/faassen-zaf/src/zope/formlib/tests/test_filewidget.py	                        (rev 0)
+++ zope.formlib/branches/faassen-zaf/src/zope/formlib/tests/test_filewidget.py	2009-12-30 21:41:42 UTC (rev 107394)
@@ -0,0 +1,83 @@
+##############################################################################
+#
+# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""File Widget tests
+
+$Id$
+"""
+import unittest
+
+from zope.testing import doctest
+from StringIO import StringIO
+from zope.formlib.interfaces import IInputWidget
+from zope.formlib.widgets import FileWidget
+
+from zope.formlib.tests.test_browserwidget import (
+    SimpleInputWidgetTest)
+
+from zope.interface.verify import verifyClass
+
+
+class FileWidgetTest(SimpleInputWidgetTest):
+    """Documents and tests the file widget.
+
+        >>> verifyClass(IInputWidget, FileWidget)
+        True
+    """
+
+    _WidgetFactory = FileWidget
+
+    def setUp(self):
+        super(FileWidgetTest, self).setUp()
+        file = StringIO('Foo Value')
+        file.filename = 'test.txt'
+        self._widget.request.form['field.foo'] = file
+
+    def testProperties(self):
+        self.assertEqual(self._widget.tag, 'input')
+        self.assertEqual(self._widget.type, 'file')
+        self.assertEqual(self._widget.cssClass, '')
+        self.assertEqual(self._widget.extra, '')
+        self.assertEqual(self._widget.default, '')
+        self.assertEqual(self._widget.displayWidth, 20)
+        self.assertEqual(self._widget.displayMaxWidth, '')
+
+    def test_hasInput(self): # override the usual one
+        del self._widget.request.form['field.foo']
+        self._widget.request.form['field.foo.used'] = ''
+        self.failUnless(self._widget.hasInput())
+        del self._widget.request.form['field.foo.used']
+        self.failIf(self._widget.hasInput())
+
+    def testRender(self):
+        value = 'Foo Value'
+        self._widget.setRenderedValue(value)
+        check_list = ('type="file"', 'id="field.foo"', 'name="field.foo"',
+                      'size="20"')
+
+        self.verifyResult(self._widget(), check_list)
+        check_list = ('type="hidden"',) + check_list[1:-1]
+        self.verifyResult(self._widget.hidden(), check_list)
+        check_list = ('style="color: red"',) + check_list
+        self._widget.extra = 'style="color: red"'
+        self.verifyResult(self._widget.hidden(), check_list)
+
+
+def test_suite():
+    return unittest.TestSuite((
+        unittest.makeSuite(FileWidgetTest),
+        doctest.DocTestSuite(),
+        ))
+
+if __name__=='__main__':
+    unittest.main(defaultTest='test_suite')

Copied: zope.formlib/branches/faassen-zaf/src/zope/formlib/tests/test_floatwidget.py (from rev 107392, zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/tests/test_floatwidget.py)
===================================================================
--- zope.formlib/branches/faassen-zaf/src/zope/formlib/tests/test_floatwidget.py	                        (rev 0)
+++ zope.formlib/branches/faassen-zaf/src/zope/formlib/tests/test_floatwidget.py	2009-12-30 21:41:42 UTC (rev 107394)
@@ -0,0 +1,64 @@
+##############################################################################
+#
+# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""Float Widget tests
+
+$Id$
+"""
+import unittest
+from zope.testing import doctest
+from zope.formlib.tests.test_browserwidget import SimpleInputWidgetTest
+from zope.formlib.interfaces import IInputWidget
+from zope.formlib.widgets import FloatWidget
+from zope.formlib.interfaces import ConversionError, WidgetInputError
+from zope.interface.verify import verifyClass
+
+from zope.schema import Float
+
+
+class FloatWidgetTest(SimpleInputWidgetTest):
+    """Documents and tests the float widget.
+        
+        >>> verifyClass(IInputWidget, FloatWidget)
+        True
+    """
+
+    _FieldFactory = Float
+    _WidgetFactory = FloatWidget
+
+    def test_hasInput(self):
+        del self._widget.request.form['field.foo']
+        self.failIf(self._widget.hasInput())
+        # widget has input, even if input is an empty string
+        self._widget.request.form['field.foo'] = u''
+        self.failUnless(self._widget.hasInput())
+        self._widget.request.form['field.foo'] = u'123'
+        self.failUnless(self._widget.hasInput())
+
+    def test_getInputValue(self):
+        self._widget.request.form['field.foo'] = u''
+        self.assertRaises(WidgetInputError, self._widget.getInputValue)
+        self._widget.request.form['field.foo'] = u'123.45'
+        self.assertEquals(self._widget.getInputValue(), 123.45)
+        self._widget.request.form['field.foo'] = u'abc'
+        self.assertRaises(ConversionError, self._widget.getInputValue)
+
+
+def test_suite():
+    return unittest.TestSuite((
+        unittest.makeSuite(FloatWidgetTest),
+        doctest.DocTestSuite(),
+        ))
+
+if __name__=='__main__':
+    unittest.main(defaultTest='test_suite')

Copied: zope.formlib/branches/faassen-zaf/src/zope/formlib/tests/test_selectwidget.py (from rev 107362, zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/tests/test_selectwidget.py)
===================================================================
--- zope.formlib/branches/faassen-zaf/src/zope/formlib/tests/test_selectwidget.py	                        (rev 0)
+++ zope.formlib/branches/faassen-zaf/src/zope/formlib/tests/test_selectwidget.py	2009-12-30 21:41:42 UTC (rev 107394)
@@ -0,0 +1,79 @@
+##############################################################################
+#
+# Copyright (c) 2004 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""Select Widget Tests
+
+$Id$
+"""
+import unittest
+
+from zope.schema import Choice, List
+from zope.formlib.widgets import SelectWidget
+from zope.publisher.browser import TestRequest
+
+choice = Choice(
+    title=u"Number",
+    description=u"The Number",
+    values=[1, 2, 3])
+
+sequence = List(
+    title=u"Numbers",
+    description=u"The Numbers",
+    value_type=choice)
+
+
+class SelectWidgetTest(unittest.TestCase):
+    
+    def _makeWidget(self, form):
+        request = TestRequest(form=form)
+        return SelectWidget(sequence, choice.vocabulary, request) 
+
+
+select_html = '''<div>
+<div class="value">
+<select id="field.terms" name="field.terms" size="5" >
+<option value="&lt; foo">&lt; foo</option>
+<option value="bar/&gt;">bar/&gt;</option>
+<option value="&amp;blah&amp;">&amp;blah&amp;</option>
+</select>
+</div>
+<input name="field.terms-empty-marker" type="hidden" value="1" />
+</div>'''
+
+class SelectWidgetHTMLEncodingTest(unittest.TestCase):
+    
+    def testOptionEncoding(self):
+        choice = Choice(
+            title=u"Number",
+            description=u"The Number",
+            values=['< foo', 'bar/>', '&blah&'])
+
+        sequence = List(
+            __name__="terms",
+            title=u"Numbers",
+            description=u"The Numbers",
+            value_type=choice)
+        
+        request = TestRequest()
+        sequence = sequence.bind(object())
+        widget = SelectWidget(sequence, choice.vocabulary, request) 
+        self.assertEqual(widget(), select_html)
+
+def test_suite():
+    return unittest.TestSuite((
+        unittest.makeSuite(SelectWidgetTest),
+        unittest.makeSuite(SelectWidgetHTMLEncodingTest)
+        ))
+
+if __name__ == '__main__':
+    unittest.main(defaultTest="test_suite")

Copied: zope.formlib/branches/faassen-zaf/src/zope/formlib/tests/test_sequencewidget.py (from rev 107392, zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/tests/test_sequencewidget.py)
===================================================================
--- zope.formlib/branches/faassen-zaf/src/zope/formlib/tests/test_sequencewidget.py	                        (rev 0)
+++ zope.formlib/branches/faassen-zaf/src/zope/formlib/tests/test_sequencewidget.py	2009-12-30 21:41:42 UTC (rev 107394)
@@ -0,0 +1,443 @@
+##############################################################################
+#
+# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""Sequence Field Widget tests.
+
+$Id$
+"""
+import unittest
+from zope.interface import Interface, implements
+from zope.schema import Tuple, List, TextLine
+from zope.schema.interfaces import ITextLine
+from zope.component import provideAdapter
+from zope.publisher.browser import TestRequest
+from zope.publisher.interfaces.browser import IDefaultBrowserLayer
+from zope.testing import doctest
+
+from zope.formlib.widgets import TextWidget, ObjectWidget, DisplayWidget
+from zope.formlib.widgets import TupleSequenceWidget, ListSequenceWidget
+from zope.formlib.widgets import SequenceDisplayWidget
+from zope.formlib.widgets import SequenceWidget
+from zope.formlib.interfaces import IDisplayWidget
+from zope.formlib.interfaces import IInputWidget, MissingInputError
+from zope.formlib.interfaces import IWidgetInputError, WidgetInputError
+from zope.formlib.interfaces import IWidgetInputErrorView
+from zope.formlib.widget import CustomWidgetFactory
+from zope.formlib.exception import WidgetInputErrorView
+
+from zope.formlib.tests.support import VerifyResults
+from zope.formlib.tests.test_browserwidget import BrowserWidgetTest
+
+from zope.traversing.testing import setUp as traversingSetUp
+from zope.testing.cleanup import tearDown as traversingTearDown
+
+class SequenceWidgetTestHelper(object):
+
+    def setUpContent(self, desc=u'', title=u'Foo Title'):
+        class ITestContent(Interface):
+            foo = self._FieldFactory(
+                    title=title,
+                    description=desc,
+                    )
+        class TestObject(object):
+            implements(ITestContent)
+
+        self.content = TestObject()
+        self.field = ITestContent['foo'].bind(self.content)
+        self.request = TestRequest(HTTP_ACCEPT_LANGUAGE='pl')
+        self.request.form['field.foo'] = u'Foo Value'
+        self._widget = self._WidgetFactory(
+            self.field, self.field.value_type, self.request)
+
+    def setUp(self):
+        traversingSetUp()
+        self.setUpContent()
+
+    def tearDown(self):
+        traversingTearDown()
+        
+    def _FieldFactory(self, **kw):
+        kw.update({
+            '__name__': u'foo', 
+            'value_type': TextLine(__name__=u'bar')})
+        return Tuple(**kw)
+
+
+class SequenceWidgetTest(SequenceWidgetTestHelper, BrowserWidgetTest):
+    """Documents and tests the tuple and list (sequence) widgets.
+
+        >>> from zope.interface.verify import verifyClass
+        >>> verifyClass(IInputWidget, TupleSequenceWidget)
+        True
+        >>> verifyClass(IInputWidget, ListSequenceWidget)
+        True
+    """
+
+    _WidgetFactory = TupleSequenceWidget
+
+    def testRender(self):
+        pass
+
+    def setUp(self):
+        super(SequenceWidgetTest, self).setUp()
+        provideAdapter(TextWidget,
+                       (ITextLine, IDefaultBrowserLayer),
+                       IInputWidget, '')
+        provideAdapter(WidgetInputErrorView,
+                       (IWidgetInputError, IDefaultBrowserLayer),
+                       IWidgetInputErrorView, '')
+
+    def test_haveNoData(self):
+        self.failIf(self._widget.hasInput())
+
+    def test_hasInput(self):
+        self._widget.request.form['field.foo.count'] = u'0'
+        self.failUnless(self._widget.hasInput())
+
+    def test_customWidgetFactory(self):
+        """Verify that the widget can be constructed via the CustomWidgetFactory
+        (Issue #293)
+        """
+
+        value_type = TextLine(__name__=u'bar')
+        self.field = List( __name__=u'foo', value_type=value_type )
+        request = TestRequest()
+
+        # set up the custom widget factory and verify that it works
+        sw = CustomWidgetFactory(ListSequenceWidget)
+        widget = sw(self.field, request)
+        assert widget.subwidget is None
+        assert widget.context.value_type is value_type
+
+        # set up a variant that specifies the subwidget to use and verify it
+        class PollOption(object) : pass
+        ow = CustomWidgetFactory(ObjectWidget, PollOption)
+        sw = CustomWidgetFactory(ListSequenceWidget, subwidget=ow)
+        widget = sw(self.field, request)
+        assert widget.subwidget is ow
+        assert widget.context.value_type is value_type
+
+    def test_subwidget(self):
+        """This test verifies that the specified subwidget is not ignored.
+        (Issue #293)
+        """
+        self.field = List(__name__=u'foo',
+                          value_type=TextLine(__name__=u'bar'))
+        request = TestRequest()
+
+        class PollOption(object) : pass
+        ow = CustomWidgetFactory(ObjectWidget, PollOption)
+        widget = SequenceWidget(
+            self.field, self.field.value_type, request, subwidget=ow)
+        assert widget.subwidget is ow
+
+    def test_list(self):
+        self.field = List(
+            __name__=u'foo',
+            value_type=TextLine(__name__=u'bar'))
+        request = TestRequest()
+        widget = ListSequenceWidget(
+            self.field, self.field.value_type, request)
+        self.failIf(widget.hasInput())
+        self.assertRaises(MissingInputError, widget.getInputValue)
+
+        request = TestRequest(form={'field.foo.add': u'Add bar',
+                                    'field.foo.count': u'0'})
+        widget = ListSequenceWidget(
+            self.field, self.field.value_type, request)
+        self.assert_(widget.hasInput())
+        self.assertRaises(WidgetInputError, widget.getInputValue)
+
+        request = TestRequest(form={'field.foo.0.bar': u'Hello world!',
+                                    'field.foo.count': u'1'})
+        widget = ListSequenceWidget(
+            self.field, self.field.value_type, request)
+        self.assert_(widget.hasInput())
+        self.assertEquals(widget.getInputValue(), [u'Hello world!'])
+
+    def test_new(self):
+        request = TestRequest()
+        widget = TupleSequenceWidget(
+            self.field, self.field.value_type, request)
+        self.failIf(widget.hasInput())
+        self.assertRaises(MissingInputError, widget.getInputValue)
+        check_list = ('input', 'name="field.foo.add"')
+        self.verifyResult(widget(), check_list)
+
+    def test_add(self):
+        request = TestRequest(form={'field.foo.add': u'Add bar',
+                                    'field.foo.count': u'0'})
+        widget = TupleSequenceWidget(
+            self.field, self.field.value_type, request)
+        self.assert_(widget.hasInput())
+        self.assertRaises(WidgetInputError, widget.getInputValue)
+        check_list = (
+            'checkbox', 'field.foo.remove_0', 'input', 'field.foo.0.bar',
+            'submit', 'submit', 'field.foo.add'
+        )
+        self.verifyResult(widget(), check_list, inorder=True)
+
+    def test_request(self):
+        request = TestRequest(form={'field.foo.0.bar': u'Hello world!',
+                                    'field.foo.count': u'1'})
+        widget = TupleSequenceWidget(
+            self.field, self.field.value_type, request)
+        self.assert_(widget.hasInput())
+        self.assertEquals(widget.getInputValue(), (u'Hello world!',))
+
+    def test_existing(self):
+        request = TestRequest()
+        widget = TupleSequenceWidget(
+            self.field, self.field.value_type, request)
+        widget.setRenderedValue((u'existing',))
+        self.failIf(widget.hasInput())
+        self.assertRaises(MissingInputError, widget.getInputValue)
+        check_list = (
+            'checkbox', 'field.foo.remove_0', 'input', 'field.foo.0.bar',
+                'existing',
+            'submit', 'submit', 'field.foo.add',
+            'field.foo.count" value="1"',
+        )
+        self.verifyResult(widget(), check_list, inorder=True)
+        widget.setRenderedValue((u'existing', u'second'))
+        self.failIf(widget.hasInput())
+        self.assertRaises(MissingInputError, widget.getInputValue)
+        check_list = (
+            'checkbox', 'field.foo.remove_0', 'input', 'field.foo.0.bar',
+                'existing',
+            'checkbox', 'field.foo.remove_1', 'input', 'field.foo.1.bar',
+                'second',
+            'submit', 'submit', 'field.foo.add',
+            'field.foo.count" value="2"',
+        )
+        self.verifyResult(widget(), check_list, inorder=True)
+
+    def test_remove(self):
+        request = TestRequest(form={
+            'field.foo.remove_0': u'1',
+            'field.foo.0.bar': u'existing', 'field.foo.1.bar': u'second',
+            'field.foo.remove': u'Remove selected items',
+            'field.foo.count': u'2'})
+        widget = TupleSequenceWidget(
+            self.field, self.field.value_type, request)
+        widget.setRenderedValue((u'existing', u'second'))
+        self.assertEquals(widget.getInputValue(), (u'second',))
+        check_list = (
+            'checkbox', 'field.foo.remove_0', 'input', 'field.foo.0.bar',
+                'existing',
+            'checkbox', 'field.foo.remove_1', 'input', 'field.foo.1.bar',
+                'second',
+            'submit', 'submit', 'field.foo.add',
+            'field.foo.count" value="2"',
+        )
+        self.verifyResult(widget(), check_list, inorder=True)
+
+    def test_min(self):
+        request = TestRequest()
+        self.field.min_length = 2
+        widget = TupleSequenceWidget(
+            self.field, self.field.value_type, request)
+        widget.setRenderedValue((u'existing',))
+        self.assertRaises(MissingInputError, widget.getInputValue)
+        check_list = (
+            'input', 'field.foo.0.bar', 'existing',
+            'input', 'field.foo.1.bar', 'value=""',
+            'submit', 'field.foo.add'
+        )
+        s = widget()
+        self.verifyResult(s, check_list, inorder=True)
+        self.assertEquals(s.find('checkbox'), -1)
+
+    def test_max(self):
+        request = TestRequest()
+        self.field.max_length = 1
+        widget = TupleSequenceWidget(
+            self.field, self.field.value_type, request)
+        widget.setRenderedValue((u'existing',))
+        self.assertRaises(MissingInputError, widget.getInputValue)
+        s = widget()
+        self.assertEquals(s.find('field.foo.add'), -1)
+
+    def test_anonymousfield(self):
+        self.field = Tuple(__name__=u'foo', value_type=TextLine())
+        request = TestRequest()
+        widget = TupleSequenceWidget(
+            self.field, self.field.value_type, request)
+        widget.setRenderedValue((u'existing',))
+        s = widget()
+        check_list = (
+            'input', '"field.foo.0."', 'existing',
+            'submit', 'submit', 'field.foo.add'
+        )
+        s = widget()
+        self.verifyResult(s, check_list, inorder=True)
+
+    def test_usererror(self):
+        self.field = Tuple(__name__=u'foo',
+                           value_type=TextLine(__name__='bar'))
+        request = TestRequest(form={
+            'field.foo.0.bar': u'', 'field.foo.1.bar': u'nonempty',
+            'field.foo.count': u'2'})
+        widget = TupleSequenceWidget(
+            self.field, self.field.value_type, request)
+        s = widget()
+        # Rendering a widget should not raise errors!
+        result = widget()
+
+        data = widget._generateSequence()
+        self.assertEquals(data, [None, u'nonempty'])
+
+    def doctest_widgeterrors(self):
+        """Test that errors on subwidgets appear
+
+            >>> field = Tuple(__name__=u'foo',
+            ...               value_type=TextLine(__name__='bar'))
+            >>> request = TestRequest(form={
+            ...     'field.foo.0.bar': u'',
+            ...     'field.foo.1.bar': u'nonempty',
+            ...     'field.foo.count': u'2'})
+            >>> widget = TupleSequenceWidget(field, field.value_type, request)
+
+         If we render the widget, we see no errors:
+
+            >>> print widget()
+            <BLANKLINE>
+            ...
+            <tr>
+              <td>
+                 <input class="editcheck" type="checkbox"
+                        name="field.foo.remove_0" />
+              </td>
+              <td>
+                 <input class="textType" id="field.foo.0.bar"
+                        name="field.foo.0.bar"
+                        size="20" type="text" value=""  />
+              </td>
+            </tr>
+            ...
+
+         However, if we call getInputValue or hasValidInput, the
+         errors on the widgets are preserved and displayed:
+
+            >>> widget.hasValidInput()
+            False
+
+            >>> print widget()
+            <BLANKLINE>
+            ...
+            <tr>
+              <td>
+                 <input class="editcheck" type="checkbox"
+                        name="field.foo.remove_0" />
+              </td>
+              <td>
+                 <span class="error">Required input is missing.</span>
+                 <input class="textType" id="field.foo.0.bar"
+                        name="field.foo.0.bar"
+                        size="20" type="text" value=""  />
+              </td>
+            </tr>
+            ...
+        """
+
+
+class SequenceDisplayWidgetTest(
+    VerifyResults, SequenceWidgetTestHelper, unittest.TestCase):
+
+    def _WidgetFactory(self, *args, **kw):
+        w = SequenceDisplayWidget(*args, **kw)
+        w.cssClass = "testwidget"
+        return w
+
+    def setUp(self):
+        self.setUpContent()
+        self.request = TestRequest()
+        self.widget = self._WidgetFactory(
+            self.field, self.field.value_type, self.request)
+        provideAdapter(DisplayWidget, (ITextLine, IDefaultBrowserLayer),
+                       IDisplayWidget)
+        
+    def test_render_empty(self):
+        self.content.foo = ()
+        self.assertEquals(self.widget(), '(no values)')
+
+    def test_render_missing(self):
+        self.content.foo = self.field.missing_value
+        self.assertEquals(self.widget(), '(no value available)')
+
+    def test_render_single(self):
+        self.content.foo = (u'one value',)
+        check_list = ['<ol', 'class=', 'testwidget',
+                      '<li', 'one value', '</li', '</ol']
+        self.verifyResult(self.widget(), check_list, inorder=True)
+
+    def test_render_multiple(self):
+        self.content.foo = (u'one', u'two', u'three', u'four')
+        check_list = ['<ol', 'class=', 'testwidget',
+                      '<li', 'one', '</li',
+                      '<li', 'two', '</li',
+                      '<li', 'three', '</li',
+                      '<li', 'four', '</li',
+                      '</ol']
+        self.verifyResult(self.widget(), check_list, inorder=True)
+
+    def test_render_alternate_cssClass(self):
+        self.content.foo = (u'one value',)
+        check_list = ['<ol', 'class=', 'altclass',
+                      '<li', 'one value', '</li', '</ol']
+        self.widget.cssClass = 'altclass'
+        self.verifyResult(self.widget(), check_list, inorder=True)
+
+    def test_honors_subwidget(self):
+        self.widget = self._WidgetFactory(
+            self.field, self.field.value_type, self.request,
+            subwidget=UppercaseDisplayWidget)
+        self.content.foo = (u'first value', u'second value')
+        check_list = ['<ol', 'class=', 'testwidget',
+                      '<li', 'FIRST VALUE', '</li',
+                      '<li', 'SECOND VALUE', '</li',
+                      '</ol']
+        self.verifyResult(self.widget(), check_list, inorder=True)
+
+
+class UppercaseDisplayWidget(DisplayWidget):
+
+    def __call__(self):
+        return super(UppercaseDisplayWidget, self).__call__().upper()
+
+
+def setUp(test):
+    traversingSetUp()
+    provideAdapter(TextWidget,
+                   (ITextLine, IDefaultBrowserLayer),
+                   IInputWidget)
+    provideAdapter(WidgetInputErrorView,
+                   (IWidgetInputError, IDefaultBrowserLayer),
+                   IWidgetInputErrorView)
+
+def tearDown(test):
+    traversingTearDown()
+
+
+def test_suite():
+    return unittest.TestSuite((
+        unittest.makeSuite(SequenceWidgetTest),
+        doctest.DocTestSuite(setUp=setUp, tearDown=tearDown,
+                             optionflags=doctest.ELLIPSIS
+                             |doctest.NORMALIZE_WHITESPACE
+                             |doctest.REPORT_NDIFF),
+        unittest.makeSuite(SequenceDisplayWidgetTest),
+        ))
+
+if __name__=='__main__':
+    unittest.main(defaultTest='test_suite')

Copied: zope.formlib/branches/faassen-zaf/src/zope/formlib/tests/test_textareawidget.py (from rev 107392, zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/tests/test_textareawidget.py)
===================================================================
--- zope.formlib/branches/faassen-zaf/src/zope/formlib/tests/test_textareawidget.py	                        (rev 0)
+++ zope.formlib/branches/faassen-zaf/src/zope/formlib/tests/test_textareawidget.py	2009-12-30 21:41:42 UTC (rev 107394)
@@ -0,0 +1,63 @@
+##############################################################################
+#
+# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""Textarea Widget tests
+
+$Id$
+"""
+import unittest
+from zope.testing import doctest
+from zope.formlib.interfaces import IInputWidget
+from zope.formlib.widgets import TextAreaWidget
+from zope.formlib.tests.test_browserwidget import SimpleInputWidgetTest
+from zope.interface.verify import verifyClass
+
+class TextAreaWidgetTest(SimpleInputWidgetTest):
+    """Documents and tests the text area widget.
+
+        >>> verifyClass(IInputWidget, TextAreaWidget)
+        True
+    """
+
+    _WidgetFactory = TextAreaWidget
+
+    def testProperties(self):
+        self.assertEqual(self._widget.tag, 'input')
+        self.assertEqual(self._widget.type, 'text')
+        self.assertEqual(self._widget.cssClass, '')
+        self.assertEqual(self._widget.extra, '')
+        self.assertEqual(self._widget.width, 60)
+        self.assertEqual(self._widget.height, 15)
+
+    def testRender(self):
+        value = "Foo Value"
+        self._widget.setRenderedValue(value)
+        check_list = ('rows="15"', 'cols="60"', 'id="field.foo"',
+                      'name="field.foo"', 'textarea')
+        self.verifyResult(self._widget(), check_list)
+        check_list = ('style="color: red"',) + check_list
+        self._widget.extra = 'style="color: red"'
+        self.verifyResult(self._widget(), check_list)
+        check_list = ('type="hidden"', 'id="field.foo"', 'name="field.foo"',
+                      'value="Foo Value"')
+        self.verifyResult(self._widget.hidden(), check_list)
+
+
+def test_suite():
+    return unittest.TestSuite((
+        unittest.makeSuite(TextAreaWidgetTest),
+        doctest.DocTestSuite(),
+        ))
+
+if __name__=='__main__':
+    unittest.main(defaultTest='test_suite')

Copied: zope.formlib/branches/faassen-zaf/src/zope/formlib/tests/test_textwidget.py (from rev 107392, zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/tests/test_textwidget.py)
===================================================================
--- zope.formlib/branches/faassen-zaf/src/zope/formlib/tests/test_textwidget.py	                        (rev 0)
+++ zope.formlib/branches/faassen-zaf/src/zope/formlib/tests/test_textwidget.py	2009-12-30 21:41:42 UTC (rev 107394)
@@ -0,0 +1,476 @@
+##############################################################################
+#
+# Copyright (c) 2001, 2002, 2004, 2005 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""Text Widget tests
+
+$Id$
+"""
+import datetime
+import unittest
+from zope.testing import doctest
+from zope.component.testing import setUp, tearDown
+from zope.interface.verify import verifyClass
+from zope.schema import TextLine
+from zope.publisher.browser import TestRequest
+
+from zope.schema import Password
+from zope.formlib.interfaces import IInputWidget
+
+from zope.formlib.widgets import TextWidget
+
+from zope.formlib.widgets import TextAreaWidget
+from zope.formlib.widgets import BytesAreaWidget
+from zope.formlib.widgets import PasswordWidget
+from zope.formlib.widgets import FileWidget
+from zope.formlib.widgets import IntWidget
+from zope.formlib.widgets import FloatWidget
+from zope.formlib.widgets import BytesWidget
+from zope.formlib.widgets import ASCIIWidget
+
+from zope.formlib.widgets import DateDisplayWidget
+from zope.formlib.widgets import DatetimeDisplayWidget
+from zope.formlib.widgets import URIDisplayWidget
+
+from zope.formlib.tests.test_browserwidget import BrowserWidgetTest
+from zope.formlib.tests.test_browserwidget import SimpleInputWidgetTest
+
+class TextWidgetTest(SimpleInputWidgetTest):
+    """Documents and tests the text widget.
+    >>> setUp()
+
+        >>> verifyClass(IInputWidget, TextWidget)
+        True
+
+    Converting Missing Values
+    -------------------------
+    String fields (TextLine, Text, etc.) values can be classified as one of the
+    following:
+
+      - Non-empty string
+      - Empty string
+      - None
+
+    Text browser widgets only support the first two types: non-empty strings
+    and empty strings. There's no facility to explicitly set a None value in a
+    text browser widget.
+
+    However, it is possible to interpret an empty string as None for some
+    applications. For example, when inputing a User Name, an empty string means
+    'the user hasn't provided a value'. In another application, an empty string
+    may mean 'the user has provided a value, specifically <empty string>'.
+
+    To support both modes, the text widget provides a 'convert_missing_value'
+    flag. When True, empty strings will be converted by the widget to the
+    field's 'missing_value' (None by default). This mode accommodates the
+    'user hasn't provided a value' scenario.
+
+    To illustrate this mode, we'll use an optional field, where missing_value
+    is None:
+
+        >>> field = TextLine(
+        ...     __name__='foo',
+        ...     missing_value=None,
+        ...     required=False)
+
+    The HTTP form submission contains an empty string for the field value:
+
+        >>> request = TestRequest(form={'field.foo':u''})
+
+    A text widget configured for the field, where convert_missing_value is True
+    (the default value)...
+
+        >>> widget = TextWidget(field, request)
+        >>> widget.convert_missing_value
+        True
+
+    will convert the form's empty string into the field's missing_value, which
+    is None:
+
+        >>> widget.getInputValue() is None
+        True
+
+    When 'convert_missing_value' is False, the text widget will not convert
+    an empty string to the field's missing_value. This supports the 'user has
+    provided a value, specifically <empty string>' mode:
+
+        >>> widget.convert_missing_value = False
+        >>> widget.getInputValue()
+        u''
+
+    >>> tearDown()
+    """
+
+    _WidgetFactory = TextWidget
+
+    def testProperties(self):
+        self.assertEqual(self._widget.tag, 'input')
+        self.assertEqual(self._widget.type, 'text')
+        self.assertEqual(self._widget.cssClass, '')
+        self.assertEqual(self._widget.extra, '')
+        self.assertEqual(self._widget.default, '')
+        self.assertEqual(self._widget.displayWidth, 20)
+        self.assertEqual(self._widget.displayMaxWidth, '')
+
+    def testRender(self):
+        value = 'Foo Value'
+        self._widget.setRenderedValue(value)
+        check_list = ('type="text"', 'id="field.foo"', 'name="field.foo"',
+                      'value="Foo Value"', 'size="20"')
+        self.verifyResult(self._widget(), check_list)
+        check_list = ('type="hidden"',) + check_list[1:-1]
+        self.verifyResult(self._widget.hidden(), check_list)
+        check_list = ('style="color: red"',) + check_list
+        self._widget.extra = 'style="color: red"'
+        self.verifyResult(self._widget.hidden(), check_list)
+
+class URIDisplayWidgetTest(BrowserWidgetTest):
+
+    _WidgetFactory = URIDisplayWidget
+
+    def testProperties(self):
+        # check the default linkTarget
+        self.failIf(self._widget.linkTarget)
+
+    def testRender(self):
+        value = "uri:fake"
+        self._widget.setRenderedValue(value)
+        self.verifyResult(self._widget(), ["<a", 'href="uri:fake"'])
+        self._widget.linkTarget = "there"
+        self.verifyResult(self._widget(), ["<a", 'href="uri:fake"',
+                                           'target="there"'])
+
+    def testEmptyRenderReturnsEmptyString(self):
+        self._widget.setRenderedValue(None)
+        self.assertEquals(self._widget(), "")
+        self._widget.setRenderedValue('')
+        self.assertEquals(self._widget(), "")
+
+
+class DateDisplayWidgetTest(BrowserWidgetTest):
+
+    _WidgetFactory = DateDisplayWidget
+
+    expected_class = "date"
+
+    def setUp(self):
+        super(DateDisplayWidgetTest, self).setUp()
+        self._value = datetime.date(2004, 12, 01)
+
+    def testDefaultDisplayStyle(self):
+        self.failIf(self._widget.displayStyle)
+
+    def testRenderDefault(self):
+        self._widget.setRenderedValue(self._value)
+        self.verifyResult(self._widget(),
+                          ["<span",
+                           'class="%s"' % self.expected_class,
+                           "01.12.2004",
+                           "</span"])
+
+    def testRenderShort(self):
+        self._widget.setRenderedValue(self._value)
+        self._widget.displayStyle = "short"
+        self.verifyResult(self._widget(),
+                          ["<span",
+                           'class="%s"' % self.expected_class,
+                           u"01.12.04",
+                           "</span"])
+
+    def testRenderMedium(self):
+        self._widget.setRenderedValue(self._value)
+        self._widget.displayStyle = "medium"
+        self.verifyResult(self._widget(),
+                          ["<span",
+                           'class="%s"' % self.expected_class,
+                           u"01.12.2004",
+                           "</span"])
+
+    def testRenderLong(self):
+        self._widget.setRenderedValue(self._value)
+        self._widget.displayStyle = "long"
+        self.verifyResult(self._widget(),
+                          ["<span",
+                           'class="%s"' % self.expected_class,
+                           u"1 \u0434\u0435\u043a\u0430\u0431\u0440\u044f"
+                                u" 2004 \u0433.",
+                           "</span"])
+
+    def testRenderFull(self):
+        self._widget.setRenderedValue(self._value)
+        self._widget.displayStyle = "full"
+        self.verifyResult(self._widget(),
+                          ["<span",
+                           'class="%s"' % self.expected_class,
+                           u"1 \u0434\u0435\u043a\u0430\u0431\u0440\u044f"
+                                u" 2004 \u0433.",
+                           "</span"])
+
+
+class DatetimeDisplayWidgetTest(DateDisplayWidgetTest):
+
+    _WidgetFactory = DatetimeDisplayWidget
+
+    expected_class = "dateTime"
+
+    def setUp(self):
+        super(DatetimeDisplayWidgetTest, self).setUp()
+        self._value = datetime.datetime(2004, 12, 01, 14, 39, 01)
+
+    def testRenderDefault(self):
+        super(DatetimeDisplayWidgetTest, self).testRenderDefault()
+        self.verifyResult(self._widget(), ["14:39:01"])
+
+    def testRenderShort(self):
+        super(DatetimeDisplayWidgetTest, self).testRenderShort()
+        self.verifyResult(self._widget(), ["14:39"])
+
+    def testRenderMedium(self):
+        super(DatetimeDisplayWidgetTest, self).testRenderMedium()
+        self.verifyResult(self._widget(), ["14:39:01"])
+
+    def testRenderLong(self):
+        super(DatetimeDisplayWidgetTest, self).testRenderLong()
+        self.verifyResult(self._widget(), ["14:39:01 +000"])
+
+    def testRenderFull(self):
+        super(DatetimeDisplayWidgetTest, self).testRenderFull()
+        self.verifyResult(self._widget(), ["14:39:01 +000"])
+
+class TextAreaDisplayWidgetTest(BrowserWidgetTest):
+
+    _WidgetFactory = TextAreaWidget
+
+    # It uses the default DisplayWidget
+    def testRender(self):
+        value = u"""
+        texttexttexttexttexttextexttexttext\xE9\xE9\xE9\xE9\xE9\xE9\xE9\xE9\xE9
+        texttexttexttexttextte\xE9\xE9\xE9\xE9\xE9xttexttexttexttexttexttexttex
+        texttexttexttexttexttexttexttexttexttexttexttexttexttexttext
+        """
+        self._widget.setRenderedValue(value)
+        self.assert_(value, self._widget._toFieldValue(value))
+        self.verifyResult(self._widget(), ["<textarea",
+                                           self._widget._toFormValue(value)])
+        check_list = (
+            ('id', 'field.foo'),
+            ('name', 'field.foo'),
+            #('value', ), tested above
+            ('cols', '60'),
+            ('rows', '15'),
+            )
+        for a, v in check_list:
+            self.verifyResult(self._widget(), [a, v])
+
+class BytesAreaDisplayWidgetTest(BrowserWidgetTest):
+
+    _WidgetFactory = BytesAreaWidget
+
+    # It uses the default DisplayWidget
+    def testRender(self):
+        value = """
+        texttexttexttexttexttexttexttexttexttexttexttexttexttexttext
+        texttexttexttexttexttexttexttexttexttexttexttexttexttexttext
+        texttexttexttexttexttexttexttexttexttexttexttexttexttexttext
+        """
+        self._widget.setRenderedValue(value)
+        self.assert_(value, self._widget._toFieldValue(value))
+        self.verifyResult(self._widget(), ["<textarea",
+                                           self._widget._toFormValue(value)])
+        check_list = (
+            ('id', 'field.foo'),
+            ('name', 'field.foo'),
+            #('value', ), tested above
+            ('cols', '60'),
+            ('rows', '15'),
+            )
+        for a, v in check_list:
+            self.verifyResult(self._widget(), [a, v])
+
+class BytesDisplayWidgetTest(BrowserWidgetTest):
+
+    _WidgetFactory = BytesWidget
+
+    # It uses the BytesDisplayWidget
+    def testRender(self):
+        value = "Food Value"
+        self._widget.setRenderedValue(value)
+        check_list = ('type="text"', 'id="field.foo"', 'name="field.foo"',
+                      'value="%s"'%value, 'size="20"')
+        self.verifyResult(self._widget(), check_list)
+
+class ASCIIDisplayWidgetTest(BrowserWidgetTest):
+
+    _WidgetFactory = ASCIIWidget
+
+    # It uses the default BytesDisplayWidget
+    def testRender(self):
+        value = "Food Value"
+        self._widget.setRenderedValue(value)
+        check_list = ('type="text"', 'id="field.foo"', 'name="field.foo"',
+                      'value="%s"'%value, 'size="20"')
+        self.verifyResult(self._widget(), check_list)
+
+class PasswordDisplayWidgetTest(BrowserWidgetTest):
+
+    _WidgetFactory = PasswordWidget
+    _FieldFactory = Password
+
+    # It uses the default DisplayWidget
+    def testRender(self):
+        value = 'Foo Value'
+        self._widget.setRenderedValue(value)
+        check_list = ('type="password"', 'id="field.foo"', 'name="field.foo"',
+                      'value=""', 'size="20"')
+        self.verifyResult(self._widget(), check_list)
+
+    def testUnchangedPassword(self):
+        # The password hasn't been set yet, so an empty string
+        # is regarded as an empty field.
+        self.assertEquals(None, self._widget._toFieldValue(''))
+        # Now the password has been filled in, so the empty string
+        # is regarded as the special value for UNCHANGED_PASSWORD.
+        self._widget.context.context.foo = u'existing password'
+        self.assertEquals(self._widget.context.UNCHANGED_PASSWORD, 
+                          self._widget._toFieldValue(''))
+
+class FileDisplayWidgetTest(BrowserWidgetTest):
+
+    _WidgetFactory = FileWidget
+
+    # It uses the default DisplayWidget
+    def testRender(self):
+        value = 'Foo Value'
+        self._widget.setRenderedValue(value)
+        check_list = ('type="file"', 'id="field.foo"', 'name="field.foo"',
+                      'size="20"')
+        self.verifyResult(self._widget(), check_list)
+        check_list = ('type="hidden"',) + check_list[1:-1]
+        self.verifyResult(self._widget.hidden(), check_list)
+        check_list = ('style="color: red"',) + check_list
+        self._widget.extra = 'style="color: red"'
+        self.verifyResult(self._widget.hidden(), check_list)
+
+class IntDisplayWidgetTest(BrowserWidgetTest):
+
+    _WidgetFactory = IntWidget
+
+    # It uses the default DisplayWidget
+    def testRender(self):
+        value = 1
+        self._widget.setRenderedValue(value)
+        check_list = ('type="text"', 'id="field.foo"', 'name="field.foo"',
+                      'size="10"', 'value="%s"'%str(value))
+        self.verifyResult(self._widget(), check_list)
+
+class FloatDisplayWidgetTest(BrowserWidgetTest):
+
+    _WidgetFactory = FloatWidget
+
+    # It uses the default DisplayWidget
+    def testRender(self):
+        value = 1.2
+        self._widget.setRenderedValue(value)
+        check_list = ('type="text"', 'id="field.foo"', 'name="field.foo"',
+                      'size="10"', 'value="%s"'%str(value))
+        self.verifyResult(self._widget(), check_list)
+
+def test_w_nonrequired_and_missing_value_and_no_inout():
+    """
+    There was a bug that caused the value attribute to be set to
+    'value' under these circumstances.
+
+    >>> from zope.schema import TextLine
+    >>> field = TextLine(__name__='foo', title=u'on',
+    ...                  required=False, missing_value=u'')
+    >>> request = TestRequest()
+    >>> widget = TextWidget(field, request)
+
+    >>> def normalize(s):
+    ...   return '\\n  '.join(filter(None, s.split(' ')))
+
+    >>> print normalize( widget() )
+    <input
+      class="textType"
+      id="field.foo"
+      name="field.foo"
+      size="20"
+      type="text"
+      value=""
+      />
+
+    """
+
+def test_no_error_on_render_only():
+    """This is really a test of a bug fix to SimpleInputWidget.
+
+    _error shouldn't be set due to an *internal* call to getInputValue
+    when rendering.
+
+    >>> from zope.schema import TextLine
+    >>> field = TextLine(__name__='foo')
+    >>> request = TestRequest(form={'field.foo': ''})
+    >>> widget = TextWidget(field, request)
+    >>> ignored = widget()
+    >>> unicode(widget.error())
+    u''
+
+
+    """
+
+def test_text_area_works_with_missing_value():
+    """
+    >>> from zope.schema import Text
+    >>> field = Text(__name__='foo', title=u'on',
+    ...              required=False, missing_value=u'')
+    >>> request = TestRequest()
+    >>> widget = TextAreaWidget(field, request)
+    >>> def normalize(s):
+    ...   return '\\n  '.join(filter(None, s.split(' ')))
+
+    >>> print normalize( widget() )
+    <textarea
+      cols="60"
+      id="field.foo"
+      name="field.foo"
+      rows="15"
+      ></textarea>
+
+    >>> print normalize( widget.hidden() )
+    <input
+      class="hiddenType"
+      id="field.foo"
+      name="field.foo"
+      type="hidden"
+      value=""
+      />
+      """
+
+def test_suite():
+    return unittest.TestSuite((
+        unittest.makeSuite(TextWidgetTest),
+        unittest.makeSuite(URIDisplayWidgetTest),
+        unittest.makeSuite(DateDisplayWidgetTest),
+        unittest.makeSuite(DatetimeDisplayWidgetTest),
+        unittest.makeSuite(TextAreaDisplayWidgetTest),
+        unittest.makeSuite(BytesAreaDisplayWidgetTest),
+        unittest.makeSuite(PasswordDisplayWidgetTest),
+        unittest.makeSuite(FileDisplayWidgetTest),
+        unittest.makeSuite(IntDisplayWidgetTest),
+        unittest.makeSuite(FloatDisplayWidgetTest),
+        unittest.makeSuite(BytesDisplayWidgetTest),
+        unittest.makeSuite(ASCIIDisplayWidgetTest),
+        doctest.DocTestSuite(),
+        ))
+
+if __name__=='__main__':
+    unittest.main(defaultTest='test_suite')



More information about the Zope3-Checkins mailing list