X Tutup
namespace Python.EmbeddingTest { using System; using System.Collections.Generic; using System.Text; using NUnit.Framework; using Python.Runtime; using Python.Runtime.Codecs; public class Codecs { [SetUp] public void SetUp() { PythonEngine.Initialize(); } [TearDown] public void Dispose() { PythonEngine.Shutdown(); } [Test] public void ConversionsGeneric() { ConversionsGeneric, ValueTuple>(); } static void ConversionsGeneric() { TupleCodec.Register(); var tuple = Activator.CreateInstance(typeof(T), 42, "42", new object()); T restored = default; using (Py.GIL()) using (var scope = Py.CreateScope()) { void Accept(T value) => restored = value; var accept = new Action(Accept).ToPython(); scope.Set(nameof(tuple), tuple); scope.Set(nameof(accept), accept); scope.Exec($"{nameof(accept)}({nameof(tuple)})"); Assert.AreEqual(expected: tuple, actual: restored); } } [Test] public void ConversionsObject() { ConversionsObject, ValueTuple>(); } static void ConversionsObject() { TupleCodec.Register(); var tuple = Activator.CreateInstance(typeof(T), 42, "42", new object()); T restored = default; using (Py.GIL()) using (var scope = Py.CreateScope()) { void Accept(object value) => restored = (T)value; var accept = new Action(Accept).ToPython(); scope.Set(nameof(tuple), tuple); scope.Set(nameof(accept), accept); scope.Exec($"{nameof(accept)}({nameof(tuple)})"); Assert.AreEqual(expected: tuple, actual: restored); } } [Test] public void TupleRoundtripObject() { TupleRoundtripObject, ValueTuple>(); } static void TupleRoundtripObject() { var tuple = Activator.CreateInstance(typeof(T), 42, "42", new object()); using (Py.GIL()) { var pyTuple = TupleCodec.Instance.TryEncode(tuple); Assert.IsTrue(TupleCodec.Instance.TryDecode(pyTuple, out object restored)); Assert.AreEqual(expected: tuple, actual: restored); } } [Test] public void TupleRoundtripGeneric() { TupleRoundtripGeneric, ValueTuple>(); } static void TupleRoundtripGeneric() { var tuple = Activator.CreateInstance(typeof(T), 42, "42", new object()); using (Py.GIL()) { var pyTuple = TupleCodec.Instance.TryEncode(tuple); Assert.IsTrue(TupleCodec.Instance.TryDecode(pyTuple, out T restored)); Assert.AreEqual(expected: tuple, actual: restored); } } } /// /// "Decodes" only objects of exact type . /// Result is just the raw proxy to the encoder instance itself. /// class ObjectToEncoderInstanceEncoder : IPyObjectEncoder { public bool CanEncode(Type type) => type == typeof(T); public PyObject TryEncode(object value) => PyObject.FromManagedObject(this); } /// /// Decodes object of specified Python type to the predefined value /// /// Type of the class DecoderReturningPredefinedValue : IPyObjectDecoder { public PyObject TheOnlySupportedSourceType { get; } public TTarget DecodeResult { get; } public DecoderReturningPredefinedValue(PyObject objectType, TTarget decodeResult) { this.TheOnlySupportedSourceType = objectType; this.DecodeResult = decodeResult; } public bool CanDecode(PyObject objectType, Type targetType) => objectType.Handle == TheOnlySupportedSourceType.Handle && targetType == typeof(TTarget); public bool TryDecode(PyObject pyObj, out T value) { if (typeof(T) != typeof(TTarget)) throw new ArgumentException(nameof(T)); value = (T)(object)DecodeResult; return true; } } }
X Tutup