Пример #1
0
        public void TryTranslateNavigationSegmentTemplate_ReturnsODataNavigationSegment()
        {
            // Arrange
            EdmEntityType          employee   = new EdmEntityType("NS", "Employee");
            IEdmNavigationProperty navigation = employee.AddUnidirectionalNavigation(new EdmNavigationPropertyInfo
            {
                Name               = "DirectReports",
                Target             = employee,
                TargetMultiplicity = EdmMultiplicity.Many
            });

            NavigationSegmentTemplate     navigationSegment = new NavigationSegmentTemplate(navigation, null);
            ODataTemplateTranslateContext context           = new ODataTemplateTranslateContext();

            // Act
            bool ok = navigationSegment.TryTranslate(context);

            // Assert
            Assert.True(ok);
            ODataPathSegment          actual     = Assert.Single(context.Segments);
            NavigationPropertySegment navSegment = Assert.IsType <NavigationPropertySegment>(actual);

            Assert.Same(navigation, navSegment.NavigationProperty);
            Assert.Null(navSegment.NavigationSource);
        }
        public static bool MatchBindingPath(IEdmPathExpression bindingPath, IList <ODataSegmentTemplate> parsedSegments)
        {
            List <string> paths = bindingPath.PathSegments.ToList();

            // If binding path only includes navigation property name, it matches.
            if (paths.Count == 1)
            {
                return(true);
            }

            int pathIndex = paths.Count - 2; // Skip the last segment which is navigation property name.

            // Match from tail to head.
            for (int segmentIndex = parsedSegments.Count - 1; segmentIndex >= 0; segmentIndex--)
            {
                ODataSegmentTemplate segment = parsedSegments[segmentIndex];

                PropertySegmentTemplate   propertySegment   = segment as PropertySegmentTemplate;
                NavigationSegmentTemplate navigationSegment = segment as NavigationSegmentTemplate;
                // Containment navigation property or complex property in binding path.
                if (propertySegment != null ||
                    (navigationSegment != null && navigationSegment.Segment.NavigationSource is IEdmContainedEntitySet))
                {
                    string pathName = propertySegment != null ?
                                      propertySegment.Property.Name :
                                      navigationSegment.NavigationProperty.Name;

                    if (pathIndex < 0 || string.CompareOrdinal(paths[pathIndex], pathName) != 0)
                    {
                        return(false);
                    }

                    pathIndex--;
                }
                else if (segment is CastSegmentTemplate)
                {
                    CastSegmentTemplate cast = (CastSegmentTemplate)segment;
                    // May need match type if the binding path contains type cast.
                    if (pathIndex >= 0 && paths[pathIndex].Contains(".", System.StringComparison.Ordinal))
                    {
                        if (string.CompareOrdinal(paths[pathIndex], cast.CastType.AsElementType().FullTypeName()) != 0)
                        {
                            return(false);
                        }

                        pathIndex--;
                    }
                }
                else if (segment is EntitySetSegmentTemplate ||
                         segment is SingletonSegmentTemplate ||
                         navigationSegment != null)
                {
                    // Containment navigation property in first if statement for NavigationPropertySegment.
                    break;
                }
            }

            // Return true if all the segments in binding path have been matched.
            return(pathIndex == -1 ? true : false);
        }
Пример #3
0
        public void TryTranslateSingletonSegmentTemplate_ThrowsArgumentNull_Context()
        {
            // Arrange
            NavigationSegmentTemplate navigationSegment = GetSegmentTemplate(out _);

            // Act & Assert
            ExceptionAssert.ThrowsArgumentNull(() => navigationSegment.TryTranslate(null), "context");
        }
Пример #4
0
        public void CtorNavigationSegmentTemplate_SetsProperties()
        {
            // Arrange & Act
            NavigationSegmentTemplate navigationSegment = GetSegmentTemplate(out IEdmNavigationProperty navigation);

            // Assert
            Assert.NotNull(navigationSegment.Segment);
            Assert.Same(navigation, navigationSegment.NavigationProperty);
        }
Пример #5
0
        public void GetTemplatesNavigationSegmentTemplate_ReturnsTemplates()
        {
            // Arrange
            NavigationSegmentTemplate navigationSegment = GetSegmentTemplate(out _);

            // Act & Assert
            IEnumerable <string> templates = navigationSegment.GetTemplates();
            string template = Assert.Single(templates);

            Assert.Equal("/DirectReports", template);
        }
Пример #6
0
        public void ParseODataUriTemplate_ForNavigationProperty(string template, int count)
        {
            // Arrange
            IODataPathTemplateParser parser = new DefaultODataPathTemplateParser();

            // Act
            ODataPathTemplate path = parser.Parse(_edmModel, template, null);

            // Assert
            Assert.NotNull(path);
            Assert.Equal(count, path.Count);
            NavigationSegmentTemplate navigationSegment = Assert.IsType <NavigationSegmentTemplate>(path[count - 1]);

            Assert.Equal("Orders", navigationSegment.NavigationProperty.Name);
        }
Пример #7
0
        public void TryTranslateNavigationSegmentTemplate_ReturnsODataNavigationSegment()
        {
            // Arrange
            NavigationSegmentTemplate     navigationSegment = GetSegmentTemplate(out IEdmNavigationProperty navigation);
            ODataTemplateTranslateContext context           = new ODataTemplateTranslateContext();

            // Act
            bool ok = navigationSegment.TryTranslate(context);

            // Assert
            Assert.True(ok);
            ODataPathSegment          actual     = Assert.Single(context.Segments);
            NavigationPropertySegment navSegment = Assert.IsType <NavigationPropertySegment>(actual);

            Assert.Same(navigation, navSegment.NavigationProperty);
            Assert.Null(navSegment.NavigationSource);
        }
