Exemplo n.º 1
0
        public void PrimitiveTypesOfSameKindCanConvertToEachOther()
        {
            var stringType    = new EdmStringTypeReference(EdmCoreModel.Instance.GetPrimitiveType(EdmPrimitiveTypeKind.String), true);
            var primitiveType = new EdmPrimitiveTypeReference(EdmCoreModel.Instance.GetPrimitiveType(EdmPrimitiveTypeKind.String), true);

            Assert.True(TypePromotionUtils.CanConvertTo(null, stringType, primitiveType));
            Assert.True(TypePromotionUtils.CanConvertTo(null, primitiveType, stringType));
        }
        public static IEdmModel InterfaceCriticalKindValueMismatchOnlyUsingStringTypeReferenceModel()
        {
            var model = new EdmModel();

            var badTypeRef = new EdmStringTypeReference(EdmCoreModel.Instance.GetPrimitiveType(EdmPrimitiveTypeKind.Double), true);
            var valueTerm  = new EdmTerm("NS", "Note", badTypeRef);

            model.AddElement(valueTerm);

            return(model);
        }
Exemplo n.º 3
0
        public void TestComparingEdmStringTypeReference()
        {
            var stringType     = new EdmStringTypeReference(EdmCoreModel.Instance.GetPrimitiveType(EdmPrimitiveTypeKind.String), true);
            var stringTypeCopy = new EdmStringTypeReference(EdmCoreModel.Instance.GetPrimitiveType(EdmPrimitiveTypeKind.String), true);

            Assert.True(stringType.IsEquivalentTo(stringTypeCopy));

            var stringTypeWithNullableFalse = new EdmStringTypeReference(EdmCoreModel.Instance.GetPrimitiveType(EdmPrimitiveTypeKind.String), false);
            var primitiveType = new EdmPrimitiveTypeReference(EdmCoreModel.Instance.GetPrimitiveType(EdmPrimitiveTypeKind.String), true);

            Assert.False(stringType.IsEquivalentTo(primitiveType));
            Assert.False(stringType.IsEquivalentTo(stringTypeWithNullableFalse));
        }
Exemplo n.º 4
0
        public void ShouldWriteOptionalParameters()
        {
            string expected =
                "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
                "<edmx:Edmx Version=\"4.0\" xmlns:edmx=\"http://docs.oasis-open.org/odata/ns/edmx\">" +
                "<edmx:DataServices>" +
                "<Schema Namespace=\"test\" xmlns=\"http://docs.oasis-open.org/odata/ns/edm\">" +
                "<Function Name=\"TestFunction\">" +
                "<Parameter Name=\"requiredParam\" Type=\"Edm.String\" Nullable=\"false\" />" +
                "<Parameter Name=\"optionalParam\" Type=\"Edm.String\" Nullable=\"false\">" +
                "<Annotation Term=\"Org.OData.Core.V1.OptionalParameter\" />" +
                "</Parameter>" +
                "<Parameter Name=\"optionalParamWithDefault\" Type=\"Edm.String\" Nullable=\"false\">" +
                "<Annotation Term=\"Org.OData.Core.V1.OptionalParameter\">" +
                "<Record>" +
                "<PropertyValue Property=\"DefaultValue\" String=\"Smith\" />" +
                "</Record>" +
                "</Annotation>" +
                "</Parameter>" +
                "<ReturnType Type=\"Edm.String\" Nullable=\"false\" />" +
                "</Function>" +
                "<EntityContainer Name=\"Default\">" +
                "<FunctionImport Name=\"TestFunction\" Function=\"test.TestFunction\" />" +
                "</EntityContainer>" +
                "</Schema>" +
                "</edmx:DataServices>" +
                "</edmx:Edmx>";

            var stringTypeReference = new EdmStringTypeReference(EdmCoreModel.Instance.GetPrimitiveType(EdmPrimitiveTypeKind.String), false);
            var model                    = new EdmModel();
            var function                 = new EdmFunction("test", "TestFunction", stringTypeReference);
            var requiredParam            = new EdmOperationParameter(function, "requiredParam", stringTypeReference);
            var optionalParam            = new EdmOptionalParameter(function, "optionalParam", stringTypeReference, null);
            var optionalParamWithDefault = new EdmOptionalParameter(function, "optionalParamWithDefault", stringTypeReference, "Smith");

            function.AddParameter(requiredParam);
            function.AddParameter(optionalParam);
            function.AddParameter(optionalParamWithDefault);
            model.AddElement(function);
            model.AddEntityContainer("test", "Default").AddFunctionImport("TestFunction", function);
            string csdlStr = GetCsdl(model, CsdlTarget.OData);

            Assert.Equal(expected, csdlStr);
        }
