Classe para cálculo de desconto progressivo e teste unitário Symfony


/ Published in: PHP
Save to your folder(s)

Uma classe e seu teste unitário


Copy this code and paste it in your HTML
  1. <?php
  2.  
  3. class financeira
  4. {
  5. private $value, $original, $info;
  6.  
  7. public function __construct($value = 100)
  8. {
  9. $this->value = $this->original = $value;
  10. $this->info = array('log'=>$value,'operacao' => '');
  11. }
  12. private function addLog($x)
  13. {
  14. $this->info['log'] .= "\n" . $x;
  15. }
  16. private function addOperacao($x)
  17. {
  18. $this->info['operacao'] .= $x;
  19. $this->addLog($x);
  20. }
  21. public function getInfo($k = 'operacao')
  22. {
  23. return $this->info[$k];
  24. }
  25. public function setValue($x)
  26. {
  27. $this->original = $x;
  28. $this->resetValue();
  29. return $this;
  30. }
  31. public function getValue()
  32. {
  33. $this->addLog('=' . $this->value);
  34. return (float) $this->value;
  35. }
  36. public function resetValue()
  37. {
  38. $this->value = $this->original;
  39. $this->info['operacao'] = '';
  40. $this->info['log'] = '';
  41. return $this;
  42. }
  43.  
  44. private function percent($x, $v = NULL)
  45. {
  46. if(!isset($v))
  47. {
  48. $v = $this->value;
  49. }
  50. $r = ($v * $x) /100;
  51. $this->addOperacao('-' . $x . '%');
  52. return $r;
  53. }
  54. public function addDesconto($x)
  55. {
  56. $this->value -= $this->percent($x);
  57. }
  58. /*
  59.  * Calcula descontos progressivos como 10% + 20% + 5% a partir de um array
  60.  */
  61. public function addDescontoProgressivo(array $descontos)
  62. {
  63. foreach($descontos as $desconto)
  64. {
  65. $this->addDesconto($desconto);
  66. }
  67. return $this;
  68. }
  69.  
  70. public function getDesconto()
  71. {
  72. return $this->original - $this->value;
  73. }
  74.  
  75. public function getAlterador()
  76. {
  77. return ($this->getDesconto() * 100) / $this->original;
  78. }
  79.  
  80. /*
  81. * Calcula o numero multiplicador de desconto progressivo como 10% + 20% + 5% a partir de um array
  82. */
  83. public function getMultiplicadorDaProgressao(array $descontos)
  84. {
  85. $this->resetValue();
  86. foreach($descontos as $desconto)
  87. {
  88. $this->addDesconto($desconto);
  89. }
  90. return $this->getAlterador();
  91. }
  92.  
  93.  
  94. }
  95.  
  96.  
  97. // Teste unitário, salvo no arquivo financeiraTest.php
  98.  
  99.  
  100.  
  101. /**
  102.  *
  103.  * @author Gilmar Pupo <[email protected]>
  104.  *
  105.  * Testa as funcoes da classe financeira
  106.  */
  107.  
  108. require_once dirname(__FILE__).'/../bootstrap/unit.php';
  109. $t = new lime_test(25);
  110.  
  111. $v = new financeira(100);
  112. $v->addDesconto(10);
  113. $t->is( $v->getValue(),90 ,'adicionando 10% de Porcentagem:' . $v->getValue());
  114. $v->addDesconto(10);
  115. $t->is( $v->getValue(),81 ,'adicionando 10% de Porcentagem:' . $v->getValue());
  116.  
  117. $v->resetValue();
  118. $t->is( $v->getValue(),100 ,'reiniciando valores:' . $v->getValue());
  119.  
  120. $v->addDescontoProgressivo(array(10, 10));
  121. $t->is( $v->getValue(),81 ,'adicionando 10% + 10% de Porcentagem:' . $v->getValue());
  122.  
  123. $v->resetValue();
  124. $v->addDescontoProgressivo(array(30, 10, 5));
  125. $t->is( $v->getValue(),59.85 ,'adicionando 30% + 10% + 5% de desconto em 100:' . $v->getValue());
  126.  
  127. $t->diag('Testando métodos compactados');
  128.  
  129. $v->setValue(80)->addDescontoProgressivo(array(30, 10, 5));
  130. $t->is( $v->getValue(),47.88 ,'adicionando 30% + 10% + 5% de desconto em 80:' . $v->getValue());
  131.  
  132. $t->is( $v->setValue(50)
  133. ->addDescontoProgressivo(array(30, 10, 5))
  134. ->getValue()
  135. ,29.925 ,'adicionando 30% + 10% + 5% de desconto em 50:' . $v->getValue());
  136.  
  137. $t->diag('Obtendo dados informativos');
  138. $t->is( $v->setValue(100)
  139. ->addDescontoProgressivo(array(30, 10, 5))
  140. ->getDesconto()
  141. ,40.15 ,'acumulado de desconto foi de:' . $v->getDesconto());
  142. $t->is( $v->getAlterador(), 40.15, 'alterador:' . $v->getAlterador());
  143.  
  144. $t->is( $v->setValue(80)
  145. ->addDescontoProgressivo(array(30, 10, 5))
  146. ->getDesconto()
  147. ,32.12 ,'acumulado de desconto foi de:' . $v->getDesconto());
  148. $t->is( $v->getAlterador(), 40.15, 'alterador:' . $v->getAlterador());
  149.  
  150. $t->is( $v->setValue(50)
  151. ->addDescontoProgressivo(array(30, 10, 5))
  152. ->getDesconto()
  153. ,20.075 ,'acumulado de desconto foi de:' . $v->getDesconto());
  154. $t->is( $v->getAlterador(), 40.15, 'alterador:' . $v->getAlterador());
  155.  
  156.  
  157. $t->diag('Definindo multiplicador a partir de um array');
  158.  
  159. $y = new financeira();
  160.  
  161. $t->is( $i = $y->getMultiplicadorDaProgressao(array(30, 10, 10)) , 43.3, 'getMultiplicadorDaProgressao:' . $i);
  162. $t->isa_ok( $y->getInfo(), 'string', 'operacao:' . $y->getInfo());
  163. //echo $y->getInfo('log') . "\n";
  164.  
  165. $t->is( $i = $y->getMultiplicadorDaProgressao(array(20, 10, 10)) , 35.2, 'getMultiplicadorDaProgressao:' . $i);
  166. $t->isa_ok( $y->getInfo(), 'string', 'operacao:' . $y->getInfo());
  167. //echo $y->getInfo('log') . "\n";
  168.  
  169.  
  170. $t->is( $i = $y->getMultiplicadorDaProgressao(array(30, 10, 5)) , 40.15, 'getMultiplicadorDaProgressao:' . $i);
  171. $t->isa_ok( $y->getInfo(), 'string', 'operacao:' . $y->getInfo());
  172. //echo $y->getInfo('log') . "\n";
  173.  
  174.  
  175. $t->is($r = ((100 * $y->getMultiplicadorDaProgressao(array(30, 10, 5))) /100) , 40.15, $y->getInfo() . ':' . $r);
  176. $t->is($r = ((80 * $y->getMultiplicadorDaProgressao(array(30, 10, 5))) /100) , 32.12, $y->getInfo() . ':' . $r);
  177. $t->is($r = ((50 * $y->getMultiplicadorDaProgressao(array(30, 10, 5))) /100) , 20.075, $y->getInfo() . ':' . $r);
  178.  
  179.  
  180. $t->is($r = ((100 * $y->getMultiplicadorDaProgressao(array(30, 7, 5))) /100) , 38.155, $y->getInfo() . ':' . $r);
  181. $t->is($r = ((80 * $y->getMultiplicadorDaProgressao(array(30, 8, 5))) /100) , 31.056, $y->getInfo() . ':' . $r);
  182. $t->is($r = ((50 * $y->getMultiplicadorDaProgressao(array(20, 9, 20))) /100) , 20.88, $y->getInfo() . ':' . $r);

Report this snippet


Comments

RSS Icon Subscribe to comments

You need to login to post a comment.