public function testFreez() { $em = $this->getMockBuilder('\\Doctrine\\ORM\\EntityManager')->disableOriginalConstructor()->getMock(); $em->expects($this->atLeastOnce())->method('getReference')->will($this->returnCallback(function ($class_name, $id) { $ref = new \stdClass(); $ref->class = $class_name; $ref->id = $id; return $ref; })); /* @var $doctrine \PHPUnit_Framework_MockObject_MockObject|Registry */ $doctrine = $this->getMockBuilder('\\Doctrine\\Bundle\\DoctrineBundle\\Registry')->disableOriginalConstructor()->getMock(); $doctrine->expects($this->once())->method('getManager')->will($this->returnValue($em)); // set related entities $country = $this->getRef('\\AnimeDb\\Bundle\\CatalogBundle\\Entity\\Country', 'setCountry'); $storage = $this->getRef('\\AnimeDb\\Bundle\\CatalogBundle\\Entity\\Storage', 'setStorage'); $type = $this->getRef('\\AnimeDb\\Bundle\\CatalogBundle\\Entity\\Type', 'setType'); $genre1 = $this->getRef('\\AnimeDb\\Bundle\\CatalogBundle\\Entity\\Genre', 'addGenre'); $genre2 = $this->getRef('\\AnimeDb\\Bundle\\CatalogBundle\\Entity\\Genre', 'addGenre'); $this->item->freez($doctrine); // test freez result $this->assertEquals($country, $this->item->getCountry()); $this->assertEquals($storage, $this->item->getStorage()); $this->assertEquals($type, $this->item->getType()); $this->assertEquals($genre1, $this->item->getGenres()[0]); $this->assertEquals($genre2, $this->item->getGenres()[1]); }
/** * Fill head data * * @param \AnimeDb\Bundle\CatalogBundle\Entity\Item $item * @param \DOMXPath $xpath * @param \DOMElement $head * * @return \AnimeDb\Bundle\CatalogBundle\Entity\Item */ private function fillHeadData(Item $item, \DOMXPath $xpath, \DOMElement $head) { /* @var $data \DOMElement */ $data = $xpath->query('font', $head)->item(0); $length = $data->childNodes->length; for ($i = 0; $i < $length; $i++) { if ($data->childNodes->item($i)->nodeName == 'b') { switch ($data->childNodes->item($i)->nodeValue) { // set country case 'Производство': $j = 1; do { if ($data->childNodes->item($i + $j)->nodeName == 'a') { $country_name = trim($data->childNodes->item($i + $j)->nodeValue); if ($country_name && ($country = $this->getCountryByName($country_name))) { $item->setCountry($country); } break; } $j++; } while ($data->childNodes->item($i + $j)->nodeName != 'br'); $i += $j; break; // add genre // add genre case 'Жанр': $j = 2; do { if ($data->childNodes->item($i + $j)->nodeName == 'a' && ($genre = $this->getGenreByName($data->childNodes->item($i + $j)->nodeValue))) { $item->addGenre($genre); } $j++; } while ($data->childNodes->item($i + $j)->nodeName != 'br'); $i += $j; break; // set type and add file info // set type and add file info case 'Тип': $type = $data->childNodes->item($i + 1)->nodeValue; if (preg_match('/(?<type>[\\w\\s]+)(?: \\((?:(?<episodes_number>>?\\d+) эп.)?(?<file_info>.*)\\))?(, (?<duration>\\d{1,3}) мин\\.)?$/u', $type, $match)) { // add type if ($type = $this->getTypeByName(trim($match['type']))) { $item->setType($type); } // add duration if (!empty($match['duration'])) { $item->setDuration((int) $match['duration']); } // add number of episodes if (!empty($match['episodes_number'])) { if ($match['episodes_number'][0] == '>') { $item->setEpisodesNumber(substr($match['episodes_number'], 1) . '+'); } else { $item->setEpisodesNumber((int) $match['episodes_number']); } } elseif ($item->getType()->getId() != 'tv') { // everything except the TV series consist of a single episode $item->setEpisodesNumber(1); } // add file info if (!empty($match['file_info'])) { $file_info = $item->getFileInfo(); $item->setFileInfo(($file_info ? $file_info . "\n" : '') . trim($match['file_info'])); } } $i++; break; // set date premiere and date end if exists // set date premiere and date end if exists case 'Премьера': case 'Выпуск': $j = 1; $date = ''; do { $date .= $data->childNodes->item($i + $j)->nodeValue; $j++; } while ($length > $i + $j && $data->childNodes->item($i + $j)->nodeName != 'br'); $i += $j; $reg = '/(?<start>(?:(?:\\d{2})|(?:\\?\\?)).\\d{2}.\\d{4})' . '(?:.*(?<end>(?:(?:\\d{2})|(?:\\?\\?)).\\d{2}.\\d{4}))?/'; if (preg_match($reg, $date, $match)) { $item->setDatePremiere(new \DateTime(str_replace('??', '01', $match['start']))); if (isset($match['end'])) { $item->setDateEnd(new \DateTime($match['end'])); } } break; case 'Хронометраж': if (preg_match('/(?<duration>\\d+)/', $data->childNodes->item($i + 1)->nodeValue, $match)) { $item->setDuration((int) $match['duration']); } break; case 'Кол-во серий': $number = trim($data->childNodes->item($i + 1)->nodeValue, ' :'); if (strpos($number, '>') !== false) { $number = str_replace('>', '', $number) . '+'; } $item->setEpisodesNumber($number); break; } } } }