← Back to team overview

dulwich-users team mailing list archive

Re: [PATCH 25/28] tests/utils: Add builder functions to make C extension tests.

 

Ok, I just wanted *something* simpler than what we had, since these patches
introduced a fair number of new extension functions.

On Mon, Dec 13, 2010 at 04:10, Jelmer Vernooij <jelmer@xxxxxxxxx> wrote:

> On Thu, 2010-12-02 at 16:22 -0800, dborowitz@xxxxxxxxxx wrote:
> > diff --git a/dulwich/tests/utils.py b/dulwich/tests/utils.py
> > index 8df2a83..2535e3f 100644
> > --- a/dulwich/tests/utils.py
> > +++ b/dulwich/tests/utils.py
> > @@ -25,12 +25,16 @@ import os
> >  import shutil
> >  import tempfile
> >  import time
> > +import types
> >
> >  from dulwich.objects import (
> >      FixedSha,
> >      Commit,
> >      )
> >  from dulwich.repo import Repo
> > +from dulwich.tests import (
> > +    TestSkipped,
> > +    )
> >
> >
> >  def open_repo(name):
> > @@ -105,3 +109,41 @@ def make_commit(**attrs):
> >                   'tree': '0' * 40}
> >      all_attrs.update(attrs)
> >      return make_object(Commit, **all_attrs)
> > +
> > +
> > +def functest_builder(method, func):
> > +    """Generate a test method that tests the given function."""
> > +
> > +    def do_test(self):
> > +        method(self, func)
> > +
> > +    return do_test
> > +
> > +
> > +def ext_functest_builder(method, func):
> > +    """Generate a test method that tests the given extension function.
> > +
> > +    This is intended to generate test methods that test both a
> pure-Python
> > +    version and an extension version using common test code. The
> extension test
> > +    will raise TestSkipped if the extension is not found.
> > +
> > +    Sample usage:
> > +
> > +    class MyTest(TestCase);
> > +        def _do_some_test(self, func_impl):
> > +            self.assertEqual('foo', func_impl())
> > +
> > +        test_foo = functest_builder(_do_some_test, foo_py)
> > +        test_foo_extension = ext_functest_builder(_do_some_test, _foo_c)
> > +
> > +    :param method: The method to run. It must must two parameters, self
> and the
> > +        function implementation to test.
> > +    :param func: The function implementation to pass to method.
> > +    """
> > +
> > +    def do_test(self):
> > +        if not isinstance(func, types.BuiltinFunctionType):
> > +            raise TestSkipped("%s extension not found", func.func_name)
> > +        method(self, func)
> > +
> > +    return do_test
> I'm not crazy about this pattern, the approach that's used in Bazaar for
> this kind of thing is nicer imho. I'll see if I can propose an
> alternative.
>
> Cheers,
>
> Jelmer
>

Follow ups

References