def test_get_all_mappings(self): R = ['a', 'b', 'c'] T = ['A', 'B', 'C'] mappings = list(combinatorics.get_all_mappings(R, T)) self.assertEqual(len(mappings), 27) hashable_mappings = [] # Are all mappings unique and valid? for mapping in mappings: hashable_mappings.append(tuple(sorted(mapping.items()))) self.assertNoDuplicates(hashable_mappings)
def _get_next_states_when_blocking(self, state): # What creatures can block / what creatures are attacking? attacking_creature_uids = [] blocking_creatures_uids = [] for uid, creature in state.battleground.creatures_with_uids: if (creature.controlling_player == state.defending_player and not creature.tapped): blocking_creatures_uids.append(uid) elif creature.attacking: attacking_creature_uids.append(uid) # Generate all possible blocking assignments, by adding a "0" uid # marking a fake attacker (representing a "no block"). attacking_creature_uids.append(NO_BLOCK_UID) mappings_generator = \ combinatorics.get_all_mappings(blocking_creatures_uids, attacking_creature_uids) for mapping in mappings_generator: # Remove NO_BLOCK_UID from mapping. for key in mapping.keys(): if mapping[key] == NO_BLOCK_UID: del mapping[key] next_state = state.copy() next_state.declare_blockers(mapping) yield next_state