/**
  * A method to test the compensatedPriorities() method.
  *
  * Requirements - NO PAST AD INFO
  * Test 1: Test with a zone of zero available impressions, and no linked ads, and
  *         ensure the returned ads array is empty, and the initial blank impression
  *         is one.
  * Test 2: Test with a zone of > zero available impressions, and no linked ads, and
  *         ensure the returned ads array is empty, and the initial blank impression
  *         is one.
  * Test 3: Test with a zone of zero available impressions, and linked ads with zero
  *         required impressions, and ensure the returned ads array has zero for all
  *         ad priorities, and the initial blank impression is one.
  * Test 4: Test with a zone of > zero available impressions, and linked ads with zero
  *         required impressions, and ensure the returned ads array has zero for all
  *         ad priorities, and the initial blank impression is one.
  * Test 5: Test with a zone of zero available impressions, and linked ads with > zero
  *         required impressions, and ensure the returned ads array has zero for all
  *         ad priorities, and the initial blank impression is one.
  * Test 6: Test with a zone of > zero available impressions, and linked ads with > zero
  *         required impressions, and ensure the returned priorities are correctly
  *         calculcated and scaled.
  *
  * Requirements - WITH PAST AD INFO
  * Test 7: Test with a zone of zero available impressions, and linked ads with zero
  *         required impressions, and ensure the returned ads array has zero for all
  *         ad priorities, and the initial blank impression is one.
  * Test 8: Test with a zone of > zero available impressions, and linked ads with zero
  *         required impressions, and ensure the returned ads array has zero for all
  *         ad priorities, and the initial blank impression is one.
  * Test 9: Test with a zone of zero available impressions, and linked ads with > zero
  *         required impressions, and ensure the returned ads array has zero for all
  *         ad priorities, and the initial blank impression is one.
  * Test 10: Test with a zone of > zero available impressions, and linked ads with > zero
  *          required impressions, but no past zone information, and ensure the returned
  *          priorities are correctly calculcated and scaled.
  * Test 11: Test with a zone of > zero available impressions, and linked ads with > zero
  *          required impressions, with past zone information, and ensure the returned
  *          priorities are correctly calculcated and scaled.
  * Test 12: Test with a factor that will be limited.
  * Test 13: Test with a factor that would be limited, but with deliveryLimitationChanged
  *          set and ensure that the priority factor is reset
  */
 function testCompensatedPriorities()
 {
     // Mock the OA_Dal_Maintenance_Priority class used in the constructor method
     $oDal = new $this->mockDal($this);
     $oServiceLocator =& OA_ServiceLocator::instance();
     $oServiceLocator->register('OA_Dal_Maintenance_Priority', $oDal);
     // Partially mock the OA_Maintenance_Priority_AdServer_Task_PriorityCompensation class
     $oPriorityCompensation = new PartialMock_OA_Maintenance_Priority_AdServer_Task_PriorityCompensation($this);
     $oPriorityCompensation->setReturnReference('_getDal', $oDal);
     $oPriorityCompensation->setReturnReference('_getOperationIntUtils', $oOperationInterval);
     $oPriorityCompensation->__construct();
     // Test 1
     $oZone = new OX_Maintenance_Priority_Zone(array('zoneid' => 1));
     $oZone->availableImpressions = 0;
     $result = $oPriorityCompensation->compensatedPriorities($oZone);
     $this->assertEqual(count($result['ads']), 0);
     $this->assertEqual($result['blank'], 1);
     // Test 2
     $oZone = new OX_Maintenance_Priority_Zone(array('zoneid' => 1));
     $oZone->availableImpressions = 100;
     $result = $oPriorityCompensation->compensatedPriorities($oZone);
     $this->assertEqual(count($result['ads']), 0);
     $this->assertEqual($result['blank'], 1);
     // Test 3
     $oZone = new OX_Maintenance_Priority_Zone(array('zoneid' => 1));
     $oZone->availableImpressions = 0;
     $oAd = new OA_Maintenance_Priority_Ad(array('ad_id' => 1));
     $oAd->requiredImpressions = 0;
     $oAd->requestedImpressions = 0;
     $oZone->addAdvert($oAd);
     $oAd = new OA_Maintenance_Priority_Ad(array('ad_id' => 2));
     $oAd->requiredImpressions = 0;
     $oAd->requestedImpressions = 0;
     $oZone->addAdvert($oAd);
     $oAd = new OA_Maintenance_Priority_Ad(array('ad_id' => 3));
     $oAd->requiredImpressions = 0;
     $oAd->requestedImpressions = 0;
     $oZone->addAdvert($oAd);
     $oAd = new OA_Maintenance_Priority_Ad(array('ad_id' => 9));
     $oAd->requiredImpressions = 0;
     $oAd->requestedImpressions = 0;
     $oZone->addAdvert($oAd);
     $result = $oPriorityCompensation->compensatedPriorities($oZone);
     $this->assertEqual(count($result['ads']), 4);
     $this->assertEqual($result['ads'][1]['ad_id'], 1);
     $this->assertEqual($result['ads'][1]['zone_id'], 1);
     $this->assertEqual($result['ads'][1]['priority'], 0);
     $this->assertEqual($result['ads'][1]['required_impressions'], 0);
     $this->assertEqual($result['ads'][1]['requested_impressions'], 0);
     $this->assertEqual($result['ads'][1]['priority_factor'], 1);
     $this->assertFalse($result['ads'][1]['priority_factor_limited']);
     $this->assertNull($result['ads'][1]['past_zone_traffic_fraction']);
     $this->assertEqual($result['ads'][2]['ad_id'], 2);
     $this->assertEqual($result['ads'][2]['zone_id'], 1);
     $this->assertEqual($result['ads'][2]['priority'], 0);
     $this->assertEqual($result['ads'][2]['required_impressions'], 0);
     $this->assertEqual($result['ads'][2]['requested_impressions'], 0);
     $this->assertEqual($result['ads'][2]['priority_factor'], 1);
     $this->assertFalse($result['ads'][2]['priority_factor_limited']);
     $this->assertNull($result['ads'][2]['past_zone_traffic_fraction']);
     $this->assertEqual($result['ads'][3]['ad_id'], 3);
     $this->assertEqual($result['ads'][3]['zone_id'], 1);
     $this->assertEqual($result['ads'][3]['priority'], 0);
     $this->assertEqual($result['ads'][3]['required_impressions'], 0);
     $this->assertEqual($result['ads'][3]['requested_impressions'], 0);
     $this->assertEqual($result['ads'][3]['priority_factor'], 1);
     $this->assertFalse($result['ads'][3]['priority_factor_limited']);
     $this->assertNull($result['ads'][3]['past_zone_traffic_fraction']);
     $this->assertEqual($result['ads'][9]['ad_id'], 9);
     $this->assertEqual($result['ads'][9]['zone_id'], 1);
     $this->assertEqual($result['ads'][9]['priority'], 0);
     $this->assertEqual($result['ads'][9]['required_impressions'], 0);
     $this->assertEqual($result['ads'][9]['requested_impressions'], 0);
     $this->assertEqual($result['ads'][9]['priority_factor'], 1);
     $this->assertFalse($result['ads'][9]['priority_factor_limited']);
     $this->assertNull($result['ads'][9]['past_zone_traffic_fraction']);
     $this->assertEqual($result['blank'], 1);
     // Test 4
     $oZone = new OX_Maintenance_Priority_Zone(array('zoneid' => 1));
     $oZone->availableImpressions = 100;
     $oAd = new OA_Maintenance_Priority_Ad(array('ad_id' => 1));
     $oAd->requiredImpressions = 0;
     $oAd->requestedImpressions = 0;
     $oZone->addAdvert($oAd);
     $oAd = new OA_Maintenance_Priority_Ad(array('ad_id' => 2));
     $oAd->requiredImpressions = 0;
     $oAd->requestedImpressions = 0;
     $oZone->addAdvert($oAd);
     $oAd = new OA_Maintenance_Priority_Ad(array('ad_id' => 3));
     $oAd->requiredImpressions = 0;
     $oAd->requestedImpressions = 0;
     $oZone->addAdvert($oAd);
     $oAd = new OA_Maintenance_Priority_Ad(array('ad_id' => 9));
     $oAd->requiredImpressions = 0;
     $oAd->requestedImpressions = 0;
     $oZone->addAdvert($oAd);
     $result = $oPriorityCompensation->compensatedPriorities($oZone);
     $this->assertEqual(count($result['ads']), 4);
     $this->assertEqual($result['ads'][1]['ad_id'], 1);
     $this->assertEqual($result['ads'][1]['zone_id'], 1);
     $this->assertEqual($result['ads'][1]['priority'], 0);
     $this->assertEqual($result['ads'][1]['required_impressions'], 0);
     $this->assertEqual($result['ads'][1]['requested_impressions'], 0);
     $this->assertEqual($result['ads'][1]['priority_factor'], 1);
     $this->assertFalse($result['ads'][1]['priority_factor_limited']);
     $this->assertNull($result['ads'][1]['past_zone_traffic_fraction']);
     $this->assertEqual($result['ads'][2]['ad_id'], 2);
     $this->assertEqual($result['ads'][2]['zone_id'], 1);
     $this->assertEqual($result['ads'][2]['priority'], 0);
     $this->assertEqual($result['ads'][2]['required_impressions'], 0);
     $this->assertEqual($result['ads'][2]['requested_impressions'], 0);
     $this->assertEqual($result['ads'][2]['priority_factor'], 1);
     $this->assertFalse($result['ads'][2]['priority_factor_limited']);
     $this->assertNull($result['ads'][2]['past_zone_traffic_fraction']);
     $this->assertEqual($result['ads'][3]['ad_id'], 3);
     $this->assertEqual($result['ads'][3]['zone_id'], 1);
     $this->assertEqual($result['ads'][3]['priority'], 0);
     $this->assertEqual($result['ads'][3]['required_impressions'], 0);
     $this->assertEqual($result['ads'][3]['requested_impressions'], 0);
     $this->assertEqual($result['ads'][3]['priority_factor'], 1);
     $this->assertFalse($result['ads'][3]['priority_factor_limited']);
     $this->assertNull($result['ads'][3]['past_zone_traffic_fraction']);
     $this->assertEqual($result['ads'][9]['ad_id'], 9);
     $this->assertEqual($result['ads'][9]['zone_id'], 1);
     $this->assertEqual($result['ads'][9]['priority'], 0);
     $this->assertEqual($result['ads'][9]['required_impressions'], 0);
     $this->assertEqual($result['ads'][9]['requested_impressions'], 0);
     $this->assertEqual($result['ads'][9]['priority_factor'], 1);
     $this->assertFalse($result['ads'][9]['priority_factor_limited']);
     $this->assertNull($result['ads'][9]['past_zone_traffic_fraction']);
     $this->assertEqual($result['blank'], 1);
     $this->assertEqual($result['blank'], 1);
     // Test 5
     $oZone = new OX_Maintenance_Priority_Zone(array('zoneid' => 1));
     $oZone->availableImpressions = 0;
     $oAd = new OA_Maintenance_Priority_Ad(array('ad_id' => 1));
     $oAd->requiredImpressions = 10;
     $oAd->requestedImpressions = 10;
     $oZone->addAdvert($oAd);
     $oAd = new OA_Maintenance_Priority_Ad(array('ad_id' => 2));
     $oAd->requiredImpressions = 20;
     $oAd->requestedImpressions = 20;
     $oZone->addAdvert($oAd);
     $oAd = new OA_Maintenance_Priority_Ad(array('ad_id' => 3));
     $oAd->requiredImpressions = 30;
     $oAd->requestedImpressions = 30;
     $oZone->addAdvert($oAd);
     $oAd = new OA_Maintenance_Priority_Ad(array('ad_id' => 9));
     $oAd->requiredImpressions = 40;
     $oAd->requestedImpressions = 40;
     $oZone->addAdvert($oAd);
     $result = $oPriorityCompensation->compensatedPriorities($oZone);
     $this->assertEqual(count($result['ads']), 4);
     $this->assertEqual($result['ads'][1]['ad_id'], 1);
     $this->assertEqual($result['ads'][1]['zone_id'], 1);
     $this->assertEqual($result['ads'][1]['priority'], 0);
     $this->assertEqual($result['ads'][1]['required_impressions'], 10);
     $this->assertEqual($result['ads'][1]['requested_impressions'], 10);
     $this->assertEqual($result['ads'][1]['priority_factor'], 1);
     $this->assertFalse($result['ads'][1]['priority_factor_limited']);
     $this->assertNull($result['ads'][1]['past_zone_traffic_fraction']);
     $this->assertEqual($result['ads'][2]['ad_id'], 2);
     $this->assertEqual($result['ads'][2]['zone_id'], 1);
     $this->assertEqual($result['ads'][2]['priority'], 0);
     $this->assertEqual($result['ads'][2]['required_impressions'], 20);
     $this->assertEqual($result['ads'][2]['requested_impressions'], 20);
     $this->assertEqual($result['ads'][2]['priority_factor'], 1);
     $this->assertFalse($result['ads'][2]['priority_factor_limited']);
     $this->assertNull($result['ads'][2]['past_zone_traffic_fraction']);
     $this->assertEqual($result['ads'][3]['ad_id'], 3);
     $this->assertEqual($result['ads'][3]['zone_id'], 1);
     $this->assertEqual($result['ads'][3]['priority'], 0);
     $this->assertEqual($result['ads'][3]['required_impressions'], 30);
     $this->assertEqual($result['ads'][3]['requested_impressions'], 30);
     $this->assertEqual($result['ads'][3]['priority_factor'], 1);
     $this->assertFalse($result['ads'][3]['priority_factor_limited']);
     $this->assertNull($result['ads'][3]['past_zone_traffic_fraction']);
     $this->assertEqual($result['ads'][9]['ad_id'], 9);
     $this->assertEqual($result['ads'][9]['zone_id'], 1);
     $this->assertEqual($result['ads'][9]['priority'], 0);
     $this->assertEqual($result['ads'][9]['required_impressions'], 40);
     $this->assertEqual($result['ads'][9]['requested_impressions'], 40);
     $this->assertEqual($result['ads'][9]['priority_factor'], 1);
     $this->assertFalse($result['ads'][9]['priority_factor_limited']);
     $this->assertNull($result['ads'][9]['past_zone_traffic_fraction']);
     $this->assertEqual($result['blank'], 1);
     // Test 6
     $oZone = new OX_Maintenance_Priority_Zone(array('zoneid' => 1));
     $oZone->availableImpressions = 100;
     $oAd = new OA_Maintenance_Priority_Ad(array('ad_id' => 1));
     $oAd->requiredImpressions = 10;
     $oAd->requestedImpressions = 10;
     $oZone->addAdvert($oAd);
     $oAd = new OA_Maintenance_Priority_Ad(array('ad_id' => 2));
     $oAd->requiredImpressions = 20;
     $oAd->requestedImpressions = 20;
     $oZone->addAdvert($oAd);
     $oAd = new OA_Maintenance_Priority_Ad(array('ad_id' => 3));
     $oAd->requiredImpressions = 30;
     $oAd->requestedImpressions = 30;
     $oZone->addAdvert($oAd);
     $oAd = new OA_Maintenance_Priority_Ad(array('ad_id' => 9));
     $oAd->requiredImpressions = 40;
     $oAd->requestedImpressions = 40;
     $oZone->addAdvert($oAd);
     $result = $oPriorityCompensation->compensatedPriorities($oZone);
     $this->assertEqual(count($result['ads']), 4);
     $this->assertEqual($result['ads'][1]['ad_id'], 1);
     $this->assertEqual($result['ads'][1]['zone_id'], 1);
     $this->assertEqual($result['ads'][1]['priority'], 0.1);
     $this->assertEqual($result['ads'][1]['required_impressions'], 10);
     $this->assertEqual($result['ads'][1]['requested_impressions'], 10);
     $this->assertEqual($result['ads'][1]['priority_factor'], 1);
     $this->assertFalse($result['ads'][1]['priority_factor_limited']);
     $this->assertNull($result['ads'][1]['past_zone_traffic_fraction']);
     $this->assertEqual($result['ads'][2]['ad_id'], 2);
     $this->assertEqual($result['ads'][2]['zone_id'], 1);
     $this->assertEqual($result['ads'][2]['priority'], 0.2);
     $this->assertEqual($result['ads'][2]['required_impressions'], 20);
     $this->assertEqual($result['ads'][2]['requested_impressions'], 20);
     $this->assertEqual($result['ads'][2]['priority_factor'], 1);
     $this->assertFalse($result['ads'][2]['priority_factor_limited']);
     $this->assertNull($result['ads'][2]['past_zone_traffic_fraction']);
     $this->assertEqual($result['ads'][3]['ad_id'], 3);
     $this->assertEqual($result['ads'][3]['zone_id'], 1);
     $this->assertEqual($result['ads'][3]['priority'], 0.3);
     $this->assertEqual($result['ads'][3]['required_impressions'], 30);
     $this->assertEqual($result['ads'][3]['requested_impressions'], 30);
     $this->assertEqual($result['ads'][3]['priority_factor'], 1);
     $this->assertFalse($result['ads'][3]['priority_factor_limited']);
     $this->assertNull($result['ads'][3]['past_zone_traffic_fraction']);
     $this->assertEqual($result['ads'][9]['ad_id'], 9);
     $this->assertEqual($result['ads'][9]['zone_id'], 1);
     $this->assertEqual($result['ads'][9]['priority'], 0.4);
     $this->assertEqual($result['ads'][9]['required_impressions'], 40);
     $this->assertEqual($result['ads'][9]['requested_impressions'], 40);
     $this->assertEqual($result['ads'][9]['priority_factor'], 1);
     $this->assertFalse($result['ads'][9]['priority_factor_limited']);
     $this->assertNull($result['ads'][9]['past_zone_traffic_fraction']);
     $this->assertEqual($result['blank'], 0);
     $oZone = new OX_Maintenance_Priority_Zone(array('zoneid' => 1));
     $oZone->availableImpressions = 200;
     $oAd = new OA_Maintenance_Priority_Ad(array('ad_id' => 1));
     $oAd->requiredImpressions = 10;
     $oAd->requestedImpressions = 10;
     $oZone->addAdvert($oAd);
     $oAd = new OA_Maintenance_Priority_Ad(array('ad_id' => 2));
     $oAd->requiredImpressions = 20;
     $oAd->requestedImpressions = 20;
     $oZone->addAdvert($oAd);
     $oAd = new OA_Maintenance_Priority_Ad(array('ad_id' => 3));
     $oAd->requiredImpressions = 30;
     $oAd->requestedImpressions = 30;
     $oZone->addAdvert($oAd);
     $oAd = new OA_Maintenance_Priority_Ad(array('ad_id' => 9));
     $oAd->requiredImpressions = 40;
     $oAd->requestedImpressions = 40;
     $oZone->addAdvert($oAd);
     $result = $oPriorityCompensation->compensatedPriorities($oZone);
     $this->assertEqual(count($result['ads']), 4);
     $this->assertEqual($result['ads'][1]['ad_id'], 1);
     $this->assertEqual($result['ads'][1]['zone_id'], 1);
     $this->assertEqual($result['ads'][1]['priority'], 0.05);
     $this->assertEqual($result['ads'][1]['required_impressions'], 10);
     $this->assertEqual($result['ads'][1]['requested_impressions'], 10);
     $this->assertEqual($result['ads'][1]['priority_factor'], 1);
     $this->assertFalse($result['ads'][1]['priority_factor_limited']);
     $this->assertNull($result['ads'][1]['past_zone_traffic_fraction']);
     $this->assertEqual($result['ads'][2]['ad_id'], 2);
     $this->assertEqual($result['ads'][2]['zone_id'], 1);
     $this->assertEqual($result['ads'][2]['priority'], 0.1);
     $this->assertEqual($result['ads'][2]['required_impressions'], 20);
     $this->assertEqual($result['ads'][2]['requested_impressions'], 20);
     $this->assertEqual($result['ads'][2]['priority_factor'], 1);
     $this->assertFalse($result['ads'][2]['priority_factor_limited']);
     $this->assertNull($result['ads'][2]['past_zone_traffic_fraction']);
     $this->assertEqual($result['ads'][3]['ad_id'], 3);
     $this->assertEqual($result['ads'][3]['zone_id'], 1);
     $this->assertEqual($result['ads'][3]['priority'], 0.15);
     $this->assertEqual($result['ads'][3]['required_impressions'], 30);
     $this->assertEqual($result['ads'][3]['requested_impressions'], 30);
     $this->assertEqual($result['ads'][3]['priority_factor'], 1);
     $this->assertFalse($result['ads'][3]['priority_factor_limited']);
     $this->assertNull($result['ads'][3]['past_zone_traffic_fraction']);
     $this->assertEqual($result['ads'][9]['ad_id'], 9);
     $this->assertEqual($result['ads'][9]['zone_id'], 1);
     $this->assertEqual($result['ads'][9]['priority'], 0.2);
     $this->assertEqual($result['ads'][9]['required_impressions'], 40);
     $this->assertEqual($result['ads'][9]['requested_impressions'], 40);
     $this->assertEqual($result['ads'][9]['priority_factor'], 1);
     $this->assertFalse($result['ads'][9]['priority_factor_limited']);
     $this->assertNull($result['ads'][9]['past_zone_traffic_fraction']);
     $this->assertEqual($result['blank'], 0.5);
     // Test 7
     $oZone = new OX_Maintenance_Priority_Zone(array('zoneid' => 1));
     $oZone->availableImpressions = 0;
     $oAd = new OA_Maintenance_Priority_Ad(array('ad_id' => 1));
     $oAd->requiredImpressions = 0;
     $oAd->requestedImpressions = 0;
     $oAd->pastRequiredImpressions = 0;
     $oAd->pastActualImpressions = 5;
     $oZone->addAdvert($oAd);
     $oAd = new OA_Maintenance_Priority_Ad(array('ad_id' => 2));
     $oAd->requiredImpressions = 0;
     $oAd->requestedImpressions = 0;
     $oAd->pastRequiredImpressions = 0;
     $oAd->pastActualImpressions = 5;
     $oZone->addAdvert($oAd);
     $oAd = new OA_Maintenance_Priority_Ad(array('ad_id' => 3));
     $oAd->requiredImpressions = 0;
     $oAd->requestedImpressions = 0;
     $oAd->pastRequiredImpressions = 0;
     $oAd->pastActualImpressions = 5;
     $oZone->addAdvert($oAd);
     $oAd = new OA_Maintenance_Priority_Ad(array('ad_id' => 9));
     $oAd->requiredImpressions = 0;
     $oAd->requestedImpressions = 0;
     $oAd->pastRequiredImpressions = 0;
     $oAd->pastActualImpressions = 5;
     $oZone->addAdvert($oAd);
     $result = $oPriorityCompensation->compensatedPriorities($oZone);
     $this->assertEqual(count($result['ads']), 4);
     $this->assertEqual($result['ads'][1]['ad_id'], 1);
     $this->assertEqual($result['ads'][1]['zone_id'], 1);
     $this->assertEqual($result['ads'][1]['priority'], 0);
     $this->assertEqual($result['ads'][1]['required_impressions'], 0);
     $this->assertEqual($result['ads'][1]['requested_impressions'], 0);
     $this->assertEqual($result['ads'][1]['priority_factor'], 1);
     $this->assertFalse($result['ads'][1]['priority_factor_limited']);
     $this->assertNull($result['ads'][1]['past_zone_traffic_fraction']);
     $this->assertEqual($result['ads'][2]['ad_id'], 2);
     $this->assertEqual($result['ads'][2]['zone_id'], 1);
     $this->assertEqual($result['ads'][2]['priority'], 0);
     $this->assertEqual($result['ads'][2]['required_impressions'], 0);
     $this->assertEqual($result['ads'][2]['requested_impressions'], 0);
     $this->assertEqual($result['ads'][2]['priority_factor'], 1);
     $this->assertFalse($result['ads'][2]['priority_factor_limited']);
     $this->assertNull($result['ads'][2]['past_zone_traffic_fraction']);
     $this->assertEqual($result['ads'][3]['ad_id'], 3);
     $this->assertEqual($result['ads'][3]['zone_id'], 1);
     $this->assertEqual($result['ads'][3]['priority'], 0);
     $this->assertEqual($result['ads'][3]['required_impressions'], 0);
     $this->assertEqual($result['ads'][3]['requested_impressions'], 0);
     $this->assertEqual($result['ads'][3]['priority_factor'], 1);
     $this->assertFalse($result['ads'][3]['priority_factor_limited']);
     $this->assertNull($result['ads'][3]['past_zone_traffic_fraction']);
     $this->assertEqual($result['ads'][9]['ad_id'], 9);
     $this->assertEqual($result['ads'][9]['zone_id'], 1);
     $this->assertEqual($result['ads'][9]['priority'], 0);
     $this->assertEqual($result['ads'][9]['required_impressions'], 0);
     $this->assertEqual($result['ads'][9]['requested_impressions'], 0);
     $this->assertEqual($result['ads'][9]['priority_factor'], 1);
     $this->assertFalse($result['ads'][9]['priority_factor_limited']);
     $this->assertNull($result['ads'][9]['past_zone_traffic_fraction']);
     $this->assertEqual($result['blank'], 1);
     // Test 8
     $oZone = new OX_Maintenance_Priority_Zone(array('zoneid' => 1));
     $oZone->availableImpressions = 100;
     $oAd = new OA_Maintenance_Priority_Ad(array('ad_id' => 1));
     $oAd->requiredImpressions = 0;
     $oAd->requestedImpressions = 0;
     $oAd->pastRequiredImpressions = 10;
     $oAd->pastActualImpressions = 0;
     $oZone->addAdvert($oAd);
     $oAd = new OA_Maintenance_Priority_Ad(array('ad_id' => 2));
     $oAd->requiredImpressions = 0;
     $oAd->requestedImpressions = 0;
     $oAd->pastRequiredImpressions = 10;
     $oAd->pastActualImpressions = 0;
     $oZone->addAdvert($oAd);
     $oAd = new OA_Maintenance_Priority_Ad(array('ad_id' => 3));
     $oAd->requiredImpressions = 0;
     $oAd->requestedImpressions = 0;
     $oAd->pastRequiredImpressions = 10;
     $oAd->pastActualImpressions = 0;
     $oZone->addAdvert($oAd);
     $oAd = new OA_Maintenance_Priority_Ad(array('ad_id' => 9));
     $oAd->requiredImpressions = 0;
     $oAd->requestedImpressions = 0;
     $oAd->pastRequiredImpressions = 10;
     $oAd->pastActualImpressions = 0;
     $oZone->addAdvert($oAd);
     $result = $oPriorityCompensation->compensatedPriorities($oZone);
     $this->assertEqual(count($result['ads']), 4);
     $this->assertEqual($result['ads'][1]['ad_id'], 1);
     $this->assertEqual($result['ads'][1]['zone_id'], 1);
     $this->assertEqual($result['ads'][1]['priority'], 0);
     $this->assertEqual($result['ads'][1]['required_impressions'], 0);
     $this->assertEqual($result['ads'][1]['requested_impressions'], 0);
     $this->assertEqual($result['ads'][1]['priority_factor'], 1);
     $this->assertFalse($result['ads'][1]['priority_factor_limited']);
     $this->assertNull($result['ads'][1]['past_zone_traffic_fraction']);
     $this->assertEqual($result['ads'][2]['ad_id'], 2);
     $this->assertEqual($result['ads'][2]['zone_id'], 1);
     $this->assertEqual($result['ads'][2]['priority'], 0);
     $this->assertEqual($result['ads'][2]['required_impressions'], 0);
     $this->assertEqual($result['ads'][2]['requested_impressions'], 0);
     $this->assertEqual($result['ads'][2]['priority_factor'], 1);
     $this->assertFalse($result['ads'][2]['priority_factor_limited']);
     $this->assertNull($result['ads'][2]['past_zone_traffic_fraction']);
     $this->assertEqual($result['ads'][3]['ad_id'], 3);
     $this->assertEqual($result['ads'][3]['zone_id'], 1);
     $this->assertEqual($result['ads'][3]['priority'], 0);
     $this->assertEqual($result['ads'][3]['required_impressions'], 0);
     $this->assertEqual($result['ads'][3]['requested_impressions'], 0);
     $this->assertEqual($result['ads'][3]['priority_factor'], 1);
     $this->assertFalse($result['ads'][3]['priority_factor_limited']);
     $this->assertNull($result['ads'][3]['past_zone_traffic_fraction']);
     $this->assertEqual($result['ads'][9]['ad_id'], 9);
     $this->assertEqual($result['ads'][9]['zone_id'], 1);
     $this->assertEqual($result['ads'][9]['priority'], 0);
     $this->assertEqual($result['ads'][9]['required_impressions'], 0);
     $this->assertEqual($result['ads'][9]['requested_impressions'], 0);
     $this->assertEqual($result['ads'][9]['priority_factor'], 1);
     $this->assertFalse($result['ads'][9]['priority_factor_limited']);
     $this->assertNull($result['ads'][9]['past_zone_traffic_fraction']);
     $this->assertEqual($result['blank'], 1);
     // Test 9
     $oZone = new OX_Maintenance_Priority_Zone(array('zoneid' => 1));
     $oZone->availableImpressions = 0;
     $oAd = new OA_Maintenance_Priority_Ad(array('ad_id' => 1));
     $oAd->requiredImpressions = 10;
     $oAd->requestedImpressions = 10;
     $oAd->pastRequiredImpressions = 10;
     $oAd->pastActualImpressions = 0;
     $oZone->addAdvert($oAd);
     $oAd = new OA_Maintenance_Priority_Ad(array('ad_id' => 2));
     $oAd->requiredImpressions = 20;
     $oAd->requestedImpressions = 20;
     $oAd->pastRequiredImpressions = 10;
     $oAd->pastActualImpressions = 0;
     $oZone->addAdvert($oAd);
     $oAd = new OA_Maintenance_Priority_Ad(array('ad_id' => 3));
     $oAd->requiredImpressions = 30;
     $oAd->requestedImpressions = 30;
     $oAd->pastRequiredImpressions = 10;
     $oAd->pastActualImpressions = 0;
     $oZone->addAdvert($oAd);
     $oAd = new OA_Maintenance_Priority_Ad(array('ad_id' => 9));
     $oAd->requiredImpressions = 40;
     $oAd->requestedImpressions = 40;
     $oAd->pastRequiredImpressions = 10;
     $oAd->pastActualImpressions = 0;
     $oZone->addAdvert($oAd);
     $result = $oPriorityCompensation->compensatedPriorities($oZone);
     $this->assertEqual(count($result['ads']), 4);
     $this->assertEqual($result['ads'][1]['ad_id'], 1);
     $this->assertEqual($result['ads'][1]['zone_id'], 1);
     $this->assertEqual($result['ads'][1]['priority'], 0);
     $this->assertEqual($result['ads'][1]['required_impressions'], 10);
     $this->assertEqual($result['ads'][1]['requested_impressions'], 10);
     $this->assertEqual($result['ads'][1]['priority_factor'], 1);
     $this->assertFalse($result['ads'][1]['priority_factor_limited']);
     $this->assertNull($result['ads'][1]['past_zone_traffic_fraction']);
     $this->assertEqual($result['ads'][2]['ad_id'], 2);
     $this->assertEqual($result['ads'][2]['zone_id'], 1);
     $this->assertEqual($result['ads'][2]['priority'], 0);
     $this->assertEqual($result['ads'][2]['required_impressions'], 20);
     $this->assertEqual($result['ads'][2]['requested_impressions'], 20);
     $this->assertEqual($result['ads'][2]['priority_factor'], 1);
     $this->assertFalse($result['ads'][2]['priority_factor_limited']);
     $this->assertNull($result['ads'][2]['past_zone_traffic_fraction']);
     $this->assertEqual($result['ads'][3]['ad_id'], 3);
     $this->assertEqual($result['ads'][3]['zone_id'], 1);
     $this->assertEqual($result['ads'][3]['priority'], 0);
     $this->assertEqual($result['ads'][3]['required_impressions'], 30);
     $this->assertEqual($result['ads'][3]['requested_impressions'], 30);
     $this->assertEqual($result['ads'][3]['priority_factor'], 1);
     $this->assertFalse($result['ads'][3]['priority_factor_limited']);
     $this->assertNull($result['ads'][3]['past_zone_traffic_fraction']);
     $this->assertEqual($result['ads'][9]['ad_id'], 9);
     $this->assertEqual($result['ads'][9]['zone_id'], 1);
     $this->assertEqual($result['ads'][9]['priority'], 0);
     $this->assertEqual($result['ads'][9]['required_impressions'], 40);
     $this->assertEqual($result['ads'][9]['requested_impressions'], 40);
     $this->assertEqual($result['ads'][9]['priority_factor'], 1);
     $this->assertFalse($result['ads'][9]['priority_factor_limited']);
     $this->assertNull($result['ads'][9]['past_zone_traffic_fraction']);
     $this->assertEqual($result['blank'], 1);
     // Test 10
     $oZone = new OX_Maintenance_Priority_Zone(array('zoneid' => 1));
     $oZone->availableImpressions = 100;
     $oAd = new OA_Maintenance_Priority_Ad(array('ad_id' => 1));
     $oAd->requiredImpressions = 10;
     $oAd->requestedImpressions = 10;
     $oAd->pastRequiredImpressions = 10;
     $oAd->pastRequestedImpressions = 10;
     $oAd->pastActualImpressions = 5;
     $oZone->addAdvert($oAd);
     $oAd = new OA_Maintenance_Priority_Ad(array('ad_id' => 2));
     $oAd->requiredImpressions = 20;
     $oAd->requestedImpressions = 20;
     $oAd->pastRequiredImpressions = 10;
     $oAd->pastRequestedImpressions = 10;
     $oAd->pastActualImpressions = 5;
     $oZone->addAdvert($oAd);
     $oAd = new OA_Maintenance_Priority_Ad(array('ad_id' => 3));
     $oAd->requiredImpressions = 30;
     $oAd->requestedImpressions = 30;
     $oAd->pastRequiredImpressions = 10;
     $oAd->pastRequestedImpressions = 10;
     $oAd->pastActualImpressions = 5;
     $oZone->addAdvert($oAd);
     $oAd = new OA_Maintenance_Priority_Ad(array('ad_id' => 9));
     $oAd->requiredImpressions = 40;
     $oAd->requestedImpressions = 40;
     $oAd->pastRequiredImpressions = 10;
     $oAd->pastRequestedImpressions = 10;
     $oAd->pastActualImpressions = 5;
     $oZone->addAdvert($oAd);
     $result = $oPriorityCompensation->compensatedPriorities($oZone);
     $this->assertEqual(count($result['ads']), 4);
     $this->assertEqual($result['ads'][1]['ad_id'], 1);
     $this->assertEqual($result['ads'][1]['zone_id'], 1);
     $this->assertEqual($result['ads'][1]['priority'], 0.1);
     $this->assertEqual($result['ads'][1]['required_impressions'], 10);
     $this->assertEqual($result['ads'][1]['requested_impressions'], 10);
     $this->assertEqual($result['ads'][1]['priority_factor'], 2);
     $this->assertFalse($result['ads'][1]['priority_factor_limited']);
     $this->assertEqual($result['ads'][2]['ad_id'], 2);
     $this->assertEqual($result['ads'][2]['zone_id'], 1);
     $this->assertEqual($result['ads'][2]['priority'], 0.2);
     $this->assertEqual($result['ads'][2]['required_impressions'], 20);
     $this->assertEqual($result['ads'][2]['requested_impressions'], 20);
     $this->assertEqual($result['ads'][2]['priority_factor'], 2);
     $this->assertFalse($result['ads'][2]['priority_factor_limited']);
     $this->assertEqual($result['ads'][3]['ad_id'], 3);
     $this->assertEqual($result['ads'][3]['zone_id'], 1);
     $this->assertEqual($result['ads'][3]['priority'], 0.3);
     $this->assertEqual($result['ads'][3]['required_impressions'], 30);
     $this->assertEqual($result['ads'][3]['requested_impressions'], 30);
     $this->assertEqual($result['ads'][3]['priority_factor'], 2);
     $this->assertFalse($result['ads'][3]['priority_factor_limited']);
     $this->assertEqual($result['ads'][9]['ad_id'], 9);
     $this->assertEqual($result['ads'][9]['zone_id'], 1);
     $this->assertEqual($result['ads'][9]['priority'], 0.4);
     $this->assertEqual($result['ads'][9]['required_impressions'], 40);
     $this->assertEqual($result['ads'][9]['requested_impressions'], 40);
     $this->assertEqual($result['ads'][9]['priority_factor'], 2);
     $this->assertFalse($result['ads'][9]['priority_factor_limited']);
     $this->assertEqual($result['blank'], 0);
     $oZone = new OX_Maintenance_Priority_Zone(array('zoneid' => 1));
     $oZone->availableImpressions = 400;
     $oAd = new OA_Maintenance_Priority_Ad(array('ad_id' => 1));
     $oAd->requiredImpressions = 10;
     $oAd->requestedImpressions = 10;
     $oAd->pastRequiredImpressions = 10;
     $oAd->pastRequestedImpressions = 10;
     $oAd->pastActualImpressions = 5;
     $oZone->addAdvert($oAd);
     $oAd = new OA_Maintenance_Priority_Ad(array('ad_id' => 2));
     $oAd->requiredImpressions = 20;
     $oAd->requestedImpressions = 20;
     $oAd->pastRequiredImpressions = 10;
     $oAd->pastRequestedImpressions = 10;
     $oAd->pastActualImpressions = 5;
     $oZone->addAdvert($oAd);
     $oAd = new OA_Maintenance_Priority_Ad(array('ad_id' => 3));
     $oAd->requiredImpressions = 30;
     $oAd->requestedImpressions = 30;
     $oAd->pastRequiredImpressions = 10;
     $oAd->pastRequestedImpressions = 10;
     $oAd->pastActualImpressions = 5;
     $oZone->addAdvert($oAd);
     $oAd = new OA_Maintenance_Priority_Ad(array('ad_id' => 9));
     $oAd->requiredImpressions = 40;
     $oAd->requestedImpressions = 40;
     $oAd->pastRequiredImpressions = 10;
     $oAd->pastRequestedImpressions = 10;
     $oAd->pastActualImpressions = 5;
     $oZone->addAdvert($oAd);
     $result = $oPriorityCompensation->compensatedPriorities($oZone);
     $this->assertEqual(count($result['ads']), 4);
     $this->assertEqual($result['ads'][1]['ad_id'], 1);
     $this->assertEqual($result['ads'][1]['zone_id'], 1);
     $this->assertEqual($result['ads'][1]['priority'], 0.025);
     $this->assertEqual($result['ads'][1]['required_impressions'], 10);
     $this->assertEqual($result['ads'][1]['requested_impressions'], 10);
     $this->assertEqual($result['ads'][1]['priority_factor'], 2);
     $this->assertFalse($result['ads'][1]['priority_factor_limited']);
     $this->assertEqual($result['ads'][2]['ad_id'], 2);
     $this->assertEqual($result['ads'][2]['zone_id'], 1);
     $this->assertEqual($result['ads'][2]['priority'], 0.05);
     $this->assertEqual($result['ads'][2]['required_impressions'], 20);
     $this->assertEqual($result['ads'][2]['requested_impressions'], 20);
     $this->assertEqual($result['ads'][2]['priority_factor'], 2);
     $this->assertFalse($result['ads'][2]['priority_factor_limited']);
     $this->assertEqual($result['ads'][3]['ad_id'], 3);
     $this->assertEqual($result['ads'][3]['zone_id'], 1);
     $this->assertEqual($result['ads'][3]['priority'], 0.075);
     $this->assertEqual($result['ads'][3]['required_impressions'], 30);
     $this->assertEqual($result['ads'][3]['requested_impressions'], 30);
     $this->assertEqual($result['ads'][3]['priority_factor'], 2);
     $this->assertFalse($result['ads'][3]['priority_factor_limited']);
     $this->assertEqual($result['ads'][9]['ad_id'], 9);
     $this->assertEqual($result['ads'][9]['zone_id'], 1);
     $this->assertEqual($result['ads'][9]['priority'], 0.1);
     $this->assertEqual($result['ads'][9]['required_impressions'], 40);
     $this->assertEqual($result['ads'][9]['requested_impressions'], 40);
     $this->assertEqual($result['ads'][9]['priority_factor'], 2);
     $this->assertFalse($result['ads'][9]['priority_factor_limited']);
     $this->assertEqual($result['blank'], 0.75);
     // Test 11
     $oZone = new OX_Maintenance_Priority_Zone(array('zoneid' => 1));
     $oZone->availableImpressions = 100;
     $oAd = new OA_Maintenance_Priority_Ad(array('ad_id' => 1));
     $oAd->requiredImpressions = 10;
     $oAd->requestedImpressions = 10;
     $oAd->pastRequiredImpressions = 10;
     $oAd->pastRequestedImpressions = 10;
     $oAd->pastActualImpressions = 5;
     $oZone->addAdvert($oAd);
     $oAd = new OA_Maintenance_Priority_Ad(array('ad_id' => 2));
     $oAd->requiredImpressions = 20;
     $oAd->requestedImpressions = 20;
     $oAd->pastRequiredImpressions = 20;
     $oAd->pastRequestedImpressions = 20;
     $oAd->pastActualImpressions = 10;
     $oZone->addAdvert($oAd);
     $oAd = new OA_Maintenance_Priority_Ad(array('ad_id' => 3));
     $oAd->requiredImpressions = 30;
     $oAd->requestedImpressions = 30;
     $oAd->pastRequiredImpressions = 30;
     $oAd->pastRequestedImpressions = 30;
     $oAd->pastActualImpressions = 15;
     $oZone->addAdvert($oAd);
     $oAd = new OA_Maintenance_Priority_Ad(array('ad_id' => 9));
     $oAd->requiredImpressions = 40;
     $oAd->requestedImpressions = 40;
     $oAd->pastRequiredImpressions = 40;
     $oAd->pastRequestedImpressions = 40;
     $oAd->pastActualImpressions = 20;
     $oZone->addAdvert($oAd);
     $result = $oPriorityCompensation->compensatedPriorities($oZone);
     $this->assertEqual(count($result['ads']), 4);
     $this->assertEqual($result['ads'][1]['ad_id'], 1);
     $this->assertEqual($result['ads'][1]['zone_id'], 1);
     $this->assertEqual($result['ads'][1]['priority'], 0.1);
     $this->assertEqual($result['ads'][1]['required_impressions'], 10);
     $this->assertEqual($result['ads'][1]['requested_impressions'], 10);
     $this->assertEqual($result['ads'][1]['priority_factor'], 2);
     $this->assertFalse($result['ads'][1]['priority_factor_limited']);
     $this->assertEqual($result['ads'][1]['past_zone_traffic_fraction'], 0.05);
     $this->assertEqual($result['ads'][2]['ad_id'], 2);
     $this->assertEqual($result['ads'][2]['zone_id'], 1);
     $this->assertEqual($result['ads'][2]['priority'], 0.2);
     $this->assertEqual($result['ads'][2]['required_impressions'], 20);
     $this->assertEqual($result['ads'][2]['requested_impressions'], 20);
     $this->assertEqual($result['ads'][2]['priority_factor'], 2);
     $this->assertFalse($result['ads'][2]['priority_factor_limited']);
     $this->assertEqual($result['ads'][2]['past_zone_traffic_fraction'], 0.1);
     $this->assertEqual($result['ads'][3]['ad_id'], 3);
     $this->assertEqual($result['ads'][3]['zone_id'], 1);
     $this->assertEqual($result['ads'][3]['priority'], 0.3);
     $this->assertEqual($result['ads'][3]['required_impressions'], 30);
     $this->assertEqual($result['ads'][3]['requested_impressions'], 30);
     $this->assertEqual($result['ads'][3]['priority_factor'], 2);
     $this->assertFalse($result['ads'][3]['priority_factor_limited']);
     $this->assertEqual($result['ads'][3]['past_zone_traffic_fraction'], 0.15);
     $this->assertEqual($result['ads'][9]['ad_id'], 9);
     $this->assertEqual($result['ads'][9]['zone_id'], 1);
     $this->assertEqual($result['ads'][9]['priority'], 0.4);
     $this->assertEqual($result['ads'][9]['required_impressions'], 40);
     $this->assertEqual($result['ads'][9]['requested_impressions'], 40);
     $this->assertEqual($result['ads'][9]['priority_factor'], 2);
     $this->assertFalse($result['ads'][9]['priority_factor_limited']);
     $this->assertEqual($result['ads'][9]['past_zone_traffic_fraction'], 0.2);
     $this->assertEqual($result['blank'], 0);
     $oZone = new OX_Maintenance_Priority_Zone(array('zoneid' => 1));
     $oZone->availableImpressions = 400;
     $oAd = new OA_Maintenance_Priority_Ad(array('ad_id' => 1));
     $oAd->requiredImpressions = 10;
     $oAd->requestedImpressions = 10;
     $oAd->pastRequiredImpressions = 10;
     $oAd->pastRequestedImpressions = 10;
     $oAd->pastActualImpressions = 5;
     $oZone->addAdvert($oAd);
     $oAd = new OA_Maintenance_Priority_Ad(array('ad_id' => 2));
     $oAd->requiredImpressions = 20;
     $oAd->requestedImpressions = 20;
     $oAd->pastRequiredImpressions = 10;
     $oAd->pastRequestedImpressions = 10;
     $oAd->pastActualImpressions = 5;
     $oZone->addAdvert($oAd);
     $oAd = new OA_Maintenance_Priority_Ad(array('ad_id' => 3));
     $oAd->requiredImpressions = 30;
     $oAd->requestedImpressions = 30;
     $oAd->pastRequiredImpressions = 10;
     $oAd->pastRequestedImpressions = 10;
     $oAd->pastActualImpressions = 5;
     $oZone->addAdvert($oAd);
     $oAd = new OA_Maintenance_Priority_Ad(array('ad_id' => 9));
     $oAd->requiredImpressions = 40;
     $oAd->requestedImpressions = 40;
     $oAd->pastRequiredImpressions = 10;
     $oAd->pastRequestedImpressions = 10;
     $oAd->pastActualImpressions = 5;
     $oZone->addAdvert($oAd);
     $result = $oPriorityCompensation->compensatedPriorities($oZone);
     $this->assertEqual(count($result['ads']), 4);
     $this->assertEqual($result['ads'][1]['ad_id'], 1);
     $this->assertEqual($result['ads'][1]['zone_id'], 1);
     $this->assertEqual($result['ads'][1]['priority'], 0.025);
     $this->assertEqual($result['ads'][1]['required_impressions'], 10);
     $this->assertEqual($result['ads'][1]['requested_impressions'], 10);
     $this->assertEqual($result['ads'][1]['priority_factor'], 2);
     $this->assertFalse($result['ads'][1]['priority_factor_limited']);
     $this->assertEqual($result['ads'][2]['ad_id'], 2);
     $this->assertEqual($result['ads'][2]['zone_id'], 1);
     $this->assertEqual($result['ads'][2]['priority'], 0.05);
     $this->assertEqual($result['ads'][2]['required_impressions'], 20);
     $this->assertEqual($result['ads'][2]['requested_impressions'], 20);
     $this->assertEqual($result['ads'][2]['priority_factor'], 2);
     $this->assertFalse($result['ads'][2]['priority_factor_limited']);
     $this->assertEqual($result['ads'][3]['ad_id'], 3);
     $this->assertEqual($result['ads'][3]['zone_id'], 1);
     $this->assertEqual($result['ads'][3]['priority'], 0.075);
     $this->assertEqual($result['ads'][3]['required_impressions'], 30);
     $this->assertEqual($result['ads'][3]['requested_impressions'], 30);
     $this->assertEqual($result['ads'][3]['priority_factor'], 2);
     $this->assertFalse($result['ads'][3]['priority_factor_limited']);
     $this->assertEqual($result['ads'][9]['ad_id'], 9);
     $this->assertEqual($result['ads'][9]['zone_id'], 1);
     $this->assertEqual($result['ads'][9]['priority'], 0.1);
     $this->assertEqual($result['ads'][9]['required_impressions'], 40);
     $this->assertEqual($result['ads'][9]['requested_impressions'], 40);
     $this->assertEqual($result['ads'][9]['priority_factor'], 2);
     $this->assertFalse($result['ads'][9]['priority_factor_limited']);
     $this->assertEqual($result['blank'], 0.75);
     // Test 12
     $value = 1.2 * mt_getrandmax();
     $oZone = new OX_Maintenance_Priority_Zone(array('zoneid' => 1));
     $oZone->availableImpressions = $value;
     $oAd = new OA_Maintenance_Priority_Ad(array('ad_id' => 1));
     $oAd->requiredImpressions = $value;
     $oAd->requestedImpressions = $value;
     $oAd->pastRequiredImpressions = $value;
     $oAd->pastRequestedImpressions = $value;
     $oAd->pastActualImpressions = 1;
     $oAd->pastZoneTrafficFraction = 0;
     $oAd->pastAdZonePriorityFactor = 1;
     $oZone->addAdvert($oAd);
     $result = $oPriorityCompensation->compensatedPriorities($oZone);
     $this->assertEqual(count($result['ads']), 1);
     $this->assertEqual($result['ads'][1]['ad_id'], 1);
     $this->assertEqual($result['ads'][1]['zone_id'], 1);
     $this->assertEqual($result['ads'][1]['priority'], 1);
     $this->assertEqual($result['ads'][1]['required_impressions'], $value);
     $this->assertEqual($result['ads'][1]['requested_impressions'], $value);
     $this->assertEqual($result['ads'][1]['priority_factor'], 1 + (mt_getrandmax() - 1) / 2);
     $this->assertTrue($result['ads'][1]['priority_factor_limited']);
     $this->assertEqual($result['ads'][1]['past_zone_traffic_fraction'], 1 / $value);
     $this->assertEqual($result['blank'], 0);
     // Test 13
     $value = 1.2 * mt_getrandmax();
     $oZone = new OX_Maintenance_Priority_Zone(array('zoneid' => 1));
     $oZone->availableImpressions = $value;
     $oAd = new OA_Maintenance_Priority_Ad(array('ad_id' => 1));
     $oAd->deliveryLimitationChanged = true;
     $oAd->requiredImpressions = $value;
     $oAd->requestedImpressions = $value;
     $oAd->pastRequiredImpressions = $value;
     $oAd->pastRequestedImpressions = $value;
     $oAd->pastActualImpressions = 1;
     $oAd->pastZoneTrafficFraction = 0;
     $oAd->pastAdZonePriorityFactor = 1;
     $oZone->addAdvert($oAd);
     $result = $oPriorityCompensation->compensatedPriorities($oZone);
     $this->assertEqual(count($result['ads']), 1);
     $this->assertEqual($result['ads'][1]['ad_id'], 1);
     $this->assertEqual($result['ads'][1]['zone_id'], 1);
     $this->assertEqual($result['ads'][1]['priority'], 1);
     $this->assertEqual($result['ads'][1]['required_impressions'], $value);
     $this->assertEqual($result['ads'][1]['requested_impressions'], $value);
     $this->assertEqual($result['ads'][1]['priority_factor'], 1);
     $this->assertFalse($result['ads'][1]['priority_factor_limited']);
     $this->assertNull($result['ads'][1]['past_zone_traffic_fraction']);
     $this->assertEqual($result['blank'], 0);
 }
 /**
  * Method to test the getPreviousAdDeliveryInfo method.
  *
  * Requirements:
  * Test 1:   Test with no Date registered in the service locator, ensure false returned.
  * Test 2:   Test with a Date registered in the service locator, no data in the database,
  *           and ensure no data is returned.
  *
  * Test 3:   Test with ONLY impression data, but NOT in the previous OI, and ensure no
  *           data is returned.
  * Test 4:   Test with ONLY impression data, in the previous OI, and ensure that ONLY
  *           data relating to the impressions is returned.
  * Test 5:   Test with ONLY impression data, in the 2nd previous OI, and ensure that
  *           no data is returned.
  * Test 5a:  Re-test with ONLY impression data, in the 2nd previous OI, but pass in the
  *           ad/zone pair, and ensure that no data is returned.
  *
  * Test 6:   Test with ONLY prioritisation data, but NOT in the previous OI, and
  *           ensure no data is returned.
  * Test 7:   Test with ONLY prioritisation data, in the previous OI, and ensure that
  *           ONLY data relating to the prioritisation is returned.
  * Test 8:   Test with ONLY prioritisation data, in the 2nd previous OI, and ensure no
  *           data is returned.
  * Test 8a:  Re-test with ONLY prioritisation data, in the 2nd previous OI, but pass in
  *           the ad/zone pair, and ensure that ONLY data relating to the prioritisation
  *           is returned.
  *
  * Test 9:   Test with BOTH impressions data NOT in the previous OI, and prioritisation
  *           data NOT in the previous OI, and ensure no data is returned.
  * Test 10:  Test with BOTH impressions data NOT in the previous OI, and prioritisation
  *           data in the previous OI, and ensure ONLY data relating to the prioritisation
  *           is returned.
  * Test 11:  Test with BOTH impressions data NOT in the previous OI, and prioritisation
  *           data in the 2nd previous OI, and ensure no data is returned.
  * Test 11a: Re-test with BOTH impressions data NOT in the previous OI, and prioritisation
  *           data in the 2nd previous OI, but pass in the ad/zone pair, and ensure that
  *           ONLY data relating to the prioritisation is returned.
  *
  * Test 12:  Test with BOTH impressions data in the 2nd previous OI, and prioritisation
  *           data NOT in the previous OI, and ensure no data is returned.
  * Test 13:  Test with BOTH impressions data in the 2nd previous OI, and prioritisation
  *           data in the previous OI, and ensure ONLY data relating to the prioritisation
  *           is returned.
  * Test 14:  Test with BOTH impressions data in the 2nd previous OI, and prioritisation
  *           data in the 2nd previous OI, and ensure no data is returned.
  * Test 14a: Re-test with BOTH impressions data in the 2nd previous OI, and prioritisation
  *           data in the 2nd previous OI, but pass in the ad/zone pair, and ensure that
  *           all data is returned.
  *
  * Test 15:  Test with BOTH impressions data in the previous OI, and prioritisation
  *           data NOT in the previous OI, and ensure that ONLY data relating to the
  *           impressions is returned.
  * Test 16:  Test with BOTH impressions data in the previous OI, and prioritisation
  *           data in the previous OI, and ensure that all data is returned.
  * Test 17:  Test with BOTH impressions data in the previous OI, and prioritisation
  *           data in the 2nd previous OI, and ensure that all data is returned.
  * Test 17a: Re-test with BOTH impressions data in the previous OI, and prioritisation
  *           data in the 2nd previous OI, but pass in the ad/zone pair, and ensure that
  *           all data is returned.
  *
  * Test 18:  Perform a more realistic test, with data for the ads/zones in various
  *           past OIs, and including some ads with multiple prioritisation data
  *           per OI, as well as ads with no prioritisation data in some OIs, and
  *           ensure that the correct values are returned for each one. Test that:
  *           - Only ad/zones that delivered in the previous operation interval,
  *             or were requested to deliver in the previous operation interval,
  *             but didn't (i.e. not in other intervals) are returned in the
  *             results.
  *           - That prioritisation information where just ONE set of data exists
  *             is returned correctly.
  *           - That prioritisation information where multiple sets of INDENTICAL
  *             data exists is returned correctly.
  *           - That prioritisation information where multiple sets of DIFFERENT
  *             data exists is returned correctly.
  *           - That prioritisation information from older sets of data is
  *             returned correctly.
  * Test 18a: Re-test, but also include ad/zone pairs that are in/not in the above
  *           set of data, and ensure that these ad/zone pairs are also included
  *           in the results.
  */
 function testGetPreviousAdDeliveryInfo()
 {
     $conf = $GLOBALS['_MAX']['CONF'];
     $oDbh =& OA_DB::singleton();
     $oMaxDalMaintenance = new OA_Dal_Maintenance_Priority();
     $aEmptyZoneAdArray = array();
     $aAdParams = array('ad_id' => 1, 'active' => 't', 'type' => 'sql', 'weight' => 1);
     $oAd = new OA_Maintenance_Priority_Ad($aAdParams);
     $oZone = new OX_Maintenance_Priority_Zone(array('zoneid' => 1));
     $oZone->addAdvert($oAd);
     $aZoneAdArray = array($oZone->id => $oZone);
     // Test 1
     $oServiceLocator =& OA_ServiceLocator::instance();
     $oServiceLocator->remove('now');
     $result =& $oMaxDalMaintenance->getPreviousAdDeliveryInfo($aEmptyZoneAdArray);
     $this->assertFalse($result);
     // Test 2
     $oDate = new Date();
     $oServiceLocator->register('now', $oDate);
     $result =& $oMaxDalMaintenance->getPreviousAdDeliveryInfo($aEmptyZoneAdArray);
     $this->assertEqual(count($result), 0);
     // Test 3
     $operationIntervalID = OX_OperationInterval::convertDateToOperationIntervalID($oDate);
     $aDates = OX_OperationInterval::convertDateToOperationIntervalStartAndEndDates($oDate);
     $oNow = new Date();
     $bannerId1 = $this->_insertCampaignBanner();
     $aData = array($conf['maintenance']['operationInterval'], $operationIntervalID, $aDates['start']->format('%Y-%m-%d %H:%M:%S'), $aDates['end']->format('%Y-%m-%d %H:%M:%S'), $aDates['start']->format('%Y-%m-%d'), $aDates['start']->format('%H'), $bannerId1, 0, 1, 1, $oNow->format('%Y-%m-%d %H:%M:%S'));
     $idDia = $this->_insertDataIntermediateAd($aData);
     $result =& $oMaxDalMaintenance->getPreviousAdDeliveryInfo($aEmptyZoneAdArray);
     $this->assertEqual(count($result), 0);
     $oDate =& $oServiceLocator->get('now');
     DataGenerator::cleanUp();
     $oServiceLocator->register('now', $oDate);
     // Test 4
     $operationIntervalID = OX_OperationInterval::convertDateToOperationIntervalID($oDate);
     $previousOperationIntervalID = OX_OperationInterval::previousOperationIntervalID($operationIntervalID);
     $aDates = OX_OperationInterval::convertDateToPreviousOperationIntervalStartAndEndDates($oDate);
     $bannerId1 = $this->_insertCampaignBanner();
     $aData = array($conf['maintenance']['operationInterval'], $previousOperationIntervalID, $aDates['start']->format('%Y-%m-%d %H:%M:%S'), $aDates['end']->format('%Y-%m-%d %H:%M:%S'), $aDates['start']->format('%Y-%m-%d'), $aDates['start']->format('%H'), $bannerId1, 0, 1, 1, $oNow->format('%Y-%m-%d %H:%M:%S'));
     $idDia = $this->_insertDataIntermediateAd($aData);
     $result =& $oMaxDalMaintenance->getPreviousAdDeliveryInfo($aEmptyZoneAdArray);
     $this->assertEqual(count($result), 1);
     $this->assertEqual($result[1][1]['ad_id'], $bannerId1);
     $this->assertEqual($result[1][1]['zone_id'], 1);
     $this->assertNull($result[1][1]['required_impressions']);
     $this->assertNull($result[1][1]['requested_impressions']);
     $this->assertNull($result[1][1]['priority_factor']);
     $this->assertNull($result[1][1]['past_zone_traffic_fraction']);
     $this->assertEqual($result[1][1]['impressions'], 1);
     $oDate =& $oServiceLocator->get('now');
     DataGenerator::cleanUp();
     $oServiceLocator->register('now', $oDate);
     // Test 5, 5a
     $operationIntervalID = OX_OperationInterval::convertDateToOperationIntervalID($oDate);
     $previousOperationIntervalID = OX_OperationInterval::previousOperationIntervalID($operationIntervalID);
     $previousOperationIntervalID = OX_OperationInterval::previousOperationIntervalID($previousOperationIntervalID);
     $aDates = OX_OperationInterval::convertDateToPreviousOperationIntervalStartAndEndDates($oDate);
     $aDates = OX_OperationInterval::convertDateToPreviousOperationIntervalStartAndEndDates($aDates['start']);
     $bannerId1 = $this->_insertCampaignBanner();
     $aData = array($conf['maintenance']['operationInterval'], $previousOperationIntervalID, $aDates['start']->format('%Y-%m-%d %H:%M:%S'), $aDates['end']->format('%Y-%m-%d %H:%M:%S'), $aDates['start']->format('%Y-%m-%d'), $aDates['start']->format('%H'), $bannerId1, 0, 1, 1, $oNow->format('%Y-%m-%d %H:%M:%S'));
     $idDia = $this->_insertDataIntermediateAd($aData);
     $result =& $oMaxDalMaintenance->getPreviousAdDeliveryInfo($aEmptyZoneAdArray);
     $this->assertEqual(count($result), 0);
     $result =& $oMaxDalMaintenance->getPreviousAdDeliveryInfo($aZoneAdArray);
     $this->assertEqual(count($result), 0);
     $oDate =& $oServiceLocator->get('now');
     DataGenerator::cleanUp();
     $oServiceLocator->register('now', $oDate);
     // Test 6
     $operationIntervalID = OX_OperationInterval::convertDateToOperationIntervalID($oDate);
     $aDates = OX_OperationInterval::convertDateToOperationIntervalStartAndEndDates($oDate);
     $bannerId1 = $this->_insertCampaignBanner();
     $aData = array($conf['maintenance']['operationInterval'], $operationIntervalID, $aDates['start']->format('%Y-%m-%d %H:%M:%S'), $aDates['end']->format('%Y-%m-%d %H:%M:%S'), $bannerId1, 1, 1, 1, 0.1, 0.5, 0.99, $oNow->format('%Y-%m-%d %H:%M:%S'), 0);
     $this->_insertDataSummaryAdZoneAssoc($aData);
     $result =& $oMaxDalMaintenance->getPreviousAdDeliveryInfo($aEmptyZoneAdArray);
     $this->assertEqual(count($result), 0);
     $oDate =& $oServiceLocator->get('now');
     DataGenerator::cleanUp();
     $oServiceLocator->register('now', $oDate);
     // Test 7
     $operationIntervalID = OX_OperationInterval::convertDateToOperationIntervalID($oDate);
     $previousOperationIntervalID = OX_OperationInterval::previousOperationIntervalID($operationIntervalID);
     $aDates = OX_OperationInterval::convertDateToPreviousOperationIntervalStartAndEndDates($oDate);
     $bannerId1 = $this->_insertCampaignBanner();
     $aData = array($conf['maintenance']['operationInterval'], $previousOperationIntervalID, $aDates['start']->format('%Y-%m-%d %H:%M:%S'), $aDates['end']->format('%Y-%m-%d %H:%M:%S'), $bannerId1, 1, 1, 1, 0, 0.5, 0.99, $oNow->format('%Y-%m-%d %H:%M:%S'), 0);
     $this->_insertDataSummaryAdZoneAssoc($aData);
     $result =& $oMaxDalMaintenance->getPreviousAdDeliveryInfo($aEmptyZoneAdArray);
     $this->assertEqual(count($result), 1);
     $this->assertEqual($result[1][1]['ad_id'], $bannerId1);
     $this->assertEqual($result[1][1]['zone_id'], 1);
     $this->assertEqual($result[1][1]['required_impressions'], 1);
     $this->assertEqual($result[1][1]['requested_impressions'], 1);
     $this->assertEqual($result[1][1]['priority_factor'], 0.5);
     $this->assertEqual($result[1][1]['past_zone_traffic_fraction'], 0.99);
     $this->assertNull($result[1][1]['impressions']);
     $oDate =& $oServiceLocator->get('now');
     DataGenerator::cleanUp();
     $oServiceLocator->register('now', $oDate);
     // Test 8, 8a
     $operationIntervalID = OX_OperationInterval::convertDateToOperationIntervalID($oDate);
     $previousOperationIntervalID = OX_OperationInterval::previousOperationIntervalID($operationIntervalID);
     $previousOperationIntervalID = OX_OperationInterval::previousOperationIntervalID($previousOperationIntervalID);
     $aDates = OX_OperationInterval::convertDateToPreviousOperationIntervalStartAndEndDates($oDate);
     $aDates = OX_OperationInterval::convertDateToPreviousOperationIntervalStartAndEndDates($aDates['start']);
     $bannerId1 = $this->_insertCampaignBanner();
     $aData = array($conf['maintenance']['operationInterval'], $previousOperationIntervalID, $aDates['start']->format('%Y-%m-%d %H:%M:%S'), $aDates['end']->format('%Y-%m-%d %H:%M:%S'), $bannerId1, 1, 1, 1, 0, 0.5, 0.99, $oNow->format('%Y-%m-%d %H:%M:%S'), 0);
     $this->_insertDataSummaryAdZoneAssoc($aData);
     $result =& $oMaxDalMaintenance->getPreviousAdDeliveryInfo($aEmptyZoneAdArray);
     $this->assertEqual(count($result), 0);
     $result =& $oMaxDalMaintenance->getPreviousAdDeliveryInfo($aZoneAdArray);
     $this->assertEqual(count($result), 1);
     $this->assertEqual($result[1][1]['ad_id'], $bannerId1);
     $this->assertEqual($result[1][1]['zone_id'], 1);
     $this->assertEqual($result[1][1]['required_impressions'], 1);
     $this->assertEqual($result[1][1]['requested_impressions'], 1);
     $this->assertEqual($result[1][1]['priority_factor'], 0.5);
     $this->assertEqual($result[1][1]['past_zone_traffic_fraction'], 0.99);
     $this->assertNull($result[1][1]['impressions']);
     $oDate =& $oServiceLocator->get('now');
     DataGenerator::cleanUp();
     $oServiceLocator->register('now', $oDate);
     // Test 9
     $operationIntervalID = OX_OperationInterval::convertDateToOperationIntervalID($oDate);
     $aDates = OX_OperationInterval::convertDateToOperationIntervalStartAndEndDates($oDate);
     $bannerId1 = $this->_insertCampaignBanner();
     $aData = array($conf['maintenance']['operationInterval'], $operationIntervalID, $aDates['start']->format('%Y-%m-%d %H:%M:%S'), $aDates['end']->format('%Y-%m-%d %H:%M:%S'), $aDates['start']->format('%Y-%m-%d'), $aDates['start']->format('%H'), $bannerId1, 0, 1, 1, $oNow->format('%Y-%m-%d %H:%M:%S'));
     $idDia = $this->_insertDataIntermediateAd($aData);
     $operationIntervalID = OX_OperationInterval::convertDateToOperationIntervalID($oDate);
     $aDates = OX_OperationInterval::convertDateToOperationIntervalStartAndEndDates($oDate);
     $aData = array($conf['maintenance']['operationInterval'], $operationIntervalID, $aDates['start']->format('%Y-%m-%d %H:%M:%S'), $aDates['end']->format('%Y-%m-%d %H:%M:%S'), $bannerId1, 1, 1, 1, 0, 0.5, 0.99, $oNow->format('%Y-%m-%d %H:%M:%S'), 0);
     $this->_insertDataSummaryAdZoneAssoc($aData);
     $result =& $oMaxDalMaintenance->getPreviousAdDeliveryInfo($aEmptyZoneAdArray);
     $this->assertEqual(count($result), 0);
     $oDate =& $oServiceLocator->get('now');
     DataGenerator::cleanUp();
     $oServiceLocator->register('now', $oDate);
     // Test 10
     $operationIntervalID = OX_OperationInterval::convertDateToOperationIntervalID($oDate);
     $aDates = OX_OperationInterval::convertDateToOperationIntervalStartAndEndDates($oDate);
     $bannerId1 = $this->_insertCampaignBanner();
     $aData = array($conf['maintenance']['operationInterval'], $operationIntervalID, $aDates['start']->format('%Y-%m-%d %H:%M:%S'), $aDates['end']->format('%Y-%m-%d %H:%M:%S'), $aDates['start']->format('%Y-%m-%d'), $aDates['start']->format('%H'), $bannerId1, 0, 1, 1, $oNow->format('%Y-%m-%d %H:%M:%S'));
     $idDia = $this->_insertDataIntermediateAd($aData);
     $operationIntervalID = OX_OperationInterval::convertDateToOperationIntervalID($oDate);
     $previousOperationIntervalID = OX_OperationInterval::previousOperationIntervalID($operationIntervalID);
     $aDates = OX_OperationInterval::convertDateToPreviousOperationIntervalStartAndEndDates($oDate);
     $aData = array($conf['maintenance']['operationInterval'], $previousOperationIntervalID, $aDates['start']->format('%Y-%m-%d %H:%M:%S'), $aDates['end']->format('%Y-%m-%d %H:%M:%S'), $bannerId1, 1, 1, 1, 0, 0.5, 0.99, $oNow->format('%Y-%m-%d %H:%M:%S'), 0);
     $this->_insertDataSummaryAdZoneAssoc($aData);
     $result =& $oMaxDalMaintenance->getPreviousAdDeliveryInfo($aEmptyZoneAdArray);
     $this->assertEqual(count($result), 1);
     $this->assertEqual($result[1][1]['ad_id'], $bannerId1);
     $this->assertEqual($result[1][1]['zone_id'], 1);
     $this->assertEqual($result[1][1]['required_impressions'], 1);
     $this->assertEqual($result[1][1]['requested_impressions'], 1);
     $this->assertEqual($result[1][1]['priority_factor'], 0.5);
     $this->assertEqual($result[1][1]['past_zone_traffic_fraction'], 0.99);
     $this->assertNull($result[1][1]['impressions']);
     $oDate =& $oServiceLocator->get('now');
     DataGenerator::cleanUp();
     $oServiceLocator->register('now', $oDate);
     // Test 11, 11a
     $operationIntervalID = OX_OperationInterval::convertDateToOperationIntervalID($oDate);
     $aDates = OX_OperationInterval::convertDateToOperationIntervalStartAndEndDates($oDate);
     $bannerId1 = $this->_insertCampaignBanner();
     $aData = array($conf['maintenance']['operationInterval'], $operationIntervalID, $aDates['start']->format('%Y-%m-%d %H:%M:%S'), $aDates['end']->format('%Y-%m-%d %H:%M:%S'), $aDates['start']->format('%Y-%m-%d'), $aDates['start']->format('%H'), $bannerId1, 0, 1, 1, $oNow->format('%Y-%m-%d %H:%M:%S'));
     $idDia = $this->_insertDataIntermediateAd($aData);
     $operationIntervalID = OX_OperationInterval::convertDateToOperationIntervalID($oDate);
     $previousOperationIntervalID = OX_OperationInterval::previousOperationIntervalID($operationIntervalID);
     $previousOperationIntervalID = OX_OperationInterval::previousOperationIntervalID($previousOperationIntervalID);
     $aDates = OX_OperationInterval::convertDateToPreviousOperationIntervalStartAndEndDates($oDate);
     $aDates = OX_OperationInterval::convertDateToPreviousOperationIntervalStartAndEndDates($aDates['start']);
     $aData = array($conf['maintenance']['operationInterval'], $previousOperationIntervalID, $aDates['start']->format('%Y-%m-%d %H:%M:%S'), $aDates['end']->format('%Y-%m-%d %H:%M:%S'), $bannerId1, 1, 1, 1, 0, 0.5, 0.99, $oNow->format('%Y-%m-%d %H:%M:%S'), 0);
     $this->_insertDataSummaryAdZoneAssoc($aData);
     $result =& $oMaxDalMaintenance->getPreviousAdDeliveryInfo($aEmptyZoneAdArray);
     $this->assertEqual(count($result), 0);
     $result =& $oMaxDalMaintenance->getPreviousAdDeliveryInfo($aZoneAdArray);
     $this->assertEqual(count($result), 1);
     $this->assertEqual($result[1][1]['ad_id'], $bannerId1);
     $this->assertEqual($result[1][1]['zone_id'], 1);
     $this->assertEqual($result[1][1]['required_impressions'], 1);
     $this->assertEqual($result[1][1]['requested_impressions'], 1);
     $this->assertEqual($result[1][1]['priority_factor'], 0.5);
     $this->assertEqual($result[1][1]['past_zone_traffic_fraction'], 0.99);
     $this->assertNull($result[1][1]['impressions']);
     $oDate =& $oServiceLocator->get('now');
     DataGenerator::cleanUp();
     $oServiceLocator->register('now', $oDate);
     // Test 12
     $operationIntervalID = OX_OperationInterval::convertDateToOperationIntervalID($oDate);
     $previousOperationIntervalID = OX_OperationInterval::previousOperationIntervalID($operationIntervalID);
     $previousOperationIntervalID = OX_OperationInterval::previousOperationIntervalID($previousOperationIntervalID);
     $aDates = OX_OperationInterval::convertDateToPreviousOperationIntervalStartAndEndDates($oDate);
     $aDates = OX_OperationInterval::convertDateToPreviousOperationIntervalStartAndEndDates($aDates['start']);
     $bannerId1 = $this->_insertCampaignBanner();
     $aData = array($conf['maintenance']['operationInterval'], $previousOperationIntervalID, $aDates['start']->format('%Y-%m-%d %H:%M:%S'), $aDates['end']->format('%Y-%m-%d %H:%M:%S'), $aDates['start']->format('%Y-%m-%d'), $aDates['start']->format('%H'), $bannerId1, 0, 1, 1, $oNow->format('%Y-%m-%d %H:%M:%S'));
     $idDia = $this->_insertDataIntermediateAd($aData);
     $operationIntervalID = OX_OperationInterval::convertDateToOperationIntervalID($oDate);
     $aDates = OX_OperationInterval::convertDateToOperationIntervalStartAndEndDates($oDate);
     $aData = array($conf['maintenance']['operationInterval'], $operationIntervalID, $aDates['start']->format('%Y-%m-%d %H:%M:%S'), $aDates['end']->format('%Y-%m-%d %H:%M:%S'), $bannerId1, 1, 1, 1, 0, 0.5, 0.99, $oNow->format('%Y-%m-%d %H:%M:%S'), 0);
     $this->_insertDataSummaryAdZoneAssoc($aData);
     $result =& $oMaxDalMaintenance->getPreviousAdDeliveryInfo($aEmptyZoneAdArray);
     $this->assertEqual(count($result), 0);
     $oDate =& $oServiceLocator->get('now');
     DataGenerator::cleanUp();
     $oServiceLocator->register('now', $oDate);
     // Test 13
     $operationIntervalID = OX_OperationInterval::convertDateToOperationIntervalID($oDate);
     $previousOperationIntervalID = OX_OperationInterval::previousOperationIntervalID($operationIntervalID);
     $previousOperationIntervalID = OX_OperationInterval::previousOperationIntervalID($previousOperationIntervalID);
     $aDates = OX_OperationInterval::convertDateToPreviousOperationIntervalStartAndEndDates($oDate);
     $aDates = OX_OperationInterval::convertDateToPreviousOperationIntervalStartAndEndDates($aDates['start']);
     $bannerId1 = $this->_insertCampaignBanner();
     $aData = array($conf['maintenance']['operationInterval'], $previousOperationIntervalID, $aDates['start']->format('%Y-%m-%d %H:%M:%S'), $aDates['end']->format('%Y-%m-%d %H:%M:%S'), $aDates['start']->format('%Y-%m-%d'), $aDates['start']->format('%H'), $bannerId1, 0, 1, 1, $oNow->format('%Y-%m-%d %H:%M:%S'));
     $idDia = $this->_insertDataIntermediateAd($aData);
     $operationIntervalID = OX_OperationInterval::convertDateToOperationIntervalID($oDate);
     $previousOperationIntervalID = OX_OperationInterval::previousOperationIntervalID($operationIntervalID);
     $aDates = OX_OperationInterval::convertDateToPreviousOperationIntervalStartAndEndDates($oDate);
     $aData = array($conf['maintenance']['operationInterval'], $previousOperationIntervalID, $aDates['start']->format('%Y-%m-%d %H:%M:%S'), $aDates['end']->format('%Y-%m-%d %H:%M:%S'), $bannerId1, 1, 1, 1, 0, 0.5, 0.99, $oNow->format('%Y-%m-%d %H:%M:%S'), 0);
     $this->_insertDataSummaryAdZoneAssoc($aData);
     $result =& $oMaxDalMaintenance->getPreviousAdDeliveryInfo($aEmptyZoneAdArray);
     $this->assertEqual(count($result), 1);
     $this->assertEqual($result[1][1]['ad_id'], $bannerId1);
     $this->assertEqual($result[1][1]['zone_id'], 1);
     $this->assertEqual($result[1][1]['required_impressions'], 1);
     $this->assertEqual($result[1][1]['requested_impressions'], 1);
     $this->assertEqual($result[1][1]['priority_factor'], 0.5);
     $this->assertEqual($result[1][1]['past_zone_traffic_fraction'], 0.99);
     $this->assertNull($result[1][1]['impressions']);
     $oDate =& $oServiceLocator->get('now');
     DataGenerator::cleanUp();
     $oServiceLocator->register('now', $oDate);
     // Test 14, 14a
     $operationIntervalID = OX_OperationInterval::convertDateToOperationIntervalID($oDate);
     $previousOperationIntervalID = OX_OperationInterval::previousOperationIntervalID($operationIntervalID);
     $previousOperationIntervalID = OX_OperationInterval::previousOperationIntervalID($previousOperationIntervalID);
     $aDates = OX_OperationInterval::convertDateToPreviousOperationIntervalStartAndEndDates($oDate);
     $aDates = OX_OperationInterval::convertDateToPreviousOperationIntervalStartAndEndDates($aDates['start']);
     $bannerId1 = $this->_insertCampaignBanner();
     $aData = array($conf['maintenance']['operationInterval'], $previousOperationIntervalID, $aDates['start']->format('%Y-%m-%d %H:%M:%S'), $aDates['end']->format('%Y-%m-%d %H:%M:%S'), $aDates['start']->format('%Y-%m-%d'), $aDates['start']->format('%H'), $bannerId1, 0, 1, 1, $oNow->format('%Y-%m-%d %H:%M:%S'));
     $idDia = $this->_insertDataIntermediateAd($aData);
     $operationIntervalID = OX_OperationInterval::convertDateToOperationIntervalID($oDate);
     $previousOperationIntervalID = OX_OperationInterval::previousOperationIntervalID($operationIntervalID);
     $previousOperationIntervalID = OX_OperationInterval::previousOperationIntervalID($previousOperationIntervalID);
     $aDates = OX_OperationInterval::convertDateToPreviousOperationIntervalStartAndEndDates($oDate);
     $aDates = OX_OperationInterval::convertDateToPreviousOperationIntervalStartAndEndDates($aDates['start']);
     $aData = array($conf['maintenance']['operationInterval'], $previousOperationIntervalID, $aDates['start']->format('%Y-%m-%d %H:%M:%S'), $aDates['end']->format('%Y-%m-%d %H:%M:%S'), $bannerId1, 1, 1, 1, 0, 0.5, 0.99, $oNow->format('%Y-%m-%d %H:%M:%S'), 0);
     $this->_insertDataSummaryAdZoneAssoc($aData);
     $result =& $oMaxDalMaintenance->getPreviousAdDeliveryInfo($aEmptyZoneAdArray);
     $this->assertEqual(count($result), 0);
     $result =& $oMaxDalMaintenance->getPreviousAdDeliveryInfo($aZoneAdArray);
     $this->assertEqual(count($result), 1);
     $this->assertEqual($result[1][1]['ad_id'], $bannerId1);
     $this->assertEqual($result[1][1]['zone_id'], 1);
     $this->assertEqual($result[1][1]['required_impressions'], 1);
     $this->assertEqual($result[1][1]['requested_impressions'], 1);
     $this->assertEqual($result[1][1]['priority_factor'], 0.5);
     $this->assertEqual($result[1][1]['past_zone_traffic_fraction'], 0.99);
     $this->assertEqual($result[1][1]['impressions'], 1);
     $oDate =& $oServiceLocator->get('now');
     DataGenerator::cleanUp();
     $oServiceLocator->register('now', $oDate);
     // Test 15
     $operationIntervalID = OX_OperationInterval::convertDateToOperationIntervalID($oDate);
     $previousOperationIntervalID = OX_OperationInterval::previousOperationIntervalID($operationIntervalID);
     $aDates = OX_OperationInterval::convertDateToPreviousOperationIntervalStartAndEndDates($oDate);
     $bannerId1 = $this->_insertCampaignBanner();
     $aData = array($conf['maintenance']['operationInterval'], $previousOperationIntervalID, $aDates['start']->format('%Y-%m-%d %H:%M:%S'), $aDates['end']->format('%Y-%m-%d %H:%M:%S'), $aDates['start']->format('%Y-%m-%d'), $aDates['start']->format('%H'), $bannerId1, 0, 1, 1, $oNow->format('%Y-%m-%d %H:%M:%S'));
     $idDia = $this->_insertDataIntermediateAd($aData);
     $operationIntervalID = OX_OperationInterval::convertDateToOperationIntervalID($oDate);
     $aDates = OX_OperationInterval::convertDateToOperationIntervalStartAndEndDates($oDate);
     $aData = array($conf['maintenance']['operationInterval'], $operationIntervalID, $aDates['start']->format('%Y-%m-%d %H:%M:%S'), $aDates['end']->format('%Y-%m-%d %H:%M:%S'), $bannerId1, 1, 1, 1, 0, 0.5, 0.99, $oNow->format('%Y-%m-%d %H:%M:%S'), 0);
     $this->_insertDataSummaryAdZoneAssoc($aData);
     $result =& $oMaxDalMaintenance->getPreviousAdDeliveryInfo($aEmptyZoneAdArray);
     $this->assertEqual(count($result), 1);
     $this->assertEqual($result[1][1]['ad_id'], $bannerId1);
     $this->assertEqual($result[1][1]['zone_id'], 1);
     $this->assertNull($result[1][1]['required_impressions']);
     $this->assertNull($result[1][1]['requested_impressions']);
     $this->assertNull($result[1][1]['priority_factor']);
     $this->assertNull($result[1][1]['past_zone_traffic_fraction']);
     $this->assertEqual($result[1][1]['impressions'], 1);
     $oDate =& $oServiceLocator->get('now');
     DataGenerator::cleanUp();
     $oServiceLocator->register('now', $oDate);
     // Test 16
     $operationIntervalID = OX_OperationInterval::convertDateToOperationIntervalID($oDate);
     $previousOperationIntervalID = OX_OperationInterval::previousOperationIntervalID($operationIntervalID);
     $aDates = OX_OperationInterval::convertDateToPreviousOperationIntervalStartAndEndDates($oDate);
     $bannerId1 = $this->_insertCampaignBanner();
     $aData = array($conf['maintenance']['operationInterval'], $previousOperationIntervalID, $aDates['start']->format('%Y-%m-%d %H:%M:%S'), $aDates['end']->format('%Y-%m-%d %H:%M:%S'), $aDates['start']->format('%Y-%m-%d'), $aDates['start']->format('%H'), $bannerId1, 0, 1, 1, $oNow->format('%Y-%m-%d %H:%M:%S'));
     $idDia = $this->_insertDataIntermediateAd($aData);
     $operationIntervalID = OX_OperationInterval::convertDateToOperationIntervalID($oDate);
     $previousOperationIntervalID = OX_OperationInterval::previousOperationIntervalID($operationIntervalID);
     $aDates = OX_OperationInterval::convertDateToPreviousOperationIntervalStartAndEndDates($oDate);
     $aData = array($conf['maintenance']['operationInterval'], $previousOperationIntervalID, $aDates['start']->format('%Y-%m-%d %H:%M:%S'), $aDates['end']->format('%Y-%m-%d %H:%M:%S'), $bannerId1, 1, 1, 1, 0, 0.5, 0.99, $oNow->format('%Y-%m-%d %H:%M:%S'), 0);
     $this->_insertDataSummaryAdZoneAssoc($aData);
     $result =& $oMaxDalMaintenance->getPreviousAdDeliveryInfo($aEmptyZoneAdArray);
     $this->assertEqual(count($result), 1);
     $this->assertEqual($result[1][1]['ad_id'], $bannerId1);
     $this->assertEqual($result[1][1]['zone_id'], 1);
     $this->assertEqual($result[1][1]['required_impressions'], 1);
     $this->assertEqual($result[1][1]['requested_impressions'], 1);
     $this->assertEqual($result[1][1]['priority_factor'], 0.5);
     $this->assertEqual($result[1][1]['past_zone_traffic_fraction'], 0.99);
     $this->assertEqual($result[1][1]['impressions'], 1);
     $oDate =& $oServiceLocator->get('now');
     DataGenerator::cleanUp();
     $oServiceLocator->register('now', $oDate);
     // Test 17, 17a
     $operationIntervalID = OX_OperationInterval::convertDateToOperationIntervalID($oDate);
     $previousOperationIntervalID = OX_OperationInterval::previousOperationIntervalID($operationIntervalID);
     $aDates = OX_OperationInterval::convertDateToPreviousOperationIntervalStartAndEndDates($oDate);
     $bannerId1 = $this->_insertCampaignBanner();
     $aData = array($conf['maintenance']['operationInterval'], $previousOperationIntervalID, $aDates['start']->format('%Y-%m-%d %H:%M:%S'), $aDates['end']->format('%Y-%m-%d %H:%M:%S'), $aDates['start']->format('%Y-%m-%d'), $aDates['start']->format('%H'), $bannerId1, 0, 1, 1, $oNow->format('%Y-%m-%d %H:%M:%S'));
     $idDia = $this->_insertDataIntermediateAd($aData);
     $operationIntervalID = OX_OperationInterval::convertDateToOperationIntervalID($oDate);
     $previousOperationIntervalID = OX_OperationInterval::previousOperationIntervalID($operationIntervalID);
     $previousOperationIntervalID = OX_OperationInterval::previousOperationIntervalID($previousOperationIntervalID);
     $aDates = OX_OperationInterval::convertDateToPreviousOperationIntervalStartAndEndDates($oDate);
     $aDates = OX_OperationInterval::convertDateToPreviousOperationIntervalStartAndEndDates($aDates['start']);
     $aData = array($conf['maintenance']['operationInterval'], $previousOperationIntervalID, $aDates['start']->format('%Y-%m-%d %H:%M:%S'), $aDates['end']->format('%Y-%m-%d %H:%M:%S'), $bannerId1, 1, 1, 1, 0, 0.5, 0.99, $oNow->format('%Y-%m-%d %H:%M:%S'), 0);
     $this->_insertDataSummaryAdZoneAssoc($aData);
     $result =& $oMaxDalMaintenance->getPreviousAdDeliveryInfo($aEmptyZoneAdArray);
     $this->assertEqual(count($result), 1);
     $this->assertEqual($result[1][1]['ad_id'], $bannerId1);
     $this->assertEqual($result[1][1]['zone_id'], 1);
     $this->assertEqual($result[1][1]['required_impressions'], 1);
     $this->assertEqual($result[1][1]['requested_impressions'], 1);
     $this->assertEqual($result[1][1]['priority_factor'], 0.5);
     $this->assertEqual($result[1][1]['past_zone_traffic_fraction'], 0.99);
     $this->assertEqual($result[1][1]['impressions'], 1);
     $result =& $oMaxDalMaintenance->getPreviousAdDeliveryInfo($aZoneAdArray);
     $this->assertEqual(count($result), 1);
     $this->assertEqual($result[1][1]['ad_id'], $bannerId1);
     $this->assertEqual($result[1][1]['zone_id'], 1);
     $this->assertEqual($result[1][1]['required_impressions'], 1);
     $this->assertEqual($result[1][1]['requested_impressions'], 1);
     $this->assertEqual($result[1][1]['priority_factor'], 0.5);
     $this->assertEqual($result[1][1]['past_zone_traffic_fraction'], 0.99);
     $this->assertEqual($result[1][1]['impressions'], 1);
     $oDate =& $oServiceLocator->get('now');
     DataGenerator::cleanUp();
     $oServiceLocator->register('now', $oDate);
     // Test 18
     $operationIntervalID = OX_OperationInterval::convertDateToOperationIntervalID($oDate);
     $previousOperationIntervalID = OX_OperationInterval::previousOperationIntervalID($operationIntervalID);
     $aDates = OX_OperationInterval::convertDateToPreviousOperationIntervalStartAndEndDates($oDate);
     $bannerId1 = $this->_insertCampaignBanner();
     $aData = array($conf['maintenance']['operationInterval'], $previousOperationIntervalID, $aDates['start']->format('%Y-%m-%d %H:%M:%S'), $aDates['end']->format('%Y-%m-%d %H:%M:%S'), $aDates['start']->format('%Y-%m-%d'), $aDates['start']->format('%H'), $bannerId1, 0, 1, 1, $oNow->format('%Y-%m-%d %H:%M:%S'));
     $idDia = $this->_insertDataIntermediateAd($aData);
     $aData = array($conf['maintenance']['operationInterval'], $previousOperationIntervalID, $aDates['start']->format('%Y-%m-%d %H:%M:%S'), $aDates['end']->format('%Y-%m-%d %H:%M:%S'), $aDates['start']->format('%Y-%m-%d'), $aDates['start']->format('%H'), $bannerId1, 0, 2, 1, $oNow->format('%Y-%m-%d %H:%M:%S'));
     $idDia = $this->_insertDataIntermediateAd($aData);
     $bannerId2 = $this->_insertCampaignBanner();
     $aData = array($conf['maintenance']['operationInterval'], $previousOperationIntervalID, $aDates['start']->format('%Y-%m-%d %H:%M:%S'), $aDates['end']->format('%Y-%m-%d %H:%M:%S'), $aDates['start']->format('%Y-%m-%d'), $aDates['start']->format('%H'), $bannerId2, 0, 3, 2, $oNow->format('%Y-%m-%d %H:%M:%S'));
     $idDia = $this->_insertDataIntermediateAd($aData);
     $aData = array($conf['maintenance']['operationInterval'], $previousOperationIntervalID, $aDates['start']->format('%Y-%m-%d %H:%M:%S'), $aDates['end']->format('%Y-%m-%d %H:%M:%S'), $aDates['start']->format('%Y-%m-%d'), $aDates['start']->format('%H'), $bannerId2, 0, 4, 2, $oNow->format('%Y-%m-%d %H:%M:%S'));
     $idDia = $this->_insertDataIntermediateAd($aData);
     $bannerId3 = $this->_insertCampaignBanner();
     $aData = array($conf['maintenance']['operationInterval'], $previousOperationIntervalID, $aDates['start']->format('%Y-%m-%d %H:%M:%S'), $aDates['end']->format('%Y-%m-%d %H:%M:%S'), $aDates['start']->format('%Y-%m-%d'), $aDates['start']->format('%H'), $bannerId3, 0, 5, 5, $oNow->format('%Y-%m-%d %H:%M:%S'));
     $idDia = $this->_insertDataIntermediateAd($aData);
     $operationIntervalID = OX_OperationInterval::convertDateToOperationIntervalID($oDate);
     $previousOperationIntervalID = OX_OperationInterval::previousOperationIntervalID($operationIntervalID);
     $previousOperationIntervalID = OX_OperationInterval::previousOperationIntervalID($previousOperationIntervalID);
     $aDates = OX_OperationInterval::convertDateToPreviousOperationIntervalStartAndEndDates($oDate);
     $aDates = OX_OperationInterval::convertDateToPreviousOperationIntervalStartAndEndDates($aDates['start']);
     $aData = array($conf['maintenance']['operationInterval'], $previousOperationIntervalID, $aDates['start']->format('%Y-%m-%d %H:%M:%S'), $aDates['end']->format('%Y-%m-%d %H:%M:%S'), $aDates['start']->format('%Y-%m-%d'), $aDates['start']->format('%H'), $bannerId1, 0, 1, 100, $oNow->format('%Y-%m-%d %H:%M:%S'));
     $idDia = $this->_insertDataIntermediateAd($aData);
     $aData = array($conf['maintenance']['operationInterval'], $previousOperationIntervalID, $aDates['start']->format('%Y-%m-%d %H:%M:%S'), $aDates['end']->format('%Y-%m-%d %H:%M:%S'), $aDates['start']->format('%Y-%m-%d'), $aDates['start']->format('%H'), $bannerId1, 0, 2, 100, $oNow->format('%Y-%m-%d %H:%M:%S'));
     $idDia = $this->_insertDataIntermediateAd($aData);
     $aData = array($conf['maintenance']['operationInterval'], $previousOperationIntervalID, $aDates['start']->format('%Y-%m-%d %H:%M:%S'), $aDates['end']->format('%Y-%m-%d %H:%M:%S'), $aDates['start']->format('%Y-%m-%d'), $aDates['start']->format('%H'), $bannerId2, 0, 3, 200, $oNow->format('%Y-%m-%d %H:%M:%S'));
     $idDia = $this->_insertDataIntermediateAd($aData);
     $aData = array($conf['maintenance']['operationInterval'], $previousOperationIntervalID, $aDates['start']->format('%Y-%m-%d %H:%M:%S'), $aDates['end']->format('%Y-%m-%d %H:%M:%S'), $aDates['start']->format('%Y-%m-%d'), $aDates['start']->format('%H'), $bannerId2, 0, 4, 200, $oNow->format('%Y-%m-%d %H:%M:%S'));
     $idDia = $this->_insertDataIntermediateAd($aData);
     $aData = array($conf['maintenance']['operationInterval'], $previousOperationIntervalID, $aDates['start']->format('%Y-%m-%d %H:%M:%S'), $aDates['end']->format('%Y-%m-%d %H:%M:%S'), $aDates['start']->format('%Y-%m-%d'), $aDates['start']->format('%H'), $bannerId3, 0, 5, 500, $oNow->format('%Y-%m-%d %H:%M:%S'));
     $idDia = $this->_insertDataIntermediateAd($aData);
     $aData = array($conf['maintenance']['operationInterval'], $previousOperationIntervalID, $aDates['start']->format('%Y-%m-%d %H:%M:%S'), $aDates['end']->format('%Y-%m-%d %H:%M:%S'), $aDates['start']->format('%Y-%m-%d'), $aDates['start']->format('%H'), 4, 0, 5, 500, $oNow->format('%Y-%m-%d %H:%M:%S'));
     $idDia = $this->_insertDataIntermediateAd($aData);
     $operationIntervalID = OX_OperationInterval::convertDateToOperationIntervalID($oDate);
     $previousOperationIntervalID = OX_OperationInterval::previousOperationIntervalID($operationIntervalID);
     $aDates = OX_OperationInterval::convertDateToPreviousOperationIntervalStartAndEndDates($oDate);
     $oSpecialDate = new Date($aDates['end']);
     $oSpecialDate->addSeconds(1);
     $aData = array($conf['maintenance']['operationInterval'], $previousOperationIntervalID, $aDates['start']->format('%Y-%m-%d %H:%M:%S'), $aDates['end']->format('%Y-%m-%d %H:%M:%S'), $bannerId1, 2, 10, 10, 0, 0.5, 0.99, $oNow->format('%Y-%m-%d %H:%M:%S'), 0);
     $this->_insertDataSummaryAdZoneAssoc($aData);
     $aData = array($conf['maintenance']['operationInterval'], $previousOperationIntervalID, $aDates['start']->format('%Y-%m-%d %H:%M:%S'), $aDates['end']->format('%Y-%m-%d %H:%M:%S'), 9, 9, 59, 59, 0, 95, 0.995, $oNow->format('%Y-%m-%d %H:%M:%S'), 0);
     $this->_insertDataSummaryAdZoneAssoc($aData);
     $aData = array($conf['maintenance']['operationInterval'], $previousOperationIntervalID, $aDates['start']->format('%Y-%m-%d %H:%M:%S'), $aDates['end']->format('%Y-%m-%d %H:%M:%S'), $bannerId2, 3, 30, 30, 0, 0.4, 0.5, $aDates['start']->format('%Y-%m-%d %H:%M:%S'), 0, $aDates['end']->format('%Y-%m-%d %H:30:00'));
     $this->_insertDataSummaryAdZoneAssoc($aData);
     $aData = array($conf['maintenance']['operationInterval'], $previousOperationIntervalID, $aDates['start']->format('%Y-%m-%d %H:%M:%S'), $aDates['end']->format('%Y-%m-%d %H:%M:%S'), $bannerId2, 3, 30, 30, 0, 0.4, 0.5, $aDates['start']->format('%Y-%m-%d %H:30:00'), 0, $aDates['end']->format('%Y-%m-%d %H:%M:%S'));
     $this->_insertDataSummaryAdZoneAssoc($aData);
     $aData = array($conf['maintenance']['operationInterval'], $previousOperationIntervalID, $aDates['start']->format('%Y-%m-%d %H:%M:%S'), $aDates['end']->format('%Y-%m-%d %H:%M:%S'), $bannerId2, 4, 10, 10, 0, 0.4, 0.5, $aDates['start']->format('%Y-%m-%d %H:%M:%S'), 0, $aDates['end']->format('%Y-%m-%d %H:30:00'));
     $this->_insertDataSummaryAdZoneAssoc($aData);
     $aData = array($conf['maintenance']['operationInterval'], $previousOperationIntervalID, $aDates['start']->format('%Y-%m-%d %H:%M:%S'), $aDates['end']->format('%Y-%m-%d %H:%M:%S'), $bannerId2, 4, 20, 20, 0, 0.8, 0.5, $aDates['start']->format('%Y-%m-%d %H:30:00'), 0, $oSpecialDate->format('%Y-%m-%d %H:%M:%S'));
     $this->_insertDataSummaryAdZoneAssoc($aData);
     $operationIntervalID = OX_OperationInterval::convertDateToOperationIntervalID($oDate);
     $previousOperationIntervalID = OX_OperationInterval::previousOperationIntervalID($operationIntervalID);
     $previousOperationIntervalID = OX_OperationInterval::previousOperationIntervalID($previousOperationIntervalID);
     $aDates = OX_OperationInterval::convertDateToPreviousOperationIntervalStartAndEndDates($oDate);
     $aDates = OX_OperationInterval::convertDateToPreviousOperationIntervalStartAndEndDates($aDates['start']);
     $oSpecialDate = new Date($aDates['end']);
     $oSpecialDate->addSeconds(1);
     $aData = array($conf['maintenance']['operationInterval'], $previousOperationIntervalID, $aDates['start']->format('%Y-%m-%d %H:%M:%S'), $aDates['end']->format('%Y-%m-%d %H:%M:%S'), $bannerId3, 5, 200, 200, 0, 0.2, 0.95, $aDates['start']->format('%Y-%m-%d %H:%M:%S'), 0, $aDates['end']->format('%Y-%m-%d %H:30:00'));
     $this->_insertDataSummaryAdZoneAssoc($aData);
     $aData = array($conf['maintenance']['operationInterval'], $previousOperationIntervalID, $aDates['start']->format('%Y-%m-%d %H:%M:%S'), $aDates['end']->format('%Y-%m-%d %H:%M:%S'), $bannerId3, 5, 100, 100, 0, 0.4, 0.95, $aDates['start']->format('%Y-%m-%d %H:30:00'), 0, $oSpecialDate->format('%Y-%m-%d %H:%M:%S'));
     $this->_insertDataSummaryAdZoneAssoc($aData);
     $result =& $oMaxDalMaintenance->getPreviousAdDeliveryInfo($aEmptyZoneAdArray);
     $this->assertEqual(count($result), 4);
     $this->assertEqual(count($result[1]), 2);
     $this->assertEqual($result[1][1]['ad_id'], $bannerId1);
     $this->assertEqual($result[1][1]['zone_id'], 1);
     $this->assertNull($result[1][1]['required_impressions']);
     $this->assertNull($result[1][1]['requested_impressions']);
     $this->assertNull($result[1][1]['priority_factor']);
     $this->assertNull($result[1][1]['past_zone_traffic_fraction']);
     $this->assertEqual($result[1][1]['impressions'], 1);
     $this->assertEqual($result[1][2]['ad_id'], $bannerId1);
     $this->assertEqual($result[1][2]['zone_id'], 2);
     $this->assertEqual($result[1][2]['required_impressions'], 10);
     $this->assertEqual($result[1][2]['requested_impressions'], 10);
     $this->assertEqual($result[1][2]['priority_factor'], 0.5);
     $this->assertEqual($result[1][2]['past_zone_traffic_fraction'], 0.99);
     $this->assertEqual($result[1][2]['impressions'], 1);
     $this->assertEqual(count($result[2]), 2);
     $this->assertEqual($result[2][3]['ad_id'], $bannerId2);
     $this->assertEqual($result[2][3]['zone_id'], 3);
     $this->assertEqual($result[2][3]['required_impressions'], 30);
     $this->assertEqual($result[2][3]['requested_impressions'], 30);
     $this->assertEqual($result[2][3]['priority_factor'], 0.4);
     $this->assertEqual($result[2][3]['past_zone_traffic_fraction'], 0.5);
     $this->assertEqual($result[2][3]['impressions'], 2);
     $this->assertEqual($result[2][4]['ad_id'], $bannerId2);
     $this->assertEqual($result[2][4]['zone_id'], 4);
     $this->assertEqual($result[2][4]['required_impressions'], 15);
     $this->assertEqual($result[2][4]['requested_impressions'], 15);
     $this->assertEqual($result[2][4]['priority_factor'], 0.6);
     $this->assertEqual($result[2][4]['past_zone_traffic_fraction'], 0.5);
     $this->assertEqual($result[2][4]['impressions'], 2);
     $this->assertEqual(count($result[3]), 1);
     $this->assertEqual($result[3][5]['ad_id'], $bannerId3);
     $this->assertEqual($result[3][5]['zone_id'], 5);
     $this->assertEqual($result[3][5]['required_impressions'], 150);
     $this->assertEqual($result[3][5]['requested_impressions'], 150);
     $this->assertEqual($result[3][5]['priority_factor'], 0.3);
     $this->assertEqual($result[3][5]['past_zone_traffic_fraction'], 0.95);
     $this->assertEqual($result[3][5]['impressions'], 5);
     $this->assertEqual(count($result[9]), 1);
     $this->assertEqual($result[9][9]['ad_id'], 9);
     $this->assertEqual($result[9][9]['zone_id'], 9);
     $this->assertEqual($result[9][9]['required_impressions'], 59);
     $this->assertEqual($result[9][9]['requested_impressions'], 59);
     $this->assertEqual($result[9][9]['priority_factor'], 95);
     $this->assertEqual($result[9][9]['past_zone_traffic_fraction'], 0.995);
     $this->assertNull($result[9][9]['impressions']);
     $oDate =& $oServiceLocator->get('now');
     DataGenerator::cleanUp();
     $oServiceLocator->register('now', $oDate);
     // Test 18a
     $oZone = new OX_Maintenance_Priority_Zone(array('zoneid' => 4));
     $aAdParams = array('ad_id' => 10, 'active' => 't', 'type' => 'sql', 'weight' => 1);
     $oAd = new OA_Maintenance_Priority_Ad($aAdParams);
     $oZone->addAdvert($oAd);
     $aAdParams = array('ad_id' => 11, 'active' => 't', 'type' => 'sql', 'weight' => 1);
     $oAd = new OA_Maintenance_Priority_Ad($aAdParams);
     $oZone->addAdvert($oAd);
     $aZoneAdArray = array($oZone->id => $oZone);
     $operationIntervalID = OX_OperationInterval::convertDateToOperationIntervalID($oDate);
     $previousOperationIntervalID = OX_OperationInterval::previousOperationIntervalID($operationIntervalID);
     $aDates = OX_OperationInterval::convertDateToPreviousOperationIntervalStartAndEndDates($oDate);
     $bannerId1 = $this->_insertCampaignBanner();
     $aData = array($conf['maintenance']['operationInterval'], $previousOperationIntervalID, $aDates['start']->format('%Y-%m-%d %H:%M:%S'), $aDates['end']->format('%Y-%m-%d %H:%M:%S'), $aDates['start']->format('%Y-%m-%d'), $aDates['start']->format('%H'), $bannerId1, 0, 1, 1, $oNow->format('%Y-%m-%d %H:%M:%S'));
     $idDia = $this->_insertDataIntermediateAd($aData);
     $aData = array($conf['maintenance']['operationInterval'], $previousOperationIntervalID, $aDates['start']->format('%Y-%m-%d %H:%M:%S'), $aDates['end']->format('%Y-%m-%d %H:%M:%S'), $aDates['start']->format('%Y-%m-%d'), $aDates['start']->format('%H'), $bannerId1, 0, 2, 1, $oNow->format('%Y-%m-%d %H:%M:%S'));
     $idDia = $this->_insertDataIntermediateAd($aData);
     $bannerId2 = $this->_insertCampaignBanner();
     $aData = array($conf['maintenance']['operationInterval'], $previousOperationIntervalID, $aDates['start']->format('%Y-%m-%d %H:%M:%S'), $aDates['end']->format('%Y-%m-%d %H:%M:%S'), $aDates['start']->format('%Y-%m-%d'), $aDates['start']->format('%H'), $bannerId2, 0, 3, 2, $oNow->format('%Y-%m-%d %H:%M:%S'));
     $idDia = $this->_insertDataIntermediateAd($aData);
     $aData = array($conf['maintenance']['operationInterval'], $previousOperationIntervalID, $aDates['start']->format('%Y-%m-%d %H:%M:%S'), $aDates['end']->format('%Y-%m-%d %H:%M:%S'), $aDates['start']->format('%Y-%m-%d'), $aDates['start']->format('%H'), $bannerId2, 0, 4, 2, $oNow->format('%Y-%m-%d %H:%M:%S'));
     $idDia = $this->_insertDataIntermediateAd($aData);
     $bannerId3 = $this->_insertCampaignBanner();
     $aData = array($conf['maintenance']['operationInterval'], $previousOperationIntervalID, $aDates['start']->format('%Y-%m-%d %H:%M:%S'), $aDates['end']->format('%Y-%m-%d %H:%M:%S'), $aDates['start']->format('%Y-%m-%d'), $aDates['start']->format('%H'), $bannerId3, 0, 5, 5, $oNow->format('%Y-%m-%d %H:%M:%S'));
     $idDia = $this->_insertDataIntermediateAd($aData);
     $operationIntervalID = OX_OperationInterval::convertDateToOperationIntervalID($oDate);
     $previousOperationIntervalID = OX_OperationInterval::previousOperationIntervalID($operationIntervalID);
     $previousOperationIntervalID = OX_OperationInterval::previousOperationIntervalID($previousOperationIntervalID);
     $aDates = OX_OperationInterval::convertDateToPreviousOperationIntervalStartAndEndDates($oDate);
     $aDates = OX_OperationInterval::convertDateToPreviousOperationIntervalStartAndEndDates($aDates['start']);
     $aData = array($conf['maintenance']['operationInterval'], $previousOperationIntervalID, $aDates['start']->format('%Y-%m-%d %H:%M:%S'), $aDates['end']->format('%Y-%m-%d %H:%M:%S'), $aDates['start']->format('%Y-%m-%d'), $aDates['start']->format('%H'), $bannerId1, 0, 1, 100, $oNow->format('%Y-%m-%d %H:%M:%S'));
     $idDia = $this->_insertDataIntermediateAd($aData);
     $aData = array($conf['maintenance']['operationInterval'], $previousOperationIntervalID, $aDates['start']->format('%Y-%m-%d %H:%M:%S'), $aDates['end']->format('%Y-%m-%d %H:%M:%S'), $aDates['start']->format('%Y-%m-%d'), $aDates['start']->format('%H'), $bannerId1, 0, 2, 100, $oNow->format('%Y-%m-%d %H:%M:%S'));
     $idDia = $this->_insertDataIntermediateAd($aData);
     $aData = array($conf['maintenance']['operationInterval'], $previousOperationIntervalID, $aDates['start']->format('%Y-%m-%d %H:%M:%S'), $aDates['end']->format('%Y-%m-%d %H:%M:%S'), $aDates['start']->format('%Y-%m-%d'), $aDates['start']->format('%H'), $bannerId2, 0, 3, 200, $oNow->format('%Y-%m-%d %H:%M:%S'));
     $idDia = $this->_insertDataIntermediateAd($aData);
     $aData = array($conf['maintenance']['operationInterval'], $previousOperationIntervalID, $aDates['start']->format('%Y-%m-%d %H:%M:%S'), $aDates['end']->format('%Y-%m-%d %H:%M:%S'), $aDates['start']->format('%Y-%m-%d'), $aDates['start']->format('%H'), $bannerId2, 0, 4, 200, $oNow->format('%Y-%m-%d %H:%M:%S'));
     $idDia = $this->_insertDataIntermediateAd($aData);
     $aData = array($conf['maintenance']['operationInterval'], $previousOperationIntervalID, $aDates['start']->format('%Y-%m-%d %H:%M:%S'), $aDates['end']->format('%Y-%m-%d %H:%M:%S'), $aDates['start']->format('%Y-%m-%d'), $aDates['start']->format('%H'), $bannerId3, 0, 5, 500, $oNow->format('%Y-%m-%d %H:%M:%S'));
     $idDia = $this->_insertDataIntermediateAd($aData);
     $aData = array($conf['maintenance']['operationInterval'], $previousOperationIntervalID, $aDates['start']->format('%Y-%m-%d %H:%M:%S'), $aDates['end']->format('%Y-%m-%d %H:%M:%S'), $aDates['start']->format('%Y-%m-%d'), $aDates['start']->format('%H'), 4, 0, 5, 500, $oNow->format('%Y-%m-%d %H:%M:%S'));
     $idDia = $this->_insertDataIntermediateAd($aData);
     $aData = array($conf['maintenance']['operationInterval'], $previousOperationIntervalID, $aDates['start']->format('%Y-%m-%d %H:%M:%S'), $aDates['end']->format('%Y-%m-%d %H:%M:%S'), $aDates['start']->format('%Y-%m-%d'), $aDates['start']->format('%H'), 10, 0, 4, 1000, $oNow->format('%Y-%m-%d %H:%M:%S'));
     $idDia = $this->_insertDataIntermediateAd($aData);
     $operationIntervalID = OX_OperationInterval::convertDateToOperationIntervalID($oDate);
     $previousOperationIntervalID = OX_OperationInterval::previousOperationIntervalID($operationIntervalID);
     for ($i = 0; $i <= MINUTES_PER_WEEK / $conf['maintenance']['operationInterval']; $i++) {
         $previousOperationIntervalID = OX_OperationInterval::previousOperationIntervalID($previousOperationIntervalID);
     }
     $aDates = OX_OperationInterval::convertDateToPreviousOperationIntervalStartAndEndDates($oDate);
     for ($i = 0; $i <= MINUTES_PER_WEEK / $conf['maintenance']['operationInterval']; $i++) {
         $aDates = OX_OperationInterval::convertDateToPreviousOperationIntervalStartAndEndDates($aDates['start']);
     }
     $aData = array($conf['maintenance']['operationInterval'], $previousOperationIntervalID, $aDates['start']->format('%Y-%m-%d %H:%M:%S'), $aDates['end']->format('%Y-%m-%d %H:%M:%S'), $aDates['start']->format('%Y-%m-%d'), $aDates['start']->format('%H'), 11, 0, 4, 2000, $oNow->format('%Y-%m-%d %H:%M:%S'));
     $idDia = $this->_insertDataIntermediateAd($aData);
     $operationIntervalID = OX_OperationInterval::convertDateToOperationIntervalID($oDate);
     $previousOperationIntervalID = OX_OperationInterval::previousOperationIntervalID($operationIntervalID);
     $aDates = OX_OperationInterval::convertDateToPreviousOperationIntervalStartAndEndDates($oDate);
     $oSpecialDate = new Date($aDates['end']);
     $oSpecialDate->addSeconds(1);
     $aData = array($conf['maintenance']['operationInterval'], $previousOperationIntervalID, $aDates['start']->format('%Y-%m-%d %H:%M:%S'), $aDates['end']->format('%Y-%m-%d %H:%M:%S'), $bannerId1, 2, 10, 10, 0, 0.5, 0.99, $oNow->format('%Y-%m-%d %H:%M:%S'), 0);
     $this->_insertDataSummaryAdZoneAssoc($aData);
     $aData = array($conf['maintenance']['operationInterval'], $previousOperationIntervalID, $aDates['start']->format('%Y-%m-%d %H:%M:%S'), $aDates['end']->format('%Y-%m-%d %H:%M:%S'), 9, 9, 59, 59, 0, 95, 0.995, $oNow->format('%Y-%m-%d %H:%M:%S'), 0);
     $this->_insertDataSummaryAdZoneAssoc($aData);
     $aData = array($conf['maintenance']['operationInterval'], $previousOperationIntervalID, $aDates['start']->format('%Y-%m-%d %H:%M:%S'), $aDates['end']->format('%Y-%m-%d %H:%M:%S'), $bannerId2, 3, 30, 30, 0, 0.4, 0.5, $aDates['start']->format('%Y-%m-%d %H:30:00'), 0, $oSpecialDate->format('%Y-%m-%d %H:%M:%S'));
     $this->_insertDataSummaryAdZoneAssoc($aData);
     $aData = array($conf['maintenance']['operationInterval'], $previousOperationIntervalID, $aDates['start']->format('%Y-%m-%d %H:%M:%S'), $aDates['end']->format('%Y-%m-%d %H:%M:%S'), $bannerId2, 3, 30, 30, 0, 0.4, 0.5, $aDates['start']->format('%Y-%m-%d %H:30:00'), 0, $aDates['end']->format('%Y-%m-%d %H:%M:%S'));
     $this->_insertDataSummaryAdZoneAssoc($aData);
     $aData = array($conf['maintenance']['operationInterval'], $previousOperationIntervalID, $aDates['start']->format('%Y-%m-%d %H:%M:%S'), $aDates['end']->format('%Y-%m-%d %H:%M:%S'), $bannerId2, 4, 10, 10, 0, 0.4, 0.5, $aDates['start']->format('%Y-%m-%d %H:%M:%S'), 0, $aDates['end']->format('%Y-%m-%d %H:30:00'));
     $this->_insertDataSummaryAdZoneAssoc($aData);
     $aData = array($conf['maintenance']['operationInterval'], $previousOperationIntervalID, $aDates['start']->format('%Y-%m-%d %H:%M:%S'), $aDates['end']->format('%Y-%m-%d %H:%M:%S'), $bannerId2, 4, 20, 20, 0, 0.8, 0.5, $aDates['start']->format('%Y-%m-%d %H:30:00'), 0, $oSpecialDate->format('%Y-%m-%d %H:%M:%S'));
     $this->_insertDataSummaryAdZoneAssoc($aData);
     $operationIntervalID = OX_OperationInterval::convertDateToOperationIntervalID($oDate);
     $previousOperationIntervalID = OX_OperationInterval::previousOperationIntervalID($operationIntervalID);
     $previousOperationIntervalID = OX_OperationInterval::previousOperationIntervalID($previousOperationIntervalID);
     $aDates = OX_OperationInterval::convertDateToPreviousOperationIntervalStartAndEndDates($oDate);
     $aDates = OX_OperationInterval::convertDateToPreviousOperationIntervalStartAndEndDates($aDates['start']);
     $oSpecialDate = new Date($aDates['end']);
     $oSpecialDate->addSeconds(1);
     $aData = array($conf['maintenance']['operationInterval'], $previousOperationIntervalID, $aDates['start']->format('%Y-%m-%d %H:%M:%S'), $aDates['end']->format('%Y-%m-%d %H:%M:%S'), $bannerId3, 5, 200, 200, 0, 0.2, 0.95, $aDates['start']->format('%Y-%m-%d %H:%M:%S'), 0, $aDates['end']->format('%Y-%m-%d %H:30:00'));
     $this->_insertDataSummaryAdZoneAssoc($aData);
     $aData = array($conf['maintenance']['operationInterval'], $previousOperationIntervalID, $aDates['start']->format('%Y-%m-%d %H:%M:%S'), $aDates['end']->format('%Y-%m-%d %H:%M:%S'), $bannerId3, 5, 100, 100, 0, 0.4, 0.95, $aDates['start']->format('%Y-%m-%d %H:30:00'), 0, $oSpecialDate->format('%Y-%m-%d %H:%M:%S'));
     $this->_insertDataSummaryAdZoneAssoc($aData);
     $aData = array($conf['maintenance']['operationInterval'], $previousOperationIntervalID, $aDates['start']->format('%Y-%m-%d %H:%M:%S'), $aDates['end']->format('%Y-%m-%d %H:%M:%S'), 10, 4, 1000, 1000, 0, 1, 0.9, $aDates['start']->format('%Y-%m-%d %H:30:00'), 0, $oSpecialDate->format('%Y-%m-%d %H:%M:%S'));
     $this->_insertDataSummaryAdZoneAssoc($aData);
     $operationIntervalID = OX_OperationInterval::convertDateToOperationIntervalID($oDate);
     $previousOperationIntervalID = OX_OperationInterval::previousOperationIntervalID($operationIntervalID);
     for ($i = 0; $i <= MINUTES_PER_WEEK / $conf['maintenance']['operationInterval']; $i++) {
         $previousOperationIntervalID = OX_OperationInterval::previousOperationIntervalID($previousOperationIntervalID);
     }
     $aDates = OX_OperationInterval::convertDateToPreviousOperationIntervalStartAndEndDates($oDate);
     for ($i = 0; $i <= MINUTES_PER_WEEK / $conf['maintenance']['operationInterval']; $i++) {
         $aDates = OX_OperationInterval::convertDateToPreviousOperationIntervalStartAndEndDates($aDates['start']);
     }
     $oSpecialDate = new Date($aDates['end']);
     $oSpecialDate->addSeconds(1);
     $aData = array($conf['maintenance']['operationInterval'], $previousOperationIntervalID, $aDates['start']->format('%Y-%m-%d %H:%M:%S'), $aDates['end']->format('%Y-%m-%d %H:%M:%S'), 11, 4, 2000, 2000, 0, 1, 0.9, $aDates['start']->format('%Y-%m-%d %H:30:00'), 0, $oSpecialDate->format('%Y-%m-%d %H:%M:%S'));
     $this->_insertDataSummaryAdZoneAssoc($aData);
     $result =& $oMaxDalMaintenance->getPreviousAdDeliveryInfo($aZoneAdArray);
     $this->assertEqual(count($result), 5);
     $this->assertEqual(count($result[1]), 2);
     $this->assertEqual($result[1][1]['ad_id'], $bannerId1);
     $this->assertEqual($result[1][1]['zone_id'], 1);
     $this->assertNull($result[1][1]['required_impressions']);
     $this->assertNull($result[1][1]['requested_impressions']);
     $this->assertNull($result[1][1]['priority_factor']);
     $this->assertNull($result[1][1]['past_zone_traffic_fraction']);
     $this->assertEqual($result[1][1]['impressions'], 1);
     $this->assertEqual($result[1][2]['ad_id'], $bannerId1);
     $this->assertEqual($result[1][2]['zone_id'], 2);
     $this->assertEqual($result[1][2]['required_impressions'], 10);
     $this->assertEqual($result[1][2]['requested_impressions'], 10);
     $this->assertEqual($result[1][2]['priority_factor'], 0.5);
     $this->assertEqual($result[1][2]['past_zone_traffic_fraction'], 0.99);
     $this->assertEqual($result[1][2]['impressions'], 1);
     $this->assertEqual(count($result[2]), 2);
     $this->assertEqual($result[2][3]['ad_id'], $bannerId2);
     $this->assertEqual($result[2][3]['zone_id'], 3);
     $this->assertEqual($result[2][3]['required_impressions'], 30);
     $this->assertEqual($result[2][3]['requested_impressions'], 30);
     $this->assertEqual($result[2][3]['priority_factor'], 0.4);
     $this->assertEqual($result[2][3]['past_zone_traffic_fraction'], 0.5);
     $this->assertEqual($result[2][3]['impressions'], 2);
     $this->assertEqual($result[2][4]['ad_id'], $bannerId2);
     $this->assertEqual($result[2][4]['zone_id'], 4);
     $this->assertEqual($result[2][4]['required_impressions'], 15);
     $this->assertEqual($result[2][4]['requested_impressions'], 15);
     $this->assertEqual($result[2][4]['priority_factor'], 0.6);
     $this->assertEqual($result[2][4]['past_zone_traffic_fraction'], 0.5);
     $this->assertEqual($result[2][4]['impressions'], 2);
     $this->assertEqual(count($result[3]), 1);
     $this->assertEqual($result[3][5]['ad_id'], $bannerId3);
     $this->assertEqual($result[3][5]['zone_id'], 5);
     $this->assertEqual($result[3][5]['required_impressions'], 150);
     $this->assertEqual($result[3][5]['requested_impressions'], 150);
     $this->assertEqual($result[3][5]['priority_factor'], 0.3);
     $this->assertEqual($result[3][5]['past_zone_traffic_fraction'], 0.95);
     $this->assertEqual($result[3][5]['impressions'], 5);
     $this->assertEqual(count($result[9]), 1);
     $this->assertEqual($result[9][9]['ad_id'], 9);
     $this->assertEqual($result[9][9]['zone_id'], 9);
     $this->assertEqual($result[9][9]['required_impressions'], 59);
     $this->assertEqual($result[9][9]['requested_impressions'], 59);
     $this->assertEqual($result[9][9]['priority_factor'], 95);
     $this->assertEqual($result[9][9]['past_zone_traffic_fraction'], 0.995);
     $this->assertNull($result[9][9]['impressions']);
     $this->assertEqual(count($result[10]), 1);
     $this->assertEqual($result[10][4]['ad_id'], 10);
     $this->assertEqual($result[10][4]['zone_id'], 4);
     $this->assertEqual($result[10][4]['required_impressions'], 1000);
     $this->assertEqual($result[10][4]['requested_impressions'], 1000);
     $this->assertEqual($result[10][4]['priority_factor'], 1);
     $this->assertEqual($result[10][4]['past_zone_traffic_fraction'], 0.9);
     $this->assertEqual($result[10][4]['impressions'], 1000);
     TestEnv::restoreEnv();
 }
 /**
  * A method to visually test the compensatedPriorities() method.
  *
  * Tests a series of operation intervals for a zone where some ads are limited
  * to appear only in certain "channels" of the zone, and display the results
  * graphically. Uses a changing number of impressions in the zone each operation
  * interval.
  */
 function testCompensatedPrioritiesSharpChangingZoneInvetory()
 {
     $conf = $GLOBALS['_MAX']['CONF'];
     // Mock the OA_Dal_Maintenance_Priority class
     $oDal = new MockOA_Dal_Maintenance_Priority($this);
     $oServiceLocator =& OA_ServiceLocator::instance();
     $oServiceLocator->register('OA_Dal_Maintenance_Priority', $oDal);
     // Partially mock the OA_Maintenance_Priority_AdServer_Task_PriorityCompensation class
     $oPriorityCompensation = new PartialMock_OA_Maintenance_Priority_AdServer_Task_PriorityCompensation($this);
     $oPriorityCompensation->setReturnReference('_getDal', $oDal);
     $oPriorityCompensation->OA_Maintenance_Priority_AdServer_Task_PriorityCompensation();
     // Define the number of iterations to test over
     $iterations = 48;
     // Define the maximum number of impressions in the zone
     $maxZoneImpressions = 10000;
     // Define the maximum number of impressions in the zone
     $minZoneImpressions = 1000;
     // Define the zone impression period
     $zoneImpressionPeriod = 24;
     // Define the channels, including the % of zone impressions in each
     $aChannels[1] = 0.1;
     // Channel 1:  10% of zone traffic
     $aChannels[2] = 0.02;
     // Channel 2:   2% of zone traffic
     // Define the ads, including the required impressions each iteration,
     // the channel the ad is limited to (if any) and the colour to use in
     // the graph of results
     $aAds[1] = array('impressions' => 5000, 'channel' => null, 'colour' => 'red');
     $aAds[2] = array('impressions' => 1500, 'channel' => 1, 'colour' => 'blue');
     $aAds[3] = array('impressions' => 750, 'channel' => 2, 'colour' => 'green');
     // Preapare the graph data sets, ready to accept test data
     foreach ($aAds as $adKey => $aAdData) {
         // Add the new data to the graph of the results
         $dataSetName = 'oDataSet_Ad' . $adKey . '_RequiredImpressions';
         ${$dataSetName} =& Image_Graph::factory('dataset');
         ${$dataSetName}->setName('Ad ' . $adKey . ': Required Impressions');
         $dataSetName = 'oDataSet_Ad' . $adKey . '_AvailableImpressions';
         ${$dataSetName} =& Image_Graph::factory('dataset');
         ${$dataSetName}->setName('Ad ' . $adKey . ': Available Impressions');
         $dataSetName = 'oDataSet_Ad' . $adKey . '_ActualImpressions';
         ${$dataSetName} =& Image_Graph::factory('dataset');
         ${$dataSetName}->setName('Ad ' . $adKey . ': Delivered Impressions');
     }
     $oDataSetBestError =& Image_Graph::factory('dataset');
     $oDataSetBestError->setName('Least Possible Error In Delivery');
     $oDataSetTotalError =& Image_Graph::factory('dataset');
     $oDataSetTotalError->setName('Total Error In Delivery');
     // Prepare the ads/zone for the initial iteration
     $thisZoneImpressions = $minZoneImpressions;
     $oZone = new OX_Maintenance_Priority_Zone(array('zoneid' => 1));
     $oZone->availableImpressions = $thisZoneImpressions;
     foreach ($aAds as $adKey => $aAdData) {
         $oAd = new OA_Maintenance_Priority_Ad(array('ad_id' => $adKey));
         $oAd->requiredImpressions = $aAdData['impressions'];
         $oAd->requestedImpressions = $aAdData['impressions'];
         $oZone->addAdvert($oAd);
     }
     $result = $oPriorityCompensation->compensatedPriorities($oZone);
     // Perform the iterations
     for ($iteration = 1; $iteration <= $iterations; $iteration++) {
         // Calculate how many impressions will be delivered for each ad
         foreach ($aAds as $adKey => $aAdData) {
             $aDelivered[$adKey] = 0;
         }
         $this->_predictDelivery($aDelivered, $thisZoneImpressions, $aAds, $aChannels, $result, $oPriorityCompensation);
         // Add the new data to the graph of the results
         $bestError = 0;
         $totalError = 0;
         foreach ($aAds as $adKey => $aAdData) {
             $dataSetName = 'oDataSet_Ad' . $adKey . '_RequiredImpressions';
             ${$dataSetName}->addPoint($iteration, $aAds[$adKey]['impressions']);
             $dataSetName = 'oDataSet_Ad' . $adKey . '_AvailableImpressions';
             if (is_null($aAdData['channel'])) {
                 ${$dataSetName}->addPoint($iteration, $thisZoneImpressions);
             } else {
                 ${$dataSetName}->addPoint($iteration, $thisZoneImpressions * $aChannels[$aAdData['channel']]);
             }
             $dataSetName = 'oDataSet_Ad' . $adKey . '_ActualImpressions';
             ${$dataSetName}->addPoint($iteration, $aDelivered[$adKey]);
             if (!is_null($aAdData['channel']) && $thisZoneImpressions * $aChannels[$aAdData['channel']] < $aAds[$adKey]['impressions']) {
                 $bestError += abs($thisZoneImpressions * $aChannels[$aAdData['channel']] - $aAds[$adKey]['impressions']);
             }
             $totalError += abs($oZone->aAdverts[$adKey]->requiredImpressions - $aDelivered[$adKey]);
         }
         $oDataSetBestError->addPoint($iteration, $bestError);
         $oDataSetTotalError->addPoint($iteration, $totalError);
         // Prepare the ads/zone for the next iteration
         $previousZoneImpressions = $thisZoneImpressions;
         if ($iteration == 1) {
             $thisZoneImpressions = $this->_predictSharpZoneInventory($minZoneImpressions, $maxZoneImpressions, $zoneImpressionPeriod, $iteration);
         } else {
             $thisZoneImpressions = $this->_predictSharpZoneInventory($minZoneImpressions, $maxZoneImpressions, $zoneImpressionPeriod, $iteration);
         }
         $oZone = new OX_Maintenance_Priority_Zone(array('zoneid' => 1));
         $oZone->availableImpressions = $thisZoneImpressions;
         foreach ($aAds as $adKey => $aAdData) {
             $oAd = new OA_Maintenance_Priority_Ad(array('ad_id' => $adKey));
             $oAd->requiredImpressions = $aAdData['impressions'];
             $oAd->requestedImpressions = $aAdData['impressions'];
             $oAd->pastRequiredImpressions = $aAdData['impressions'];
             $oAd->pastRequestedImpressions = $aAdData['impressions'];
             $oAd->pastActualImpressions = $aDelivered[$adKey];
             $oAd->pastAdZonePriorityFactor = $result['ads'][$adKey]['priority_factor'];
             $oAd->pastZoneTrafficFraction = $result['ads'][$adKey]['past_zone_traffic_fraction'];
             $oZone->addAdvert($oAd);
         }
         $result = $oPriorityCompensation->compensatedPriorities($oZone);
     }
     // Prepare the graph
     $oCanvas =& Image_Canvas::factory('png', array('width' => 600, 'height' => 480, 'antialias' => false));
     $oGraph =& Image_Graph::factory('graph', $oCanvas);
     if (function_exists('imagettfbbox') && isset($conf['graphs']['ttfName'])) {
         $oFont =& $oGraph->addNew('ttf_font', $conf['graphs']['ttfName']);
         $oFont->setSize(9);
         $oGraph->setFont($oFont);
     }
     $oGraph->add(Image_Graph::vertical(Image_Graph::factory('title', array('Priority Compensation in Fixed Impression Zone', 12)), Image_Graph::vertical($oPlotarea = Image_Graph::factory('plotarea', array('axis', 'axis_log')), $oLegend = Image_Graph::factory('legend'), 80), 10));
     $oLegend->setPlotarea($oPlotarea);
     $oGridLines =& $oPlotarea->addNew('line_grid', array(), IMAGE_GRAPH_AXIS_X);
     $oGridLines =& $oPlotarea->addNew('line_grid', array(), IMAGE_GRAPH_AXIS_Y);
     $oAxis =& $oPlotarea->getAxis(IMAGE_GRAPH_AXIS_X);
     $oAxis->setTitle('Operation Intervals');
     $oAxis =& $oPlotarea->getAxis(IMAGE_GRAPH_AXIS_Y);
     $oAxis->setTitle('Impressions', 'vertical');
     $counter = 1;
     $aAxisLabels = array();
     while ($counter < $maxZoneImpressions) {
         $counter *= 10;
         $aAxisLabels[] = $counter;
     }
     $oAxis->setLabelInterval($aAxisLabels);
     // Ad the data sets to the graph
     foreach ($aAds as $adKey => $aAdData) {
         $dataSetName = 'oDataSet_Ad' . $adKey . '_RequiredImpressions';
         $oPlot =& $oPlotarea->addNew('line', ${$dataSetName});
         $oLineStyle =& Image_Graph::factory('Image_Graph_Line_Dashed', array($aAdData['colour'], 'transparent'));
         $oPlot->setLineStyle($oLineStyle);
         $dataSetName = 'oDataSet_Ad' . $adKey . '_AvailableImpressions';
         $oPlot =& $oPlotarea->addNew('line', ${$dataSetName});
         $oLineStyle =& Image_Graph::factory('Image_Graph_Line_Dotted', array($aAdData['colour'], 'transparent'));
         $oPlot->setLineStyle($oLineStyle);
         $dataSetName = 'oDataSet_Ad' . $adKey . '_ActualImpressions';
         $oPlot =& $oPlotarea->addNew('line', ${$dataSetName});
         $oPlot->setLineColor($aAdData['colour']);
     }
     $oPlot =& $oPlotarea->addNew('line', $oDataSetBestError);
     $oLineStyle =& Image_Graph::factory('Image_Graph_Line_Dotted', array('magenta', 'transparent'));
     $oPlot->setLineStyle($oLineStyle);
     $oPlot =& $oPlotarea->addNew('line', $oDataSetTotalError);
     $oPlot->setLineColor('magenta');
     $oPlotarea->setFillColor('white');
     $filename = "results/" . __CLASS__ . '_' . __FUNCTION__ . ".png";
     $oGraph->done(array('filename' => MAX_PATH . '/tests/' . $filename));
     echo '<img src="' . $filename . '" alt="" />' . "\n";
 }
 /**
  * A method to visually test the scaling back of the compensation factor.
  *
  * Performs a more relalistic version of the test above, with multiple ads,
  * and disabling of an ad during the operation of the zone.
  */
 function testScaleBackComplex2()
 {
     $conf = $GLOBALS['_MAX']['CONF'];
     // Mock the OA_Dal_Maintenance_Priority class
     $oDal = new MockOA_Dal_Maintenance_Priority($this);
     $oServiceLocator =& OA_ServiceLocator::instance();
     $oServiceLocator->register('OA_Dal_Maintenance_Priority', $oDal);
     // Partially mock the OA_Maintenance_Priority_AdServer_Task_PriorityCompensation class
     $oPriorityCompensation = new PartialMock_OA_Maintenance_Priority_AdServer_Task_PriorityCompensationScaleBack($this);
     $oPriorityCompensation->setReturnReference('_getDal', $oDal);
     $oPriorityCompensation->OA_Maintenance_Priority_AdServer_Task_PriorityCompensation();
     // Define the number of initial iterations to test over
     $initialIterations = 12;
     // Define how many impressions are in the zone in each initial iteration
     $initialZoneImpressions = 10;
     // Define the number of final iterations to test over
     $finalIterations = 24;
     // Define how many impressions are in the zone in each final iteration
     $finalZoneImpressions = 20000;
     // Define the channels, including the % of zone impressions in each
     $aChannels[1] = 0.1;
     // Channel 1:  10% of zone traffic
     $aChannels[2] = 0.05;
     // Channel 2:   5% of zone traffic
     // Define the test ads, giving the number of required impressions
     // each hour (fixed), the channel the ad is in (if any), and the
     // colour to graph the ad
     // The number of ads must not exceed ($initialZoneImpressions - 1)
     // or ($finalZoneImpressions - 1), to ensure that the values for
     // the requestedImpressions >= 1 for all ads
     $aAds[1] = array('requiredImpressions' => 5000, 'channel' => null, 'requiredColour' => '#AA00FF', 'requestedColour' => 'blue', 'availableColour' => 'black', 'deliveredColour' => 'green', 'priorityFactorColour' => 'red');
     $aAds[2] = array('requiredImpressions' => 5000, 'channel' => 1, 'requiredColour' => '#AA00FF', 'requestedColour' => 'blue', 'availableColour' => 'black', 'deliveredColour' => 'green', 'priorityFactorColour' => 'red');
     $aAds[3] = array('requiredImpressions' => 5000, 'channel' => 2, 'requiredColour' => '#AA00FF', 'requestedColour' => 'blue', 'availableColour' => 'black', 'deliveredColour' => 'green', 'priorityFactorColour' => 'red');
     // Preapare the graph data sets, ready to accept test data
     foreach ($aAds as $adKey => $aAdData) {
         $dataSetName = 'oDataSet_Ad_' . $adKey . '_RequiredImpressions';
         ${$dataSetName} =& Image_Graph::factory('dataset');
         ${$dataSetName}->setName('Ad ' . $adKey . ': Required Impressions');
         $dataSetName = 'oDataSet_Ad_' . $adKey . '_RequestedImpressions';
         ${$dataSetName} =& Image_Graph::factory('dataset');
         ${$dataSetName}->setName('Ad ' . $adKey . ': Requested Impressions');
         $dataSetName = 'oDataSet_Ad_' . $adKey . '_AvailableImpressions';
         ${$dataSetName} =& Image_Graph::factory('dataset');
         ${$dataSetName}->setName('Ad ' . $adKey . ': Available Impressions');
         $dataSetName = 'oDataSet_Ad_' . $adKey . '_DeliveredImpressions';
         ${$dataSetName} =& Image_Graph::factory('dataset');
         ${$dataSetName}->setName('Ad ' . $adKey . ': Delivered Impressions');
         $dataSetName = 'oDataSet_Ad_' . $adKey . '_PriorityFactor';
         ${$dataSetName} =& Image_Graph::factory('dataset');
         ${$dataSetName}->setName('Ad ' . $adKey . ': Priority Factor');
         $dataSetName = 'oDataSet_Ad_' . $adKey . '_Priority';
         ${$dataSetName} =& Image_Graph::factory('dataset');
         ${$dataSetName}->setName('Ad ' . $adKey . ': Priority');
     }
     // Prepare the zone/ads for the initial iterations
     $oZone = new OX_Maintenance_Priority_Zone(array('zoneid' => 1));
     $oZone->availableImpressions = $initialZoneImpressions;
     $zoneTotalRequired = 0;
     foreach ($aAds as $adKey => $aAdData) {
         $zoneTotalRequired += $aAdData['requiredImpressions'];
     }
     foreach ($aAds as $adKey => $aAdData) {
         $oAd = new OA_Maintenance_Priority_Ad(array('ad_id' => $adKey));
         $oAd->requiredImpressions = $aAdData['requiredImpressions'];
         if ($zoneTotalRequired > $oZone->availableImpressions) {
             $oAd->requestedImpressions = floor(($oZone->availableImpressions - 1) / count($aAds));
         } else {
             $oAd->requestedImpressions = $aAdData['requiredImpressions'];
         }
         $oZone->addAdvert($oAd);
     }
     $result = $oPriorityCompensation->compensatedPriorities($oZone);
     // Perform the initial iterations
     $oSavedZone;
     $zoneImpressions = $initialZoneImpressions;
     for ($iteration = 0; $iteration <= $initialIterations; $iteration++) {
         // As these are the initial iterations, no delivery of any ads (zone not active)
         foreach ($aAds as $adKey => $aAdData) {
             $aDelivered[$adKey] = 0;
         }
         // Add the new data to the graph of the results
         foreach ($aAds as $adKey => $aAdData) {
             $dataSetName = 'oDataSet_Ad_' . $adKey . '_RequiredImpressions';
             ${$dataSetName}->addPoint($iteration, $aAds[$adKey]['requiredImpressions']);
             $dataSetName = 'oDataSet_Ad_' . $adKey . '_RequestedImpressions';
             ${$dataSetName}->addPoint($iteration, $result['ads'][$adKey]['requested_impressions']);
             $dataSetName = 'oDataSet_Ad_' . $adKey . '_AvailableImpressions';
             if (is_null($aAdData['channel'])) {
                 ${$dataSetName}->addPoint($iteration, $zoneImpressions);
             } else {
                 ${$dataSetName}->addPoint($iteration, $zoneImpressions * $aChannels[$aAdData['channel']]);
             }
             $dataSetName = 'oDataSet_Ad_' . $adKey . '_DeliveredImpressions';
             ${$dataSetName}->addPoint($iteration, $aDelivered[$adKey]);
             $dataSetName = 'oDataSet_Ad_' . $adKey . '_PriorityFactor';
             ${$dataSetName}->addPoint($iteration, $result['ads'][$adKey]['priority_factor']);
             $dataSetName = 'oDataSet_Ad_' . $adKey . '_Priority';
             ${$dataSetName}->addPoint($iteration, $result['ads'][$adKey]['priority']);
         }
         // Prepare the ads/zone for the next iteration
         $oZone = new OX_Maintenance_Priority_Zone(array('zoneid' => 1));
         $oZone->availableImpressions = $zoneImpressions;
         $zoneTotalRequired = 0;
         foreach ($aAds as $adKey => $aAdData) {
             $zoneTotalRequired += $aAdData['requiredImpressions'];
         }
         foreach ($aAds as $adKey => $aAdData) {
             $oAd = new OA_Maintenance_Priority_Ad(array('ad_id' => $adKey));
             $oAd->requiredImpressions = $aAdData['requiredImpressions'];
             if ($zoneTotalRequired > $zoneImpressions) {
                 $oAd->requestedImpressions = floor(($zoneImpressions - 1) / count($aAds));
             } else {
                 $oAd->requestedImpressions = $aAdData['requiredImpressions'];
             }
             $oAd->pastRequiredImpressions = $aAdData['requiredImpressions'];
             $oAd->pastRequestedImpressions = $result['ads'][$adKey]['requested_impressions'];
             $oAd->pastActualImpressions = $aDelivered[$adKey];
             $oAd->pastAdZonePriorityFactor = $result['ads'][$adKey]['priority_factor'];
             $oAd->pastZoneTrafficFraction = $result['ads'][$adKey]['past_zone_traffic_fraction'];
             $oZone->addAdvert($oAd);
         }
         // Move to the next iteration
         $result = $oPriorityCompensation->compensatedPriorities($oZone);
     }
     // Prepare the zone/ads for the final iterations
     $zoneTotalRequired = 0;
     foreach ($aAds as $adKey => $aAdData) {
         $zoneTotalRequired += $aAdData['requiredImpressions'];
     }
     foreach ($aAds as $adKey => $aAdData) {
         $oAd =& $oZone->aAdverts[$adKey];
         $oAd->requiredImpressions = $aAdData['requiredImpressions'];
         if ($zoneTotalRequired > $oZone->availableImpressions) {
             $oAd->requestedImpressions = floor(($oZone->availableImpressions - 1) / count($aAds));
         } else {
             $oAd->requestedImpressions = $aAdData['requiredImpressions'];
         }
     }
     $result = $oPriorityCompensation->compensatedPriorities($oZone);
     // Perform the final iterations
     $zoneImpressions = $finalZoneImpressions;
     for ($iteration = $initialIterations + 1; $iteration <= $initialIterations + $finalIterations; $iteration++) {
         // As these are the final iteration, calculate delivery
         foreach ($aAds as $adKey => $aAdData) {
             $aDelivered[$adKey] = 0;
         }
         $this->_predictDelivery($aDelivered, $zoneImpressions, $aAds, $aChannels, $result, $oPriorityCompensation);
         // Add the new data to the graph of the results
         foreach ($aAds as $adKey => $aAdData) {
             $dataSetName = 'oDataSet_Ad_' . $adKey . '_RequiredImpressions';
             ${$dataSetName}->addPoint($iteration, $aAds[$adKey]['requiredImpressions']);
             $dataSetName = 'oDataSet_Ad_' . $adKey . '_RequestedImpressions';
             ${$dataSetName}->addPoint($iteration, $result['ads'][$adKey]['requested_impressions']);
             $dataSetName = 'oDataSet_Ad_' . $adKey . '_AvailableImpressions';
             if (is_null($aAdData['channel'])) {
                 ${$dataSetName}->addPoint($iteration, $zoneImpressions);
             } else {
                 ${$dataSetName}->addPoint($iteration, $zoneImpressions * $aChannels[$aAdData['channel']]);
             }
             $dataSetName = 'oDataSet_Ad_' . $adKey . '_DeliveredImpressions';
             ${$dataSetName}->addPoint($iteration, $aDelivered[$adKey]);
             $dataSetName = 'oDataSet_Ad_' . $adKey . '_PriorityFactor';
             ${$dataSetName}->addPoint($iteration, $result['ads'][$adKey]['priority_factor']);
             $dataSetName = 'oDataSet_Ad_' . $adKey . '_Priority';
             ${$dataSetName}->addPoint($iteration, $result['ads'][$adKey]['priority']);
         }
         // Prepare the ads/zone for the next iteration
         $oZone = new OX_Maintenance_Priority_Zone(array('zoneid' => 1));
         $oZone->availableImpressions = $zoneImpressions;
         $zoneTotalRequired = 0;
         foreach ($aAds as $adKey => $aAdData) {
             if (!($iteration > ($initialIterations + $finalIterations) / 2 && $adKey == 2)) {
                 $zoneTotalRequired += $aAdData['requiredImpressions'];
             }
         }
         foreach ($aAds as $adKey => $aAdData) {
             if (!($iteration > ($initialIterations + $finalIterations) / 2 && $adKey == 2)) {
                 $oAd = new OA_Maintenance_Priority_Ad(array('ad_id' => $adKey));
                 $oAd->requiredImpressions = $aAdData['requiredImpressions'];
                 if ($zoneTotalRequired > $zoneImpressions) {
                     $oAd->requestedImpressions = floor(($zoneImpressions - 1) / count($aAds));
                 } else {
                     $oAd->requestedImpressions = $aAdData['requiredImpressions'];
                 }
                 $oAd->pastRequiredImpressions = $aAdData['requiredImpressions'];
                 $oAd->pastRequestedImpressions = $result['ads'][$adKey]['requested_impressions'];
                 $oAd->pastActualImpressions = $aDelivered[$adKey];
                 $oAd->pastAdZonePriorityFactor = $result['ads'][$adKey]['priority_factor'];
                 $oAd->pastZoneTrafficFraction = $result['ads'][$adKey]['past_zone_traffic_fraction'];
                 $oZone->addAdvert($oAd);
             }
         }
         $result = $oPriorityCompensation->compensatedPriorities($oZone);
     }
     // Prepare the main graph
     $oCanvas =& Image_Canvas::factory('png', array('width' => 600, 'height' => 600, 'antialias' => false));
     $oGraph =& Image_Graph::factory('graph', $oCanvas);
     if (function_exists('imagettfbbox') && isset($conf['graphs']['ttfName'])) {
         $oFont =& $oGraph->addNew('ttf_font', $conf['graphs']['ttfName']);
         $oFont->setSize(9);
         $oGraph->setFont($oFont);
     }
     $oGraph->add(Image_Graph::vertical(Image_Graph::factory('title', array('Priority Compensation in Fixed Impression Zone: Multi-Ad Complex Scale-Back Test', 12)), Image_Graph::vertical($oPlotarea = Image_Graph::factory('plotarea', array('axis', 'axis')), $oLegend = Image_Graph::factory('legend'), 90), 10));
     $oLegend->setPlotarea($oPlotarea);
     $oPlotareaSecondary =& Image_Graph::factory('plotarea', array('axis', 'axis', IMAGE_GRAPH_AXIS_Y_SECONDARY));
     $oGraph->add($oPlotareaSecondary);
     $oGridLines =& $oPlotarea->addNew('line_grid', array(), IMAGE_GRAPH_AXIS_X);
     $oGridLines =& $oPlotarea->addNew('line_grid', array(), IMAGE_GRAPH_AXIS_Y);
     $oAxis =& $oPlotarea->getAxis(IMAGE_GRAPH_AXIS_X);
     $oAxis->setTitle('Operation Intervals');
     $oAxis =& $oPlotarea->getAxis(IMAGE_GRAPH_AXIS_Y);
     $oAxis->setTitle('Impressions', 'vertical');
     $oAxis =& Image_Graph::factory('axis', IMAGE_GRAPH_AXIS_Y_SECONDARY);
     $oPlotarea->add($oAxis);
     $oAxis =& $oPlotarea->getAxis(IMAGE_GRAPH_AXIS_Y_SECONDARY);
     $oAxis->setTitle('Priority Factor', 'vertical2');
     // Ad the data sets to the graph
     foreach ($aAds as $adKey => $aAdData) {
         if ($adKey == 1) {
             $dataSetName = 'oDataSet_Ad_' . $adKey . '_PriorityFactor';
             $oPlot =& $oPlotarea->addNew('line', ${$dataSetName}, IMAGE_GRAPH_AXIS_Y_SECONDARY);
             $oLineStyle =& Image_Graph::factory('Image_Graph_Line_Solid', array($aAdData['priorityFactorColour'], 'transparent'));
             $oPlot->setLineStyle($oLineStyle);
             $dataSetName = 'oDataSet_Ad_' . $adKey . '_DeliveredImpressions';
             $oPlot =& $oPlotarea->addNew('line', ${$dataSetName});
             $oLineStyle =& Image_Graph::factory('Image_Graph_Line_Solid', array($aAdData['deliveredColour'], 'transparent'));
             $oPlot->setLineStyle($oLineStyle);
             $dataSetName = 'oDataSet_Ad_' . $adKey . '_AvailableImpressions';
             $oPlot =& $oPlotarea->addNew('line', ${$dataSetName});
             $oLineStyle =& Image_Graph::factory('Image_Graph_Line_Dashed', array($aAdData['availableColour'], 'transparent'));
             $oPlot->setLineStyle($oLineStyle);
             $dataSetName = 'oDataSet_Ad_' . $adKey . '_RequiredImpressions';
             $oPlot =& $oPlotarea->addNew('line', ${$dataSetName});
             $oLineStyle =& Image_Graph::factory('Image_Graph_Line_Dashed', array($aAdData['requiredColour'], 'transparent'));
             $oPlot->setLineStyle($oLineStyle);
             $dataSetName = 'oDataSet_Ad_' . $adKey . '_RequestedImpressions';
             $oPlot =& $oPlotarea->addNew('line', ${$dataSetName});
             $oLineStyle =& Image_Graph::factory('Image_Graph_Line_Dotted', array($aAdData['requestedColour'], 'transparent'));
             $oPlot->setLineStyle($oLineStyle);
         }
     }
     $oPlotarea->setFillColor('white');
     $filename = "results/" . __CLASS__ . '_' . __FUNCTION__ . "1.png";
     $oGraph->done(array('filename' => MAX_PATH . '/tests/' . $filename));
     echo '<img src="' . $filename . '" alt=""/>' . "\n";
     // Prepare the priority graph
     $oCanvas =& Image_Canvas::factory('png', array('width' => 600, 'height' => 600, 'antialias' => false));
     $oGraph =& Image_Graph::factory('graph', $oCanvas);
     if (function_exists('imagettfbbox') && isset($conf['graphs']['ttfName'])) {
         $oFont =& $oGraph->addNew('ttf_font', $conf['graphs']['ttfName']);
         $oFont->setSize(9);
         $oGraph->setFont($oFont);
     }
     $oGraph->add(Image_Graph::vertical(Image_Graph::factory('title', array('Priority Compensation in Fixed Impression Zone: Multi-Ad Complex Scale-Back Test', 12)), Image_Graph::vertical($oPlotarea = Image_Graph::factory('plotarea', array('axis', 'axis')), $oLegend = Image_Graph::factory('legend'), 90), 10));
     $oLegend->setPlotarea($oPlotarea);
     $oGridLines =& $oPlotarea->addNew('line_grid', array(), IMAGE_GRAPH_AXIS_X);
     $oGridLines =& $oPlotarea->addNew('line_grid', array(), IMAGE_GRAPH_AXIS_Y);
     $oAxis =& $oPlotarea->getAxis(IMAGE_GRAPH_AXIS_X);
     $oAxis->setTitle('Operation Intervals');
     $oAxis =& $oPlotarea->getAxis(IMAGE_GRAPH_AXIS_Y);
     $oAxis->setTitle('Priority', 'vertical');
     // Ad the data sets to the graph
     foreach ($aAds as $adKey => $aAdData) {
         if ($adKey == 1) {
             $dataSetName = 'oDataSet_Ad_' . $adKey . '_Priority';
             $oPlot =& $oPlotarea->addNew('line', ${$dataSetName});
             $oLineStyle =& Image_Graph::factory('Image_Graph_Line_Solid', array($aAdData['priorityFactorColour'], 'transparent'));
             $oPlot->setLineStyle($oLineStyle);
         }
     }
     $oPlotarea->setFillColor('white');
     $filename = "results/" . __CLASS__ . '_' . __FUNCTION__ . "2.png";
     $oGraph->done(array('filename' => MAX_PATH . '/tests/' . $filename));
     echo '<img src="' . $filename . '" alt=""/>' . "\n";
     // Prepare the main graph
     $oCanvas =& Image_Canvas::factory('png', array('width' => 600, 'height' => 600, 'antialias' => false));
     $oGraph =& Image_Graph::factory('graph', $oCanvas);
     if (function_exists('imagettfbbox') && isset($conf['graphs']['ttfName'])) {
         $oFont =& $oGraph->addNew('ttf_font', $conf['graphs']['ttfName']);
         $oFont->setSize(9);
         $oGraph->setFont($oFont);
     }
     $oGraph->add(Image_Graph::vertical(Image_Graph::factory('title', array('Priority Compensation in Fixed Impression Zone: Multi-Ad Complex Scale-Back Test', 12)), Image_Graph::vertical($oPlotarea = Image_Graph::factory('plotarea', array('axis', 'axis')), $oLegend = Image_Graph::factory('legend'), 90), 10));
     $oLegend->setPlotarea($oPlotarea);
     $oPlotareaSecondary =& Image_Graph::factory('plotarea', array('axis', 'axis', IMAGE_GRAPH_AXIS_Y_SECONDARY));
     $oGraph->add($oPlotareaSecondary);
     $oGridLines =& $oPlotarea->addNew('line_grid', array(), IMAGE_GRAPH_AXIS_X);
     $oGridLines =& $oPlotarea->addNew('line_grid', array(), IMAGE_GRAPH_AXIS_Y);
     $oAxis =& $oPlotarea->getAxis(IMAGE_GRAPH_AXIS_X);
     $oAxis->setTitle('Operation Intervals');
     $oAxis =& $oPlotarea->getAxis(IMAGE_GRAPH_AXIS_Y);
     $oAxis->setTitle('Impressions', 'vertical');
     $oAxis =& Image_Graph::factory('axis', IMAGE_GRAPH_AXIS_Y_SECONDARY);
     $oPlotarea->add($oAxis);
     $oAxis =& $oPlotarea->getAxis(IMAGE_GRAPH_AXIS_Y_SECONDARY);
     $oAxis->setTitle('Priority Factor', 'vertical2');
     // Ad the data sets to the graph
     foreach ($aAds as $adKey => $aAdData) {
         if ($adKey == 2) {
             $dataSetName = 'oDataSet_Ad_' . $adKey . '_PriorityFactor';
             $oPlot =& $oPlotarea->addNew('line', ${$dataSetName}, IMAGE_GRAPH_AXIS_Y_SECONDARY);
             $oLineStyle =& Image_Graph::factory('Image_Graph_Line_Solid', array($aAdData['priorityFactorColour'], 'transparent'));
             $oPlot->setLineStyle($oLineStyle);
             $dataSetName = 'oDataSet_Ad_' . $adKey . '_DeliveredImpressions';
             $oPlot =& $oPlotarea->addNew('line', ${$dataSetName});
             $oLineStyle =& Image_Graph::factory('Image_Graph_Line_Solid', array($aAdData['deliveredColour'], 'transparent'));
             $oPlot->setLineStyle($oLineStyle);
             $dataSetName = 'oDataSet_Ad_' . $adKey . '_AvailableImpressions';
             $oPlot =& $oPlotarea->addNew('line', ${$dataSetName});
             $oLineStyle =& Image_Graph::factory('Image_Graph_Line_Dashed', array($aAdData['availableColour'], 'transparent'));
             $oPlot->setLineStyle($oLineStyle);
             $dataSetName = 'oDataSet_Ad_' . $adKey . '_RequiredImpressions';
             $oPlot =& $oPlotarea->addNew('line', ${$dataSetName});
             $oLineStyle =& Image_Graph::factory('Image_Graph_Line_Dashed', array($aAdData['requiredColour'], 'transparent'));
             $oPlot->setLineStyle($oLineStyle);
             $dataSetName = 'oDataSet_Ad_' . $adKey . '_RequestedImpressions';
             $oPlot =& $oPlotarea->addNew('line', ${$dataSetName});
             $oLineStyle =& Image_Graph::factory('Image_Graph_Line_Dotted', array($aAdData['requestedColour'], 'transparent'));
             $oPlot->setLineStyle($oLineStyle);
         }
     }
     $oPlotarea->setFillColor('white');
     $filename = "results/" . __CLASS__ . '_' . __FUNCTION__ . "3.png";
     $oGraph->done(array('filename' => MAX_PATH . '/tests/' . $filename));
     echo '<img src="' . $filename . '" alt=""/>' . "\n";
     // Prepare the priority graph
     $oCanvas =& Image_Canvas::factory('png', array('width' => 600, 'height' => 600, 'antialias' => false));
     $oGraph =& Image_Graph::factory('graph', $oCanvas);
     if (function_exists('imagettfbbox') && isset($conf['graphs']['ttfName'])) {
         $oFont =& $oGraph->addNew('ttf_font', $conf['graphs']['ttfName']);
         $oFont->setSize(9);
         $oGraph->setFont($oFont);
     }
     $oGraph->add(Image_Graph::vertical(Image_Graph::factory('title', array('Priority Compensation in Fixed Impression Zone: Multi-Ad Complex Scale-Back Test', 12)), Image_Graph::vertical($oPlotarea = Image_Graph::factory('plotarea', array('axis', 'axis')), $oLegend = Image_Graph::factory('legend'), 90), 10));
     $oLegend->setPlotarea($oPlotarea);
     $oGridLines =& $oPlotarea->addNew('line_grid', array(), IMAGE_GRAPH_AXIS_X);
     $oGridLines =& $oPlotarea->addNew('line_grid', array(), IMAGE_GRAPH_AXIS_Y);
     $oAxis =& $oPlotarea->getAxis(IMAGE_GRAPH_AXIS_X);
     $oAxis->setTitle('Operation Intervals');
     $oAxis =& $oPlotarea->getAxis(IMAGE_GRAPH_AXIS_Y);
     $oAxis->setTitle('Priority', 'vertical');
     // Ad the data sets to the graph
     foreach ($aAds as $adKey => $aAdData) {
         if ($adKey == 2) {
             $dataSetName = 'oDataSet_Ad_' . $adKey . '_Priority';
             $oPlot =& $oPlotarea->addNew('line', ${$dataSetName});
             $oLineStyle =& Image_Graph::factory('Image_Graph_Line_Solid', array($aAdData['priorityFactorColour'], 'transparent'));
             $oPlot->setLineStyle($oLineStyle);
         }
     }
     $oPlotarea->setFillColor('white');
     $filename = "results/" . __CLASS__ . '_' . __FUNCTION__ . "4.png";
     $oGraph->done(array('filename' => MAX_PATH . '/tests/' . $filename));
     echo '<img src="' . $filename . '" alt=""/>' . "\n";
     // Prepare the main graph
     $oCanvas =& Image_Canvas::factory('png', array('width' => 600, 'height' => 600, 'antialias' => false));
     $oGraph =& Image_Graph::factory('graph', $oCanvas);
     if (function_exists('imagettfbbox') && isset($conf['graphs']['ttfName'])) {
         $oFont =& $oGraph->addNew('ttf_font', $conf['graphs']['ttfName']);
         $oFont->setSize(9);
         $oGraph->setFont($oFont);
     }
     $oGraph->add(Image_Graph::vertical(Image_Graph::factory('title', array('Priority Compensation in Fixed Impression Zone: Multi-Ad Complex Scale-Back Test', 12)), Image_Graph::vertical($oPlotarea = Image_Graph::factory('plotarea', array('axis', 'axis')), $oLegend = Image_Graph::factory('legend'), 90), 10));
     $oLegend->setPlotarea($oPlotarea);
     $oPlotareaSecondary =& Image_Graph::factory('plotarea', array('axis', 'axis', IMAGE_GRAPH_AXIS_Y_SECONDARY));
     $oGraph->add($oPlotareaSecondary);
     $oGridLines =& $oPlotarea->addNew('line_grid', array(), IMAGE_GRAPH_AXIS_X);
     $oGridLines =& $oPlotarea->addNew('line_grid', array(), IMAGE_GRAPH_AXIS_Y);
     $oAxis =& $oPlotarea->getAxis(IMAGE_GRAPH_AXIS_X);
     $oAxis->setTitle('Operation Intervals');
     $oAxis =& $oPlotarea->getAxis(IMAGE_GRAPH_AXIS_Y);
     $oAxis->setTitle('Impressions', 'vertical');
     $oAxis =& Image_Graph::factory('axis', IMAGE_GRAPH_AXIS_Y_SECONDARY);
     $oPlotarea->add($oAxis);
     $oAxis =& $oPlotarea->getAxis(IMAGE_GRAPH_AXIS_Y_SECONDARY);
     $oAxis->setTitle('Priority Factor', 'vertical2');
     // Ad the data sets to the graph
     foreach ($aAds as $adKey => $aAdData) {
         if ($adKey == 3) {
             $dataSetName = 'oDataSet_Ad_' . $adKey . '_PriorityFactor';
             $oPlot =& $oPlotarea->addNew('line', ${$dataSetName}, IMAGE_GRAPH_AXIS_Y_SECONDARY);
             $oLineStyle =& Image_Graph::factory('Image_Graph_Line_Solid', array($aAdData['priorityFactorColour'], 'transparent'));
             $oPlot->setLineStyle($oLineStyle);
             $dataSetName = 'oDataSet_Ad_' . $adKey . '_DeliveredImpressions';
             $oPlot =& $oPlotarea->addNew('line', ${$dataSetName});
             $oLineStyle =& Image_Graph::factory('Image_Graph_Line_Solid', array($aAdData['deliveredColour'], 'transparent'));
             $oPlot->setLineStyle($oLineStyle);
             $dataSetName = 'oDataSet_Ad_' . $adKey . '_AvailableImpressions';
             $oPlot =& $oPlotarea->addNew('line', ${$dataSetName});
             $oLineStyle =& Image_Graph::factory('Image_Graph_Line_Dashed', array($aAdData['availableColour'], 'transparent'));
             $oPlot->setLineStyle($oLineStyle);
             $dataSetName = 'oDataSet_Ad_' . $adKey . '_RequiredImpressions';
             $oPlot =& $oPlotarea->addNew('line', ${$dataSetName});
             $oLineStyle =& Image_Graph::factory('Image_Graph_Line_Dashed', array($aAdData['requiredColour'], 'transparent'));
             $oPlot->setLineStyle($oLineStyle);
             $dataSetName = 'oDataSet_Ad_' . $adKey . '_RequestedImpressions';
             $oPlot =& $oPlotarea->addNew('line', ${$dataSetName});
             $oLineStyle =& Image_Graph::factory('Image_Graph_Line_Dotted', array($aAdData['requestedColour'], 'transparent'));
             $oPlot->setLineStyle($oLineStyle);
         }
     }
     $oPlotarea->setFillColor('white');
     $filename = "results/" . __CLASS__ . '_' . __FUNCTION__ . "5.png";
     $oGraph->done(array('filename' => MAX_PATH . '/tests/' . $filename));
     echo '<img src="' . $filename . '" alt=""/>' . "\n";
     // Prepare the priority graph
     $oCanvas =& Image_Canvas::factory('png', array('width' => 600, 'height' => 600, 'antialias' => false));
     $oGraph =& Image_Graph::factory('graph', $oCanvas);
     if (function_exists('imagettfbbox') && isset($conf['graphs']['ttfName'])) {
         $oFont =& $oGraph->addNew('ttf_font', $conf['graphs']['ttfName']);
         $oFont->setSize(9);
         $oGraph->setFont($oFont);
     }
     $oGraph->add(Image_Graph::vertical(Image_Graph::factory('title', array('Priority Compensation in Fixed Impression Zone: Multi-Ad Complex Scale-Back Test', 12)), Image_Graph::vertical($oPlotarea = Image_Graph::factory('plotarea', array('axis', 'axis')), $oLegend = Image_Graph::factory('legend'), 90), 10));
     $oLegend->setPlotarea($oPlotarea);
     $oGridLines =& $oPlotarea->addNew('line_grid', array(), IMAGE_GRAPH_AXIS_X);
     $oGridLines =& $oPlotarea->addNew('line_grid', array(), IMAGE_GRAPH_AXIS_Y);
     $oAxis =& $oPlotarea->getAxis(IMAGE_GRAPH_AXIS_X);
     $oAxis->setTitle('Operation Intervals');
     $oAxis =& $oPlotarea->getAxis(IMAGE_GRAPH_AXIS_Y);
     $oAxis->setTitle('Priority', 'vertical');
     // Ad the data sets to the graph
     foreach ($aAds as $adKey => $aAdData) {
         if ($adKey == 3) {
             $dataSetName = 'oDataSet_Ad_' . $adKey . '_Priority';
             $oPlot =& $oPlotarea->addNew('line', ${$dataSetName});
             $oLineStyle =& Image_Graph::factory('Image_Graph_Line_Solid', array($aAdData['priorityFactorColour'], 'transparent'));
             $oPlot->setLineStyle($oLineStyle);
         }
     }
     $oPlotarea->setFillColor('white');
     $filename = "results/" . __CLASS__ . '_' . __FUNCTION__ . "6.png";
     $oGraph->done(array('filename' => MAX_PATH . '/tests/' . $filename));
     echo '<img src="' . $filename . '" alt=""/>' . "\n";
 }