public function testResolveCategoryHierarchy()
 {
     $subject = DIWikiPage::newFromText('Foo');
     $description = new ClassDescription(DIWikiPage::newFromText('Foocat', NS_CATEGORY));
     $query = new Query($description);
     $query->setSubject($subject);
     $queryResult = $this->getMockBuilder('\\SMWQueryResult')->disableOriginalConstructor()->getMock();
     $queryResult->expects($this->once())->method('getResults')->will($this->returnValue(array()));
     $queryResult->expects($this->any())->method('getQuery')->will($this->returnValue($query));
     $store = $this->getMockBuilder('\\SMW\\Store')->disableOriginalConstructor()->getMockForAbstractClass();
     $propertyHierarchyLookup = $this->getMockBuilder('\\SMW\\PropertyHierarchyLookup')->disableOriginalConstructor()->getMock();
     $propertyHierarchyLookup->expects($this->any())->method('hasSubcategoryFor')->will($this->returnValue(true));
     $propertyHierarchyLookup->expects($this->at(1))->method('findSubcategoryListFor')->with($this->equalTo(DIWikiPage::newFromText('Foocat', NS_CATEGORY)))->will($this->returnValue(array(DIWikiPage::newFromText('Subcat', NS_CATEGORY))));
     $propertyHierarchyLookup->expects($this->at(3))->method('findSubcategoryListFor')->with($this->equalTo(DIWikiPage::newFromText('Subcat', NS_CATEGORY)))->will($this->returnValue(array()));
     $instance = new EmbeddedQueryDependencyListResolver($store, $propertyHierarchyLookup);
     $instance->setQueryResult($queryResult);
     $expected = array(DIWikiPage::newFromText('Foo'), DIWikiPage::newFromText('Subcat', NS_CATEGORY), DIWikiPage::newFromText('Foocat', NS_CATEGORY));
     $this->assertEquals($expected, $instance->getQueryDependencySubjectList());
 }
 /**
  * This method is called from the `SMW::Store::AfterQueryResultLookupComplete` hook
  * to resolve and update dependencies fetched fro an embedded query and its
  * QueryResult object.
  *
  * @since 2.3
  *
  * @param EmbeddedQueryDependencyListResolver $embeddedQueryDependencyListResolver
  */
 public function addDependencyList(EmbeddedQueryDependencyListResolver $embeddedQueryDependencyListResolver)
 {
     if (!$this->isEnabled() || $embeddedQueryDependencyListResolver->getSubject() === null) {
         return null;
     }
     $subject = $embeddedQueryDependencyListResolver->getSubject();
     $hash = $embeddedQueryDependencyListResolver->getQueryId();
     $sid = $this->getIdForSubject($subject, $hash);
     if ($this->canSuppressUpdateOnSkewFactorFor($sid, $subject)) {
         return wfDebugLog('smw', __METHOD__ . " suppressed (skewed time) for SID " . $sid . "\n");
     }
     $dependencyList = $embeddedQueryDependencyListResolver->getQueryDependencySubjectList();
     if ($dependencyList === array()) {
         return null;
     }
     if ($sid > 0) {
         return $this->updateDependencyList($sid, $dependencyList);
     }
     // SID == 0 means the storage update/process has not been finalized
     // (new object hasn't been registered) hence an event is registered to
     // update the list after the update process has been completed
     // PHP 5.3 compatibility
     $embeddedQueryResultLinksUpdater = $this;
     EventHandler::getInstance()->addCallbackListener('deferred.embedded.query.dep.update', function () use($embeddedQueryResultLinksUpdater, $dependencyList, $subject, $hash) {
         wfDebugLog('smw', __METHOD__ . ' deferred.embedded.query.dep.update for ' . $hash . "\n");
         $embeddedQueryResultLinksUpdater->updateDependencyList($embeddedQueryResultLinksUpdater->getIdForSubject($subject, $hash), $dependencyList);
     });
 }