Exemplo n.º 5
0
        public void ParseComputeAsExpandQueryOption()
        {
            // Create model
            EdmModel         model         = new EdmModel();
            EdmEntityType    elementType   = model.AddEntityType("DevHarness", "Entity");
            EdmEntityType    targetType    = model.AddEntityType("DevHarness", "Navigation");
            EdmTypeReference typeReference = new EdmStringTypeReference(EdmCoreModel.Instance.GetPrimitiveType(EdmPrimitiveTypeKind.String), false);

            targetType.AddProperty(new EdmStructuralProperty(targetType, "Prop1", typeReference));
            EdmNavigationPropertyInfo propertyInfo = new EdmNavigationPropertyInfo();

            propertyInfo.Name               = "Nav1";
            propertyInfo.Target             = targetType;
            propertyInfo.TargetMultiplicity = EdmMultiplicity.One;
            EdmProperty navigation = EdmNavigationProperty.CreateNavigationProperty(elementType, propertyInfo);

            elementType.AddProperty(navigation);

            EdmEntityContainer container = model.AddEntityContainer("Default", "Container");

            container.AddEntitySet("Entities", elementType);

            // Define queries and new up parser.
            Uri            root   = new Uri("http://host");
            Uri            url    = new Uri("http://host/Entities?$expand=Nav1($compute=cast(Prop1, 'Edm.String') as NavProperty1AsString)");
            ODataUriParser parser = new ODataUriParser(model, root, url);

            // parse and validate
            SelectExpandClause clause = parser.ParseSelectAndExpand();
            List <SelectItem>  items  = clause.SelectedItems.ToList();

            items.Count.Should().Be(1);
            ExpandedNavigationSelectItem expanded = items[0] as ExpandedNavigationSelectItem;
            List <ComputeExpression>     computes = expanded.ComputeOption.ComputedItems.ToList();

            computes.Count.Should().Be(1);
            computes[0].Alias.ShouldBeEquivalentTo("NavProperty1AsString");
            computes[0].Expression.ShouldBeSingleValueFunctionCallQueryNode();
            computes[0].Expression.TypeReference.ShouldBeEquivalentTo(typeReference);
        }
        IEdmPrimitiveTypeReference IPrimitiveDataTypeVisitor <IEdmPrimitiveTypeReference> .Visit(StringDataType dataType)
        {
            IEdmPrimitiveType typeDefinition = this.GetEdmTypeDefinition(dataType);

            bool isUnicode = dataType.GetFacetValue <IsUnicodeFacet, bool>(true);

            int?maxLength = null;

            if (dataType.HasFacet <MaxLengthFacet>())
            {
                maxLength = dataType.GetFacet <MaxLengthFacet>().Value;
            }

            var typeReference = new EdmStringTypeReference(
                typeDefinition,
                dataType.IsNullable,
                false,
                maxLength,
                isUnicode);

            return(typeReference);
        }
Exemplo n.º 7
0
        public void ParseComputeAsQueryOption()
        {
            // Create model
            EdmModel         model         = new EdmModel();
            EdmEntityType    elementType   = model.AddEntityType("DevHarness", "Entity");
            EdmTypeReference typeReference = new EdmStringTypeReference(EdmCoreModel.Instance.GetPrimitiveType(EdmPrimitiveTypeKind.String), false);

            elementType.AddProperty(new EdmStructuralProperty(elementType, "Prop1", typeReference));

            EdmEntityContainer container = model.AddEntityContainer("Default", "Container");

            container.AddEntitySet("Entities", elementType);

            // Define queries and new up parser.
            Uri            root   = new Uri("http://host");
            Uri            url    = new Uri("http://host/Entities?$compute=cast(Prop1, 'Edm.String') as Property1AsString, tolower(Prop1) as Property1Lower");
            ODataUriParser parser = new ODataUriParser(model, root, url);

            // parse and validate
            ComputeClause            clause = parser.ParseCompute();
            List <ComputeExpression> items  = clause.ComputedItems.ToList();

            items.Count().Should().Be(2);
            items[0].Alias.ShouldBeEquivalentTo("Property1AsString");
            items[0].Expression.ShouldBeSingleValueFunctionCallQueryNode();
            items[0].Expression.TypeReference.ShouldBeEquivalentTo(typeReference);
            items[1].Alias.ShouldBeEquivalentTo("Property1Lower");
            items[1].Expression.ShouldBeSingleValueFunctionCallQueryNode();
            items[1].Expression.TypeReference.FullName().ShouldBeEquivalentTo("Edm.String");
            items[1].Expression.TypeReference.IsNullable.ShouldBeEquivalentTo(true); // tolower is built in function that allows nulls.

            ComputeExpression copy = new ComputeExpression(items[0].Expression, items[0].Alias, null);

            copy.Expression.Should().NotBeNull();
            copy.TypeReference.Should().BeNull();
            ComputeClause varied = new ComputeClause(null);
        }
