Skip to content

SoftwareCraftersMurcia/potter-kata

Repository files navigation

Potter Kata

Reglas de la kata

Descripción

Descripción de la Kata en Coding Dojo

Había una vez una serie de 5 libros acerca de un héroe inglés llamado Harry. Niños y niñas de todo el mundo pensaron que él era fantástico y por supuesto, también el editor. Por tanto, en un gesto de inmensa generosidad hacía la humanidad (y para incrementar las ventas), ellos establecieron el siguiente modelo de precios para aprovecharse de los poderes mágico de Harry.

Una copia de cualquiera de los cinco libros cuesta 8 EUR. Sin embargo, si tu compras dos libros diferentes de la serie, tendrás un 5% de descuento en esos dos libros. Si compras 3 libros diferentes, tendrás un 10% de descuento. Si son 4 libros diferentes, tendrás un 20% de descuento. Si vas con todo y compras la serie completa, los 5 libros diferentes, tendrán un gran descuento del 25%.

Así que si compras, digamos, cuatro libros de los cuales 3 son títulos diferentes tendrás 10% de descuento en los 3 que son parte de un conjunto, pero el cuarto libro seguirá costándote 8 EUR.

El mundo se ha vuelto loco con los libros de Harry y los padres y madres están haciendo colas para comprarlos. Tu misión es escribir el código para calcular el precio de cualquier cesta de la compra, dando el mayor descuento posible.

Por ejemplo, ¿Cuánto cuesta esta cesta de libros?

2 copias del primer libro 2 copias del segundo libro 2 copias del tercer libro 1 copia del cuarto libro 1 copia del quinto libro.

Respuesta:

(4 * 8) - 20% [primer libro, segundo libro, tercer libro, cuarto libro]
+ (4 * 8) - 20% [primer libro, segundo libro, tercer libro, quinto libro]
= 25.6 * 2
= 51.20

Sugerencias de tests

Publicado originalmente en xp-france:

def testBasics
  assert_equal(0, price([]))
  assert_equal(8, price([1]))
  assert_equal(8, price([2]))
  assert_equal(8, price([3]))
  assert_equal(8, price([4]))
  assert_equal(8 * 3, price([1, 1, 1]))
end

def testSimpleDiscounts
  assert_equal(8 * 2 * 0.95, price([0, 1]))
  assert_equal(8 * 3 * 0.9, price([0, 2, 4]))
  assert_equal(8 * 4 * 0.8, price([0, 1, 2, 4]))
  assert_equal(8 * 5 * 0.75, price([0, 1, 2, 3, 4]))
end

def testSeveralDiscounts
  assert_equal(8 + (8 * 2 * 0.95), price([0, 0, 1]))
  assert_equal(2 * (8 * 2 * 0.95), price([0, 0, 1, 1]))
  assert_equal((8 * 4 * 0.8) + (8 * 2 * 0.95), price([0, 0, 1, 2, 2, 3]))
  assert_equal(8 + (8 * 5 * 0.75), price([0, 1, 1, 2, 3, 4]))
end

def testEdgeCases
  assert_equal(2 * (8 * 4 * 0.8), price([0, 0, 1, 1, 2, 2, 3, 4]))
  assert_equal(3 * (8 * 5 * 0.75) + 2 * (8 * 4 * 0.8),
    price([0, 0, 0, 0, 0,
           1, 1, 1, 1, 1,
           2, 2, 2, 2,
           3, 3, 3, 3, 3,
           4, 4, 4, 4]))
end

Base para hacer tests

Configuración básica para empezar a hacer una kata o aprender a hacer tests en los siguientes lenguajes:

  • PHP con PHPUnit
  • Javascript con Jest
  • Typescript con Node
  • Typescript con Deno
  • Java con Junit y Mockito
  • Scala con Munit y Scalacheck
  • Kotlin con JUnit5 y MockK
  • C# con xUnit (FluentAsertion) y NSubstitute (para mock)

Configuración específica por lenguaje

PHP con PHPUnit

  1. Instalar composer curl -sS https://getcomposer.org/installer | php
  2. composer install (estando en la carpeta php)
  3. vendor/bin/phpunit o composer test

📚 Documentación

Javascript con Jest

  1. Instalar Node
  2. npm install (Estando en la carpeta javascript)
  3. npm test

📚 Documentación

Typescript con Deno

  1. Instalar Deno
  2. deno test (Estando en la carpeta typescript)

📚 Documentación

Java con Junit y Mockito

  1. Instalar las dependencias y tests con Maven [mvn test]
  2. Ejecutar los tests con el IDE

📚 Documentación

Scala con Munit y Scalacheck

  1. sbt (en la carpeta scala)
  2. ~test para ejecutar los test en hot reload

📚 Documentación

Linux/Mac

  1. Instalar SDKMan
  2. sdk install java 11.0.12-open instala OpenJDK
  3. sdk install sbt una vez instalado SDKMan

Windows

  1. Instalar OpenJDK
  2. Instalar SBT

Visual Studio Code

  1. Descargar Visual Studio Code
  2. Instalar para VS Code Metals

Kotlin con JUnit5 y MockK

  1. Por consola: Puedes instalar dependencias y lanzar los tests con gradlew test
  2. Usando IDE: Simplemente abre el proyecto desde el raiz de la plantilla Kotlin

📚 Documentación

C# con xUnit (con FluentAsertion) y NSubstitute (para mock)

  1. Instalar Microsoft Visual Studio Community 2022
  2. Abre el proyecto y se descargaran automáticamente los paquetes Nuguet necesarios

📚 Documentación

Python

  1. Instalar python 3.x
  2. Una vez descargado el código fuente dentro de la carpeta */python/ creamos un virtual enviroment:
  3. python3 -m venv env
  4. Activamos en virtual environment:
  • windows: .\env\Scripts\activate.bat
  • linux/mac: source env/bin/activate
  1. pytest para ejecutar los tests.