def test_grandfathered(self):
        p = parser._parse_code('i-klingon')
        self.assertEqual(p['grandfathered']['tag'], 'i-klingon')
        self.assertEqual(p['grandfathered']['description'][0], 'Klingon')
        self.assertNil(p, ['language', 'extlang', 'script', 'region',
                           'variants', 'extensions'])

        p = parser._parse_code('i-navajo')
        self.assertEqual(p['grandfathered']['tag'], 'i-navajo')
        self.assertEqual(p['grandfathered']['description'][0], 'Navajo')
        self.assertNil(p, ['language', 'extlang', 'script', 'region',
                           'variants', 'extensions'])

        p = parser._parse_code('art-lojban')
        self.assertEqual(p['grandfathered']['tag'], 'art-lojban')
        self.assertEqual(p['grandfathered']['description'][0], 'Lojban')
        self.assertNil(p, ['language', 'extlang', 'script', 'region',
                           'variants', 'extensions'])
    def test_language_extlang(self):
        p = parser._parse_code('zh-cmn-Hans-CN')
        self.assertTagDesc(p['language'], 'zh', 'Chinese')
        self.assertTagDesc(p['extlang'], 'cmn', 'Mandarin Chinese')
        self.assertTagDesc(p['script'], 'hans', 'Han (Simplified variant)')
        self.assertTagDesc(p['region'], 'cn', 'China')
        self.assertNil(p, ['variants', 'extensions', 'grandfathered'])

        p = parser._parse_code('zh-yue-HK')
        self.assertTagDesc(p['language'], 'zh', 'Chinese')
        self.assertTagDesc(p['extlang'], 'yue', 'Yue Chinese')
        self.assertTagDesc(p['region'], 'hk', 'Hong Kong')
        self.assertNil(p, ['script', 'variants', 'extensions', 'grandfathered'])

        p = parser._parse_code('sgn-ase')
        self.assertTagDesc(p['language'], 'sgn', 'Sign languages')
        self.assertTagDesc(p['extlang'], 'ase', 'American Sign Language')
        self.assertNil(p, ['script', 'region', 'variants', 'extensions',
                           'grandfathered'])

        self.assertMalformed('zh-invalid-Hans-CN')
        self.assertMalformed('zh-cmn-invalid-CN')
        self.assertMalformed('zh-cmn-Hans-invalid')