[Zope3-checkins] CVS: Zope3/src/zope/schema/tests - states.py:1.2 tabcomplete.py:1.2 test_states.py:1.2 test_tabcomplete.py:1.2 test_vocabulary.py:1.2

Fred L. Drake, Jr. fred@zope.com
Tue, 20 May 2003 12:10:31 -0400


Update of /cvs-repository/Zope3/src/zope/schema/tests
In directory cvs.zope.org:/tmp/cvs-serv24680/src/zope/schema/tests

Added Files:
	states.py tabcomplete.py test_states.py test_tabcomplete.py 
	test_vocabulary.py 
Log Message:
Merge schema-vocabulary-branch into the trunk.

Preliminary documentation on vocabularies and schema vocabulary fields
can be found at http://dev.zope.org/Zope3/VocabularyFields.


=== Zope3/src/zope/schema/tests/states.py 1.1 => 1.2 ===
--- /dev/null	Tue May 20 12:10:31 2003
+++ Zope3/src/zope/schema/tests/states.py	Tue May 20 12:10:30 2003
@@ -0,0 +1,130 @@
+##############################################################################
+#
+# Copyright (c) 2003 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.0 (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.
+#
+##############################################################################
+
+"""Sample vocabulary supporting state abbreviations."""
+
+from zope.schema import interfaces
+from zope.schema import vocabulary
+
+
+# This table is based on information from the United States Postal Service:
+# http://www.usps.com/ncsc/lookups/abbreviations.html#states
+_states = {
+    'AL': u'Alabama',
+    'AK': u'Alaska',
+    'AS': u'American Samoa',
+    'AZ': u'Arizona',
+    'AR': u'Arkansas',
+    'CA': u'California',
+    'CO': u'Colorado',
+    'CT': u'Connecticut',
+    'DE': u'Delaware',
+    'DC': u'District of Columbia',
+    'FM': u'Federated States of Micronesia',
+    'FL': u'Florida',
+    'GA': u'Georgia',
+    'GU': u'Guam',
+    'HI': u'Hawaii',
+    'ID': u'Idaho',
+    'IL': u'Illinois',
+    'IN': u'Indiana',
+    'IA': u'Iowa',
+    'KS': u'Kansas',
+    'KY': u'Kentucky',
+    'LA': u'Louisiana',
+    'ME': u'Maine',
+    'MH': u'Marshall Islands',
+    'MD': u'Maryland',
+    'MA': u'Massachusetts',
+    'MI': u'Michigan',
+    'MN': u'Minnesota',
+    'MS': u'Mississippi',
+    'MO': u'Missouri',
+    'MT': u'Montana',
+    'NE': u'Nebraska',
+    'NV': u'Nevada',
+    'NH': u'New Hampshire',
+    'NJ': u'New Jersey',
+    'NM': u'New Mexico',
+    'NY': u'New York',
+    'NC': u'North Carolina',
+    'ND': u'North Dakota',
+    'MP': u'Northern Mariana Islands',
+    'OH': u'Ohio',
+    'OK': u'Oklahoma',
+    'OR': u'Oregon',
+    'PW': u'Palau',
+    'PA': u'Pennsylvania',
+    'PR': u'Puerto Rico',
+    'RI': u'Rhode Island',
+    'SC': u'South Carolina',
+    'SD': u'South Dakota',
+    'TN': u'Tennessee',
+    'TX': u'Texas',
+    'UT': u'Utah',
+    'VT': u'Vermont',
+    'VI': u'Virgin Islands',
+    'VA': u'Virginia',
+    'WA': u'Washington',
+    'WV': u'West Virginia',
+    'WI': u'Wisconsin',
+    'WY': u'Wyoming',
+    }
+
+
+class State:
+    __slots__ = 'value', 'title'
+    __implements__ = interfaces.ITerm
+
+    def __init__(self, value, title):
+        self.value = value
+        self.title = title
+
+for v,p in _states.iteritems():
+    _states[v] = State(v, p)
+
+
+class IStateVocabulary(interfaces.IVocabulary):
+    """Vocabularies that support the states database conform to this."""
+
+
+class StateVocabulary(object):
+    __slots__ = ()
+    __implements__ = IStateVocabulary
+
+    def __init__(self, object=None):
+        pass
+
+    def __contains__(self, value):
+        return value in _states
+
+    def getTerm(self, value):
+        return _states[value]
+
+    def __iter__(self):
+        return _states.itervalues()
+
+    def __len__(self):
+        return len(_states)
+
+
+class StateSelectionField(vocabulary.VocabularyField):
+    __implements__ = vocabulary.VocabularyField.__implements__
+    vocabulary = StateVocabulary()
+
+    def __init__(self, **kw):
+        super(StateSelectionField, self).__init__(
+            vocabulary=StateSelectionField.vocabulary,
+            **kw)
+        self.vocabularyName = "states"


