forked from pythonnet/pythonnet
-
Notifications
You must be signed in to change notification settings - Fork 31
Expand file tree
/
Copy pathTestPyObject.cs
More file actions
146 lines (120 loc) · 4.62 KB
/
Copy pathTestPyObject.cs
File metadata and controls
146 lines (120 loc) · 4.62 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
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<string> expectedMemberNames = new List<string>
{
"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<string> 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<ArgumentNullException>(() => list.Invoke(new PyObject[] {null}));
}
[Test]
public void AsManagedObjectInvalidCast()
{
var list = PythonEngine.Eval("list");
Assert.Throws<InvalidCastException>(() => list.AsManagedObject(typeof(int)));
}
[Test]
public void UnaryMinus_ThrowsOnBadType()
{
dynamic list = new PyList();
var error = Assert.Throws<PythonException>(() => list = -list);
Assert.AreEqual("TypeError", error.Type.Name);
}
[Test]
[Obsolete]
[Ignore("Obsolote.")]
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<PythonException>(
() => 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)");
}
[Test]
public void FailedTryAsDoesNotLeavePythonErrorSet()
{
using var _ = Py.GIL();
using var locals = new PyDict();
PythonEngine.Exec("def a_function(a, b): return a * b", null, locals);
using var pyObject = locals.GetItem("a_function");
Assert.IsFalse(pyObject.TryAs<int>(out var _));
Assert.IsFalse(Exceptions.ErrorOccurred());
Assert.IsFalse(pyObject.TryAsManagedObject(typeof(decimal), out var _));
Assert.IsFalse(Exceptions.ErrorOccurred());
// The thread state must be clean for subsequent unrelated Python calls
Assert.DoesNotThrow(() => PyModule.FromString("TryAsLeakCheck", "x = 1").Dispose());
}
[Test]
public void FailedAsManagedObjectRaisesWithConversionErrorAsCause()
{
using var _ = Py.GIL();
using var locals = new PyDict();
PythonEngine.Exec("def a_function(a, b): return a * b", null, locals);
using var pyObject = locals.GetItem("a_function");
var exception = Assert.Throws<InvalidCastException>(() => pyObject.AsManagedObject(typeof(int)));
Assert.IsNotNull(exception.InnerException);
StringAssert.Contains("int()", exception.InnerException.Message);
Assert.IsFalse(Exceptions.ErrorOccurred());
}
}
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);
}
}