示例#1
0
def test(load_gi, backend=None, strict=False, filter_=None, failfast=False):
    """Run the test suite.

    load_gi -- run all tests in the pygobject suite with PyGObject
    backend -- "ctypes" or "cffi"
    strict  -- fail on glib warnings
    filter_ -- filter for test names (class names)
    """

    global _is_gi, _is_pypy, _has_cairo, _gi_version, GIOverflowError

    _is_gi = load_gi
    _is_pypy = platform.python_implementation() == "PyPy"
    _has_cairo = True

    if not load_gi:
        try:
            import cairocffi
            cairocffi.install_as_pycairo()
        except (ImportError, OSError):
            _has_cairo = False
        import pgi
        pgi.install_as_gi()
        try:
            pgi.set_backend(backend)
        except LookupError:
            print("Couldn't load backend: %r" % backend)
            return

    def headline(text):
        return (("### %s " % text) + "#" * 80)[:80]

    import gi

    TYPELIBS = {
        "Gtk": "3.0",
        "Gdk": "3.0",
        "Clutter": "1.0",
        "Regress": "1.0",
        "GIMarshallingTests": "1.0",
        "PangoCairo": "1.0"
    }

    for name, version in TYPELIBS.items():
        try:
            gi.require_version(name, version)
        except ValueError:
            pass

    if load_gi:
        assert gi.__name__ == "gi"
        try:
            _gi_version = gi.version_info
        except AttributeError:
            _gi_version = gi._gobject.pygobject_version

        if _gi_version < (3, 10):
            GIOverflowError = ValueError
        else:
            GIOverflowError = OverflowError

        hl = headline("GI")
    else:
        assert gi.__name__ == "pgi"
        if backend:
            hl = headline("PGI (%s)" % backend)
        else:
            hl = headline("PGI")

        GIOverflowError = OverflowError
    print(hl[:80])

    # gi uses logging
    logging.disable(logging.ERROR)

    if strict:
        # make glib warnings fatal
        from gi.repository import GLib
        GLib.log_set_always_fatal(
            GLib.LogLevelFlags.LEVEL_CRITICAL |
            GLib.LogLevelFlags.LEVEL_ERROR |
            GLib.LogLevelFlags.LEVEL_WARNING)

    current_dir = os.path.join(os.path.dirname(__file__))
    tests = []
    tests = discover(current_dir, "tests_pygobject")
    tests += discover(current_dir, "tests_mixed")
    if not load_gi:
        tests.extend(discover(current_dir, "tests_pgi"))

    if filter_ is not None:
        tests = filter(lambda t: filter_(t.__name__), tests)

    tests = [unittest.makeSuite(t) for t in tests]

    # only in case all get run, so filtered results don't get spammed
    if filter_ is None:
        # collected by the FIXME decorator
        print(headline("FIXME"))
        for item, desc in sorted(_fixme.items(), key=lambda x: repr(x)):
            print(" -> %s.%s" % (item.__module__, item.__name__), end="")
            if desc:
                print("(%s)" % desc)
            else:
                print()

    run = unittest.TextTestRunner(
        verbosity=2, failfast=failfast).run(unittest.TestSuite(tests))

    return len(run.failures) + len(run.errors)
示例#2
0
def run(load_gi, backend=None):
    if not load_gi:
        import pgi
        pgi.install_as_gi()
        try:
            pgi.set_backend(backend)
        except LookupError:
            print("Couldn't load backend: %r" % backend)
            return

    import gi

    if load_gi:
        assert gi.__name__ == "gi"
        hl = "### GI " + "#" * 100
    else:
        assert gi.__name__ == "pgi"
        if backend:
            hl = "### PGI (%s) " % backend + "#" * 100
        else:
            hl = "### PGI " + "#" * 100
    print(hl[:80])

    t = time.time()
    from gi.repository import Gtk, GObject, GLib, Gio, Pango, Gdk
    GLib = GLib
    Gio = Gio
    Pango = Pango
    Gdk = Gdk
    t = time.time() - t
    print("%20s: %6.2f ms" % ("import", t * (10 ** 3)))

    def bench_func(n):
        times = []
        for i in xrange(n):
            t = time.time()
            Gtk.get_current_event_time()
            Gtk.rc_get_theme_dir()[:]
            t = time.time() - t
            times.append(t)
        return times

    def bench_gvalue(n):
        times = []
        b = Gtk.Button()
        for i in xrange(n):
            t = time.time()
            value = GObject.Value()
            value.init(GObject.TYPE_INT)
            value.set_int(42)
            value.get_int()
            value.unset()
            value = GObject.Value()
            value.init(GObject.TYPE_STRING)
            value.set_string("foobar")
            value.get_string()
            value.unset()
            value = GObject.Value()
            value.init(GObject.TYPE_OBJECT)
            value.set_object(b)
            value.get_object()
            value.unset()
            t = time.time() - t
            times.append(t)
        return times

    def bench_object(n):
        times = []
        for i in xrange(n):
            t = time.time()
            w = Gtk.Window()
            w.props.title = "this"
            t = time.time() - t
            times.append(t)
        return times

    def bench_method(n):
        times = []
        b = Gtk.Button()
        for i in xrange(n):
            t = time.time()
            b.set_name("foobar")
            b.get_name()
            b.set_relief(Gtk.ReliefStyle.NORMAL)
            b.get_relief()
            b.set_use_stock(True)
            b.get_use_stock()
            b.set_alignment(0.2, 0.4)
            b.get_alignment()
            t = time.time() - t
            times.append(t)
        return times

    def torture_signature_0(rounds):
        test = Regress.TestObj()
        func = test.torture_signature_0
        times = []
        for i in xrange(rounds):
            t0 = time.time()
            func(5000, "foobar", 12345)
            times.append(time.time() - t0)
        return times

    def torture_signature_1(rounds):
        test = Regress.TestObj()
        func = test.torture_signature_1
        times = []
        for i in xrange(rounds):
            t0 = time.time()
            func(5000, "foobar", 12344)
            times.append(time.time() - t0)
        return times

    def torture_signature_1e(rounds):
        test = Regress.TestObj()
        func = test.torture_signature_1
        times = []
        for i in xrange(rounds):
            t0 = time.time()
            try:
                func(5000, "foobar", 12345)
            except:
                pass
            times.append(time.time() - t0)
        return times

    def bench_arrays(rounds):
        times = []
        for i in xrange(rounds):
            t0 = time.time()
            GIMarshallingTests.array_fixed_int_return()
            GIMarshallingTests.array_fixed_short_return()
            GIMarshallingTests.array_fixed_int_in([-1, 0, 1, 2])
            GIMarshallingTests.array_fixed_out()
            GIMarshallingTests.array_fixed_inout([-1, 0, 1, 2])
            GIMarshallingTests.array_return()
            GIMarshallingTests.array_return_etc(5, 9)
            GIMarshallingTests.array_string_in(['foo', 'bar'])
            times.append(time.time() - t0)
        return times

    bench = [
        (bench_func, 100000),
        (bench_method, 100000),
        (bench_gvalue, 10000),
        (bench_object, 10000),
    ]

    try:
        from gi.repository import Regress
    except ImportError:
        pass
    else:
        bench.extend([
            (torture_signature_0, 10000),
            (torture_signature_1, 10000),
            (torture_signature_1e, 10000),
        ])

    try:
        from gi.repository import GIMarshallingTests
    except ImportError:
        pass
    else:
        bench.extend([
            (bench_arrays, 10000),
        ])

    for b, n in bench:
        min_time = min(b(n))
        print("%20s: %6.2f µs" % (b.__name__, min_time * (10 ** 6)))
