Skip to content

Instantly share code, notes, and snippets.

@maksymx
Created July 18, 2015 16:48
Show Gist options
  • Save maksymx/5043b9bb335f066e86ec to your computer and use it in GitHub Desktop.
Save maksymx/5043b9bb335f066e86ec to your computer and use it in GitHub Desktop.
SECL group test task
# 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