public void GetContextTypeMember()
        {
            var klass = new TestClass("Object", "java.code.MyClass");

            klass.AddMethod(SupportTypeBuilder.CreateMethod(klass, "Echo", new CodeGenerationOptions(), "uint", false, false, new Parameter("value", "uint", "uint", false)));
            klass.AddField(new TestField("string", "Foo"));

            var context = new CodeGeneratorContext();

            context.ContextTypes.Push(klass);

            Assert.AreEqual("java.code.MyClass", context.GetContextTypeMember());

            context.ContextMethod = klass.Methods.Single();

            Assert.AreEqual("java.code.MyClass.Echo (uint)", context.GetContextTypeMember());

            context.ContextMethod = null;
            context.ContextField  = klass.Fields.Single();

            Assert.AreEqual("java.code.MyClass.Foo", context.GetContextTypeMember());

            context.ContextMethod = klass.Methods.Single();
            context.ContextField  = null;
            context.ContextTypes.Clear();

            Assert.AreEqual("Echo (uint)", context.GetContextTypeMember());
        }
示例#2
0
        void TestParameterlessMethods(string name)
        {
            var c = SupportTypeBuilder.CreateClass("java.myClass", options);
            var m = SupportTypeBuilder.CreateMethod(c, name, options);

            // Yes
            Assert.True(c.RequiresNew(m.Name, m));

            // No because > 0 parameters
            m.Parameters.Add(new Parameter("value", "int", "int", false));

            Assert.False(c.RequiresNew(m.Name, m));
        }
示例#3
0
        public void HandleAlwaysRequiresNew()
        {
            // The same name as a property always requires new, no matter the parameters
            var c = SupportTypeBuilder.CreateClass("java.myClass", options);
            var m = SupportTypeBuilder.CreateMethod(c, "Handle", options);

            // Yes
            Assert.True(c.RequiresNew(m.Name, m));

            // Yes, even with parameters
            m.Parameters.Add(new Parameter("value", "int", "int", false));

            Assert.True(c.RequiresNew(m.Name, m));
        }
示例#4
0
        public void ValidateInterfaceMethods()
        {
            var options = new CodeGenerationOptions {
                SupportDefaultInterfaceMethods = true
            };
            var iface = SupportTypeBuilder.CreateEmptyInterface("My.Test.Interface");

            iface.Methods.Add(SupportTypeBuilder.CreateMethod(iface, "DoAbstractThing", options));
            iface.Methods.Add(SupportTypeBuilder.CreateMethod(iface, "DoDefaultThing", options).SetDefaultInterfaceMethod());

            // The interface should be valid
            Assert.True(iface.Validate(options, new GenericParameterDefinitionList(), new CodeGeneratorContext()));

            Assert.AreEqual(2, iface.Methods.Count);
        }
示例#5
0
        public void FixProtectedMethod()
        {
            var klass = CreateSealedClass();

            var method = SupportTypeBuilder.CreateMethod(klass, "ToString", options);

            klass.Methods.Add(method);

            method.Visibility = "protected";
            method.IsOverride = false;

            SealedProtectedFixups.Fixup(new [] { (GenBase)klass }.ToList());

            Assert.AreEqual("private", method.Visibility);
        }
示例#6
0
        public void ValidateInvalidAbstractInterfaceMethods()
        {
            var options = new CodeGenerationOptions {
                SupportDefaultInterfaceMethods = true
            };
            var iface = SupportTypeBuilder.CreateEmptyInterface("My.Test.Interface");

            iface.Methods.Add(SupportTypeBuilder.CreateMethod(iface, "DoAbstractThing", options, "potato"));
            iface.Methods.Add(SupportTypeBuilder.CreateMethod(iface, "DoDefaultThing", options).SetDefaultInterfaceMethod());

            // The interface should be invalid because an abstract method is invalid
            Assert.False(iface.Validate(options, new GenericParameterDefinitionList(), new CodeGeneratorContext()));

            // The invalid abstract method should be removed, leaving just the valid default method
            Assert.AreEqual(1, iface.Methods.Count);
        }
示例#7
0
        public void WriteKotlinUnsignedArrayTypeMethodsClass()
        {
            var @class = new TestClass("Object", "java.code.MyClass");

            @class.AddMethod(SupportTypeBuilder.CreateMethod(@class, "Echo", options, "uint[]", false, false, new Parameter("value", "uint[]", "uint[]", false)));
            @class.AddMethod(SupportTypeBuilder.CreateMethod(@class, "Echo", options, "ushort[]", false, false, new Parameter("value", "ushort[]", "ushort[]", false)));
            @class.AddMethod(SupportTypeBuilder.CreateMethod(@class, "Echo", options, "ulong[]", false, false, new Parameter("value", "ulong[]", "ulong[]", false)));
            @class.AddMethod(SupportTypeBuilder.CreateMethod(@class, "Echo", options, "ubyte[]", false, false, new Parameter("value", "ubyte[]", "byte[]", false)));

            // Kotlin methods with unsigned types are name-mangled and don't support virtual
            foreach (var m in @class.Methods)
            {
                m.IsVirtual = false;
            }

            generator.Context.ContextTypes.Push(@class);
            generator.WriteClass(@class, string.Empty, new GenerationInfo("", "", "MyAssembly"));
            generator.Context.ContextTypes.Pop();

            Assert.AreEqual(GetTargetedExpected(nameof(WriteKotlinUnsignedArrayTypeMethodsClass)), writer.ToString().NormalizeLineEndings());
        }
示例#8
0
        public void TestEqualsMethodsWithOneParameter()
        {
            var c = SupportTypeBuilder.CreateClass("java.myClass", options);
            var m = SupportTypeBuilder.CreateMethod(c, "Equals", options, "void", false, false);

            // No because 0 parameters
            Assert.False(c.RequiresNew(m.Name, m));

            var p0 = new Parameter("p0", "object", "object", false);

            m.Parameters.Add(p0);

            // Yes
            Assert.True(c.RequiresNew(m.Name, m));

            // No because parameter is wrong type
            var p1 = new Parameter("p1", "string", "string", false);

            m = SupportTypeBuilder.CreateMethod(c, "Equals", options, "void", true, false, p1);

            Assert.False(c.RequiresNew(m.Name, m));
        }
示例#9
0
        void TestStaticMethodsWithTwoParameters(string name)
        {
            var c = SupportTypeBuilder.CreateClass("java.myClass", options);

            var p0 = new Parameter("p0", "object", "object", false);
            var p1 = new Parameter("p1", "object", "object", false);
            var m  = SupportTypeBuilder.CreateMethod(c, name, options, "void", true, false, p0, p1);

            // Yes
            Assert.True(c.RequiresNew(m.Name, m));

            // No because != 2 parameters
            m.Parameters.Add(new Parameter("value", "int", "int", false));
            Assert.False(c.RequiresNew(m.Name, m));

            // No because parameter is wrong type
            var p2 = new Parameter("p1", "string", "string", false);

            m = SupportTypeBuilder.CreateMethod(c, name, options, "void", true, false, p0, p2);

            Assert.False(c.RequiresNew(m.Name, m));
        }