=== Zope3/src/zope/schema/tests/tabcomplete.py 1.1 => 1.2 ===
--- /dev/null	Tue May 20 12:10:31 2003
+++ Zope3/src/zope/schema/tests/tabcomplete.py	Tue May 20 12:10:30 2003
@@ -0,0 +1,87 @@
+##############################################################################
+#
+# Copyright (c) 2003 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.0 (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.
+#
+##############################################################################
+
+"""Example vocabulary for tab completion."""
+
+
+from zope.schema.interfaces import ITerm, ISubsetVocabulary, IVocabulary
+
+
+class Term:
+    __implements__ = ITerm
+
+    def __init__(self, value):
+        self.value = value
+
+
+class TermIterator:
+    def __init__(self, values):
+        self._next = iter(values).next
+
+    def __iter__(self):
+        return self
+
+    def next(self):
+        return Term(self._next())
+
+
+class CompletionVocabulary(object):
+    __implements__ = IVocabulary
+
+    def __init__(self, values):
+        # In practice, something more dynamic could be used to
+        # get the list possible completions.
+        self._values = tuple(values)
+
+    def __contains__(self, value):
+        return value in self._values
+
+    def getTerm(self, value):
+        if value in self._values:
+            return Term(value)
+        raise LookupError(value)
+
+    def __iter__(self):
+        return TermIterator(self._values)
+
+    def __len__(self):
+        return len(self._values)
+
+    def queryForPrefix(self, prefix):
+        return SubsetCompletionVocabulary(self._match_prefix(prefix),
+                                          self)
+
+    def _match_prefix(self, prefix):
+        L = [v for v in self._values if v.startswith(prefix)]
+        if L:
+            return L
+        else:
+            raise LookupError("no entries matching prefix %r" % prefix)
+
+
+class SubsetCompletionVocabulary(CompletionVocabulary):
+    __implements__ = IVocabulary, ISubsetVocabulary
+
+    def __init__(self, values, master):
+        super(SubsetCompletionVocabulary, self).__init__(values)
+        self._master = master
+
+    def getMasterVocabulary(self):
+        return self._master
+
+    def queryForPrefix(self, prefix):
+        # Never nest more than one level; cause the real
+        # master to always be returned by getMasterVocabulary()
+        return SubsetCompletionVocabulary(self._match_prefix(prefix),
+                                          self._master)


