[ Web Proxy ]
URL:
Viewing: https://raw.githubusercontent.com/linGithubName/pythonnet/fast-call/src/embed_tests/TestPyMethod.cs [Back]  [Original]

using NUnit.Framework;
using Python.Runtime;
using System.Linq;
using System.Reflection;

namespace Python.EmbeddingTest
{
    public class TestPyMethod
    {
        [OneTimeSetUp]
        public void SetUp()
        {
            PythonEngine.Initialize();
        }

        [OneTimeTearDown]
        public void Dispose()
        {
            PythonEngine.Shutdown();
        }

        public class SampleClass
        {
            public int VoidCall() => 10;

            public int Foo(int a, int b = 10) => a + b;

            public int Foo2(int a = 10, params int[] args)
            {
                return a + args.Sum();
            }
        }

        [Test]
        public void TestVoidCall()
        {
            string name = string.Format("{0}.{1}",
                typeof(SampleClass).DeclaringType.Name,
                typeof(SampleClass).Name);
            string module = MethodBase.GetCurrentMethod().DeclaringType.Namespace;
            PythonEngine.Exec($@"
from {module} import *
SampleClass = {name}
obj = SampleClass()
assert obj.VoidCall() == 10
");
        }

        [Test]
        public void TestDefaultParameter()
        {
            string name = string.Format("{0}.{1}",
                typeof(SampleClass).DeclaringType.Name,
                typeof(SampleClass).Name);
            string module = MethodBase.GetCurrentMethod().DeclaringType.Namespace;

            PythonEngine.Exec($@"
from {module} import *
SampleClass = {name}
obj = SampleClass()
assert obj.Foo(10) == 20
assert obj.Foo(10, 1) == 11

assert obj.Foo2() == 10
assert obj.Foo2(20) == 20
assert obj.Foo2(20, 30) == 50
assert obj.Foo2(20, 30, 50) == 100
");
        }

        public class OperableObject
        {
            public int Num { get; set; }

            public OperableObject(int num)
            {
                Num = num;
            }

            public static OperableObject operator +(OperableObject a, OperableObject b)
            {
                return new OperableObject(a.Num + b.Num);
            }

            public static OperableObject operator -(OperableObject a, OperableObject b)
            {
                return new OperableObject(a.Num - b.Num);
            }

            public static OperableObject operator *(OperableObject a, OperableObject b)
            {
                return new OperableObject(a.Num * b.Num);
            }

            public static OperableObject operator /(OperableObject a, OperableObject b)
            {
                return new OperableObject(a.Num / b.Num);
            }

            public static OperableObject operator &(OperableObject a, OperableObject b)
            {
                return new OperableObject(a.Num & b.Num);
            }

            public static OperableObject operator |(OperableObject a, OperableObject b)
            {
                return new OperableObject(a.Num | b.Num);
            }

            public static OperableObject operator ^(OperableObject a, OperableObject b)
            {
                return new OperableObject(a.Num ^ b.Num);
            }

            public static OperableObject operator > offset);
            }
        }

        [Test]
        public void OperatorOverloads()
        {
            string name = string.Format("{0}.{1}",
                typeof(OperableObject).DeclaringType.Name,
                typeof(OperableObject).Name);
            string module = MethodBase.GetCurrentMethod().DeclaringType.Namespace;

            PythonEngine.Exec($@"
from {module} import *
cls = {name}
a = cls(2)
b = cls(10)
c = a + b
assert c.Num == a.Num + b.Num

c = a - b
assert c.Num == a.Num - b.Num

c = a * b
assert c.Num == a.Num * b.Num

c = a / b
assert c.Num == a.Num // b.Num

c = a & b
assert c.Num == a.Num & b.Num

c = a | b
assert c.Num == a.Num | b.Num

c = a ^ b
assert c.Num == a.Num ^ b.Num

c = a  b.Num
assert c.Num == a.Num >> b.Num
");
        }
    }
}

Web Proxy Viewer  |  New URL  |  Original Page