17db96d56Sopenharmony_ciimport unittest
27db96d56Sopenharmony_ci
37db96d56Sopenharmony_ci# For scope testing.
47db96d56Sopenharmony_cig = "Global variable"
57db96d56Sopenharmony_ci
67db96d56Sopenharmony_ci
77db96d56Sopenharmony_ciclass DictComprehensionTest(unittest.TestCase):
87db96d56Sopenharmony_ci
97db96d56Sopenharmony_ci    def test_basics(self):
107db96d56Sopenharmony_ci        expected = {0: 10, 1: 11, 2: 12, 3: 13, 4: 14, 5: 15, 6: 16, 7: 17,
117db96d56Sopenharmony_ci                    8: 18, 9: 19}
127db96d56Sopenharmony_ci        actual = {k: k + 10 for k in range(10)}
137db96d56Sopenharmony_ci        self.assertEqual(actual, expected)
147db96d56Sopenharmony_ci
157db96d56Sopenharmony_ci        expected = {0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9}
167db96d56Sopenharmony_ci        actual = {k: v for k in range(10) for v in range(10) if k == v}
177db96d56Sopenharmony_ci        self.assertEqual(actual, expected)
187db96d56Sopenharmony_ci
197db96d56Sopenharmony_ci    def test_scope_isolation(self):
207db96d56Sopenharmony_ci        k = "Local Variable"
217db96d56Sopenharmony_ci
227db96d56Sopenharmony_ci        expected = {0: None, 1: None, 2: None, 3: None, 4: None, 5: None,
237db96d56Sopenharmony_ci                    6: None, 7: None, 8: None, 9: None}
247db96d56Sopenharmony_ci        actual = {k: None for k in range(10)}
257db96d56Sopenharmony_ci        self.assertEqual(actual, expected)
267db96d56Sopenharmony_ci        self.assertEqual(k, "Local Variable")
277db96d56Sopenharmony_ci
287db96d56Sopenharmony_ci        expected = {9: 1, 18: 2, 19: 2, 27: 3, 28: 3, 29: 3, 36: 4, 37: 4,
297db96d56Sopenharmony_ci                    38: 4, 39: 4, 45: 5, 46: 5, 47: 5, 48: 5, 49: 5, 54: 6,
307db96d56Sopenharmony_ci                    55: 6, 56: 6, 57: 6, 58: 6, 59: 6, 63: 7, 64: 7, 65: 7,
317db96d56Sopenharmony_ci                    66: 7, 67: 7, 68: 7, 69: 7, 72: 8, 73: 8, 74: 8, 75: 8,
327db96d56Sopenharmony_ci                    76: 8, 77: 8, 78: 8, 79: 8, 81: 9, 82: 9, 83: 9, 84: 9,
337db96d56Sopenharmony_ci                    85: 9, 86: 9, 87: 9, 88: 9, 89: 9}
347db96d56Sopenharmony_ci        actual = {k: v for v in range(10) for k in range(v * 9, v * 10)}
357db96d56Sopenharmony_ci        self.assertEqual(k, "Local Variable")
367db96d56Sopenharmony_ci        self.assertEqual(actual, expected)
377db96d56Sopenharmony_ci
387db96d56Sopenharmony_ci    def test_scope_isolation_from_global(self):
397db96d56Sopenharmony_ci        expected = {0: None, 1: None, 2: None, 3: None, 4: None, 5: None,
407db96d56Sopenharmony_ci                    6: None, 7: None, 8: None, 9: None}
417db96d56Sopenharmony_ci        actual = {g: None for g in range(10)}
427db96d56Sopenharmony_ci        self.assertEqual(actual, expected)
437db96d56Sopenharmony_ci        self.assertEqual(g, "Global variable")
447db96d56Sopenharmony_ci
457db96d56Sopenharmony_ci        expected = {9: 1, 18: 2, 19: 2, 27: 3, 28: 3, 29: 3, 36: 4, 37: 4,
467db96d56Sopenharmony_ci                    38: 4, 39: 4, 45: 5, 46: 5, 47: 5, 48: 5, 49: 5, 54: 6,
477db96d56Sopenharmony_ci                    55: 6, 56: 6, 57: 6, 58: 6, 59: 6, 63: 7, 64: 7, 65: 7,
487db96d56Sopenharmony_ci                    66: 7, 67: 7, 68: 7, 69: 7, 72: 8, 73: 8, 74: 8, 75: 8,
497db96d56Sopenharmony_ci                    76: 8, 77: 8, 78: 8, 79: 8, 81: 9, 82: 9, 83: 9, 84: 9,
507db96d56Sopenharmony_ci                    85: 9, 86: 9, 87: 9, 88: 9, 89: 9}
517db96d56Sopenharmony_ci        actual = {g: v for v in range(10) for g in range(v * 9, v * 10)}
527db96d56Sopenharmony_ci        self.assertEqual(g, "Global variable")
537db96d56Sopenharmony_ci        self.assertEqual(actual, expected)
547db96d56Sopenharmony_ci
557db96d56Sopenharmony_ci    def test_global_visibility(self):
567db96d56Sopenharmony_ci        expected = {0: 'Global variable', 1: 'Global variable',
577db96d56Sopenharmony_ci                    2: 'Global variable', 3: 'Global variable',
587db96d56Sopenharmony_ci                    4: 'Global variable', 5: 'Global variable',
597db96d56Sopenharmony_ci                    6: 'Global variable', 7: 'Global variable',
607db96d56Sopenharmony_ci                    8: 'Global variable', 9: 'Global variable'}
617db96d56Sopenharmony_ci        actual = {k: g for k in range(10)}
627db96d56Sopenharmony_ci        self.assertEqual(actual, expected)
637db96d56Sopenharmony_ci
647db96d56Sopenharmony_ci    def test_local_visibility(self):
657db96d56Sopenharmony_ci        v = "Local variable"
667db96d56Sopenharmony_ci        expected = {0: 'Local variable', 1: 'Local variable',
677db96d56Sopenharmony_ci                    2: 'Local variable', 3: 'Local variable',
687db96d56Sopenharmony_ci                    4: 'Local variable', 5: 'Local variable',
697db96d56Sopenharmony_ci                    6: 'Local variable', 7: 'Local variable',
707db96d56Sopenharmony_ci                    8: 'Local variable', 9: 'Local variable'}
717db96d56Sopenharmony_ci        actual = {k: v for k in range(10)}
727db96d56Sopenharmony_ci        self.assertEqual(actual, expected)
737db96d56Sopenharmony_ci        self.assertEqual(v, "Local variable")
747db96d56Sopenharmony_ci
757db96d56Sopenharmony_ci    def test_illegal_assignment(self):
767db96d56Sopenharmony_ci        with self.assertRaisesRegex(SyntaxError, "cannot assign"):
777db96d56Sopenharmony_ci            compile("{x: y for y, x in ((1, 2), (3, 4))} = 5", "<test>",
787db96d56Sopenharmony_ci                    "exec")
797db96d56Sopenharmony_ci
807db96d56Sopenharmony_ci        with self.assertRaisesRegex(SyntaxError, "illegal expression"):
817db96d56Sopenharmony_ci            compile("{x: y for y, x in ((1, 2), (3, 4))} += 5", "<test>",
827db96d56Sopenharmony_ci                    "exec")
837db96d56Sopenharmony_ci
847db96d56Sopenharmony_ci    def test_evaluation_order(self):
857db96d56Sopenharmony_ci        expected = {
867db96d56Sopenharmony_ci            'H': 'W',
877db96d56Sopenharmony_ci            'e': 'o',
887db96d56Sopenharmony_ci            'l': 'l',
897db96d56Sopenharmony_ci            'o': 'd',
907db96d56Sopenharmony_ci        }
917db96d56Sopenharmony_ci
927db96d56Sopenharmony_ci        expected_calls = [
937db96d56Sopenharmony_ci            ('key', 'H'), ('value', 'W'),
947db96d56Sopenharmony_ci            ('key', 'e'), ('value', 'o'),
957db96d56Sopenharmony_ci            ('key', 'l'), ('value', 'r'),
967db96d56Sopenharmony_ci            ('key', 'l'), ('value', 'l'),
977db96d56Sopenharmony_ci            ('key', 'o'), ('value', 'd'),
987db96d56Sopenharmony_ci        ]
997db96d56Sopenharmony_ci
1007db96d56Sopenharmony_ci        actual_calls = []
1017db96d56Sopenharmony_ci
1027db96d56Sopenharmony_ci        def add_call(pos, value):
1037db96d56Sopenharmony_ci            actual_calls.append((pos, value))
1047db96d56Sopenharmony_ci            return value
1057db96d56Sopenharmony_ci
1067db96d56Sopenharmony_ci        actual = {
1077db96d56Sopenharmony_ci            add_call('key', k): add_call('value', v)
1087db96d56Sopenharmony_ci            for k, v in zip('Hello', 'World')
1097db96d56Sopenharmony_ci        }
1107db96d56Sopenharmony_ci
1117db96d56Sopenharmony_ci        self.assertEqual(actual, expected)
1127db96d56Sopenharmony_ci        self.assertEqual(actual_calls, expected_calls)
1137db96d56Sopenharmony_ci
1147db96d56Sopenharmony_ci    def test_assignment_idiom_in_comprehensions(self):
1157db96d56Sopenharmony_ci        expected = {1: 1, 2: 4, 3: 9, 4: 16}
1167db96d56Sopenharmony_ci        actual = {j: j*j for i in range(4) for j in [i+1]}
1177db96d56Sopenharmony_ci        self.assertEqual(actual, expected)
1187db96d56Sopenharmony_ci        expected = {3: 2, 5: 6, 7: 12, 9: 20}
1197db96d56Sopenharmony_ci        actual = {j+k: j*k for i in range(4) for j in [i+1] for k in [j+1]}
1207db96d56Sopenharmony_ci        self.assertEqual(actual, expected)
1217db96d56Sopenharmony_ci        expected = {3: 2, 5: 6, 7: 12, 9: 20}
1227db96d56Sopenharmony_ci        actual = {j+k: j*k for i in range(4)  for j, k in [(i+1, i+2)]}
1237db96d56Sopenharmony_ci        self.assertEqual(actual, expected)
1247db96d56Sopenharmony_ci
1257db96d56Sopenharmony_ci    def test_star_expression(self):
1267db96d56Sopenharmony_ci        expected = {0: 0, 1: 1, 2: 4, 3: 9}
1277db96d56Sopenharmony_ci        self.assertEqual({i: i*i for i in [*range(4)]}, expected)
1287db96d56Sopenharmony_ci        self.assertEqual({i: i*i for i in (*range(4),)}, expected)
1297db96d56Sopenharmony_ci
1307db96d56Sopenharmony_ci
1317db96d56Sopenharmony_ciif __name__ == "__main__":
1327db96d56Sopenharmony_ci    unittest.main()
133