def test_equality(self):
        """== check causes a match."""
        class any(object):
            def __eq__(self, other):
                return True
        assert match((any(),), (5,)) == ()

        # Long strings do not match with ``is``.
        assert match(('abc'*1000,), ('abc'*1000,)) == ()
    def test_class_capture(self):
        """Capturing values by matching against a class pattern."""
        assert match((int,), (5,)) == (5,)
        assert match((int,), (int,)) == ()

        # Multiple matches
        assert match(('a', int, int), ('a', 5, 7)) == (5, 7)

        # object can be used to match many things
        assert match((object, object, object), (5, 'foo', {})) == (5, 'foo', {})
    def test_dict(self):
        """dicts have special handling."""

        # It's ok if message has more items than pattern
        assert match(({},), ({'foo': 'bar'},)) == ()

        # But message must have all items that pattern does
        assert match(({'foo': 'bar'},), ({},)) is None
        assert match(({'foo': 'bar'},), ({'foo': 'bar'},)) == ()

        # And those items have to match as well
        assert match(({'foo': 'bar'},), ({'foo': 'baz'},)) is None

        # Class placeholders are supported in dicts as well
        assert match(({'foo': str},), ({'foo': 'bar'},)) == ('bar',)

        # dicts can be nested
        assert match(({'spam': {'ham': str}},),
            ({'spam': {'ham': 'eggs'}},)) == ('eggs',)
 def test_catch_all(self):
     """An empty pattern means match all."""
     assert match((), (1,)) == ()
     assert match((), ('sdf', 1, 2, 3, {'a': 'b'})) == ()
 def test_class_type(self):
     """Test that old-style classes work."""
     class Foo:
         pass
     foo = Foo()
     assert match((Foo,), (foo,)) == (foo,)
 def test_ident_objects(self):
     """``is`` ident check causes a match."""
     obj = object()
     assert match((obj,), (obj,)) == ()
     assert match((obj,), (object(),)) is None
 def test_different_lengths(self):
     assert match((5, 4, 'sdf'), (int, int, str, int)) is None