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.IsNotNull(sys.testattr);
sys.testattr = null;
Assert.IsNull(sys.testattr);
}
///
/// 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.IsTrue(sys.testattr1.Equals(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.IsTrue(sys.testattr1.Equals(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.IsTrue(status == 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);
}
}
}