Skip to content

Commit f38a946

Browse files
committed
More tests, better error messages
1 parent 4b8abce commit f38a946

File tree

1 file changed

+39
-3
lines changed

1 file changed

+39
-3
lines changed

tests/Java.Interop-Tests/Java.Interop/JniRuntimeJniValueManagerContract.cs

+39-3
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using System.Diagnostics.CodeAnalysis;
66
using System.Linq;
77
using System.Reflection;
8+
using System.Runtime.CompilerServices;
89
using System.Threading;
910

1011
using Java.Interop;
@@ -159,6 +160,32 @@ public unsafe void CreatePeer_UsesFallbackType ()
159160
Assert.AreSame (typeof (IJavaInterfaceInvoker), p!.GetType ());
160161
}
161162

163+
[Test]
164+
public void CreatePeer_CreatesNewValueUsingActivationConstructor ()
165+
{
166+
using var v1 = new AnotherJavaInterfaceImpl ();
167+
var lref = v1.PeerReference.NewLocalRef ();
168+
try {
169+
using var v2 = valueManager.CreatePeer (ref lref, JniObjectReferenceOptions.CopyAndDispose, typeof (AnotherJavaInterfaceImpl));
170+
Assert.AreNotSame (v1, v2, "CreatePeer() should create new values");
171+
}
172+
finally {
173+
JniObjectReference.Dispose (ref lref);
174+
}
175+
}
176+
177+
[Test]
178+
public void CreatePeer_ThrowsIfNoActivationConstructorPresent ()
179+
{
180+
using var v1 = new GetThis ();
181+
var lref = v1.PeerReference.NewLocalRef ();
182+
var ex = Assert.Throws<NotSupportedException> (
183+
() => valueManager.CreatePeer (ref lref, JniObjectReferenceOptions.CopyAndDispose, typeof (GetThis)),
184+
$"`GetThis` has no activation constructor, so attempting to use it should throw NotSupportedException.");
185+
Assert.IsTrue (lref.IsValid, "lref should still be valid");
186+
JniObjectReference.Dispose (ref lref);
187+
}
188+
162189
[Test]
163190
public void CreatePeer_ReplaceableDoesNotReplace ()
164191
{
@@ -167,17 +194,26 @@ public void CreatePeer_ReplaceableDoesNotReplace ()
167194
v.Dispose ();
168195

169196
try {
197+
Assert.IsNull (valueManager.PeekPeer (lref), "v.Dispose() should have unregistered the peer.");
170198
var peer1 = valueManager.CreatePeer (ref lref, JniObjectReferenceOptions.Copy, typeof (AnotherJavaInterfaceImpl));
171199
Assert.IsTrue (
172200
peer1!.JniManagedPeerState.HasFlag (JniManagedPeerStates.Replaceable),
173201
$"Expected peer1.JniManagedPeerState to have .Replaceable, but was {peer1.JniManagedPeerState}.");
202+
Assert.AreSame (peer1, valueManager.PeekPeer (lref),
203+
$"Expected peer1==PeekValue(peer1.PeerReference); it's the only one that should exist!");
204+
174205
var peer2 = valueManager.CreatePeer (ref lref, JniObjectReferenceOptions.Copy, typeof (AnotherJavaInterfaceImpl));
175206
Assert.IsTrue (
176207
peer2!.JniManagedPeerState.HasFlag (JniManagedPeerStates.Replaceable),
177-
$"Expected peer2.JniManagedPeerState to have .Replaceable, but was {peer1.JniManagedPeerState}.");
208+
$"Expected peer2.JniManagedPeerState to have .Replaceable, but was {peer2.JniManagedPeerState}.");
178209
Assert.AreNotSame (peer1, peer2, "Expected peer1 and peer2 to be different instances.");
179-
var peeked = valueManager.PeekPeer (peer2.PeerReference);
180-
Assert.AreSame (peer1, peeked, "Expected peer1 and peeked to be the same instance.");
210+
211+
var peeked = valueManager.PeekPeer (lref);
212+
Assert.AreSame (peer1, peeked,
213+
"Expected peer1 and peeked to be the same instance; " +
214+
$"peeked={RuntimeHelpers.GetHashCode (peeked).ToString ("x")}, " +
215+
$"peer1={RuntimeHelpers.GetHashCode (peer1).ToString ("x")}, " +
216+
$"peer2={RuntimeHelpers.GetHashCode (peer2).ToString ("x")}");
181217
} finally {
182218
JniObjectReference.Dispose (ref lref);
183219
}

0 commit comments

Comments
 (0)