=== Zope3/src/zope/schema/tests/test_states.py 1.1 => 1.2 ===
--- /dev/null	Tue May 20 12:10:31 2003
+++ Zope3/src/zope/schema/tests/test_states.py	Tue May 20 12:10:30 2003
@@ -0,0 +1,96 @@
+##############################################################################
+#
+# Copyright (c) 2003 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.0 (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.
+#
+##############################################################################
+
+"""Tests of the states example."""
+
+import unittest
+
+from zope.interface import Interface
+
+from zope.schema import vocabulary
+from zope.schema.tests import states
+
+
+class IBirthInfo(Interface):
+    state1 = vocabulary.VocabularyField(
+        title=u'State of Birth',
+        description=u'The state in which you were born.',
+        vocabulary="states",
+        default="AL",
+        )
+    state2 = vocabulary.VocabularyField(
+        title=u'State of Birth',
+        description=u'The state in which you were born.',
+        vocabulary="states",
+        default="AL",
+        )
+    state3 = vocabulary.VocabularyField(
+        title=u'Favorite State',
+        description=u'The state you like the most.',
+        vocabulary=states.StateVocabulary(),
+        )
+    state4 = vocabulary.VocabularyField(
+        title=u"Name",
+        description=u"The name of your new state",
+        vocabulary="states",
+        )
+
+class BirthInfo:
+    __implements__ = IBirthInfo
+
+    def __init__(self):
+        self.state = state
+
+
+class StateSelectionTest(unittest.TestCase):
+    def setUp(self):
+        vocabulary._clear()
+        vr = vocabulary.getVocabularyRegistry()
+        vr.register("states", states.StateVocabulary)
+
+    def tearDown(self):
+        vocabulary._clear()
+
+    def test_default_presentation(self):
+        field = IBirthInfo.getDescriptionFor("state1")
+        bound = field.bind(object())
+        self.assertEqual(bound.vocabulary.getTerm("VA").title, "Virginia")
+
+    def test_contains(self):
+        vocab = states.StateVocabulary()
+        count = 0
+        L = list(vocab)
+        for term in L:
+            count += 1
+            self.assert_(term.value in vocab)
+        self.assertEqual(count, len(vocab))
+        # make sure we get the same values the second time around:
+        L = [term.value for term in L]
+        L.sort()
+        L2 = [term.value for term in vocab]
+        L2.sort()
+        self.assertEqual(L, L2)
+
+    def test_prebound_vocabulary(self):
+        field = IBirthInfo.getDescriptionFor("state3")
+        bound = field.bind(None)
+        self.assert_(bound.vocabularyName is None)
+        self.assert_("AL" in bound.vocabulary)
+
+
+def test_suite():
+    return unittest.makeSuite(StateSelectionTest)
+
+if __name__ == "__main__":
+    unittest.main(defaultTest="test_suite")


=== Zope3/src/zope/schema/tests/test_tabcomplete.py 1.1 => 1.2 ===
--- /dev/null	Tue May 20 12:10:31 2003
+++ Zope3/src/zope/schema/tests/test_tabcomplete.py	Tue May 20 12:10:30 2003
@@ -0,0 +1,52 @@
+##############################################################################
+#
+# Copyright (c) 2003 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.0 (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.
+#
+##############################################################################
+
+"""Tests of the 'tab completion' example vocabulary."""
+
+import unittest
+
+from zope.schema import vocabulary
+from zope.schema.interfaces import ITerm
+from zope.schema.tests import tabcomplete
+
+
+class TabCompletionTests(unittest.TestCase):
+
+    def setUp(self):
+        self.vocab = tabcomplete.CompletionVocabulary(['abc', 'def'])
+
+    def test_successful_query(self):
+        subset = self.vocab.queryForPrefix("a")
+        L = [term.value for term in subset]
+        self.assertEqual(L, ["abc"])
+        self.assert_(subset.getMasterVocabulary() is self.vocab)
+        subset = self.vocab.queryForPrefix("def")
+        L = [term.value for term in subset]
+        self.assertEqual(L, ["def"])
+        self.assert_(subset.getMasterVocabulary() is self.vocab)
+
+    def test_failed_query(self):
+        self.assertRaises(LookupError, self.vocab.queryForPrefix, "g")
+
+    def test_getTerm(self):
+        term = self.vocab.getTerm("abc")
+        self.assert_(ITerm.isImplementedBy(term))
+        self.assertEqual(term.value, "abc")
+
+
+def test_suite():
+    return unittest.makeSuite(TabCompletionTests)
+
+if __name__ == "__main__":
+    unittest.main(defaultTest="test_suite")


