public void NativeTypeTakesPrecedenceOverMarshalTypeForMappedType()
        {
            var cppMarshallable = new CppParameter("param")
            {
                TypeName       = "short",
                ArrayDimension = "0",
                IsArray        = true,
                Rule           =
                {
                    MappingType = "bool"
                }
            };

            var typeRegistry = new TypeRegistry(Logger, A.Fake <IDocumentationLinker>());

            typeRegistry.BindType("bool", TypeRegistry.Boolean, TypeRegistry.Int32);
            typeRegistry.BindType("short", TypeRegistry.Int16);

            var marshalledElementFactory = new MarshalledElementFactory(Logger, new GlobalNamespaceProvider(), typeRegistry);

            var csMarshallable = marshalledElementFactory.Create(cppMarshallable, cppMarshallable.Name);

            Assert.Equal(TypeRegistry.Boolean, csMarshallable.PublicType);
            Assert.Equal(TypeRegistry.Int16, csMarshallable.MarshalType);
            Assert.False(csMarshallable.HasPointer);
            Assert.False(csMarshallable.IsArray);
            Assert.Equal(0, csMarshallable.ArrayDimensionValue);
        }
        public void NativeTypeTakesPrecedenceOverMarshalTypeForMappedType()
        {
            var cppMarshallable = new CppMarshallable
            {
                TypeName       = "short",
                ArrayDimension = "0",
                IsArray        = true,
                Rule           = new MappingRule
                {
                    MappingType = "bool"
                }
            };

            var typeRegistry = new TypeRegistry(Logger, A.Fake <IDocumentationLinker>());

            typeRegistry.BindType("bool", typeRegistry.ImportType(typeof(bool)), typeRegistry.ImportType(typeof(int)));
            typeRegistry.BindType("short", typeRegistry.ImportType(typeof(short)));

            var marshalledElementFactory = new MarshalledElementFactory(Logger, new GlobalNamespaceProvider(), typeRegistry);

            var csMarshallable = marshalledElementFactory.Create(cppMarshallable);

            Assert.Equal(typeRegistry.ImportType(typeof(bool)), csMarshallable.PublicType);
            Assert.Equal(typeRegistry.ImportType(typeof(short)), csMarshallable.MarshalType);
        }
        public void BoolToIntSetForAllIntegerTypes(PrimitiveTypeCode integerType)
        {
            var cppMarshallable = new CppParameter("param")
            {
                TypeName       = "Integer",
                ArrayDimension = "0",
                IsArray        = true,
                Rule           =
                {
                    MappingType = "bool"
                }
            };

            var typeRegistry = new TypeRegistry(Logger, A.Fake <IDocumentationLinker>());

            typeRegistry.BindType("bool", TypeRegistry.Boolean);
            typeRegistry.BindType("Integer", TypeRegistry.ImportPrimitiveType(integerType));

            var marshalledElementFactory = new MarshalledElementFactory(Logger, new GlobalNamespaceProvider(), typeRegistry);

            var csMarshallable = marshalledElementFactory.Create(cppMarshallable, cppMarshallable.Name);

            Assert.Equal(TypeRegistry.Boolean, csMarshallable.PublicType);
            Assert.Equal(TypeRegistry.ImportPrimitiveType(integerType), csMarshallable.MarshalType);
            Assert.True(csMarshallable.IsBoolToInt);
            Assert.False(csMarshallable.HasPointer);
            Assert.False(csMarshallable.IsArray);
            Assert.Equal(0, csMarshallable.ArrayDimensionValue);
        }
        public void BoolToIntSetForAllIntegerTypes(Type integerType)
        {
            var cppMarshallable = new CppMarshallable
            {
                TypeName       = "Integer",
                ArrayDimension = "0",
                IsArray        = true,
                Rule           = new MappingRule
                {
                    MappingType = "bool"
                }
            };

            var typeRegistry = new TypeRegistry(Logger, A.Fake <IDocumentationLinker>());

            typeRegistry.BindType("bool", typeRegistry.ImportType(typeof(bool)));
            typeRegistry.BindType("Integer", typeRegistry.ImportType(integerType));

            var marshalledElementFactory = new MarshalledElementFactory(Logger, new GlobalNamespaceProvider(), typeRegistry);

            var csMarshallable = marshalledElementFactory.Create(cppMarshallable);

            Assert.Equal(typeRegistry.ImportType(typeof(bool)), csMarshallable.PublicType);
            Assert.Equal(typeRegistry.ImportType(integerType), csMarshallable.MarshalType);
            Assert.True(csMarshallable.IsBoolToInt);
        }
        public void BoundTypeForArrayType(string elementType)
        {
            var cppMarshallable = new CppParameter("param")
            {
                TypeName       = elementType,
                IsArray        = true,
                ArrayDimension = "ANYSIZE_ARRAY"
            };

            var         typeRegistry      = new TypeRegistry(Logger, A.Fake <IDocumentationLinker>());
            CsInterface dynamicStringType = new(null, "DynamicString");

            typeRegistry.BindType(elementType + "[ANYSIZE_ARRAY]", dynamicStringType);

            var marshalledElementFactory = new MarshalledElementFactory(Logger, new GlobalNamespaceProvider(), typeRegistry);

            var csMarshallable = marshalledElementFactory.Create(cppMarshallable, cppMarshallable.Name);

            Assert.Equal(dynamicStringType, csMarshallable.PublicType);
            Assert.Equal(dynamicStringType, csMarshallable.MarshalType);
            Assert.Equal(0, csMarshallable.ArrayDimensionValue);
            Assert.False(csMarshallable.IsArray);
            Assert.False(csMarshallable.IsString);
            Assert.False(csMarshallable.IsWideChar);
        }
 public StructTransform(NamingRulesManager namingRules,
                        NamespaceRegistry namespaceRegistry,
                        MarshalledElementFactory factory,
                        Ioc ioc) : base(namingRules, ioc)
 {
     this.namespaceRegistry           = namespaceRegistry;
     this.factory                     = factory;
     factory.RequestStructProcessing += Process;
 }
