public function __construct(Date $base, $weekStart = Timestamp::WEEKDAY_MONDAY)
 {
     $firstDayOfMonth = Date::create($base->getYear() . '-' . $base->getMonth() . '-01');
     $lastDayOfMonth = Date::create($base->getYear() . '-' . $base->getMonth() . '-' . date('t', $base->toStamp()));
     $start = $firstDayOfMonth->getFirstDayOfWeek($weekStart);
     $end = $lastDayOfMonth->getLastDayOfWeek($weekStart);
     $this->monthRange = DateRange::create()->lazySet($firstDayOfMonth, $lastDayOfMonth);
     $this->fullRange = DateRange::create()->lazySet($start, $end);
     $rawDays = $this->fullRange->split();
     $this->fullLength = 0;
     foreach ($rawDays as $rawDay) {
         $day = CalendarDay::create($rawDay->toStamp());
         if ($this->monthRange->contains($day)) {
             $day->setOutside(false);
         } else {
             $day->setOutside(true);
         }
         $this->days[$day->toDate()] = $day;
         $weekNumber = floor($this->fullLength / 7);
         if (!isset($this->weeks[$weekNumber])) {
             $this->weeks[$weekNumber] = CalendarWeek::create();
         }
         $this->weeks[$weekNumber]->addDay($day);
         ++$this->fullLength;
     }
     ++$this->fullLength;
 }
 public function testSleeping()
 {
     $calendarDay = CalendarDay::create('1984-03-25')->setOutside(true)->setSelected(false);
     $serializedDay = serialize($calendarDay);
     $unserializedDay = unserialize($serializedDay);
     $this->assertEquals($calendarDay->getDay(), $unserializedDay->getDay());
     $this->assertEquals($calendarDay->getMonth(), $unserializedDay->getMonth());
     $this->assertEquals($calendarDay->getYear(), $unserializedDay->getYear());
     $this->assertEquals($calendarDay->isOutside(), $unserializedDay->isOutside());
     $this->assertEquals($calendarDay->isSelected(), $unserializedDay->isSelected());
 }