示例#3
0
# Copyright 2013 Christoph Reiter
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.

import os

# Force disable translations for gi libraries.
# For example descriptions of properties/signals are translated.
os.environ["LANG"] = "en"

import pgi
pgi.install_as_gi()
pgi.set_backend("ctypes,null")
示例#4
0
文件: __init__.py 项目: tobes/pgi
def test(load_gi, backend=None, strict=False, filter_=None, failfast=False):
    """Run the test suite.

    load_gi -- run all tests in the pygobject suite with PyGObject
    backend -- "ctypes" or "cffi"
    strict  -- fail on glib warnings
    filter_ -- filter for test names (class names)
    """

    global _is_gi, _is_pypy, _has_cairo, _gi_version, GIOverflowError

    _is_gi = load_gi
    _is_pypy = platform.python_implementation() == "PyPy"
    _has_cairo = True

    if not load_gi:
        try:
            import cairocffi
            cairocffi.install_as_pycairo()
        except (ImportError, OSError):
            _has_cairo = False
        import pgi
        pgi.install_as_gi()
        try:
            pgi.set_backend(backend)
        except LookupError:
            print("Couldn't load backend: %r" % backend)
            return

    def headline(text):
        return (("### %s " % text) + "#" * 80)[:80]

    import gi

    TYPELIBS = {
        "Gtk": "3.0",
        "Gdk": "3.0",
        "Clutter": "1.0",
        "Regress": "1.0",
        "GIMarshallingTests": "1.0",
        "PangoCairo": "1.0"
    }

    for name, version in TYPELIBS.items():
        try:
            gi.require_version(name, version)
        except ValueError:
            pass

    if load_gi:
        assert gi.__name__ == "gi"
        try:
            _gi_version = gi.version_info
        except AttributeError:
            _gi_version = gi._gobject.pygobject_version

        if _gi_version < (3, 10):
            GIOverflowError = ValueError
        else:
            GIOverflowError = OverflowError

        hl = headline("GI")
    else:
        assert gi.__name__ == "pgi"
        if backend:
            hl = headline("PGI (%s)" % backend)
        else:
            hl = headline("PGI")

        GIOverflowError = OverflowError
    print(hl[:80])

    # gi uses logging
    logging.disable(logging.ERROR)

    if strict:
        # make glib warnings fatal
        from gi.repository import GLib
        GLib.log_set_always_fatal(GLib.LogLevelFlags.LEVEL_CRITICAL
                                  | GLib.LogLevelFlags.LEVEL_ERROR
                                  | GLib.LogLevelFlags.LEVEL_WARNING)

    current_dir = os.path.join(os.path.dirname(__file__))
    tests = []
    tests = discover(current_dir, "tests_pygobject")
    tests += discover(current_dir, "tests_mixed")
    if not load_gi:
        tests.extend(discover(current_dir, "tests_pgi"))

    if filter_ is not None:
        tests = filter(lambda t: filter_(t.__name__), tests)

    tests = [unittest.makeSuite(t) for t in tests]

    # only in case all get run, so filtered results don't get spammed
    if filter_ is None:
        # collected by the FIXME decorator
        print(headline("FIXME"))
        for item, desc in sorted(_fixme.items(), key=lambda x: repr(x)):
            print(" -> %s.%s" % (item.__module__, item.__name__), end="")
            if desc:
                print("(%s)" % desc)
            else:
                print()

    run = unittest.TextTestRunner(verbosity=2, failfast=failfast).run(
        unittest.TestSuite(tests))

    return len(run.failures) + len(run.errors)