5
5
using System . Diagnostics . CodeAnalysis ;
6
6
using System . Linq ;
7
7
using System . Reflection ;
8
+ using System . Runtime . CompilerServices ;
8
9
using System . Threading ;
9
10
10
11
using Java . Interop ;
@@ -159,6 +160,32 @@ public unsafe void CreatePeer_UsesFallbackType ()
159
160
Assert . AreSame ( typeof ( IJavaInterfaceInvoker ) , p ! . GetType ( ) ) ;
160
161
}
161
162
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
+
162
189
[ Test ]
163
190
public void CreatePeer_ReplaceableDoesNotReplace ( )
164
191
{
@@ -167,17 +194,26 @@ public void CreatePeer_ReplaceableDoesNotReplace ()
167
194
v . Dispose ( ) ;
168
195
169
196
try {
197
+ Assert . IsNull ( valueManager . PeekPeer ( lref ) , "v.Dispose() should have unregistered the peer." ) ;
170
198
var peer1 = valueManager . CreatePeer ( ref lref , JniObjectReferenceOptions . Copy , typeof ( AnotherJavaInterfaceImpl ) ) ;
171
199
Assert . IsTrue (
172
200
peer1 ! . JniManagedPeerState . HasFlag ( JniManagedPeerStates . Replaceable ) ,
173
201
$ "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
+
174
205
var peer2 = valueManager . CreatePeer ( ref lref , JniObjectReferenceOptions . Copy , typeof ( AnotherJavaInterfaceImpl ) ) ;
175
206
Assert . IsTrue (
176
207
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 } .") ;
178
209
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" ) } ") ;
181
217
} finally {
182
218
JniObjectReference . Dispose ( ref lref ) ;
183
219
}
0 commit comments