From 5f493538fbb77d19760b1fc92aa0621281ec18e2 Mon Sep 17 00:00:00 2001 From: Francisco Urquiza <103083880+franciscourquiza@users.noreply.github.com> Date: Mon, 3 Oct 2022 22:08:50 -0300 Subject: [PATCH 1/6] Delete exercise1.py --- exercises/exercise1.py | 45 ------------------------------------------ 1 file changed, 45 deletions(-) delete mode 100644 exercises/exercise1.py diff --git a/exercises/exercise1.py b/exercises/exercise1.py deleted file mode 100644 index 4d88ccc..0000000 --- a/exercises/exercise1.py +++ /dev/null @@ -1,45 +0,0 @@ -"""Variables de Instancia y Métodos de instancia.""" - -from math import pi - - -class Circle: - """Todo cículo tiene un radio y se desea conocer tanto el área como el - perímetro (longitud de circunferencia). - - Reportar los números redondeados a dos decimales - - Restricciones: - - Utilizar 1 variable de instancia - - Utilizar 2 métodos de instancia - - No utilizar variable de clase - - No utilizar Dataclasses - - No utilizar Properties - - Utilizar Type Hints en todos los métodos y variables - """ - - -# NO MODIFICAR - INICIO -# Test básico -circle = Circle(1) -assert circle.radio == 1 -assert circle.area() == 3.14 -assert circle.perimetro() == 6.28 - -# Test palabra clave -circle = Circle(radio=1) -assert circle.radio == 1 -assert circle.area() == 3.14 -assert circle.perimetro() == 6.28 - -# Test parámetro obligatorio -try: - circle = Circle() - assert False, "No se puede instanciar sin radio" -except TypeError: - assert True - -# Test invocación encadenada -assert Circle(1).area() == 3.14 -assert Circle(1).perimetro() == 6.28 -# NO MODIFICAR - FIN From c5b3350d15ee66e68cdbd487187364ad1f0a0cae Mon Sep 17 00:00:00 2001 From: Francisco Urquiza <103083880+franciscourquiza@users.noreply.github.com> Date: Mon, 3 Oct 2022 22:09:01 -0300 Subject: [PATCH 2/6] Delete exercise2.py --- exercises/exercise2.py | 71 ------------------------------------------ 1 file changed, 71 deletions(-) delete mode 100644 exercises/exercise2.py diff --git a/exercises/exercise2.py b/exercises/exercise2.py deleted file mode 100644 index 2b02c90..0000000 --- a/exercises/exercise2.py +++ /dev/null @@ -1,71 +0,0 @@ -"""Variables de Clase y Métodos de Clase.""" - - -class Article: - """Todos los artículos tienen un nombre y un costo, opcionalmente algunos - tienen un porcentaje de descuento. - - El IVA es un impuesto que se aplica a todos los productos por igual, - actualmente es de 21% pero puede cambiar en el futuro. - - Para calcular el precio de un artículo, hay que sumar el IVA y luego restar - los descuentos si hubiera. Redondear a 2 decimales. - - Restricciones: - - Utilizar 3 variables de instancia - - Utilizar 1 método de instancia - - Utilizar 1 variable de clase - - Utilizar 1 método de clase - - No utilizar Dataclasses - - No utilizar Properties - - Utilizar Type Hints en todos los métodos y variables - """ - - -# NO MODIFICAR - INICIO -# Test parámetro obligatorio -try: - article = Article() - assert False, "No se puede instanciar sin nombre ni costo" -except TypeError: - assert True - -try: - article = Article("Auto") - assert False, "No se puede instanciar sin costo" -except TypeError: - assert True - -try: - article = Article(nombre="Auto", costo=1) - assert True -except TypeError: - assert False, "El descuento es opcional" - -# Test básico -article = Article("Auto", 1) -assert article.nombre == "Auto" -assert article.calcular_precio() == 1.21 - -article = Article("Auto", 1, 0.21) -assert article.nombre == "Auto" -assert article.calcular_precio() == 0.96 - - -# Test palabra clave -article = Article(costo=1, nombre="Auto") -assert article.nombre == "Auto" -assert article.calcular_precio() == 1.21 - -article = Article(costo=1, nombre="Auto", descuento=0.21) -assert article.nombre == "Auto" -assert article.calcular_precio() == 0.96 - - -# Test de método de clase -Article.actualizar_iva(0.25) - -article = Article(costo=1, nombre="Auto") -assert article.nombre == "Auto" -assert article.calcular_precio() == 1.25 -# NO MODIFICAR - FIN From 2d9e55df82d687841db5fe729550e3a4166e1bbe Mon Sep 17 00:00:00 2001 From: Francisco Urquiza <103083880+franciscourquiza@users.noreply.github.com> Date: Mon, 3 Oct 2022 22:09:08 -0300 Subject: [PATCH 3/6] Delete exercise3.py --- exercises/exercise3.py | 74 ------------------------------------------ 1 file changed, 74 deletions(-) delete mode 100644 exercises/exercise3.py diff --git a/exercises/exercise3.py b/exercises/exercise3.py deleted file mode 100644 index 331440a..0000000 --- a/exercises/exercise3.py +++ /dev/null @@ -1,74 +0,0 @@ -"""Properties""" - - -class Article: - """Re-Escribir el ejercicio anterior utilizando una property en vez de un - método de instancia. - - Restricciones: - - Utilizar 3 variables de instancia - - Utilizar 1 property - - Utilizar 1 variable de clase - - Utilizar 1 método de clase - - No utilizar métodos de instancia - - No utilizar Dataclasses - - Utilizar Type Hints en todos los métodos y variables - """ - - -# NO MODIFICAR - INICIO -# Test parámetro obligatorio -try: - article = Article() - assert False, "No se puede instanciar sin nombre ni costo" -except TypeError: - assert True - -try: - article = Article("Auto") - assert False, "No se puede instanciar sin costo" -except TypeError: - assert True - -try: - article = Article(nombre="Auto", costo=1) - assert True -except TypeError: - assert False, "El descuento es opcional" - -try: - article = Article(nombre="Auto", costo=1) - article.precio = 2 - assert False, "No se puede modificar el precio" -except AttributeError: - assert True - - -# Test básico -article = Article("Auto", 1) -assert article.nombre == "Auto" -assert article.precio == 1.21 - - -article = Article("Auto", 1, 0.21) -assert article.nombre == "Auto" -assert article.precio == 0.96 - - -# Test palabra clave -article = Article(costo=1, nombre="Auto") -assert article.nombre == "Auto" -assert article.precio == 1.21 - -article = Article(costo=1, nombre="Auto", descuento=0.21) -assert article.nombre == "Auto" -assert article.precio == 0.96 - - -# Test de método de clase -Article.actualizar_iva(0.25) - -article = Article(costo=1, nombre="Auto") -assert article.nombre == "Auto" -assert article.precio == 1.25 -# NO MODIFICAR - FIN From 0bb21c67063c446a7b0e2a24bfb3567618ddcf4c Mon Sep 17 00:00:00 2001 From: Francisco Urquiza <103083880+franciscourquiza@users.noreply.github.com> Date: Mon, 3 Oct 2022 22:09:16 -0300 Subject: [PATCH 4/6] Delete exercise4.py --- exercises/exercise4.py | 55 ------------------------------------------ 1 file changed, 55 deletions(-) delete mode 100644 exercises/exercise4.py diff --git a/exercises/exercise4.py b/exercises/exercise4.py deleted file mode 100644 index b424db7..0000000 --- a/exercises/exercise4.py +++ /dev/null @@ -1,55 +0,0 @@ -"""DataClasses y Sobrecarga de operadores.""" - -from dataclasses import dataclass -from typing import List - - -"""Una carrera tiene varias materias, la "longitud" de una carrera hace -referencia a cuantas materias tiene. - -Cada materia tiene un nombre. - -Escribir una estructura de clases que refleje lo anterior. - -Restricciones: - - Utilizar Dataclasses - - Utilizar 2 clases - - Utilizar 1 variables de instancia en cada clase - - Utilizar 1 método mágico - - No utilizar variables de clase - - No utilizar métodos de clase - - No utilizar métodos de instancia - - No utilizar properties - - Utilizar Type Hints en todos los métodos y variables -""" - - -# NO MODIFICAR - INICIO -# Test parámetro obligatorio -try: - materia = Materia() - assert False, "No se puede instanciar sin nombre" -except TypeError: - assert True - -try: - materia = Carrera() - assert False, "No se puede instanciar sin materias" -except TypeError: - assert True - -# Test básico -matematica = Materia("Matemática") -assert matematica.nombre == "Matemática" - -estadistica = Materia(nombre="Estadística") -assert estadistica.nombre == "Estadística" - -ciclo_basico = Carrera([matematica, estadistica]) -assert ( - str(ciclo_basico) - == "Carrera(materias=[Materia(nombre='Matemática'), Materia(nombre='Estadística')])" # noqa: 501 -) - -assert len(ciclo_basico) == 2 -# NO MODIFICAR - FIN From 23017297187c6582922a2f4f4627e0b220035aa1 Mon Sep 17 00:00:00 2001 From: Francisco Urquiza <103083880+franciscourquiza@users.noreply.github.com> Date: Mon, 3 Oct 2022 22:09:25 -0300 Subject: [PATCH 5/6] Delete exercise5.py --- exercises/exercise5.py | 103 ----------------------------------------- 1 file changed, 103 deletions(-) delete mode 100644 exercises/exercise5.py diff --git a/exercises/exercise5.py b/exercises/exercise5.py deleted file mode 100644 index 92d717c..0000000 --- a/exercises/exercise5.py +++ /dev/null @@ -1,103 +0,0 @@ -"""El ente regulador de impuestos llama a todas las personas activas -laboralmente Contribuyentes, sin embargo, existen varios tipos de -contribuyentes, por ejemplo, el Monotributista y el que es Empleado en relación -de dependencia. Ambos están dentro del sistema pero pagan diferentes impuestos. - -El monotributista tiene que pagar en función de sus ingresos brutos anuales: - - Si son menores a $370.000, paga $2646,22 mensuales - - Si son menores a $550.000, paga $2958,95 mensuales - - Si son menores a $770.000, paga $3382,62 mensuales - - Si son mayores a $770.000, paga $3988,85 mensuales - -En el caso de los empleados en relación de dependencia, ellos pagan un 17% de -impuestos sobre sus ingresos brutos mensuales. - -Inspirado en datos reales: https://www.afip.gob.ar/monotributo/categorias.asp - -Escribir una estructura de clases que refleje lo anterior. Para simplificar el -análisis, todos los montos serán mensuales (dividir los límites del monotributo -por 12). - -Aclaración: Este ejercicio está basado en la realidad pero se realizaron -múltiples simplificaciones para adecuarlo al contexto del curso. - -Restricciones: - - Utilizar Dataclasses - - Utilizar 3 clases: 1 abstracta y 2 concretas - - Utilizar 1 variables de instancia en cada clase concreta - - Utilizar 1 métodos de instancia con polimorfismo - - No utilizar variables de clase - - No utilizar métodos de clase - - No utilizar properties - - Utilizar Type Hints en todos los métodos y variables -""" - -import abc -from abc import ABC, abstractmethod -from dataclasses import dataclass -from typing import List - - -def calcular_sueldos(contribuyentes: List[Contribuyente]): - """Data una lista de contribuyentes, devuelve una lista de los sueldos de - cada uno.""" - - -# NO MODIFICAR - INICIO -assert type(Contribuyente) == abc.ABCMeta, "Contribuyente debe ser abstracta" -assert issubclass(Empleado, Contribuyente), "Empleado debe heredar de Contribuyente" # noqa: 501 -assert issubclass(Monotributista, Contribuyente), "Monotributista debe heredar de Contribuyente" # noqa: 501 - -try: - juan = Contribuyente() - assert False, "No se puede instanciar una clase abstracta" -except TypeError: - assert True - -try: - juan = Empleado() - assert False, "No se puede instanciar sin sueldo" -except TypeError: - assert True - -try: - juan = Monotributista() - assert False, "No se puede instanciar sin sueldo" -except TypeError: - assert True - - -# Test Básico -juan = Monotributista(25_000) -assert juan.calcular_sueldo() == 22353.78 - -juan = Monotributista(35_000) -assert juan.calcular_sueldo() == 32041.05 - -juan = Monotributista(50_000) -assert juan.calcular_sueldo() == 46617.38 - -juan = Monotributista(75_000) -assert juan.calcular_sueldo() == 71011.15 - - -maria = Empleado(25_000) -assert maria.calcular_sueldo() == 20750.0 - -maria = Empleado(35_000) -assert maria.calcular_sueldo() == 29050.0 - -maria = Empleado(50_000) -assert maria.calcular_sueldo() == 41500.0 - -maria = Empleado(75_000) -assert maria.calcular_sueldo() == 62250.0 - - -# Test Calculadora de sueldos - -contribuyentes = [Monotributista(80_000), Empleado(80_000)] - -assert calcular_sueldos(contribuyentes) == [76011.15, 66400.0] - -# NO MODIFICAR - FIN From 70b042f6cd3d38559dcf44aad7b71618cd243141 Mon Sep 17 00:00:00 2001 From: Francisco Urquiza <103083880+franciscourquiza@users.noreply.github.com> Date: Mon, 3 Oct 2022 22:09:40 -0300 Subject: [PATCH 6/6] Add files via upload --- exercises/exercise1.py | 49 +++++++++++++++ exercises/exercise2.py | 83 ++++++++++++++++++++++++++ exercises/exercise3.py | 95 +++++++++++++++++++++++++++++ exercises/exercise4.py | 63 ++++++++++++++++++++ exercises/exercise5.py | 132 +++++++++++++++++++++++++++++++++++++++++ 5 files changed, 422 insertions(+) create mode 100644 exercises/exercise1.py create mode 100644 exercises/exercise2.py create mode 100644 exercises/exercise3.py create mode 100644 exercises/exercise4.py create mode 100644 exercises/exercise5.py diff --git a/exercises/exercise1.py b/exercises/exercise1.py new file mode 100644 index 0000000..3ab4866 --- /dev/null +++ b/exercises/exercise1.py @@ -0,0 +1,49 @@ +"""Variables de Instancia y Métodos de instancia.""" + +from math import pi + + +class Circle: + """Todo cículo tiene un radio y se desea conocer tanto el área como el + perímetro (longitud de circunferencia). + Reportar los números redondeados a dos decimales + Restricciones: + - Utilizar 1 variable de instancia + - Utilizar 2 métodos de instancia + - No utilizar variable de clase + - No utilizar Dataclasses + - No utilizar Properties + - Utilizar Type Hints en todos los métodos y variables + """ + + def __init__(self, radio): + self.radio = radio + def area (self): + return round(pi*self.radio**2,2) + def perimetro (self): + return round(2*self.radio*pi,2) + +# NO MODIFICAR - INICIO +# Test básico +circle = Circle(1) +assert circle.radio == 1 +assert circle.area() == 3.14 +assert circle.perimetro() == 6.28 + +# Test palabra clave +circle = Circle(radio=1) +assert circle.radio == 1 +assert circle.area() == 3.14 +assert circle.perimetro() == 6.28 + +# Test parámetro obligatorio +try: + circle = Circle() + assert False, "No se puede instanciar sin radio" +except TypeError: + assert True + +# Test invocación encadenada +assert Circle(1).area() == 3.14 +assert Circle(1).perimetro() == 6.28 +# NO MODIFICAR - FIN \ No newline at end of file diff --git a/exercises/exercise2.py b/exercises/exercise2.py new file mode 100644 index 0000000..bed1582 --- /dev/null +++ b/exercises/exercise2.py @@ -0,0 +1,83 @@ +"""Variables de Clase y Métodos de Clase.""" + + +class Article: + """Todos los artículos tienen un nombre y un costo, opcionalmente algunos + tienen un porcentaje de descuento. + El IVA es un impuesto que se aplica a todos los productos por igual, + actualmente es de 21% pero puede cambiar en el futuro. + Para calcular el precio de un artículo, hay que sumar el IVA y luego restar + los descuentos si hubiera. Redondear a 2 decimales. + Restricciones: + - Utilizar 3 variables de instancia + - Utilizar 1 método de instancia + - Utilizar 1 variable de clase + - Utilizar 1 método de clase + - No utilizar Dataclasses + - No utilizar Properties + - Utilizar Type Hints en todos los métodos y variables + """ + IVA = 0.21 + + def __init__(self, nombre, costo, descuento = 0): + self.nombre = nombre + self.costo = costo + self.descuento = descuento + + def calcular_precio (self): + precio_iva = round((self.costo * self.IVA) + self.costo,2) + precio = round((precio_iva - precio_iva * self.descuento),2) + return precio + + @classmethod + def actualizar_iva(cls, nuevo_iva): + cls.IVA = nuevo_iva + return cls.IVA + +# NO MODIFICAR - INICIO +# Test parámetro obligatorio +try: + article = Article() + assert False, "No se puede instanciar sin nombre ni costo" +except TypeError: + assert True + +try: + article = Article("Auto") + assert False, "No se puede instanciar sin costo" +except TypeError: + assert True + +try: + article = Article(nombre="Auto", costo=1) + assert True +except TypeError: + assert False, "El descuento es opcional" + +# Test básico +article = Article("Auto", 1) +assert article.nombre == "Auto" +assert article.calcular_precio() == 1.21 + +article = Article("Auto", 1, 0.21) +assert article.nombre == "Auto" +assert article.calcular_precio() == 0.96 + + +# Test palabra clave +article = Article(costo=1, nombre="Auto") +assert article.nombre == "Auto" +assert article.calcular_precio() == 1.21 + +article = Article(costo=1, nombre="Auto", descuento=0.21) +assert article.nombre == "Auto" +assert article.calcular_precio() == 0.96 + + +# Test de método de clase +Article.actualizar_iva(0.25) + +article = Article(costo=1, nombre="Auto") +assert article.nombre == "Auto" +assert article.calcular_precio() == 1.25 +# NO MODIFICAR - FIN \ No newline at end of file diff --git a/exercises/exercise3.py b/exercises/exercise3.py new file mode 100644 index 0000000..ecb1394 --- /dev/null +++ b/exercises/exercise3.py @@ -0,0 +1,95 @@ +"""Properties""" + + +class Article: + """Re-Escribir el ejercicio anterior utilizando una property en vez de un + método de instancia. + Restricciones: + - Utilizar 3 variables de instancia + - Utilizar 1 property + - Utilizar 1 variable de clase + - Utilizar 1 método de clase + - No utilizar métodos de instancia + - No utilizar Dataclasses + - Utilizar Type Hints en todos los métodos y variables + """ + __iva = 0.21 + + def __init__(self, nombre, costo, descuento = 0): + self.nombre = nombre + self.costo = costo + self.descuento = descuento + + @property + def precio(self): + precio =round(self.costo + (self.costo * self.__iva),2) + precio_fin = round(precio-(self.descuento * precio),2) + return precio_fin + + @classmethod + def actualizar_iva(cls, nuevo_iva): + cls.__iva = nuevo_iva + return cls.__iva + + def calcular_precio(self): + precio_iva = round((self.costo * self.__iva) + self.costo,2) + precio = round((precio_iva - precio_iva * self.descuento),2) + return precio + + +# NO MODIFICAR - INICIO +# Test parámetro obligatorio +try: + article = Article() + assert False, "No se puede instanciar sin nombre ni costo" +except TypeError: + assert True + +try: + article = Article("Auto") + assert False, "No se puede instanciar sin costo" +except TypeError: + assert True + +try: + article = Article(nombre="Auto", costo=1) + assert True +except TypeError: + assert False, "El descuento es opcional" + +try: + article = Article(nombre="Auto", costo=1) + article.precio = 2 + assert False, "No se puede modificar el precio" +except AttributeError: + assert True + + +# Test básico +article = Article("Auto", 1) +assert article.nombre == "Auto" +assert article.precio == 1.21 + + +article = Article("Auto", 1, 0.21) +assert article.nombre == "Auto" +assert article.precio == 0.96 + + +# Test palabra clave +article = Article(costo=1, nombre="Auto") +assert article.nombre == "Auto" +assert article.precio == 1.21 + +article = Article(costo=1, nombre="Auto", descuento=0.21) +assert article.nombre == "Auto" +assert article.precio == 0.96 + + +# Test de método de clase +Article.actualizar_iva(0.25) + +article = Article(costo=1, nombre="Auto") +assert article.nombre == "Auto" +assert article.precio == 1.25 +# NO MODIFICAR - FIN \ No newline at end of file diff --git a/exercises/exercise4.py b/exercises/exercise4.py new file mode 100644 index 0000000..8283584 --- /dev/null +++ b/exercises/exercise4.py @@ -0,0 +1,63 @@ +"""DataClasses y Sobrecarga de operadores.""" + +from dataclasses import dataclass +from typing import List + + +"""Una carrera tiene varias materias, la "longitud" de una carrera hace +referencia a cuantas materias tiene. +Cada materia tiene un nombre. +Escribir una estructura de clases que refleje lo anterior. +Restricciones: + - Utilizar Dataclasses + - Utilizar 2 clases + - Utilizar 1 variables de instancia en cada clase + - Utilizar 1 método mágico + - No utilizar variables de clase + - No utilizar métodos de clase + - No utilizar métodos de instancia + - No utilizar properties + - Utilizar Type Hints en todos los métodos y variables +""" +@dataclass +class Materia: + nombre:str +@dataclass +class Carrera: + longitud:list + + def __str__(self): + return f"Carrera(materias={self.longitud})" + + def __len__(self): + return len(self.longitud) + +# NO MODIFICAR - INICIO +# Test parámetro obligatorio +try: + materia = Materia() + assert False, "No se puede instanciar sin nombre" +except TypeError: + assert True + +try: + materia = Carrera() + assert False, "No se puede instanciar sin materias" +except TypeError: + assert True + +# Test básico +matematica = Materia("Matemática") +assert matematica.nombre == "Matemática" + +estadistica = Materia(nombre="Estadística") +assert estadistica.nombre == "Estadística" + +ciclo_basico = Carrera([matematica, estadistica]) +assert ( + str(ciclo_basico) + == "Carrera(materias=[Materia(nombre='Matemática'), Materia(nombre='Estadística')])" # noqa: 501 +) + +assert len(ciclo_basico) == 2 +# NO MODIFICAR - FIN \ No newline at end of file diff --git a/exercises/exercise5.py b/exercises/exercise5.py new file mode 100644 index 0000000..5ad12cc --- /dev/null +++ b/exercises/exercise5.py @@ -0,0 +1,132 @@ +"""El ente regulador de impuestos llama a todas las personas activas +laboralmente Contribuyentes, sin embargo, existen varios tipos de +contribuyentes, por ejemplo, el Monotributista y el que es Empleado en relación +de dependencia. Ambos están dentro del sistema pero pagan diferentes impuestos. +El monotributista tiene que pagar en función de sus ingresos brutos anuales: + - Si son menores a $370.000, paga $2646,22 mensuales + - Si son menores a $550.000, paga $2958,95 mensuales + - Si son menores a $770.000, paga $3382,62 mensuales + - Si son mayores a $770.000, paga $3988,85 mensuales +En el caso de los empleados en relación de dependencia, ellos pagan un 17% de +impuestos sobre sus ingresos brutos mensuales. +Inspirado en datos reales: https://www.afip.gob.ar/monotributo/categorias.asp +Escribir una estructura de clases que refleje lo anterior. Para simplificar el +análisis, todos los montos serán mensuales (dividir los límites del monotributo +por 12). +Aclaración: Este ejercicio está basado en la realidad pero se realizaron +múltiples simplificaciones para adecuarlo al contexto del curso. +Restricciones: + - Utilizar Dataclasses + - Utilizar 3 clases: 1 abstracta y 2 concretas + - Utilizar 1 variables de instancia en cada clase concreta + - Utilizar 1 métodos de instancia con polimorfismo + - No utilizar variables de clase + - No utilizar métodos de clase + - No utilizar properties + - Utilizar Type Hints en todos los métodos y variables +""" + +import abc +from abc import ABC, abstractmethod +from dataclasses import dataclass +from decimal import Rounded +from typing import List + + +class Contribuyente(ABC): + @abstractmethod + def calcular_sueldo(self): + pass + +@dataclass +class Empleado(Contribuyente): + sueldo:int + + def calcular_sueldo(self): + return self.sueldo*0.83 + +@dataclass +class Monotributista(Contribuyente): + sueldo:float + + def calcular_sueldo(self): + sueldo_bruto = self.sueldo*12 + + if sueldo_bruto<370000: + sueldo_mensual_final=self.sueldo-2646.22 + elif sueldo_bruto<550000: + sueldo_mensual_final=self.sueldo-2958.95 + elif sueldo_bruto<770000: + sueldo_mensual_final=self.sueldo-3382.62 + elif sueldo_bruto>770000: + sueldo_mensual_final=self.sueldo-3988.85 + return sueldo_mensual_final + + + +def calcular_sueldos(contribuyentes: List[Contribuyente]): + """Data una lista de contribuyentes, devuelve una lista de los sueldos de + cada uno.""" + sueldos_vacios=[] + for i in contribuyentes: + sueldos_vacios.append(i.calcular_sueldo()) + return sueldos_vacios + +# NO MODIFICAR - INICIO +assert type(Contribuyente) == abc.ABCMeta, "Contribuyente debe ser abstracta" +assert issubclass(Empleado, Contribuyente), "Empleado debe heredar de Contribuyente" # noqa: 501 +assert issubclass(Monotributista, Contribuyente), "Monotributista debe heredar de Contribuyente" # noqa: 501 + +try: + juan = Contribuyente() + assert False, "No se puede instanciar una clase abstracta" +except TypeError: + assert True + +try: + juan = Empleado() + assert False, "No se puede instanciar sin sueldo" +except TypeError: + assert True + +try: + juan = Monotributista() + assert False, "No se puede instanciar sin sueldo" +except TypeError: + assert True + + +# Test Básico +juan = Monotributista(25_000) +assert juan.calcular_sueldo() == 22353.78 + +juan = Monotributista(35_000) +assert juan.calcular_sueldo() == 32041.05 + +juan = Monotributista(50_000) +assert juan.calcular_sueldo() == 46617.38 + +juan = Monotributista(75_000) +assert juan.calcular_sueldo() == 71011.15 + + +maria = Empleado(25_000) +assert maria.calcular_sueldo() == 20750.0 + +maria = Empleado(35_000) +assert maria.calcular_sueldo() == 29050.0 + +maria = Empleado(50_000) +assert maria.calcular_sueldo() == 41500.0 + +maria = Empleado(75_000) +assert maria.calcular_sueldo() == 62250.0 + + +# Test Calculadora de sueldos + +contribuyentes = [Monotributista(80_000), Empleado(80_000)] + +assert calcular_sueldos(contribuyentes) == [76011.15, 66400.0] + +# NO MODIFICAR - FIN \ No newline at end of file