Completed
Pull Request — master (#2423)
by
unknown
02:12
created

AssembledDocumentationTest   A

Complexity

Total Complexity 6

Size/Duplication

Total Lines 25
Duplicated Lines 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
c 2
b 0
f 0
dl 0
loc 25
rs 10
wmc 6

1 Method

Rating   Name   Duplication   Size   Complexity  
B test_python_assembly() 0 23 6
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
    def test_not_implemented(self):
60
        raw_docstyle = DocstyleDefinition("nolang", "nostyle", ('', '', ''),
61
                                          self.Metadata('', '', ''))
62
        not_implemented = DocumentationComment(
63
            "some docs", raw_docstyle, None, None, None)
64
        with self.assertRaises(NotImplementedError):
65
            not_implemented.parse()
66
67
68
class PythonDocumentationCommentTest(DocumentationCommentTest):
69
70
    def check_docstring(self, docstring, expected=[]):
71
        self.assertIsInstance(docstring,
72
                              str,
73
                              "expected needs to be a string for this test.")
74
75
        self.assertIsInstance(expected,
76
                              list,
77
                              "expected needs to be a list for this test.")
78
79
        python_default = DocstyleDefinition.load("python", "default")
80
81
        doc_comment = DocumentationComment(docstring, python_default,
82
                                           None, None, None)
83
        parsed_metadata = doc_comment.parse()
84
        self.assertEqual(parsed_metadata, expected)
85
86
    def test_empty_docstring(self):
87
        self.check_docstring("", [])
88
89
    def test_description(self):
90
        doc = " description only "
91
        self.check_docstring(doc, [self.Description(desc=' description only ')])
92
93
    def test_params_default(self):
94
        self.maxDiff = None
95
        doc = (" :param test:  test description1 \n"
96
               " :param test:  test description2 \n")
97
        expected = [self.Parameter(name='test', desc='  test description1 \n'),
98
                    self.Parameter(name='test', desc='  test description2 \n')]
99
        self.check_docstring(doc, expected)
100
101
    def test_return_values_default(self):
102
        doc = (" :return: something1 \n"
103
               " :return: something2 ")
104
        expected = [self.ReturnValue(desc=' something1 \n'),
105
                    self.ReturnValue(desc=' something2 ')]
106
        self.check_docstring(doc, expected)
107
108 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...
109
        data = load_testdata("default.py")
110
111
        parsed_docs = [doc.parse() for doc in
112
                       extract_documentation(data, "python", "default")]
113
114
        expected = [
115
            [self.Description(desc='\nModule description.\n\n'
116
                                   'Some more foobar-like text.\n')],
117
            [self.Description(desc='\nA nice and neat way of '
118
                                   'documenting code.\n'),
119
             self.Parameter(name='radius', desc=' The explosion radius. ')],
120
            [self.Description(desc='A function that returns 55.')],
121
            [self.Description(desc='\nDocstring with layouted text.\n\n    '
122
                                   'layouts inside docs are preserved.'
123
                                   '\nthis is intended.\n')],
124
            [self.Description(desc=' Docstring inline with triple quotes.\n'
125
                                   '    Continues here. ')],
126
            [self.Description(desc='\nThis is the best docstring ever!\n\n'),
127
             self.Parameter(name='param1',
128
                            desc='\n    Very Very Long Parameter '
129
                                 'description.\n'),
130
             self.Parameter(name='param2',
131
                            desc='\n    Short Param description.\n\n'),
132
             self.ReturnValue(desc=' Long Return Description That Makes No '
133
                                   'Sense And Will\n         Cut to the Next'
134
                                   ' Line.\n')]]
135
136
        self.assertEqual(parsed_docs, expected)
137
138 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...
139
        data = load_testdata("doxygen.py")
140
141
        parsed_docs = [doc.parse() for doc in
142
                       extract_documentation(data, "python", "doxygen")]
143
144
        expected = [
145
            [self.Description(desc=' @package pyexample\n  Documentation for'
146
                                   ' this module.\n\n  More details.\n')],
147
            [self.Description(
148
                desc=' Documentation for a class.\n\n More details.\n')],
149
            [self.Description(desc=' The constructor.\n')],
150
            [self.Description(desc=' Documentation for a method.\n'),
151
             self.Parameter(name='self', desc='The object pointer.\n')],
152
            [self.Description(desc=' A class variable.\n')],
153
            [self.Description(desc=' @var _memVar\n  a member variable\n')],
154
            [self.Description(desc=' This is the best docstring ever!\n\n'),
155
             self.Parameter(name='param1', desc='Parameter 1\n'),
156
             self.Parameter(name='param2', desc='Parameter 2\n'),
157
             self.ReturnValue(desc='Nothing\n')]]
158
159
        self.assertEqual(parsed_docs, expected)
160
161
162
class JavaDocumentationCommentTest(DocumentationCommentTest):
163
164
    def test_java_default(self):
165
        data = load_testdata("default.java")
166
167
        parsed_docs = [doc.parse() for doc in
168
                       extract_documentation(data, "java", "default")]
169
170
        expected = [[self.Description(
171
                     desc='\n Returns an String that says Hello with the name'
172
                          ' argument.\n\n'),
173
                     self.Parameter(name='name',
174
                                    desc='the name to which to say hello\n'),
175
                     self.ReturnValue(
176
                         desc='     the concatenated string\n')]]
177
178
        self.assertEqual(expected, parsed_docs)
179
180
181
class AssembledDocumentationTest(unittest.TestCase):
182
183
    def test_python_assembly(self):
184
185
        data = load_testdata("default.py")
186
187
        original = [doc.documentation for doc in
188
                    extract_documentation(data, "python", "default")]
189
190
        parsed_docs = [(doc.parse(), doc.marker, doc.indent, doc.range)
191
                       for doc in
192
                       extract_documentation(data, "python", "default")]
193
194
        docstyle_definition = DocstyleDefinition.load("python", "default")
195
196
        assembled_docs = [DocumentationComment.from_metadata(
197
                          doc[0], docstyle_definition, doc[1], doc[2], doc[3])
198
                          for doc in parsed_docs]
199
200
        self.assertEqual([str(doc) for doc in assembled_docs], original)
201
202
        docs = "".join(data)
203
204
        for assembled_doc in assembled_docs:
205
            self.assertIn(assembled_doc.assemble(), docs)
206