17db96d56Sopenharmony_ci"""A module to test whether doctest recognizes some 2.2 features,
27db96d56Sopenharmony_cilike static and class methods.
37db96d56Sopenharmony_ci
47db96d56Sopenharmony_ci>>> print('yup')  # 1
57db96d56Sopenharmony_ciyup
67db96d56Sopenharmony_ci
77db96d56Sopenharmony_ciWe include some (random) encoded (utf-8) text in the text surrounding
87db96d56Sopenharmony_cithe example.  It should be ignored:
97db96d56Sopenharmony_ci
107db96d56Sopenharmony_ciЉЊЈЁЂ
117db96d56Sopenharmony_ci
127db96d56Sopenharmony_ci"""
137db96d56Sopenharmony_ci
147db96d56Sopenharmony_ciimport sys
157db96d56Sopenharmony_ciimport unittest
167db96d56Sopenharmony_ciif sys.flags.optimize >= 2:
177db96d56Sopenharmony_ci    raise unittest.SkipTest("Cannot test docstrings with -O2")
187db96d56Sopenharmony_ci
197db96d56Sopenharmony_ciclass C(object):
207db96d56Sopenharmony_ci    """Class C.
217db96d56Sopenharmony_ci
227db96d56Sopenharmony_ci    >>> print(C())  # 2
237db96d56Sopenharmony_ci    42
247db96d56Sopenharmony_ci
257db96d56Sopenharmony_ci
267db96d56Sopenharmony_ci    We include some (random) encoded (utf-8) text in the text surrounding
277db96d56Sopenharmony_ci    the example.  It should be ignored:
287db96d56Sopenharmony_ci
297db96d56Sopenharmony_ci        ЉЊЈЁЂ
307db96d56Sopenharmony_ci
317db96d56Sopenharmony_ci    """
327db96d56Sopenharmony_ci
337db96d56Sopenharmony_ci    def __init__(self):
347db96d56Sopenharmony_ci        """C.__init__.
357db96d56Sopenharmony_ci
367db96d56Sopenharmony_ci        >>> print(C()) # 3
377db96d56Sopenharmony_ci        42
387db96d56Sopenharmony_ci        """
397db96d56Sopenharmony_ci
407db96d56Sopenharmony_ci    def __str__(self):
417db96d56Sopenharmony_ci        """
427db96d56Sopenharmony_ci        >>> print(C()) # 4
437db96d56Sopenharmony_ci        42
447db96d56Sopenharmony_ci        """
457db96d56Sopenharmony_ci        return "42"
467db96d56Sopenharmony_ci
477db96d56Sopenharmony_ci    class D(object):
487db96d56Sopenharmony_ci        """A nested D class.
497db96d56Sopenharmony_ci
507db96d56Sopenharmony_ci        >>> print("In D!")   # 5
517db96d56Sopenharmony_ci        In D!
527db96d56Sopenharmony_ci        """
537db96d56Sopenharmony_ci
547db96d56Sopenharmony_ci        def nested(self):
557db96d56Sopenharmony_ci            """
567db96d56Sopenharmony_ci            >>> print(3) # 6
577db96d56Sopenharmony_ci            3
587db96d56Sopenharmony_ci            """
597db96d56Sopenharmony_ci
607db96d56Sopenharmony_ci    def getx(self):
617db96d56Sopenharmony_ci        """
627db96d56Sopenharmony_ci        >>> c = C()    # 7
637db96d56Sopenharmony_ci        >>> c.x = 12   # 8
647db96d56Sopenharmony_ci        >>> print(c.x)  # 9
657db96d56Sopenharmony_ci        -12
667db96d56Sopenharmony_ci        """
677db96d56Sopenharmony_ci        return -self._x
687db96d56Sopenharmony_ci
697db96d56Sopenharmony_ci    def setx(self, value):
707db96d56Sopenharmony_ci        """
717db96d56Sopenharmony_ci        >>> c = C()     # 10
727db96d56Sopenharmony_ci        >>> c.x = 12    # 11
737db96d56Sopenharmony_ci        >>> print(c.x)   # 12
747db96d56Sopenharmony_ci        -12
757db96d56Sopenharmony_ci        """
767db96d56Sopenharmony_ci        self._x = value
777db96d56Sopenharmony_ci
787db96d56Sopenharmony_ci    x = property(getx, setx, doc="""\
797db96d56Sopenharmony_ci        >>> c = C()    # 13
807db96d56Sopenharmony_ci        >>> c.x = 12   # 14
817db96d56Sopenharmony_ci        >>> print(c.x)  # 15
827db96d56Sopenharmony_ci        -12
837db96d56Sopenharmony_ci        """)
847db96d56Sopenharmony_ci
857db96d56Sopenharmony_ci    @staticmethod
867db96d56Sopenharmony_ci    def statm():
877db96d56Sopenharmony_ci        """
887db96d56Sopenharmony_ci        A static method.
897db96d56Sopenharmony_ci
907db96d56Sopenharmony_ci        >>> print(C.statm())    # 16
917db96d56Sopenharmony_ci        666
927db96d56Sopenharmony_ci        >>> print(C().statm())  # 17
937db96d56Sopenharmony_ci        666
947db96d56Sopenharmony_ci        """
957db96d56Sopenharmony_ci        return 666
967db96d56Sopenharmony_ci
977db96d56Sopenharmony_ci    @classmethod
987db96d56Sopenharmony_ci    def clsm(cls, val):
997db96d56Sopenharmony_ci        """
1007db96d56Sopenharmony_ci        A class method.
1017db96d56Sopenharmony_ci
1027db96d56Sopenharmony_ci        >>> print(C.clsm(22))    # 18
1037db96d56Sopenharmony_ci        22
1047db96d56Sopenharmony_ci        >>> print(C().clsm(23))  # 19
1057db96d56Sopenharmony_ci        23
1067db96d56Sopenharmony_ci        """
1077db96d56Sopenharmony_ci        return val
1087db96d56Sopenharmony_ci
1097db96d56Sopenharmony_ci
1107db96d56Sopenharmony_ciclass Test(unittest.TestCase):
1117db96d56Sopenharmony_ci    def test_testmod(self):
1127db96d56Sopenharmony_ci        import doctest, sys
1137db96d56Sopenharmony_ci        EXPECTED = 19
1147db96d56Sopenharmony_ci        f, t = doctest.testmod(sys.modules[__name__])
1157db96d56Sopenharmony_ci        if f:
1167db96d56Sopenharmony_ci            self.fail("%d of %d doctests failed" % (f, t))
1177db96d56Sopenharmony_ci        if t != EXPECTED:
1187db96d56Sopenharmony_ci            self.fail("expected %d tests to run, not %d" % (EXPECTED, t))
1197db96d56Sopenharmony_ci
1207db96d56Sopenharmony_ci
1217db96d56Sopenharmony_ci# Pollute the namespace with a bunch of imported functions and classes,
1227db96d56Sopenharmony_ci# to make sure they don't get tested.
1237db96d56Sopenharmony_cifrom doctest import *
1247db96d56Sopenharmony_ci
1257db96d56Sopenharmony_ciif __name__ == '__main__':
1267db96d56Sopenharmony_ci    unittest.main()
127