/** * Pushes a segment for the current navigation property being written out. * Note: Refer 'ObjectModelSerializerNotes.txt' for more details about * 'Segment Stack' and this method. * Note: Calls to this method should be balanced with calls to popSegment. * * @param ResourceProperty &$resourceProperty Current navigation property * being written out * * @return true if a segment was pushed, false otherwise * * @throws InvalidOperationException If this function invoked with non-navigation * property instance. */ private function _pushSegmentForNavigationProperty(ResourceProperty &$resourceProperty) { if ($resourceProperty->getTypeKind() == ResourceTypeKind::ENTITY) { $this->assert(!empty($this->_segmentNames), '!is_empty($this->_segmentNames'); $currentResourceSetWrapper = $this->_getCurrentResourceSetWrapper(); $currentResourceType = $currentResourceSetWrapper->getResourceType(); $currentResourceSetWrapper = $this->_dataService->getMetadataQueryProviderWrapper()->getResourceSetWrapperForNavigationProperty($currentResourceSetWrapper, $currentResourceType, $resourceProperty); $this->assert(!is_null($currentResourceSetWrapper), '!null($currentResourceSetWrapper)'); return $this->_pushSegment($resourceProperty->getName(), $currentResourceSetWrapper); } else { throw new InvalidOperationException('pushSegmentForNavigationProperty should not be called with non-entity type'); } }
public function testResourceProperty() { try { $addressResType = new ResourceType(new ReflectionClass('Address2'), ResourceTypeKind::COMPLEX, 'Address', 'Northwind'); $booleanResourcetype = ResourceType::getPrimitiveResourceType(EdmPrimitiveType::BOOLEAN); $isPrimaryPrimProperty = new ResourceProperty('IsPrimary', null, ResourcePropertyKind::PRIMITIVE, $booleanResourcetype); $addressResType->addProperty($isPrimaryPrimProperty); $exceptionThrown = false; try { $addressComplexProperty = new ResourceProperty('Address', null, ResourcePropertyKind::COMPLEX_TYPE | ResourcePropertyKind::KEY, $addressResType); } catch (\InvalidArgumentException $exception) { $exceptionThrown = true; $this->AssertStringEndsWith('not a valid ResourcePropertyKind enum value or valid combination of ResourcePropertyKind enum values', $exception->getMessage()); } if (!$exceptionThrown) { $this->fail('An expected InvalidArgumentException for \'invalid ResourcePropertyKind\' has not been raised'); } $exceptionThrown = false; try { $stringResourceType = ResourceType::getPrimitiveResourceType(EdmPrimitiveType::STRING); $addressComplexProperty = new ResourceProperty('Address', null, ResourcePropertyKind::COMPLEX_TYPE, $stringResourceType); } catch (\InvalidArgumentException $exception) { $exceptionThrown = true; $this->AssertStringStartsWith('The \'$kind\' parameter does not match with the type of the resource type', $exception->getMessage()); } if (!$exceptionThrown) { $this->fail('An expected InvalidArgumentException for \'Property and ResourceType kind mismatch\' has not been raised'); } $customerResType = new ResourceType(new ReflectionClass('Customer2'), ResourceTypeKind::ENTITY, 'Customer', 'Northwind'); $stringResourceType = ResourceType::getPrimitiveResourceType(EdmPrimitiveType::STRING); $customerIDPrimProperty = new ResourceProperty('CustomerID', null, ResourcePropertyKind::PRIMITIVE | ResourcePropertyKind::KEY, $stringResourceType); $customerNamePrimProperty = new ResourceProperty('CustomerName', null, ResourcePropertyKind::PRIMITIVE, $stringResourceType); $intResourceType = ResourceType::getPrimitiveResourceType(EdmPrimitiveType::INT32); $ratingPrimProperty = new ResourceProperty('Rating', null, ResourcePropertyKind::PRIMITIVE, $intResourceType); $customerResType->addProperty($customerIDPrimProperty); $customerResType->addProperty($customerNamePrimProperty); $customerResType->addProperty($ratingPrimProperty); $this->AssertTrue($customerIDPrimProperty->isKindOf(ResourcePropertyKind::KEY)); $this->AssertTrue($customerIDPrimProperty->isKindOf(ResourcePropertyKind::PRIMITIVE)); $customerReferenceSetProperty = new ResourceProperty('Customers', null, ResourcePropertyKind::RESOURCESET_REFERENCE, $customerResType); $this->AssertEquals($customerReferenceSetProperty->getName(), 'Customers'); $this->AssertEquals($customerReferenceSetProperty->getKind(), ResourcePropertyKind::RESOURCESET_REFERENCE); $this->AssertEquals($customerReferenceSetProperty->getInstanceType() instanceof \ReflectionClass, true); $this->AssertEquals($customerReferenceSetProperty->getResourceType()->getName(), 'Customer'); $this->AssertEquals($customerReferenceSetProperty->getTypeKind(), ResourceTypeKind::ENTITY); $this->AssertFalse($customerReferenceSetProperty->isKindOf(ResourcePropertyKind::RESOURCE_REFERENCE)); } catch (\Exception $exception) { $this->fail('An unexpected Exception has been raised' . $exception->getMessage()); } }