Пример #8
0
        public void CommonNavigationTemplateProperties_ReturnsAsExpected()
        {
            // Assert
            EdmEntityType          employee   = new EdmEntityType("NS", "Employee");
            IEdmNavigationProperty navigation = employee.AddUnidirectionalNavigation(new EdmNavigationPropertyInfo
            {
                Name               = "DirectReports",
                Target             = employee,
                TargetMultiplicity = EdmMultiplicity.Many
            });

            NavigationSegmentTemplate navigationSegment = new NavigationSegmentTemplate(navigation, null);

            // Act & Assert
            Assert.Equal("DirectReports", navigationSegment.Literal);
            Assert.Equal(ODataSegmentKind.Navigation, navigationSegment.Kind);
            Assert.False(navigationSegment.IsSingle);
            Assert.Equal("Collection(NS.Employee)", navigationSegment.EdmType.FullTypeName());
            Assert.Null(navigationSegment.NavigationSource);
        }
Пример #9
0
        //public static ODataTypeCastSegment ConvertTo(this PropertySegmentTemplate property)
        //{
        //    // So far, only support the entity type cast
        //    return new ODataTypeCastSegment(property);
        //}

        public static ODataNavigationPropertySegment ConvertTo(this NavigationSegmentTemplate navigation)
        {
            return(new ODataNavigationPropertySegment(navigation.Navigation));
        }
Пример #10
0
        public static ODataPath Translate(this ODataPathTemplate pathTemplate)
        {
            if (pathTemplate.Count == 0)
            {
                // It's service root, so far, let's skip it.
                return(null);
            }

            IList <ODataSegment> newSegments = new List <ODataSegment>();

            foreach (var segment in pathTemplate)
            {
                switch (segment.Kind)
                {
                case ODataSegmentKind.Metadata:
                    newSegments.Add(new ODataMetadataSegment());
                    break;

                case ODataSegmentKind.EntitySet:
                    EntitySetSegmentTemplate entitySet = (EntitySetSegmentTemplate)segment;
                    newSegments.Add(entitySet.ConvertTo());
                    break;

                case ODataSegmentKind.Singleton:
                    SingletonSegmentTemplate singleton = (SingletonSegmentTemplate)segment;
                    newSegments.Add(singleton.ConvertTo());
                    break;

                case ODataSegmentKind.Key:
                    KeySegmentTemplate key = (KeySegmentTemplate)segment;
                    newSegments.Add(key.ConvertTo());
                    break;

                case ODataSegmentKind.Cast:
                    CastSegmentTemplate cast = (CastSegmentTemplate)segment;
                    newSegments.Add(cast.ConvertTo());
                    break;

                case ODataSegmentKind.Property:
                    // TODO:
                    return(null);

                //PropertySegmentTemplate property = (PropertySegmentTemplate)segment;
                //newSegments.Add(property.ConvertTo());
                //break;

                case ODataSegmentKind.Navigation:
                    NavigationSegmentTemplate navigation = (NavigationSegmentTemplate)segment;
                    newSegments.Add(navigation.ConvertTo());
                    break;

                case ODataSegmentKind.Function:
                    FunctionSegmentTemplate function = (FunctionSegmentTemplate)segment;
                    newSegments.Add(function.ConvertTo());
                    break;

                case ODataSegmentKind.Action:
                    ActionSegmentTemplate action = (ActionSegmentTemplate)segment;
                    newSegments.Add(action.ConvertTo());
                    break;

                case ODataSegmentKind.FunctionImport:
                    FunctionImportSegmentTemplate functionImport = (FunctionImportSegmentTemplate)segment;
                    newSegments.Add(functionImport.ConvertTo());
                    break;

                case ODataSegmentKind.ActionImport:
                    ActionImportSegmentTemplate actionImport = (ActionImportSegmentTemplate)segment;
                    newSegments.Add(actionImport.ConvertTo());
                    break;

                case ODataSegmentKind.Value:
                    return(null);

                //ValueSegmentTemplate value = (ValueSegmentTemplate)segment;
                //newSegments.Add(value.ConvertTo());
                //break;

                case ODataSegmentKind.Ref:
                    return(null);

                //KeySegmentTemplate key = (KeySegmentTemplate)segment;
                //newSegments.Add(key.ConvertTo());
                //break;

                case ODataSegmentKind.NavigationLink:
                    return(null);

                //NavigationLinkSegmentTemplate navigationLink = (NavigationLinkSegmentTemplate)segment;
                //newSegments.Add(navigationLink.ConvertTo());
                //break;

                case ODataSegmentKind.Count:
                    CountSegmentTemplate count = (CountSegmentTemplate)segment;
                    newSegments.Add(count.ConvertTo());
                    break;

                case ODataSegmentKind.PathTemplate:
                    return(null);

                //KeySegmentTemplate key = (KeySegmentTemplate)segment;
                //newSegments.Add(key.ConvertTo());
                //break;

                case ODataSegmentKind.Dynamic:
                    return(null);

                //KeySegmentTemplate key = (KeySegmentTemplate)segment;
                //newSegments.Add(key.ConvertTo());
                //break;

                default:
                    throw new NotSupportedException();
                }
            }

            return(new ODataPath(newSegments));
        }