Differential D9939 Diff 23890 src/applications/phrequent/storage/__tests__/PhrequentTimeBlockTestCase.php
Changeset View
Changeset View
Standalone View
Standalone View
src/applications/phrequent/storage/__tests__/PhrequentTimeBlockTestCase.php
Show First 20 Lines • Show All 80 Lines • ▼ Show 20 Lines | $event->attachPreemptingEvents( | ||||
$this->newEvent('meeting', 1000, 1100), | $this->newEvent('meeting', 1000, 1100), | ||||
$this->newEvent('offsite', 1400, 1600), | $this->newEvent('offsite', 1400, 1600), | ||||
$this->newEvent('T1', 1420, 1580), | $this->newEvent('T1', 1420, 1580), | ||||
$this->newEvent('offsite meeting', 1500, 1550), | $this->newEvent('offsite meeting', 1500, 1550), | ||||
)); | )); | ||||
$block = new PhrequentTimeBlock(array($event)); | $block = new PhrequentTimeBlock(array($event)); | ||||
$ranges = $block->getObjectTimeRanges(1800); | $ranges = $block->getObjectTimeRanges(); | ||||
$ranges = $this->reduceRanges($ranges); | |||||
$this->assertEqual( | $this->assertEqual( | ||||
array( | array( | ||||
'T1' => array( | 'T1' => array( | ||||
array(900, 1000), // Before morning meeting. | array(900, 1000), // Before morning meeting. | ||||
array(1100, 1400), // After morning meeting. | array(1100, 1400), // After morning meeting. | ||||
array(1420, 1500), // Coffee, before client meeting. | array(1420, 1500), // Coffee, before client meeting. | ||||
array(1550, 1580), // Coffee, after client meeting. | array(1550, 1580), // Coffee, after client meeting. | ||||
array(1600, 1700), // After returning from off site. | array(1600, 1700), // After returning from off site. | ||||
), | ), | ||||
), | ), | ||||
$ranges); | $ranges); | ||||
$event = $this->newEvent('T2', 100, 300); | $event = $this->newEvent('T2', 100, 300); | ||||
$event->attachPreemptingEvents( | $event->attachPreemptingEvents( | ||||
array( | array( | ||||
$this->newEvent('meeting', 200, null), | $this->newEvent('meeting', 200, null), | ||||
)); | )); | ||||
$block = new PhrequentTimeBlock(array($event)); | $block = new PhrequentTimeBlock(array($event)); | ||||
$ranges = $block->getObjectTimeRanges(1000); | $ranges = $block->getObjectTimeRanges(); | ||||
$ranges = $this->reduceRanges($ranges); | |||||
$this->assertEqual( | $this->assertEqual( | ||||
array( | array( | ||||
'T2' => array( | 'T2' => array( | ||||
array(100, 200), | array(100, 200), | ||||
), | ), | ||||
), | ), | ||||
$ranges); | $ranges); | ||||
} | } | ||||
Show All 26 Lines | final class PhrequentTimeBlockTestCase extends PhabricatorTestCase { | ||||
public function testInstantaneousEvent() { | public function testInstantaneousEvent() { | ||||
$event = $this->newEvent('T1', 8, 8); | $event = $this->newEvent('T1', 8, 8); | ||||
$event->attachPreemptingEvents(array()); | $event->attachPreemptingEvents(array()); | ||||
$block = new PhrequentTimeBlock(array($event)); | $block = new PhrequentTimeBlock(array($event)); | ||||
$ranges = $block->getObjectTimeRanges(1800); | $ranges = $block->getObjectTimeRanges(); | ||||
$ranges = $this->reduceRanges($ranges); | |||||
$this->assertEqual( | $this->assertEqual( | ||||
array( | array( | ||||
'T1' => array( | 'T1' => array( | ||||
array(8, 8), | array(8, 8), | ||||
), | ), | ||||
), | ), | ||||
$ranges); | $ranges); | ||||
} | } | ||||
public function testPopAcrossStrata() { | public function testPopAcrossStrata() { | ||||
$event = $this->newEvent('T1', 1, 1000); | $event = $this->newEvent('T1', 1, 1000); | ||||
$event->attachPreemptingEvents( | $event->attachPreemptingEvents( | ||||
array( | array( | ||||
$this->newEvent('T2', 100, 300), | $this->newEvent('T2', 100, 300), | ||||
$this->newEvent('T1', 200, 400), | $this->newEvent('T1', 200, 400), | ||||
$this->newEvent('T3', 250, 275), | $this->newEvent('T3', 250, 275), | ||||
)); | )); | ||||
$block = new PhrequentTimeBlock(array($event)); | $block = new PhrequentTimeBlock(array($event)); | ||||
$ranges = $block->getObjectTimeRanges(1000); | $ranges = $block->getObjectTimeRanges(); | ||||
$ranges = $this->reduceRanges($ranges); | |||||
$this->assertEqual( | $this->assertEqual( | ||||
array( | array( | ||||
'T1' => array( | 'T1' => array( | ||||
array(1, 100), | array(1, 100), | ||||
array(200, 250), | array(200, 250), | ||||
array(275, 1000), | array(275, 1000), | ||||
), | ), | ||||
Show All 9 Lines | $event->attachPreemptingEvents( | ||||
$this->newEvent('T1', 200, 400), | $this->newEvent('T1', 200, 400), | ||||
$this->newEvent('T3', 300, 800), | $this->newEvent('T3', 300, 800), | ||||
$this->newEvent('T1', 350, 600), | $this->newEvent('T1', 350, 600), | ||||
$this->newEvent('T4', 380, 390), | $this->newEvent('T4', 380, 390), | ||||
)); | )); | ||||
$block = new PhrequentTimeBlock(array($event)); | $block = new PhrequentTimeBlock(array($event)); | ||||
$ranges = $block->getObjectTimeRanges(1000); | $ranges = $block->getObjectTimeRanges(); | ||||
$ranges = $this->reduceRanges($ranges); | |||||
$this->assertEqual( | $this->assertEqual( | ||||
array( | array( | ||||
'T1' => array( | 'T1' => array( | ||||
array(1, 100), | array(1, 100), | ||||
array(200, 300), | array(200, 300), | ||||
array(350, 380), | array(350, 380), | ||||
array(390, 600), | array(390, 600), | ||||
array(900, 1000), | array(900, 1000), | ||||
), | ), | ||||
), | ), | ||||
$ranges); | $ranges); | ||||
} | } | ||||
public function testOngoing() { | |||||
$event = $this->newEvent('T1', 1, null); | |||||
$event->attachPreemptingEvents(array()); | |||||
$block = new PhrequentTimeBlock(array($event)); | |||||
$ranges = $block->getObjectTimeRanges(); | |||||
$ranges = $this->reduceRanges($ranges); | |||||
$this->assertEqual( | |||||
array( | |||||
'T1' => array( | |||||
array(1, null), | |||||
), | |||||
), | |||||
$ranges); | |||||
} | |||||
public function testOngoingInterrupted() { | |||||
$event = $this->newEvent('T1', 1, null); | |||||
$event->attachPreemptingEvents( | |||||
array( | |||||
$this->newEvent('T2', 100, 900), | |||||
)); | |||||
$block = new PhrequentTimeBlock(array($event)); | |||||
$ranges = $block->getObjectTimeRanges(); | |||||
$ranges = $this->reduceRanges($ranges); | |||||
$this->assertEqual( | |||||
array( | |||||
'T1' => array( | |||||
array(1, 100), | |||||
array(900, null) | |||||
), | |||||
), | |||||
$ranges); | |||||
} | |||||
public function testOngoingPreempted() { | |||||
$event = $this->newEvent('T1', 1, null); | |||||
$event->attachPreemptingEvents( | |||||
array( | |||||
$this->newEvent('T2', 100, null), | |||||
)); | |||||
$block = new PhrequentTimeBlock(array($event)); | |||||
$ranges = $block->getObjectTimeRanges(); | |||||
$ranges = $this->reduceRanges($ranges); | |||||
$this->assertEqual( | |||||
array( | |||||
'T1' => array( | |||||
array(1, 100), | |||||
), | |||||
), | |||||
$ranges); | |||||
} | |||||
private function newEvent($object_phid, $start_time, $end_time) { | private function newEvent($object_phid, $start_time, $end_time) { | ||||
static $id = 0; | static $id = 0; | ||||
return id(new PhrequentUserTime()) | return id(new PhrequentUserTime()) | ||||
->setID(++$id) | ->setID(++$id) | ||||
->setObjectPHID($object_phid) | ->setObjectPHID($object_phid) | ||||
->setDateStarted($start_time) | ->setDateStarted($start_time) | ||||
->setDateEnded($end_time); | ->setDateEnded($end_time); | ||||
} | } | ||||
private function reduceRanges(array $ranges) { | |||||
$results = array(); | |||||
foreach ($ranges as $phid => $slices) { | |||||
$results[$phid] = $slices->getRanges(); | |||||
} | |||||
return $results; | |||||
} | |||||
} | } |