Completed
Pull Request — master (#2423)
by
unknown
01:49
created

AssembledDocumentationTest.test_python_assembly()   B

Complexity

Conditions 6

Size

Total Lines 21

Duplication

Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
cc 6
c 2
b 0
f 0
dl 0
loc 21
rs 7.8867
1
import unittest
2
3
from coalib.bearlib.languages.documentation.DocstyleDefinition import (
4
    DocstyleDefinition)
5
from coalib.bearlib.languages.documentation.DocumentationComment import (
6
    DocumentationComment)
7
from coalib.bearlib.languages.documentation.DocumentationExtraction import (
8
    extract_documentation)
9
from tests.bearlib.languages.documentation.TestUtils import (
10
    load_testdata)
11
12
13
class DocumentationCommentTest(unittest.TestCase):
14
15
    Description = DocumentationComment.Description
16
    Parameter = DocumentationComment.Parameter
17
    ReturnValue = DocumentationComment.ReturnValue
18
19
    Metadata = DocstyleDefinition.Metadata
20
21
22
class GeneralDocumentationCommentTest(DocumentationCommentTest):
23
24
    def test_fields(self):
25
        c_doxygen = DocstyleDefinition.load("C", "doxygen")
26
        uut = DocumentationComment("my doc",
27
                                   c_doxygen,
28
                                   " ",
29
                                   ("/**", "*", "*/"),
30
                                   (25, 45))
31
32
        self.assertEqual(uut.documentation, "my doc")
33
        self.assertEqual(uut.language, "c")
34
        self.assertEqual(uut.docstyle, "doxygen")
35
        self.assertEqual(uut.indent, " ")
36
        self.assertEqual(str(uut), "my doc")
37
        self.assertEqual(uut.marker, ("/**", "*", "*/"))
38
        self.assertEqual(uut.range, (25, 45))
39
40
        python_doxygen = DocstyleDefinition.load("python", "doxygen")
41
42
        python_doxygen_metadata = self.Metadata("@param ", " ", "@return ")
43
44
        uut = DocumentationComment("qwertzuiop",
45
                                   python_doxygen,
46
                                   "\t",
47
                                   ("##", "#", "#"),
48
                                   None)
49
50
        self.assertEqual(uut.documentation, "qwertzuiop")
51
        self.assertEqual(uut.language, "python")
52
        self.assertEqual(uut.docstyle, "doxygen")
53
        self.assertEqual(uut.indent, "\t")
54
        self.assertEqual(str(uut), "qwertzuiop")
55
        self.assertEqual(uut.marker, ("##", "#", "#"))
56
        self.assertEqual(uut.range, None)
57
        self.assertEqual(uut.metadata, python_doxygen_metadata)
58
59
60
class PythonDocumentationCommentTest(DocumentationCommentTest):
61
62
    def check_docstring(self, docstring, expected=[]):
63
        self.assertIsInstance(docstring,
64
                              str,
65
                              "expected needs to be a string for this test.")
66
67
        self.assertIsInstance(expected,
68
                              list,
69
                              "expected needs to be a list for this test.")
70
71
        python_default = DocstyleDefinition.load("python", "default")
72
73
        doc_comment = DocumentationComment(docstring, python_default,
74
                                           None, None, None)
75
        parsed_metadata = doc_comment.parse()
76
        self.assertEqual(parsed_metadata, expected)
77
78
    def test_empty_docstring(self):
79
        self.check_docstring("", [])
80
81
    def test_description(self):
82
        doc = " description only "
83
        self.check_docstring(doc, [self.Description(desc=' description only ')])
84
85
    def test_params_default(self):
86
        self.maxDiff = None
87
        doc = (" :param test:  test description1 \n"
88
               " :param test:  test description2 \n")
89
        expected = [self.Parameter(name='test', desc='  test description1 \n'),
90
                    self.Parameter(name='test', desc='  test description2 \n')]
91
        self.check_docstring(doc, expected)
92
93
    def test_return_values_default(self):
94
        doc = (" :return: something1 \n"
95
               " :return: something2 ")
96
        expected = [self.ReturnValue(desc=' something1 \n'),
97
                    self.ReturnValue(desc=' something2 ')]
98
        self.check_docstring(doc, expected)
99
100 View Code Duplication
    def test_python_default(self):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
101
        data = load_testdata("default.py")
102
103
        parsed_docs = [doc.parse() for doc in
104
                       extract_documentation(data, "python", "default")]
105
106
        expected = [
107
            [self.Description(desc='\nModule description.\n\n'
108
                                   'Some more foobar-like text.\n')],
109
            [self.Description(desc='\nA nice and neat way of '
110
                                   'documenting code.\n'),
111
             self.Parameter(name='radius', desc=' The explosion radius.\n')],
112
            [self.Description(desc='\nA function that returns 55.\n')],
113
            [self.Description(desc='\nDocstring with layouted text.\n\n    '
114
                                   'layouts inside docs are preserved.'
115
                                   '\nthis is intended.\n')],
116
            [self.Description(desc=' Docstring inline with triple quotes.\n'
117
                                   '    Continues here. ')],
118
            [self.Description(desc='\nThis is the best docstring ever!\n\n'),
119
             self.Parameter(name='param1',
120
                            desc='\n    Very Very Long Parameter '
121
                                 'description.\n'),
122
             self.Parameter(name='param2',
123
                            desc='\n    Short Param description.\n\n'),
124
             self.ReturnValue(desc=' Long Return Description That Makes No '
125
                                   'Sense And Will\n         Cut to the Next'
126
                                   ' Line.\n')]]
127
128
        self.assertEqual(parsed_docs, expected)
129
130 View Code Duplication
    def test_python_doxygen(self):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
131
        data = load_testdata("doxygen.py")
132
133
        parsed_docs = [doc.parse() for doc in
134
                       extract_documentation(data, "python", "doxygen")]
135
136
        expected = [
137
            [self.Description(desc=' @package pyexample\n  Documentation for'
138
                                   ' this module.\n\n  More details.\n')],
139
            [self.Description(
140
                desc=' Documentation for a class.\n\n More details.\n')],
141
            [self.Description(desc=' The constructor.\n')],
142
            [self.Description(desc=' Documentation for a method.\n'),
143
             self.Parameter(name='self', desc='The object pointer.\n')],
144
            [self.Description(desc=' A class variable.\n')],
145
            [self.Description(desc=' @var _memVar\n  a member variable\n')],
146
            [self.Description(desc=' This is the best docstring ever!\n\n'),
147
             self.Parameter(name='param1', desc='Parameter 1\n'),
148
             self.Parameter(name='param2', desc='Parameter 2\n'),
149
             self.ReturnValue(desc='Nothing\n')]]
150
151
        self.assertEqual(parsed_docs, expected)
152
153
154
class JavaDocumentationCommentTest(DocumentationCommentTest):
155
156
    def test_java_default(self):
157
        data = load_testdata("default.java")
158
159
        parsed_docs = [doc.parse() for doc in
160
                       extract_documentation(data, "java", "default")]
161
162
        expected = [[self.Description(
163
                     desc='\n Returns an String that says Hello with the name'
164
                          ' argument.\n\n'),
165
                     self.Parameter(name='name',
166
                                    desc='the name to which to say hello\n'),
167
                     self.ReturnValue(
168
                         desc='     the concatenated string\n')]]
169
170
        self.assertEqual(expected, parsed_docs)
171
172
173
class AssembledDocumentationTest(unittest.TestCase):
174
175
    def test_python_assembly(self):
176
177
        data = load_testdata("default.py")
178
179
        original = [doc.documentation for doc in
180
                    extract_documentation(data, "python", "default")]
181
182
        parsed_docs = [(doc.parse(), doc.marker, doc.indent, doc.range)
183
                       for doc in
184
                       extract_documentation(data, "python", "default")]
185
186
        docstyle_definition = DocstyleDefinition.load("python", "default")
187
188
        assembled_docs = [DocumentationComment.from_metadata(
189
                          doc[0], docstyle_definition, doc[1], doc[2], doc[3])
190
                          for doc in parsed_docs]
191
192
        self.assertEqual([str(doc) for doc in assembled_docs], original)
193
194
        for assembled_doc in assembled_docs:
195
            self.assertIn(assembled_doc.assemble(), "".join(data))
196