Created
July 18, 2015 16:48
-
-
Save maksymx/5043b9bb335f066e86ec to your computer and use it in GitHub Desktop.
SECL group test task
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# coding=utf-8 | |
TEST = True # установите True, чтобы запустить проверку | |
""" | |
*********************************************** | |
Написать два класса: сотрудник и команда. | |
Сотрудник имеет имя, стоимость работы (долларов в час) и уровень квалификации (от 0 до 9). | |
Если сложить сотрудников (оператор +), то будет создана команда, которая будет иметь уровень | |
квалификации (максимальный уровень из всех сотрудников в команде), стоимость (сумма стоимости | |
всех сотрудников команды) и список всех сотрудников. | |
Объект команды можно итерировать. | |
К команде можно добавлять сотрудника с помощью оператора += или используя метод add. | |
Если до команды добавить сотрудника (+), то будет создана новая команда. | |
Также можно удалять сотрудника с помощью метода remove (который принимает объект сотрудника, как аргумент). | |
Если сделать вывод сотрудника (строковое представление), то должно выводится в следующем формате: | |
"Name (cost=10, level=5)" | |
Если сделать вывод команды (строковое представление), то должно выводится в следующем формате: | |
"Command (cost=25, level=8) [Name1 (cost=10, level=5), Name2 (cost=15, level=8)]" | |
Если попытатся сделать комманду с дублированным сотрудником, то должно вызыватся исключение (raise ValueError) | |
*********************************************** | |
""" | |
class Employee(object): | |
# писать решение сюда # | |
def __init__(self, name, cost, level): | |
self.name = name | |
self.cost = cost | |
self.level = level | |
def __repr__(self): | |
return "%s (cost=%s, level=%s)" % (self.name, self.cost, self.level) | |
def __add__(self, other): | |
return Command(self) + other | |
class Command(object): | |
# писать решение сюда # | |
def __init__(self, *employees): | |
self.employees = list(employees) | |
self.cost = sum(i.cost for i in employees) | |
self.level = max(i.level for i in employees) | |
def __repr__(self): | |
return "Command (cost=%s, level=%s) %s" % (self.cost, self.level, self.employees) | |
def __add__(self, other): | |
if isinstance(other, Employee): | |
if other in self.employees: | |
raise ValueError('duplicate') | |
return Command(*(self.employees + [other])) | |
else: | |
return Command(*(other.employees + self.employees)) | |
def __iadd__(self, other): | |
if other in self.employees: | |
raise ValueError('duplicate') | |
self.add(other) | |
return self | |
def __len__(self): | |
return len(self.employees) | |
def __iter__(self): | |
for emp in self.employees: | |
yield emp | |
def sum_cost_max_level(self): | |
self.cost = sum(i.cost for i in self.employees) | |
self.level = max(i.level for i in self.employees) | |
def add(self, emp): | |
if emp in self.employees: | |
raise ValueError('duplicate') | |
self.employees.append(emp) | |
self.sum_cost_max_level() | |
def remove(self, emp): | |
self.employees.remove(emp) | |
self.sum_cost_max_level() | |
if TEST: | |
# создание объектов сотрудников | |
emp1 = Employee('Ivan', 12, 4) | |
emp2 = Employee('Sidor', 15, 6) | |
emp3 = Employee('Joe', 26, 8) | |
# проверка строкового представления объектов сотрудников | |
assert str(emp1) == 'Ivan (cost=12, level=4)' | |
assert str(emp2) == 'Sidor (cost=15, level=6)' | |
assert str(emp3) == 'Joe (cost=26, level=8)' | |
# создание команды из двух сотрудников | |
com1 = emp1 + emp2 | |
# проверка строкового представления созданного объекта | |
assert str(com1) == 'Command (cost=27, level=6) [Ivan (cost=12, level=4), Sidor (cost=15, level=6)]' | |
# проверка длины | |
assert len(com1) == 2 | |
# проверка на итерабельность | |
assert list(com1) == [emp1, emp2] | |
assert [t for t in com1] == [emp1, emp2] | |
# создание другой команды из команды com1 и сотрудника emp3 | |
com2 = com1 + emp3 | |
# проверка строкового представления созданного объекта | |
assert str( | |
com2) == 'Command (cost=53, level=8) [Ivan (cost=12, level=4), Sidor (cost=15, level=6), Joe (cost=26, level=8)]' | |
# создание объекта нового сотрудника | |
emp4 = Employee('Max', 35, 9) | |
t = com1 # копирование ссылки на команду com1 | |
com1 += emp4 # добавление сотрудника emp4 в команду com1 | |
# не изменился ли объект в переменной com1 | |
assert t is com1 | |
# проверка строкового представления com1 | |
assert str( | |
com1) == 'Command (cost=62, level=9) [Ivan (cost=12, level=4), Sidor (cost=15, level=6), Max (cost=35, level=9)]' | |
# удаление сотрудника из команды | |
com1.remove(emp1) | |
# проверка строкового представления com1 | |
assert str(com1) == 'Command (cost=50, level=9) [Sidor (cost=15, level=6), Max (cost=35, level=9)]' | |
# создание новой команды из сотрудника emp1 и команды com1 (другой порядок операндов) | |
com3 = emp1 + com1 | |
# проверка строкового представления новой команды | |
assert str( | |
com3) == 'Command (cost=62, level=9) [Sidor (cost=15, level=6), Max (cost=35, level=9), Ivan (cost=12, level=4)]' | |
# попытка добавить в команду сотрудника, который там уже есть или создать команду из дублирующих сотрудников | |
try: | |
com3.add(emp1) | |
t = False | |
except ValueError: | |
t = True # если получили исключение, тогда все ок | |
assert t | |
try: | |
com3 += emp1 | |
raise AssertionError | |
except ValueError: | |
pass | |
try: | |
com3 + emp1 | |
raise AssertionError | |
except ValueError: | |
pass | |
try: | |
emp1 + emp1 | |
raise AssertionError | |
except ValueError: | |
pass | |
print 'Task 3 OK' |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment