Tempo de leitura: menos de 1 minuto
Fala galera, hoje é dia de publicar o resultado do CodeKata #2: Caixa Eletrônico.
Após a publicação do CodeKata, algumas pessoas me disseram que o segundo é mais difícil que o primeiro, no inicio achei que não, pois a solução seria basicamente fazer alguns operações matemáticas. No entato, após criar os cenários de teste para validar as implementações dos participantes, tive a verdadeira noção da complexidade deste CodeKata. Adicionar ao problema a variável “estoque de notas”, deixou o problema bem mais complexo.
Durante o desenvolvimento da minha solução, percebi que duas das notas (R$ 5,00 e R$ 50,00) deveria ter um tratamento diferenciado.
A primeira, era a única nota impar, ou seja, caso o valor solicitado para saque fosse impar, era imprescindível devolver um número impares de notas R$ 5,00, caso contrário seria impossível o saque.
Já a nota de R$ 50,00, dependendo do valor solicitado para saque e do número de notas disponíveis para saque, poderia também impossibilitar o saque. Vide cenários.
Cenário 1:
Valor solicitado: R$ 120,00
Estoque: 1 nota de R$ 50; 10 notas de R$ 20; 0 nota de R$ 10, R$ 5 e R$ 2 (ou seja, apenas notas de R$ 50 e R$ 20 disponíveis)
O valor total disponível neste cenário (R$ 250,00) é suficiente, por tanto, o caixa eletrônico tem condição de liberar o valor solicitado.
Porém, se por caso a implementação retornasse a única nota de R$ 50 disponível, seria impossível o saque, já R$ 70,00 não é múltiplo de R$ 20,00 (única nota disponível).
O correto neste cenário, seria liberar 6 notas de R$ 20,00.
Cenário 2:
Valor solicitado: R$ 120,00
Estoque: 1 nota de R$ 50; 10 notas de R$ 20; 1 nota de R$ 10; 0 nota de R$ 5 e R$ 2 (ou seja, apenas notas de R$ 50, R$20 e R$ 10 disponíveis)
O valor total disponível neste cenário (R$ 260,00) é suficiente, por tanto, o caixa eletrônico tem condição de dispensar o valor solicitado.
Neste cenário, não teria problema a liberação da nota de R$ 50,00, pois tem uma nota de R$ 10,00 para completar o valor solicitado, assim, o correto seria liberar 1 nota de R$ 50,00, 3 notas de R$ 20,00 e 1 nota de R$ 10,00, totalizando 5 notas.
Mas vamos deixar de blá blá de dar logo o resultado.
Resultado
Nesta edição tivemos 3 participantes, são eles:
- Fernando Silva;
- Rafael Alves;
- Débora Adorni.
Agradeço mais uma vez à participação de vocês. Teve mais um participante (Darian Beluzzo), que por problema de saúde não conseguiu enviar a solução a tempo.
Pelo problema ser complexo, criei 56 cenários de teste, acho que consegui uma boa cobertura de testes. Foram avaliados os seguintes itens nestes cenários:
- Valor total liberado igual ao solicitado;
- Quantidade minima de notas (“de modo a minimizar a quantidade de cédulas entregues”);
- Quantidade de cada nota;
- Impossibilidade de saque.
Abaixo segue resultado dos participantes:

Falhas de execução implementação do Fernando:
[code language=”java”]
Cenario 13 falhou: quantidade de notas esperado (3), não corresponde a quantidade retornada (4). As notas dispensadas foram: 0;0;0;3;1. (Dados no cenario: |13|10;10;10;10;10|17.00|0;0;1;1;1|3|)
Cenario 16 falhou: quantidade de notas esperado (4), não corresponde a quantidade retornada (6). As notas dispensadas foram: 1;0;1;3;1. (Dados no cenario: |16|10;10;10;10;10|77.00|1;1;0;1;1|4|)
Cenario 17 falhou: quantidade de notas esperado (5), não corresponde a quantidade retornada (6). As notas dispensadas foram: 1;1;0;3;1. (Dados no cenario: |17|10;10;10;10;10|87.00|1;1;1;1;1|5|)
Cenario 20 falhou: quantidade de notas esperado (23), não corresponde a quantidade retornada (24). As notas dispensadas foram: 5;10;4;3;2. (Dados no cenario: |20|5;10;10;10;10|509.00|5;10;5;1;2|23|)
Cenario 25 falhou: pois NAO era esperado erro neste cenario (Dados no cenario: |25|10;1;1;1;10000|4000.00|10;1;1;0;1735|1747|). Erro lancado: Impossivel sacar!! Valor restante: 1.00
Cenario 27 falhou: pois NAO era esperado erro neste cenario (Dados no cenario: |27|10;1;1;3;10000|4000.00|10;1;1;2;1730|1744|). Erro lancado: Impossivel sacar!! Valor restante: 1.00
Cenario 29 falhou: pois NAO era esperado erro neste cenario (Dados no cenario: |29|1;10;0;0;0|100.00|0;5;0;0;0|5|). Erro lancado: Impossivel sacar!! Valor restante: 10.00
Cenario 33 falhou: pois NAO era esperado erro neste cenario (Dados no cenario: |33|1;10;0;0;0|120.00|0;6;0;0;0|6|). Erro lancado: Impossivel sacar!! Valor restante: 10.00
Cenario 36 falhou: quantidade de notas esperado (6), não corresponde a quantidade retornada (9). As notas dispensadas foram: 1;3;0;0;5. (Dados no cenario: |36|1;10;0;0;10|120.00|0;6;0;0;0|6|)
Cenario 37 falhou: pois NAO era esperado erro neste cenario (Dados no cenario: |37|3;10;0;0;0|220.00|2;6;0;0;0|8|). Erro lancado: Impossivel sacar!! Valor restante: 10.00
Cenario 39 falhou: pois NAO era esperado erro neste cenario (Dados no cenario: |39|3;10;0;1;0|225.00|2;6;0;1;0|9|). Erro lancado: Impossivel sacar!! Valor restante: 10.00
Cenario 40 falhou: quantidade de notas esperado (9), não corresponde a quantidade retornada (12). As notas dispensadas foram: 3;3;0;1;5. (Dados no cenario: |40|3;10;0;1;10|225.00|2;6;0;1;0|9|)
Cenario 41 falhou: pois NAO era esperado erro neste cenario (Dados no cenario: |41|3;10;0;2;10|225.00|2;6;0;1;0|9|). Erro lancado: Impossivel sacar!! Valor restante: 1.00
Cenario 47 falhou: pois NAO era esperado erro neste cenario (Dados no cenario: |47|0;0;0;5;90|120.00|0;0;0;4;50|54|). Erro lancado: Impossivel sacar!! Valor restante: 1.00
[/code]
Nota: Podemos ver que 6 dos cenários falharam na implementação do Fernando, pois a quantidade de notas não foi minizada (cenários: 13, 16, 17, 20, 36 e 40).
Falhas de execução implementação do Débora:
[code language=”java”]
Cenario 18 falhou: quantidade de notas esperado (50), não corresponde a quantidade retornada (18). As notas dispensadas foram: 17;1;0;0;0. (Dados no cenario: |18|10;10;10;10;10|870.00|10;10;10;10;10|50|)
Cenario 19 falhou: quantidade de notas esperado (20), não corresponde a quantidade retornada (10). As notas dispensadas foram: 10;0;0;0;0. (Dados no cenario: |19|5;10;10;10;10|500.00|5;10;5;0;0|20|)
Cenario 20 falhou: quantidade de notas esperado (23), não corresponde a quantidade retornada (13). As notas dispensadas foram: 10;0;0;1;2. (Dados no cenario: |20|5;10;10;10;10|509.00|5;10;5;1;2|23|)
Cenario 21 falhou: quantidade de notas esperado (25), não corresponde a quantidade retornada (8). As notas dispensadas foram: 8;0;0;0;0. (Dados no cenario: |21|5;0;10;10;10|400.00|5;0;10;10;0|25|)
Cenario 23 falhou: quantidade de notas esperado (1760), não corresponde a quantidade retornada (80). As notas dispensadas foram: 80;0;0;0;0. (Dados no cenario: |23|10;0;0;0;10000|4000.00|10;0;0;0;1750|1760|)
Cenario 24 falhou: quantidade de notas esperado (500), não corresponde a quantidade retornada (200). As notas dispensadas foram: 200;0;0;0;0. (Dados no cenario: |24|150;100;0;0;10000|10000.00|150;100;0;0;250|500|)
Cenario 25 falhou: quantidade de notas esperado (1747), não corresponde a quantidade retornada (80). As notas dispensadas foram: 80;0;0;0;0. (Dados no cenario: |25|10;1;1;1;10000|4000.00|10;1;1;0;1735|1747|)
Cenario 26 falhou: quantidade de notas esperado (1744), não corresponde a quantidade retornada (80). As notas dispensadas foram: 80;0;0;0;0. (Dados no cenario: |26|10;1;1;2;10000|4000.00|10;1;1;2;1730|1744|)
Cenario 27 falhou: quantidade de notas esperado (1744), não corresponde a quantidade retornada (80). As notas dispensadas foram: 80;0;0;0;0. (Dados no cenario: |27|10;1;1;3;10000|4000.00|10;1;1;2;1730|1744|)
Cenario 28 falhou: quantidade de notas esperado (1741), não corresponde a quantidade retornada (80). As notas dispensadas foram: 80;0;0;0;0. (Dados no cenario: |28|10;1;1;4;10000|4000.00|10;1;1;4;1725|1741|)
Cenario 29 falhou: quantidade de notas esperado (5), não corresponde a quantidade retornada (2). As notas dispensadas foram: 2;0;0;0;0. (Dados no cenario: |29|1;10;0;0;0|100.00|0;5;0;0;0|5|)
Cenario 30 falhou: quantidade de notas esperado (4), não corresponde a quantidade retornada (2). As notas dispensadas foram: 2;0;0;0;0. (Dados no cenario: |30|1;10;1;0;0|100.00|1;2;1;0;0|4|)
Cenario 31 falhou: quantidade de notas esperado (5), não corresponde a quantidade retornada (2). As notas dispensadas foram: 2;0;0;0;0. (Dados no cenario: |31|1;10;0;3;0|100.00|1;2;0;2;0|5|)
Cenario 33 falhou: quantidade de notas esperado (6), não corresponde a quantidade retornada (3). As notas dispensadas foram: 2;1;0;0;0. (Dados no cenario: |33|1;10;0;0;0|120.00|0;6;0;0;0|6|)
Cenario 34 falhou: quantidade de notas esperado (5), não corresponde a quantidade retornada (3). As notas dispensadas foram: 2;1;0;0;0. (Dados no cenario: |34|1;10;1;0;0|120.00|1;3;1;0;0|5|)
Cenario 35 falhou: quantidade de notas esperado (6), não corresponde a quantidade retornada (3). As notas dispensadas foram: 2;1;0;0;0. (Dados no cenario: |35|1;10;0;10;0|120.00|1;3;0;2;0|6|)
Cenario 36 falhou: quantidade de notas esperado (6), não corresponde a quantidade retornada (3). As notas dispensadas foram: 2;1;0;0;0. (Dados no cenario: |36|1;10;0;0;10|120.00|0;6;0;0;0|6|)
Cenario 37 falhou: quantidade de notas esperado (8), não corresponde a quantidade retornada (5). As notas dispensadas foram: 4;1;0;0;0. (Dados no cenario: |37|3;10;0;0;0|220.00|2;6;0;0;0|8|)
Cenario 38 falhou: quantidade de notas esperado (7), não corresponde a quantidade retornada (6). As notas dispensadas foram: 4;0;1;1;0. (Dados no cenario: |38|3;10;0;1;0|215.00|3;3;0;1;0|7|)
Cenario 39 falhou: quantidade de notas esperado (9), não corresponde a quantidade retornada (6). As notas dispensadas foram: 4;1;0;1;0. (Dados no cenario: |39|3;10;0;1;0|225.00|2;6;0;1;0|9|)
Cenario 40 falhou: quantidade de notas esperado (9), não corresponde a quantidade retornada (6). As notas dispensadas foram: 4;1;0;1;0. (Dados no cenario: |40|3;10;0;1;10|225.00|2;6;0;1;0|9|)
Cenario 41 falhou: quantidade de notas esperado (9), não corresponde a quantidade retornada (6). As notas dispensadas foram: 4;1;0;1;0. (Dados no cenario: |41|3;10;0;2;10|225.00|2;6;0;1;0|9|)
Cenario 42 falhou: quantidade de notas esperado (8), não corresponde a quantidade retornada (6). As notas dispensadas foram: 4;1;0;1;0. (Dados no cenario: |42|3;10;10;1;10|225.00|3;3;1;1;0|8|)
Cenario 43 falhou: quantidade de notas esperado (9), não corresponde a quantidade retornada (6). As notas dispensadas foram: 4;1;0;1;0. (Dados no cenario: |43|3;10;0;3;10|225.00|3;3;0;3;0|9|)
Cenario 44 falhou: quantidade de notas esperado (9), não corresponde a quantidade retornada (6). As notas dispensadas foram: 4;1;0;1;0. (Dados no cenario: |44|3;10;0;10;0|225.00|3;3;0;3;0|9|)
Cenario 45 falhou: quantidade de notas esperado (9), não corresponde a quantidade retornada (6). As notas dispensadas foram: 4;1;0;1;0. (Dados no cenario: |45|3;10;0;10;10|225.00|3;3;0;3;0|9|)
Cenario 46 falhou: quantidade de notas esperado (5), não corresponde a quantidade retornada (3). As notas dispensadas foram: 2;1;0;0;0. (Dados no cenario: |46|1;10;1;0;0|120.00|1;3;1;0;0|5|)
Cenario 47 falhou: quantidade de notas esperado (54), não corresponde a quantidade retornada (3). As notas dispensadas foram: 2;1;0;0;0. (Dados no cenario: |47|0;0;0;5;90|120.00|0;0;0;4;50|54|)
Cenario 48 falhou: quantidade de notas esperado (4), não corresponde a quantidade retornada (3). As notas dispensadas foram: 2;0;1;0;0. (Dados no cenario: |48|1;10;1;0;0|110.00|1;3;0;0;0|4|)
Cenario 49 falhou: quantidade de notas esperado (5), não corresponde a quantidade retornada (4). As notas dispensadas foram: 2;1;1;0;0. (Dados no cenario: |49|1;10;1;0;0|130.00|1;4;0;0;0|5|)
Cenario 52 falhou: pois um erro era esperado (Dados no cenario: |52|1000;10;10;10;10|10002.00|ERRO||)
Cenario 55 falhou: pois um erro era esperado (Dados no cenario: |55|0;0;0;0;0|2.0|ERRO||)
Cenario 56 falhou: pois um erro era esperado (Dados no cenario: |56|10;10;10;0;10|11.00|ERRO||)
[/code]
Nota: A implementação da Débora, não ficou limitada ao estoque de notas, por isso vários cenários falharam.
Falhas de execução implementação do Rafael:
[code language=”java”]
Cenario 1 falhou: pois um erro era esperado (Dados no cenario: |1|10;10;10;10;10|0.00|ERRO||)
Cenario 6 falhou: quantidade de notas esperado (1), não corresponde a quantidade retornada (2). As notas dispensadas foram: 0;0;0;1;1. (Dados no cenario: |6|10;10;10;10;10|2.00|0;0;0;0;1|1|)
Cenario 7 falhou: quantidade de notas esperado (4), não corresponde a quantidade retornada (5). As notas dispensadas foram: 0;0;0;1;4. (Dados no cenario: |7|10;10;10;10;10|11.00|0;0;0;1;3|4|)
Cenario 8 falhou: quantidade de notas esperado (5), não corresponde a quantidade retornada (9). As notas dispensadas foram: 0;0;0;1;8. (Dados no cenario: |8|10;10;10;10;10|13.00|0;0;0;1;4|5|)
Cenario 9 falhou: quantidade de notas esperado (5), não corresponde a quantidade retornada (13). As notas dispensadas foram: 0;0;1;1;11. (Dados no cenario: |9|10;10;10;10;10|21.00|0;0;1;1;3|5|)
Cenario 10 falhou: pois NAO era esperado erro neste cenario (Dados no cenario: |10|10;10;10;10;10|6.00|0;0;0;0;3|3|). Erro lancado: Não foi possível efetuar o saque!!!
Cenario 13 falhou: quantidade de notas esperado (3), não corresponde a quantidade retornada (13). As notas dispensadas foram: 0;0;1;1;11. (Dados no cenario: |13|10;10;10;10;10|17.00|0;0;1;1;1|3|)
Cenario 14 falhou: pois NAO era esperado erro neste cenario (Dados no cenario: |14|10;10;10;10;10|52.00|1;0;0;0;1|2|). Erro lancado: Não foi possível efetuar o saque!!!
Cenario 15 falhou: pois NAO era esperado erro neste cenario (Dados no cenario: |15|10;10;10;10;10|72.00|1;1;0;0;1|3|). Erro lancado: Não foi possível efetuar o saque!!!
Cenario 16 falhou: quantidade de notas esperado (4), não corresponde a quantidade retornada (14). As notas dispensadas foram: 1;1;0;1;11. (Dados no cenario: |16|10;10;10;10;10|77.00|1;1;0;1;1|4|)
Cenario 19 falhou: quantidade de notas esperado (20), não corresponde a quantidade retornada (30). As notas dispensadas foram: 5;10;5;0;10. (Dados no cenario: |19|5;10;10;10;10|500.00|5;10;5;0;0|20|)
Cenario 21 falhou: quantidade de notas esperado (25), não corresponde a quantidade retornada (35). As notas dispensadas foram: 5;0;10;10;10. (Dados no cenario: |21|5;0;10;10;10|400.00|5;0;10;10;0|25|)
Cenario 22 falhou: quantidade de notas esperado (28), não corresponde a quantidade retornada (38). As notas dispensadas foram: 28;0;0;0;10. (Dados no cenario: |22|100;0;0;0;0|1400.00|28;0;0;0;0|28|)
Cenario 23 falhou: pois NAO era esperado erro neste cenario (Dados no cenario: |23|10;0;0;0;10000|4000.00|10;0;0;0;1750|1760|). Erro lancado: Não foi possível efetuar o saque!!!
Cenario 24 falhou: pois NAO era esperado erro neste cenario (Dados no cenario: |24|150;100;0;0;10000|10000.00|150;100;0;0;250|500|). Erro lancado: Não foi possível efetuar o saque!!!
Cenario 25 falhou: pois NAO era esperado erro neste cenario (Dados no cenario: |25|10;1;1;1;10000|4000.00|10;1;1;0;1735|1747|). Erro lancado: Não foi possível efetuar o saque!!!
Cenario 26 falhou: pois NAO era esperado erro neste cenario (Dados no cenario: |26|10;1;1;2;10000|4000.00|10;1;1;2;1730|1744|). Erro lancado: Não foi possível efetuar o saque!!!
Cenario 27 falhou: pois NAO era esperado erro neste cenario (Dados no cenario: |27|10;1;1;3;10000|4000.00|10;1;1;2;1730|1744|). Erro lancado: Não foi possível efetuar o saque!!!
Cenario 28 falhou: pois NAO era esperado erro neste cenario (Dados no cenario: |28|10;1;1;4;10000|4000.00|10;1;1;4;1725|1741|). Erro lancado: Não foi possível efetuar o saque!!!
Cenario 29 falhou: pois NAO era esperado erro neste cenario (Dados no cenario: |29|1;10;0;0;0|100.00|0;5;0;0;0|5|). Erro lancado: Não foi possível efetuar o saque!!!
Cenario 33 falhou: pois NAO era esperado erro neste cenario (Dados no cenario: |33|1;10;0;0;0|120.00|0;6;0;0;0|6|). Erro lancado: Não foi possível efetuar o saque!!!
Cenario 36 falhou: quantidade de notas esperado (6), não corresponde a quantidade retornada (9). As notas dispensadas foram: 1;3;0;0;5. (Dados no cenario: |36|1;10;0;0;10|120.00|0;6;0;0;0|6|)
Cenario 37 falhou: pois NAO era esperado erro neste cenario (Dados no cenario: |37|3;10;0;0;0|220.00|2;6;0;0;0|8|). Erro lancado: Não foi possível efetuar o saque!!!
Cenario 39 falhou: pois NAO era esperado erro neste cenario (Dados no cenario: |39|3;10;0;1;0|225.00|2;6;0;1;0|9|). Erro lancado: Não foi possível efetuar o saque!!!
Cenario 40 falhou: quantidade de notas esperado (9), não corresponde a quantidade retornada (12). As notas dispensadas foram: 3;3;0;1;5. (Dados no cenario: |40|3;10;0;1;10|225.00|2;6;0;1;0|9|)
Cenario 41 falhou: pois NAO era esperado erro neste cenario (Dados no cenario: |41|3;10;0;2;10|225.00|2;6;0;1;0|9|). Erro lancado: Não foi possível efetuar o saque!!!
Cenario 42 falhou: quantidade de notas esperado (8), não corresponde a quantidade retornada (15). As notas dispensadas foram: 3;3;1;1;7. (Dados no cenario: |42|3;10;10;1;10|225.00|3;3;1;1;0|8|)
Cenario 43 falhou: quantidade de notas esperado (9), não corresponde a quantidade retornada (16). As notas dispensadas foram: 3;3;0;3;7. (Dados no cenario: |43|3;10;0;3;10|225.00|3;3;0;3;0|9|)
Cenario 44 falhou: quantidade de notas esperado (9), não corresponde a quantidade retornada (16). As notas dispensadas foram: 3;3;0;3;7. (Dados no cenario: |44|3;10;0;10;0|225.00|3;3;0;3;0|9|)
Cenario 45 falhou: quantidade de notas esperado (9), não corresponde a quantidade retornada (16). As notas dispensadas foram: 3;3;0;3;7. (Dados no cenario: |45|3;10;0;10;10|225.00|3;3;0;3;0|9|)
Cenario 46 falhou: quantidade de notas esperado (5), não corresponde a quantidade retornada (12). As notas dispensadas foram: 1;3;1;0;7. (Dados no cenario: |46|1;10;1;0;0|120.00|1;3;1;0;0|5|)
Cenario 47 falhou: pois NAO era esperado erro neste cenario (Dados no cenario: |47|0;0;0;5;90|120.00|0;0;0;4;50|54|). Erro lancado: Não foi possível efetuar o saque!!!
Cenario 48 falhou: quantidade de notas esperado (4), não corresponde a quantidade retornada (58). As notas dispensadas foram: 1;3;0;0;54. (Dados no cenario: |48|1;10;1;0;0|110.00|1;3;0;0;0|4|)
Cenario 49 falhou: quantidade de notas esperado (5), não corresponde a quantidade retornada (59). As notas dispensadas foram: 1;4;0;0;54. (Dados no cenario: |49|1;10;1;0;0|130.00|1;4;0;0;0|5|)
Cenario 53 falhou: pois um erro era esperado (Dados no cenario: |53|1000;10;10;10;10|5.01|ERRO||)
Cenario 54 falhou: pois um erro era esperado (Dados no cenario: |54|1000;10;10;10;10|100.56|ERRO||)
[/code]
Nota: Na implementação do Rafael, 6 cenários deram deadlock (Cenários: 11, 12, 17, 20, 50 e 51).
Conclusão
Parabéns Fernando, você foi o melhor no desafio!
Para quem tiver interesse, disponibilizei no Github todas as implementações junto com os cenários de teste.
Valeu pessoal, até o próximo CodeKata!

Link permanente