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