14710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#! /usr/bin/env python
24710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport unittest
34710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfrom test import test_support
44710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport __future__
54710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
64710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmGOOD_SERIALS = ("alpha", "beta", "candidate", "final")
74710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
84710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfeatures = __future__.all_feature_names
94710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass FutureTest(unittest.TestCase):
114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_names(self):
134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # Verify that all_feature_names appears correct.
144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        given_feature_names = features[:]
154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for name in dir(__future__):
164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            obj = getattr(__future__, name, None)
174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if obj is not None and isinstance(obj, __future__._Feature):
184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                self.assertTrue(
194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    name in given_feature_names,
204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    "%r should have been in all_feature_names" % name
214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                )
224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                given_feature_names.remove(name)
234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(len(given_feature_names), 0,
244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm               "all_feature_names has too much: %r" % given_feature_names)
254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_attributes(self):
274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for feature in features:
284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            value = getattr(__future__, feature)
294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            optional = value.getOptionalRelease()
314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            mandatory = value.getMandatoryRelease()
324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            a = self.assertTrue
344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            e = self.assertEqual
354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def check(t, name):
364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                a(isinstance(t, tuple), "%s isn't tuple" % name)
374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                e(len(t), 5, "%s isn't 5-tuple" % name)
384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                (major, minor, micro, level, serial) = t
394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                a(isinstance(major, int), "%s major isn't int"  % name)
404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                a(isinstance(minor, int), "%s minor isn't int" % name)
414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                a(isinstance(micro, int), "%s micro isn't int" % name)
424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                a(isinstance(level, basestring),
434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    "%s level isn't string" % name)
444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                a(level in GOOD_SERIALS,
454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                       "%s level string has unknown value" % name)
464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                a(isinstance(serial, int), "%s serial isn't int" % name)
474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            check(optional, "optional")
494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if mandatory is not None:
504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                check(mandatory, "mandatory")
514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                a(optional < mandatory,
524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                       "optional not less than mandatory, and mandatory not None")
534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            a(hasattr(value, "compiler_flag"),
554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                   "feature is missing a .compiler_flag attr")
564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            # Make sure the compile accepts the flag.
574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            compile("", "<test>", "exec", value.compiler_flag)
584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            a(isinstance(getattr(value, "compiler_flag"), int),
594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                   ".compiler_flag isn't int")
604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef test_main():
634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    test_support.run_unittest(FutureTest)
644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmif __name__ == "__main__":
664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    test_main()
67