Exemplo n.º 8
0
        public void ParseComputeAsLevel2ExpandQueryOption()
        {
            // Create model
            EdmModel      model         = new EdmModel();
            EdmEntityType elementType   = model.AddEntityType("DevHarness", "Entity");
            EdmEntityType targetType    = model.AddEntityType("DevHarness", "Navigation");
            EdmEntityType subTargetType = model.AddEntityType("DevHarness", "SubNavigation");

            EdmTypeReference typeReference = new EdmStringTypeReference(EdmCoreModel.Instance.GetPrimitiveType(EdmPrimitiveTypeKind.String), false);

            elementType.AddProperty(new EdmStructuralProperty(elementType, "Prop1", typeReference));
            targetType.AddProperty(new EdmStructuralProperty(targetType, "Prop1", typeReference));
            subTargetType.AddProperty(new EdmStructuralProperty(subTargetType, "Prop1", typeReference));

            EdmNavigationPropertyInfo propertyInfo = new EdmNavigationPropertyInfo();

            propertyInfo.Name               = "Nav1";
            propertyInfo.Target             = targetType;
            propertyInfo.TargetMultiplicity = EdmMultiplicity.One;
            EdmProperty navigation = EdmNavigationProperty.CreateNavigationProperty(elementType, propertyInfo);

            elementType.AddProperty(navigation);

            EdmNavigationPropertyInfo subPropertyInfo = new EdmNavigationPropertyInfo();

            subPropertyInfo.Name               = "SubNav1";
            subPropertyInfo.Target             = subTargetType;
            subPropertyInfo.TargetMultiplicity = EdmMultiplicity.One;
            EdmProperty subnavigation = EdmNavigationProperty.CreateNavigationProperty(targetType, subPropertyInfo);

            targetType.AddProperty(subnavigation);

            EdmEntityContainer container = model.AddEntityContainer("Default", "Container");

            container.AddEntitySet("Entities", elementType);

            // Define queries and new up parser.
            string address = "http://host/Entities?$compute=cast(Prop1, 'Edm.String') as Property1AsString, tolower(Prop1) as Property1Lower&" +
                             "$expand=Nav1($compute=cast(Prop1, 'Edm.String') as NavProperty1AsString;" +
                             "$expand=SubNav1($compute=cast(Prop1, 'Edm.String') as SubNavProperty1AsString))";
            Uri            root   = new Uri("http://host");
            Uri            url    = new Uri(address);
            ODataUriParser parser = new ODataUriParser(model, root, url);

            // parse
            ComputeClause      computeClause = parser.ParseCompute();
            SelectExpandClause selectClause  = parser.ParseSelectAndExpand();

            // validate top compute
            List <ComputeExpression> items = computeClause.ComputedItems.ToList();

            items.Count().Should().Be(2);
            items[0].Alias.ShouldBeEquivalentTo("Property1AsString");
            items[0].Expression.ShouldBeSingleValueFunctionCallQueryNode();
            items[0].Expression.TypeReference.ShouldBeEquivalentTo(typeReference);
            items[1].Alias.ShouldBeEquivalentTo("Property1Lower");
            items[1].Expression.ShouldBeSingleValueFunctionCallQueryNode();
            items[1].Expression.TypeReference.FullName().ShouldBeEquivalentTo("Edm.String");
            items[1].Expression.TypeReference.IsNullable.ShouldBeEquivalentTo(true); // tolower is built in function that allows nulls.

            // validate level 1 expand compute
            List <SelectItem> selectItems = selectClause.SelectedItems.ToList();

            selectItems.Count.Should().Be(1);
            ExpandedNavigationSelectItem expanded = selectItems[0] as ExpandedNavigationSelectItem;
            List <ComputeExpression>     computes = expanded.ComputeOption.ComputedItems.ToList();

            computes.Count.Should().Be(1);
            computes[0].Alias.ShouldBeEquivalentTo("NavProperty1AsString");
            computes[0].Expression.ShouldBeSingleValueFunctionCallQueryNode();
            computes[0].Expression.TypeReference.ShouldBeEquivalentTo(typeReference);

            // validate level 2 expand compute
            List <SelectItem> subSelectItems = expanded.SelectAndExpand.SelectedItems.ToList();

            subSelectItems.Count.Should().Be(1);
            ExpandedNavigationSelectItem subExpanded = subSelectItems[0] as ExpandedNavigationSelectItem;
            List <ComputeExpression>     subComputes = subExpanded.ComputeOption.ComputedItems.ToList();

            subComputes.Count.Should().Be(1);
            subComputes[0].Alias.ShouldBeEquivalentTo("SubNavProperty1AsString");
            subComputes[0].Expression.ShouldBeSingleValueFunctionCallQueryNode();
            subComputes[0].Expression.TypeReference.ShouldBeEquivalentTo(typeReference);
        }