[ Web Proxy ]
URL:
Viewing: https://raw.githubusercontent.com/pythonnet/pythonnet/net8.0/src/embed_tests/TestPyObject.cs [Back]  [Original]

using System;
using System.Collections.Generic;
using System.Linq;
using NUnit.Framework;
using Python.Runtime;

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

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

        [Test]
        public void TestGetDynamicMemberNames()
        {
            List expectedMemberNames = new List
            {
                "add",
                "getNumber",
                "member1",
                "member2"
            };

            PyDict locals = new PyDict();

            PythonEngine.Exec(@"
class MemberNamesTest(object):
    def __init__(self):
        self.member1 = 123
        self.member2 = 'Test string'

    def getNumber(self):
        return 123

    def add(self, x, y):
        return x + y

a = MemberNamesTest()
", null, locals);

            PyObject a = locals.GetItem("a");

            IEnumerable memberNames = a.GetDynamicMemberNames();

            foreach (string expectedName in expectedMemberNames)
            {
                Assert.IsTrue(memberNames.Contains(expectedName), "Could not find member '{0}'.", expectedName);
            }
        }

        [Test]
        public void InvokeNull()
        {
            var list = PythonEngine.Eval("list");
            Assert.Throws(() => list.Invoke(new PyObject[] {null}));
        }

        [Test]
        public void AsManagedObjectInvalidCast()
        {
            var list = PythonEngine.Eval("list");
            Assert.Throws(() => list.AsManagedObject(typeof(int)));
        }

        [Test]
        public void UnaryMinus_ThrowsOnBadType()
        {
            dynamic list = new PyList();
            var error = Assert.Throws(() => list = -list);
            Assert.AreEqual("TypeError", error.Type.Name);
        }

        [Test]
        [Obsolete]
        public void GetAttrDefault_IgnoresAttributeErrorOnly()
        {
            var ob = new PyObjectTestMethods().ToPython();
            using var fallback = new PyList();
            var attrErrResult = ob.GetAttr(nameof(PyObjectTestMethods.RaisesAttributeError), fallback);
            Assert.IsTrue(PythonReferenceComparer.Instance.Equals(fallback, attrErrResult));

            var typeErrResult = Assert.Throws(
                () => ob.GetAttr(nameof(PyObjectTestMethods.RaisesTypeError), fallback)
            );
            Assert.AreEqual(Exceptions.TypeError, typeErrResult.Type);
        }

        // regression test from https://github.com/pythonnet/pythonnet/issues/1642
        [Test]
        public void InheritedMethodsAutoacquireGIL()
        {
            PythonEngine.Exec("from System import String\nString.Format('{0},{1}', 1, 2)");
        }
    }

    public class PyObjectTestMethods
    {
        public string RaisesAttributeError => throw new PythonException(new PyType(Exceptions.AttributeError), value: null, traceback: null);
        public string RaisesTypeError => throw new PythonException(new PyType(Exceptions.TypeError), value: null, traceback: null);
    }
}

Web Proxy Viewer  |  New URL  |  Original Page