=== Zope3/src/zope/schema/tests/test_vocabulary.py 1.1 => 1.2 ===
--- /dev/null	Tue May 20 12:10:31 2003
+++ Zope3/src/zope/schema/tests/test_vocabulary.py	Tue May 20 12:10:30 2003
@@ -0,0 +1,131 @@
+##############################################################################
+#
+# Copyright (c) 2003 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.0 (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.
+#
+##############################################################################
+
+"""Test of the VocabularyField and related support APIs."""
+
+import sys
+import unittest
+
+from zope.schema import interfaces
+from zope.schema import vocabulary
+
+
+class DummyRegistry(vocabulary.VocabularyRegistry):
+    def get(self, object, name):
+        v = SampleVocabulary()
+        v.object = object
+        v.name = name
+        return v
+
+
+class BaseTest(unittest.TestCase):
+    # Clear the vocabulary and presentation registries on each side of
+    # each test.
+
+    def setUp(self):
+        vocabulary._clear()
+
+    def tearDown(self):
+        vocabulary._clear()
+
+
+class RegistryTests(BaseTest):
+    """Tests of the simple vocabulary and presentation registries."""
+
+    def test_setVocabularyRegistry(self):
+        r = DummyRegistry()
+        vocabulary.setVocabularyRegistry(r)
+        self.assert_(vocabulary.getVocabularyRegistry() is r)
+
+    def test_getVocabularyRegistry(self):
+        r = vocabulary.getVocabularyRegistry()
+        self.assert_(interfaces.IVocabularyRegistry.isImplementedBy(r))
+
+    # XXX still need to test the default implementation
+
+class SampleTerm:
+    pass
+
+class SampleVocabulary:
+    __implements__ = interfaces.IVocabulary
+
+    def __contains__(self, value):
+        return 0 <= value < 10
+
+    def __len__(self):
+        return 10
+
+    def getQuery(self):
+        return None
+
+    def getTerm(self, value):
+        if value in self:
+            t = SampleTerm()
+            t.value = value
+            t.double = 2 * value
+            return t
+        raise LookupError("no such value: %r" % value)
+
+
+class VocabularyFieldTests(BaseTest):
+    """Tests of the VocabularyField implementation."""
+
+    def check_preconstructed(self, cls, okval, badval):
+        v = SampleVocabulary()
+        field = cls(vocabulary=v)
+        self.assert_(field.vocabulary is v)
+        self.assert_(field.vocabularyName is None)
+        bound = field.bind(None)
+        self.assert_(bound.vocabulary is v)
+        self.assert_(bound.vocabularyName is None)
+        bound.default = okval
+        self.assertEqual(bound.default, okval)
+        self.assertRaises(interfaces.ValidationError,
+                          setattr, bound, "default", badval)
+
+    def test_preconstructed_vocabulary(self):
+        self.check_preconstructed(vocabulary.VocabularyField, 1, 42)
+
+    def test_preconstructed_vocabulary_multi(self):
+        self.check_preconstructed(vocabulary.VocabularyMultiField,
+                                  [1], [1, 42])
+
+    def check_constructed(self, cls, okval, badval):
+        vocabulary.setVocabularyRegistry(DummyRegistry())
+        field = cls(vocabulary="vocab")
+        self.assert_(field.vocabulary is None)
+        self.assertEqual(field.vocabularyName, "vocab")
+        o = object()
+        bound = field.bind(o)
+        self.assert_(isinstance(bound.vocabulary, SampleVocabulary))
+        bound.default = okval
+        self.assertEqual(bound.default, okval)
+        self.assertRaises(interfaces.ValidationError,
+                          setattr, bound, "default", badval)
+
+    def test_constructed_vocabulary(self):
+        self.check_constructed(vocabulary.VocabularyField, 1, 42)
+
+    def test_constructed_vocabulary_multi(self):
+        self.check_constructed(vocabulary.VocabularyMultiField,
+                               [1], [1, 42])
+
+
+def test_suite():
+    suite = unittest.makeSuite(RegistryTests)
+    suite.addTest(unittest.makeSuite(VocabularyFieldTests))
+    return suite
+
+if __name__ == "__main__":
+    unittest.main(defaultTest="test_suite")