All tests pass.
authorMaxime Bourget <bmx007@gmail.com>
Sat, 8 Jun 2013 09:16:30 +0000 (10:16 +0100)
committerMaxime Bourget <bmx007@gmail.com>
Sat, 8 Jun 2013 10:20:40 +0000 (11:20 +0100)
includes/splitter.inc
tests/testSplitter.php

index 6019760212382821eb8766163749b0ee36ea86b0..7804483dd2a8c6485e20bf41890dfa6afd15e8fc 100644 (file)
@@ -70,22 +70,23 @@ class Splitter {
                $quantity = $row['quantity'];
                $quantity_sent = $row['qty_sent'];
 
-               if($quantity >= $quantity_sent) return $splits;
-               if(($quantity-$quantity_sent) % $this->max_quantity < $this->max_quantity) return;
+               /* Check if the item has been fully dispatched.
+                * If so,  there is no need to do anything.
+                */
+               if($quantity_sent >= $quantity) return $splits;
                
                // determine the number of split needed. This will give us the lenght of a split.
-               $nsplit = ceiling($initial_quantity/$this->max_quantity);
-               if($nsplit == 1) return $splits;
+               $nsplit = ceil($quantity/$this->max_quantity);
 
                $period = $this->days/$nsplit;
 
-               array_push($splits, $split = new Split($start_date, $period));
-               $split->quantity_dispatched = $quantity_dispatched;
+               array_push($splits, $split = new Split($this->start_date, $period));
+               $split->quantity_dispatched = $quantity_sent;
                $split_quantity = min($quantity, $this->max_quantity);
                while($split_quantity > 0) {
                                        $split->quantity += $split_quantity;
                                // Check if the split has been entirely dispatch or not.
-                               if($split->$quantity_dispatched > $split->quantity) {
+                               if($split->quantity_dispatched > $split->quantity) {
                                        //extend the split
                                        $split->extend($period);
                                }
@@ -98,6 +99,8 @@ class Splitter {
                                $split_quantity = min($quantity, $this->max_quantity);
                }
 
+               // We need to remove the last split if it's empty
+               if($split->quantity == 0) array_pop($splits);
                return $splits;
        }
 
index aa3fa8277e20121ae16ed3a8ab5e7a17bdf7f63e..2f5479e43660065961db304aacb823acae09d57f 100644 (file)
@@ -24,28 +24,35 @@ class splitterTest extends PHPUnit_Framework_TestCase {
  * @depends testConstruct
  */
        public function testSplit($splitter) {
-               $this->assertSplit($splitter, 5,  0, array());
-               $this->assertSplit($splitter, 15,  11, array());
-               $this->assertSplit($splitter, 30,  24, array());
-               $this->assertSplit($splitter, 10,  0
-                               ,array("6 0  2013/05/01 2013/05/16"
-                               ,"4 0  2013/05/16 2013/05/31"));
-               $this->assertSplit($splitter, 18,  10
-                               ,array(" 12 10  2013/05/01 2013/05/21"
-                               ,"6 0  2013/05/21 2013/05/31"));
+               $this->assertSplit($splitter, 15, 15, array());
+               $this->assertSplit($splitter, 5, 0, array("5 0 2013/05/01 2013/05/31"));
+               $this->assertSplit($splitter, 15, 11, array("12 11 2013/05/01 2013/05/21",
+                                                                                                                                                                                                       "3 0 2013/05/21 2013/05/31"));
+               $this->assertSplit($splitter, 31, 0, array("6 0 2013/05/01 2013/05/06",
+                                                                                                                                                                                                       "6 0 2013/05/06 2013/05/11",
+                                                                                                                                                                                                       "6 0 2013/05/11 2013/05/16",
+                                                                                                                                                                                                       "6 0 2013/05/16 2013/05/21",
+                                                                                                                                                                                                       "6 0 2013/05/21 2013/05/26",
+                                                                                                                                                                                                       "1 0 2013/05/26 2013/05/31",));
+               $this->assertSplit($splitter, 30, 24, array("24 24 2013/05/01 2013/05/25",
+                                                                                                                                                                                               "6 0 2013/05/25 2013/05/31"));
+               $this->assertSplit($splitter, 10, 0 ,array("6 0 2013/05/01 2013/05/16"
+                                                                                                                                                                                               ,"4 0 2013/05/16 2013/05/31"));
+               $this->assertSplit($splitter, 18, 10 ,array("12 10 2013/05/01 2013/05/21"
+                                                                                                                                                                                                       ,"6 0 2013/05/21 2013/05/31"));
        }
 
        public function assertSplit(Splitter $splitter, $quantity, $quantity_dispatched, array $expected_splits) {
                        $splits = $splitter->split(array('quantity' => $quantity, 'qty_sent' => $quantity_dispatched));
 
+                       //print_r($splits);
                        if(empty($expected_splits)) return $this->assertEmpty($splits);
-                       foreach(array_combine($expected_splits, $splits) as $ex => $split) {
-                               $this->assertEquals(explode(" ", $ex), array($split->quantity
-                                       ,$split->quantity_dispatched
-                                       ,$split->start_date
-                                       ,$split->end_date));
-                       
-                       }
+                       $this->assertEquals(array_map(function($ex) {
+                                       return explode(" ", $ex);
+                               }, $expected_splits)
+                               , array_map(function ($split) {
+                                       return array($split->quantity, $split->quantity_dispatched, $split->start_date, $split->end_date);
+                               }, $splits));
        }
 }
 ?>