示例#1
0
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)
示例#2
0
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)
    ]
示例#3
0
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)
    ]
示例#4
0
 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
示例#5
0
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 []
示例#6
0
def test_josephus_len(people_example):
    jos = Josephus()
    jos.people = people_example

    assert len(jos) == 3
示例#7
0
def test_josephus_is_iterable():
    jos = Josephus()

    assert isinstance(jos, Iterable)
示例#8
0
def test_josephus_pop(people_example):
    jos = Josephus()
    jos.people = people_example
    jos.pop(1)

    assert jos.people == [Person('Bob', 12), Person('Peter', 14)]
示例#9
0
def test_josephus_append():
    someone1: Person = Person('Bob', 12)
    jos = Josephus()
    jos.append(someone1)

    assert jos.people == [someone1]
示例#10
0
def test_josephus_init_without_reader():
    jos = Josephus()

    assert jos.start == 1
    assert jos.step == 1
    assert jos.people == []
示例#11
0
def test_josephus_init_with_invalid_reader():
    reader = mock.Mock()
    with pytest.raises(TypeError):
        Josephus(reader)