~ubuntu-branches/ubuntu/karmic/pypy/karmic

« back to all changes in this revision

Viewing changes to py/apigen/testing/test_apigen_functional.py

  • Committer: Bazaar Package Importer
  • Author(s): Alexandre Fayolle
  • Date: 2007-04-13 09:33:09 UTC
  • Revision ID: james.westby@ubuntu.com-20070413093309-yoojh4jcoocu2krz
Tags: upstream-1.0.0
ImportĀ upstreamĀ versionĀ 1.0.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
""" functional test for apigen.py
 
2
 
 
3
    script to build api + source docs from py.test
 
4
"""
 
5
 
 
6
import py
 
7
from py.__.apigen import apigen
 
8
 
 
9
def setup_module(mod):
 
10
    if py.std.sys.platform == "win32":
 
11
        py.test.skip("not supported with win32 yet")
 
12
 
 
13
def setup_fs_project(name):
 
14
    temp = py.test.ensuretemp(name)
 
15
    assert temp.listdir() == []
 
16
    temp.ensure("pak/func.py").write(py.code.Source("""\
 
17
        def func(arg1):
 
18
            "docstring"
 
19
 
 
20
        def func_2(arg1, arg2):
 
21
            return arg1(arg2)
 
22
    """))
 
23
    temp.ensure('pak/sometestclass.py').write(py.code.Source("""\
 
24
        class SomeTestClass(object):
 
25
            " docstring sometestclass "
 
26
            someattr = 'somevalue'
 
27
            def __init__(self, somevar):
 
28
                self.somevar = somevar
 
29
                
 
30
            def get_somevar(self):
 
31
                " get_somevar docstring "
 
32
                return self.somevar
 
33
            
 
34
            def get_some_source(self):
 
35
                ret = py.code.Source('''\\
 
36
                    def foo():
 
37
                      return 'bar'
 
38
                ''')
 
39
                return ret
 
40
 
 
41
    """))
 
42
    temp.ensure('pak/sometestsubclass.py').write(py.code.Source("""\
 
43
        from sometestclass import SomeTestClass
 
44
        class SomeTestSubClass(SomeTestClass):
 
45
            " docstring sometestsubclass "
 
46
            def get_somevar(self):
 
47
                return self.somevar + 1
 
48
    """))
 
49
    temp.ensure('pak/somenamespace.py').write(py.code.Source("""\
 
50
        def foo():
 
51
            return 'bar'
 
52
        def baz(qux):
 
53
            return qux
 
54
        def _hidden():
 
55
            return 'quux'
 
56
    """))
 
57
    temp.ensure("pak/__init__.py").write(py.code.Source("""\
 
58
        '''pkg docstring'''
 
59
        from py.initpkg import initpkg
 
60
        initpkg(__name__,
 
61
                long_description=globals()['__doc__'],
 
62
                exportdefs={'main.sub.func': ("./func.py", "func"),
 
63
                            'main.func': ("./func.py", "func_2"),
 
64
                            'main.SomeTestClass': ('./sometestclass.py',
 
65
                                                   'SomeTestClass'),
 
66
                            'main.SomeTestSubClass': ('./sometestsubclass.py',
 
67
                                                      'SomeTestSubClass'),
 
68
                            'somenamespace': ('./somenamespace.py', '*')})
 
69
    """))
 
70
    temp.ensure('apigen.py').write(py.code.Source("""\
 
71
        import py
 
72
        py.std.sys.path.insert(0,
 
73
            py.magic.autopath().dirpath().dirpath().dirpath().strpath)
 
74
        from py.__.apigen.apigen import build, \
 
75
            get_documentable_items_pkgdir as get_documentable_items
 
76
    """))
 
