def test_josephus_output_order_by_next(people_example): jos = Josephus() jos.start = 2 jos.step = 2 jos.people = people_example assert next(jos) == Person('Peter', 14) assert next(jos) == Person('Jack', 13) assert next(jos) == Person('Bob', 12) with pytest.raises(StopIteration): next(jos)
def test_josephus_init_with_reader(people_example): reader = mock.MagicMock() reader.__iter__.return_value = people_example jos = Josephus(reader) reader.__iter__.assert_called_with() assert jos.start == 1 assert jos.step == 1 assert jos.people == [ Person('Bob', 12), Person('Jack', 13), Person('Peter', 14) ]
def test_josephus_query_list(people_example): jos = Josephus() jos.start = 2 jos.step = 2 jos.people = people_example result = jos.query_list() assert result == [ Person('Peter', 14), Person('Jack', 13), Person('Bob', 12) ]
def create_josephus(self, text=None): self.josephus = Josephus(self.reader) if len(self.josephus) == 0: self.josephus.people = self.create_people_from_text(text) self.josephus.start = self.start self.josephus.step = self.step
class Interface: INVALID_PATH = 'abc' INVALID_TARGET_FILE = 'xx' INVALID_START = -1 INVALID_STEP = -1 def __init__(self): self.start: int = 1 self.step: int = 1 self.reader: Optional[Reader] = None super().__init__() def create_reader(self, filepath=None, target_file=None) -> None: if not filepath: return if '.txt' in filepath: self.reader = TxtReader(filepath) elif '.csv' in filepath: self.reader = CSVReader(filepath) elif '.zip' in filepath and target_file: self.reader_from_zip(filepath, target_file) def reader_from_zip(self, filepath=None, target_file=None): if '.txt' in target_file: self.reader = TxtReader.from_zip(filepath, target_file) elif '.csv' in target_file: self.reader = CSVReader.from_zip(filepath, target_file) else: raise FileNotFoundError def get_namelist_from_zip(self, filepath) -> list: if '.zip' in filepath: with zipfile.ZipFile(filepath) as zip_file: if zip_file: filenames: list = zip_file.namelist() return filenames else: return [] else: return [] def set_start_value(self, start: str): self.start = int(start) if self.start < 1: raise ValueError def set_step_value(self, step: str): self.step = int(step) if self.step < 1: raise ValueError def create_josephus(self, text=None): self.josephus = Josephus(self.reader) if len(self.josephus) == 0: self.josephus.people = self.create_people_from_text(text) self.josephus.start = self.start self.josephus.step = self.step def get_people_info(self, people) -> str: if people: people_info = '' for each in people: name = each.name age = str(each.age) people_info = people_info + name + ', ' + age + '\n' return people_info else: return '' def get_result(self) -> str: temp = self.josephus.query_list() people_info = '' count = 1 size = len(temp) for each in temp: name = each.name age = str(each.age) if count < size: people_info = people_info + 'elimination ' + name + ', ' + age + '\n' else: people_info = people_info + 'winner\t' + name + ', ' + age + '\n' count += 1 return people_info def check_strat_value(self): if self.josephus.start > len(self.josephus): raise ValueError def create_people_from_text(self, text: str) -> list: if text: people = [] text = text.strip() persons_info = text.split('\n') for item in persons_info: info = item.split(',') name = info[0] try: age = int(info[1]) except ValueError: age = 0 people.append(Person(name, age)) return people else: return []
def test_josephus_len(people_example): jos = Josephus() jos.people = people_example assert len(jos) == 3
def test_josephus_is_iterable(): jos = Josephus() assert isinstance(jos, Iterable)
def test_josephus_pop(people_example): jos = Josephus() jos.people = people_example jos.pop(1) assert jos.people == [Person('Bob', 12), Person('Peter', 14)]
def test_josephus_append(): someone1: Person = Person('Bob', 12) jos = Josephus() jos.append(someone1) assert jos.people == [someone1]
def test_josephus_init_without_reader(): jos = Josephus() assert jos.start == 1 assert jos.step == 1 assert jos.people == []
def test_josephus_init_with_invalid_reader(): reader = mock.Mock() with pytest.raises(TypeError): Josephus(reader)