[ Web Proxy ]
URL:
Viewing: https://raw.githubusercontent.com/pythonnet/pythonnet/v3.2.0/src/embed_tests/Dynamic.cs [Back]  [Original]

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

namespace Python.EmbeddingTest
{
    public class DynamicTest
    {
        /// 
        /// Set the attribute of a PyObject with a .NET object.
        /// 
        [Test]
        public void AssignObject()
        {
            var stream = new StringBuilder();
            dynamic sys = Py.Import("sys");
            sys.testattr = stream;
            // Check whether there are the same object.
            dynamic _stream = sys.testattr.AsManagedObject(typeof(StringBuilder));
            Assert.That(_stream, Is.EqualTo(stream));

            PythonEngine.RunSimpleString(
                "import sys\n" +
                "sys.testattr.Append('Hello!')\n");
            Assert.That(stream.ToString(), Is.EqualTo("Hello!"));
        }

        /// 
        /// Set the attribute of a PyObject to null.
        /// 
        [Test]
        public void AssignNone()
        {
            dynamic sys = Py.Import("sys");
            sys.testattr = new StringBuilder();
            Assert.That(sys.testattr, Is.Not.Null);

            sys.testattr = null;
            Assert.That(sys.testattr, Is.Null);
        }

        /// 
        /// Check whether we can get the attr of a python object when the
        /// value of attr is a PyObject.
        /// 
        [Test]
        public void AssignPyObject()
        {
            dynamic sys = Py.Import("sys");
            dynamic io = Py.Import("io");
            sys.testattr = io.StringIO();
            dynamic bb = sys.testattr; // Get the PyObject
            bb.write("Hello!");
            Assert.That(bb.getvalue().ToString(), Is.EqualTo("Hello!"));
        }

        /// 
        /// Pass the .NET object in Python side.
        /// 
        [Test]
        public void PassObjectInPython()
        {
            var stream = new StringBuilder();
            dynamic sys = Py.Import("sys");
            sys.testattr1 = stream;

            // Pass the .NET object in Python side
            PythonEngine.RunSimpleString(
                "import sys\n" +
                "sys.testattr2 = sys.testattr1\n"
            );

            // Compare in Python
            PythonEngine.RunSimpleString(
                "import sys\n" +
                "sys.testattr3 = sys.testattr1 is sys.testattr2\n"
            );
            Assert.That(sys.testattr3.ToString(), Is.EqualTo("True"));

            // Compare in .NET
            Assert.That(sys.testattr1, Is.EqualTo(sys.testattr2));
        }

        /// 
        /// Pass the PyObject in .NET side
        /// 
        [Test]
        public void PassPyObjectInNet()
        {
            var stream = new StringBuilder();
            dynamic sys = Py.Import("sys");
            sys.testattr1 = stream;
            sys.testattr2 = sys.testattr1;

            // Compare in Python
            PythonEngine.RunSimpleString(
                "import sys\n" +
                "sys.testattr3 = sys.testattr1 is sys.testattr2\n"
            );

            Assert.That(sys.testattr3.ToString(), Is.EqualTo("True"));

            // Compare in .NET
            Assert.That(sys.testattr1, Is.EqualTo(sys.testattr2));
        }

        // regression test for https://github.com/pythonnet/pythonnet/issues/1848
        [Test]
        public void EnumEquality()
        {
            using var scope = Py.CreateScope();
            scope.Exec(@"
import enum

class MyEnum(enum.IntEnum):
    OK = 1
    ERROR = 2

def get_status():
    return MyEnum.OK
"
);

            dynamic MyEnum = scope.Get("MyEnum");
            dynamic status = scope.Get("get_status").Invoke();
            Assert.That(status, Is.EqualTo(MyEnum.OK));
        }

        // regression test for https://github.com/pythonnet/pythonnet/issues/1680
        [Test]
        public void ForEach()
        {
            dynamic pyList = PythonEngine.Eval("[1,2,3]");
            var list = new List();
            foreach (int item in pyList)
                list.Add(item);
        }
    }
}

Web Proxy Viewer  |  New URL  |  Original Page