Example #7
0
 public MethodTransform(NamingRulesManager namingRules,
                        GroupRegistry groupRegistry,
                        MarshalledElementFactory factory,
                        IInteropSignatureTransform interopSignatureTransform,
                        Ioc ioc) : base(namingRules, ioc)
 {
     this.groupRegistry = groupRegistry;
     this.factory       = factory;
     signatureTransform = interopSignatureTransform;
 }
        public void PointerParameterMarkedAsHasPointer()
        {
            var cppParameter = new CppParameter
            {
                TypeName = "int",
                Pointer  = "*"
            };

            var typeRegistry = new TypeRegistry(Logger, A.Fake <IDocumentationLinker>());

            typeRegistry.BindType("int", typeRegistry.ImportType(typeof(int)));
            var marshalledElementFactory = new MarshalledElementFactory(Logger, new GlobalNamespaceProvider(), typeRegistry);

            var csParameter = marshalledElementFactory.Create(cppParameter);

            Assert.True(csParameter.HasPointer);
        }
        public void PointerToTypeWithMarshallingMarshalsAsUnderlyingType()
        {
            var cppMarshallable = new CppMarshallable
            {
                TypeName = "bool",
                Pointer  = "*"
            };

            var typeRegistry = new TypeRegistry(Logger, A.Fake <IDocumentationLinker>());

            typeRegistry.BindType("bool", typeRegistry.ImportType(typeof(bool)), typeRegistry.ImportType(typeof(int)));
            var marshalledElementFactory = new MarshalledElementFactory(Logger, new GlobalNamespaceProvider(), typeRegistry);

            var csMarshallable = marshalledElementFactory.Create(cppMarshallable);

            Assert.Equal(typeRegistry.ImportType(typeof(int)), csMarshallable.MarshalType);
        }
        public void ParamWithNoTypeMappingShouldHaveMarshalTypeEqualToPublic()
        {
            var marshallable = new CppParameter("param")
            {
                TypeName = "int"
            };

            var typeRegistry = new TypeRegistry(Logger, A.Fake <IDocumentationLinker>());

            typeRegistry.BindType("int", TypeRegistry.Int32);

            var marshalledElementFactory = new MarshalledElementFactory(Logger, new GlobalNamespaceProvider(), typeRegistry);

            var csMarshallable = marshalledElementFactory.Create(marshallable, marshallable.Name);

            Assert.Equal(csMarshallable.PublicType, csMarshallable.MarshalType);
        }
        public void ParamWithNoTypeMappingShouldHaveMarshalTypeEqualToPublic()
        {
            var marshallable = new CppMarshallable
            {
                TypeName = "int"
            };

            var typeRegistry = new TypeRegistry(Logger, A.Fake <IDocumentationLinker>());

            typeRegistry.BindType("int", typeRegistry.ImportType(typeof(int)));

            var marshalledElementFactory = new MarshalledElementFactory(Logger, new GlobalNamespaceProvider("SharpGen.Runtime"), typeRegistry);

            var csMarshallable = marshalledElementFactory.Create(marshallable);

            Assert.Equal(csMarshallable.PublicType, csMarshallable.MarshalType);
        }
        public void ParameterWithStructSizeRelationLogsError()
        {
            var cppParameter = new CppParameter
            {
                TypeName = "int"
            };

            cppParameter.GetMappingRule().Relation = "struct_size()";

            var typeRegistry = new TypeRegistry(Logger, A.Fake <IDocumentationLinker>());

            typeRegistry.BindType("int", typeRegistry.ImportType(typeof(int)));
            var marshalledElementFactory = new MarshalledElementFactory(Logger, new GlobalNamespaceProvider("SharpGen.Runtime"), typeRegistry);
            var csParameter = marshalledElementFactory.Create(cppParameter);

            AssertLoggingCodeLogged(LoggingCodes.InvalidRelation);
        }
        public void CharPointerMappedToStringMarshalledWithIntPtr()
        {
            var cppMarshallable = new CppMarshallable
            {
                TypeName = "char",
                Pointer  = "*"
            };

            var typeRegistry = new TypeRegistry(Logger, A.Fake <IDocumentationLinker>());

            var marshalledElementFactory = new MarshalledElementFactory(Logger, new GlobalNamespaceProvider(), typeRegistry);

            var csMarshallable = marshalledElementFactory.Create(cppMarshallable);

            Assert.Equal(typeRegistry.ImportType(typeof(string)), csMarshallable.PublicType);
            Assert.Equal(typeRegistry.ImportType(typeof(IntPtr)), csMarshallable.MarshalType);
            Assert.True(csMarshallable.HasPointer);
        }
        public void FieldWithPointerTypeMarshalledAsIntPtr()
        {
            var cppField = new CppField
            {
                TypeName = "int",
                Pointer  = "*"
            };

            var typeRegistry = new TypeRegistry(Logger, A.Fake <IDocumentationLinker>());

            typeRegistry.BindType("int", typeRegistry.ImportType(typeof(IntPtr)));
            var marshalledElementFactory = new MarshalledElementFactory(Logger, new GlobalNamespaceProvider("SharpGen.Runtime"), typeRegistry);

            var csField = marshalledElementFactory.Create(cppField);

            Assert.Equal(typeRegistry.ImportType(typeof(IntPtr)), csField.PublicType);
            Assert.Equal(csField.PublicType, csField.MarshalType);
        }
        public void DoublePointerNonInterfaceParameterMappedAsIntPtr()
        {
            var cppParameter = new CppParameter
            {
                TypeName = "int",
                Pointer  = "**"
            };

            var typeRegistry = new TypeRegistry(Logger, A.Fake <IDocumentationLinker>());

            typeRegistry.BindType("int", typeRegistry.ImportType(typeof(int)));
            var marshalledElementFactory = new MarshalledElementFactory(Logger, new GlobalNamespaceProvider("SharpGen.Runtime"), typeRegistry);
            var csParameter = marshalledElementFactory.Create(cppParameter);

            Assert.Equal(typeRegistry.ImportType(typeof(IntPtr)), csParameter.PublicType);
            Assert.Equal(typeRegistry.ImportType(typeof(IntPtr)), csParameter.MarshalType);
            Assert.True(csParameter.HasPointer);
        }
        public void PointerNonInterfaceReturnValueMappedAsIntPtr()
        {
            var cppReturnValue = new CppReturnValue
            {
                TypeName = "int",
                Pointer  = "*"
            };

            var typeRegistry = new TypeRegistry(Logger, A.Fake <IDocumentationLinker>());

            typeRegistry.BindType("int", typeRegistry.ImportType(typeof(int)));
            var marshalledElementFactory = new MarshalledElementFactory(Logger, new GlobalNamespaceProvider(), typeRegistry);
            var csReturnValue            = marshalledElementFactory.Create(cppReturnValue);

            Assert.Equal(typeRegistry.ImportType(typeof(IntPtr)), csReturnValue.PublicType);
            Assert.Equal(typeRegistry.ImportType(typeof(IntPtr)), csReturnValue.MarshalType);
            Assert.True(csReturnValue.HasPointer);
        }
        public void FieldWithPointerTypeMarshalledAsIntPtr()
        {
            var cppField = new CppField("field")
            {
                TypeName = "int",
                Pointer  = "*"
            };

            var typeRegistry = new TypeRegistry(Logger, A.Fake <IDocumentationLinker>());

            typeRegistry.BindType("int", TypeRegistry.IntPtr);
            var marshalledElementFactory = new MarshalledElementFactory(Logger, new GlobalNamespaceProvider(), typeRegistry);

            var csField = marshalledElementFactory.Create(cppField, cppField.Name);

            Assert.Equal(TypeRegistry.IntPtr, csField.PublicType);
            Assert.Equal(csField.PublicType, csField.MarshalType);
        }
        public void DoublePointerParameterMappedAsOut()
        {
            var cppParameter = new CppParameter("param")
            {
                TypeName = "Interface",
                Pointer  = "**"
            };

            var typeRegistry = new TypeRegistry(Logger, A.Fake <IDocumentationLinker>());

            typeRegistry.BindType("Interface", new CsInterface(null, "Interface"));

            var marshalledElementFactory = new MarshalledElementFactory(Logger, new GlobalNamespaceProvider(), typeRegistry);

            var csParameter = marshalledElementFactory.Create(cppParameter, cppParameter.Name);

            Assert.Equal(CsParameterAttribute.Out, csParameter.Attribute);
        }
        public void ZeroDimensionArrayMappedAsSingleElement()
        {
            var cppMarshallable = new CppMarshallable
            {
                TypeName       = "int",
                ArrayDimension = "0",
                IsArray        = true
            };

            var typeRegistry = new TypeRegistry(Logger, A.Fake <IDocumentationLinker>());

            typeRegistry.BindType("int", typeRegistry.ImportType(typeof(int)));

            var marshalledElementFactory = new MarshalledElementFactory(Logger, new GlobalNamespaceProvider(), typeRegistry);

            var csMarshallable = marshalledElementFactory.Create(cppMarshallable);

            Assert.False(csMarshallable.IsArray);
        }
        public void FieldWithPointerToInterfaceTypeHasPublicTypeOfInterface()
        {
            var cppField = new CppField("field")
            {
                TypeName = "Interface",
                Pointer  = "*"
            };

            var typeRegistry = new TypeRegistry(Logger, A.Fake <IDocumentationLinker>());

            typeRegistry.BindType("Interface", new CsInterface(null, "Interface"));
            var marshalledElementFactory = new MarshalledElementFactory(Logger, new GlobalNamespaceProvider(), typeRegistry);

            var csField = marshalledElementFactory.Create(cppField, cppField.Name);

            Assert.Equal(typeRegistry.FindBoundType("Interface"), csField.PublicType);
            Assert.Equal(TypeRegistry.IntPtr, csField.MarshalType);
            Assert.True(csField.IsInterface);
        }
        public void DoublePointerNonInterfaceParameterMappedAsIntPtr()
        {
            var cppParameter = new CppParameter("param")
            {
                TypeName = "int",
                Pointer  = "**"
            };

            var typeRegistry = new TypeRegistry(Logger, A.Fake <IDocumentationLinker>());

            typeRegistry.BindType("int", TypeRegistry.Int32);
            var marshalledElementFactory = new MarshalledElementFactory(Logger, new GlobalNamespaceProvider(), typeRegistry);
            var csParameter = marshalledElementFactory.Create(cppParameter, cppParameter.Name);

            Assert.Equal(TypeRegistry.IntPtr, csParameter.PublicType);
            Assert.Equal(TypeRegistry.IntPtr, csParameter.MarshalType);
            Assert.True(csParameter.HasPointer);
            Assert.False(csParameter.IsArray);
            Assert.Equal(0, csParameter.ArrayDimensionValue);
        }
        public void PointerToTypeWithMarshallingMarshalsAsUnderlyingType()
        {
            var cppMarshallable = new CppParameter("param")
            {
                TypeName = "bool",
                Pointer  = "*"
            };

            var typeRegistry = new TypeRegistry(Logger, A.Fake <IDocumentationLinker>());

            typeRegistry.BindType("bool", TypeRegistry.Boolean, TypeRegistry.Int32);
            var marshalledElementFactory = new MarshalledElementFactory(Logger, new GlobalNamespaceProvider(), typeRegistry);

            var csMarshallable = marshalledElementFactory.Create(cppMarshallable, cppMarshallable.Name);

            Assert.Equal(TypeRegistry.Int32, csMarshallable.MarshalType);
            Assert.Equal(0, csMarshallable.ArrayDimensionValue);
            Assert.False(csMarshallable.IsArray);
            Assert.True(csMarshallable.HasPointer);
        }
        public void CharPointerMappedToStringMarshalledWithIntPtr()
        {
            var cppMarshallable = new CppParameter("param")
            {
                TypeName = "char",
                Pointer  = "*"
            };

            var typeRegistry = new TypeRegistry(Logger, A.Fake <IDocumentationLinker>());

            var marshalledElementFactory = new MarshalledElementFactory(Logger, new GlobalNamespaceProvider(), typeRegistry);

            var csMarshallable = marshalledElementFactory.Create(cppMarshallable, cppMarshallable.Name);

            Assert.Equal(TypeRegistry.String, csMarshallable.PublicType);
            Assert.Equal(TypeRegistry.IntPtr, csMarshallable.MarshalType);
            Assert.True(csMarshallable.HasPointer);
            Assert.False(csMarshallable.IsArray);
            Assert.Equal(0, csMarshallable.ArrayDimensionValue);
        }
        public void DoubleVoidPointerParameterPreserved()
        {
            var cppParameter = new CppParameter
            {
                TypeName  = "void",
                Pointer   = "**",
                Attribute = ParamAttribute.Out
            };

            var typeRegistry = new TypeRegistry(Logger, A.Fake <IDocumentationLinker>());

            typeRegistry.BindType("void", typeRegistry.ImportType(typeof(void)));
            var marshalledElementFactory = new MarshalledElementFactory(Logger, new GlobalNamespaceProvider(), typeRegistry);
            var csParameter = marshalledElementFactory.Create(cppParameter);

            Assert.Equal(typeRegistry.ImportType(typeof(IntPtr)), csParameter.PublicType);
            Assert.Equal(typeRegistry.ImportType(typeof(IntPtr)), csParameter.MarshalType);
            Assert.True(csParameter.HasPointer);
            Assert.True(csParameter.IsOut);
        }
        public void CharArrayMappedToStringMarshalledWithByte()
        {
            var cppMarshallable = new CppMarshallable
            {
                TypeName       = "char",
                IsArray        = true,
                ArrayDimension = "10"
            };

            var typeRegistry = new TypeRegistry(Logger, A.Fake <IDocumentationLinker>());

            var marshalledElementFactory = new MarshalledElementFactory(Logger, new GlobalNamespaceProvider(), typeRegistry);

            var csMarshallable = marshalledElementFactory.Create(cppMarshallable);

            Assert.Equal(typeRegistry.ImportType(typeof(string)), csMarshallable.PublicType);
            Assert.Equal(typeRegistry.ImportType(typeof(byte)), csMarshallable.MarshalType);
            Assert.Equal(10, csMarshallable.ArrayDimensionValue);
            Assert.True(csMarshallable.IsArray);
        }
        public void FieldWithPointerToInterfaceTypeHasPublicTypeOfInterface()
        {
            var cppField = new CppField
            {
                TypeName = "Interface",
                Pointer  = "*"
            };

            var typeRegistry = new TypeRegistry(Logger, A.Fake <IDocumentationLinker>());

            typeRegistry.BindType("Interface", new CsInterface {
                Name = "Interface"
            });
            var marshalledElementFactory = new MarshalledElementFactory(Logger, new GlobalNamespaceProvider("SharpGen.Runtime"), typeRegistry);

            var csField = marshalledElementFactory.Create(cppField);

            Assert.Equal(typeRegistry.FindBoundType("Interface"), csField.PublicType);
            Assert.Equal(typeRegistry.ImportType(typeof(IntPtr)), csField.MarshalType);
            Assert.True(csField.IsInterface);
        }
        public void BoolToIntArray()
        {
            var cppParameter = new CppParameter("param")
            {
                TypeName  = "bool", Pointer = "*",
                Attribute = ParamAttribute.In | ParamAttribute.Buffer
            };

            var typeRegistry = new TypeRegistry(Logger, A.Fake <IDocumentationLinker>());

            typeRegistry.BindType("bool", TypeRegistry.Boolean, TypeRegistry.UInt8);
            var marshalledElementFactory = new MarshalledElementFactory(Logger, new GlobalNamespaceProvider(), typeRegistry);

            var csParameter = marshalledElementFactory.Create(cppParameter, cppParameter.Name);

            Assert.Equal(TypeRegistry.Boolean, csParameter.PublicType);
            Assert.Equal(TypeRegistry.UInt8, csParameter.MarshalType);
            Assert.True(csParameter.IsArray);
            Assert.True(csParameter.IsBoolToInt);
            Assert.Equal(0, csParameter.ArrayDimensionValue);
        }
        public void BoolToIntArrayMarshalTypeIsIntegerArray()
        {
            var cppParameter = new CppParameter
            {
                TypeName = "bool",
                Pointer  = "*"
            };

            var typeRegistry = new TypeRegistry(Logger, A.Fake <IDocumentationLinker>());

            typeRegistry.BindType("bool", typeRegistry.ImportType(typeof(bool)), typeRegistry.ImportType(typeof(byte)));
            var marshalledElementFactory = new MarshalledElementFactory(Logger, new GlobalNamespaceProvider(), typeRegistry);

            cppParameter.Attribute = ParamAttribute.In | ParamAttribute.Buffer;

            var csParameter = marshalledElementFactory.Create(cppParameter);

            Assert.Equal(typeRegistry.ImportType(typeof(byte)), csParameter.MarshalType);
            Assert.True(csParameter.IsArray);
            Assert.True(csParameter.IsBoolToInt);
        }
        public void ParameterWithStructSizeRelationLogsError()
        {
            var cppParameter = new CppParameter
            {
                TypeName = "int"
            };

            cppParameter.GetMappingRule().Relation = "struct-size()";

            var typeRegistry = new TypeRegistry(Logger, A.Fake <IDocumentationLinker>());

            typeRegistry.BindType("int", typeRegistry.ImportType(typeof(int)));
            var marshalledElementFactory = new MarshalledElementFactory(Logger, new GlobalNamespaceProvider(), typeRegistry);

            using (LoggerMessageCountEnvironment(1, LogLevel.Error))
                using (LoggerMessageCountEnvironment(0, ~LogLevel.Error))
                    using (LoggerCodeRequiredEnvironment(LoggingCodes.InvalidRelation))
                    {
                        marshalledElementFactory.Create(cppParameter);
                    }
        }
        public void CharArrayMappedToStringMarshalledWithByte()
        {
            var cppMarshallable = new CppParameter("param")
            {
                TypeName       = "char",
                IsArray        = true,
                ArrayDimension = "10"
            };

            var typeRegistry = new TypeRegistry(Logger, A.Fake <IDocumentationLinker>());

            var marshalledElementFactory = new MarshalledElementFactory(Logger, new GlobalNamespaceProvider(), typeRegistry);

            var csMarshallable = marshalledElementFactory.Create(cppMarshallable, cppMarshallable.Name);

            Assert.Equal(TypeRegistry.String, csMarshallable.PublicType);
            Assert.Equal(TypeRegistry.UInt8, csMarshallable.MarshalType);
            Assert.Equal(10, csMarshallable.ArrayDimensionValue);
            Assert.False(csMarshallable.IsArray);
            Assert.True(csMarshallable.IsString);
            Assert.False(csMarshallable.IsWideChar);
        }