77
    temp.ensure('pak/test/test_pak.py').write(py.code.Source("""\
 
78
        import py
 
79
        py.std.sys.path.insert(0,
 
80
            py.magic.autopath().dirpath().dirpath().dirpath().strpath)
 
81
        import pak
 
82
 
 
83
        # this mainly exists to provide some data to the tracer
 
84
        def test_pak():
 
85
            s = pak.main.SomeTestClass(10)
 
86
            assert s.get_somevar() == 10
 
87
            s = pak.main.SomeTestClass('10')
 
88
            assert s.get_somevar() == '10'
 
89
            s = pak.main.SomeTestSubClass(10)
 
90
            assert s.get_somevar() == 11
 
91
            s = pak.main.SomeTestSubClass('10')
 
92
            py.test.raises(TypeError, 's.get_somevar()')
 
93
            assert pak.main.sub.func(10) is None
 
94
            assert pak.main.sub.func(20) is None
 
95
            s = pak.main.func(pak.main.SomeTestClass, 10)
 
96
            assert isinstance(s, pak.main.SomeTestClass)
 
97
 
 
98
            # some nice things to confuse the tracer/storage
 
99
            source = py.code.Source('''\
 
100
                pak.main.sub.func(10)
 
101
            ''')
 
102
            c = compile(str(source), '<test>', 'exec')
 
103
            exec c in globals()
 
104
 
 
105
            assert pak.somenamespace._hidden() == 'quux'
 
106
 
 
107
            # this just to see a multi-level stack in the docs
 
108
            def foo():
 
109
                return pak.main.sub.func(10)
 
110
            assert foo() is None
 
111
    """))
 
112
    return temp, 'pak'
 
113
 
 
114
def test_get_documentable_items():
 
115
    fs_root, package_name = setup_fs_project('test_get_documentable_items')
 
116
    pkgname, documentable = apigen.get_documentable_items_pkgdir(
 
117
                                               fs_root.join(package_name))
 
118
    assert pkgname == 'pak'
 
119
    assert sorted(documentable.keys()) ==  [
 
120
        'main.SomeTestClass', 'main.SomeTestSubClass', 'main.func',
 
121
        'main.sub.func', 'somenamespace.baz', 'somenamespace.foo']
 
122
 
 
123
def test_apigen_functional():
 
124
    #if py.std.sys.platform == "win32":
 
125
    #    py.test.skip("XXX test fails on windows")
 
126
    fs_root, package_name = setup_fs_project('test_apigen_functional')
 
127
    tempdir = py.test.ensuretemp('test_apigen_functional_results')
 
128
    pydir = py.magic.autopath().dirpath().dirpath().dirpath()
 
129
    pakdir = fs_root.join('pak')
 
130
    if py.std.sys.platform == 'win32':
 
131
        cmd = ('set APIGENPATH=%s && set PYTHONPATH=%s && '
 
132
               'python "%s/bin/py.test"') % (tempdir, fs_root, pydir)
 
133
    else:
 
134
        cmd = ('APIGENPATH="%s" PYTHONPATH="%s" '
 
135
               'python "%s/bin/py.test"') % (tempdir, fs_root, pydir)
 
136
    try:
 
137
        output = py.process.cmdexec('%s --apigen="%s/apigen.py" "%s"' % (
 
138
                                        cmd, fs_root, pakdir))
 
139
    except py.error.Error, e:
 
140
        print e.out
 
141
        raise
 
142
    assert output.lower().find('traceback') == -1
 
143
 
 
144
    # just some quick content checks
 
145
    apidir = tempdir.join('api')
 
146
    assert apidir.check(dir=True)
 
147
    sometestclass_api = apidir.join('main.SomeTestClass.html')
 
148
    assert sometestclass_api.check(file=True)
 
149
    html = sometestclass_api.read()
 
150
    print html
 
151
    assert '<a href="main.SomeTestClass.html">SomeTestClass</a>' in html
 
152
    assert 'someattr: <em>somevalue</em>' in html
 
153
    
 
154
    namespace_api = apidir.join('main.html')
 
155
    assert namespace_api.check(file=True)
 
156
    html = namespace_api.read()
 
157
    assert '<a href="main.SomeTestClass.html">SomeTestClass</a>' in html
 
158
    index = apidir.join('index.html')
 
159
    assert index.check(file=True)
 
160
    html = index.read()
 
161
    assert 'pkg docstring' in html
 
162
 
 
163
    sourcedir = tempdir.join('source')
 
164
    assert sourcedir.check(dir=True)
 
165
    sometestclass_source = sourcedir.join('sometestclass.py.html')
 
166
    assert sometestclass_source.check(file=True)
 
167
    html = sometestclass_source.read()
 
168
    assert '<div class="project_title">sources for sometestclass.py</div>' in html
 
169
 
 
170
    index = sourcedir.join('index.html')
 
171
    assert index.check(file=True)
 
172
    html = index.read()
 
173
    print html
 
174
    assert '<a href="test/index.html">test</a>' in html
 
175
    assert 'href="../../py/doc/home.html"'
 
176