forked from swiftlang/swift-java
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathBasicRuntimeTests.swift
More file actions
127 lines (105 loc) · 4.11 KB
/
BasicRuntimeTests.swift
File metadata and controls
127 lines (105 loc) · 4.11 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
//===----------------------------------------------------------------------===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2024 Apple Inc. and the Swift.org project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of Swift.org project authors
//
// SPDX-License-Identifier: Apache-2.0
//
//===----------------------------------------------------------------------===//
import JavaNet
import JavaUtil
import SwiftJava
import XCTest // NOTE: Workaround for https://github.com/swiftlang/swift-java/issues/43
/// Handy reference to the JVM abstraction.
var jvm: JavaVirtualMachine {
get throws {
try .shared()
}
}
class BasicRuntimeTests: XCTestCase {
func testJavaObjectManagement() throws {
let environment = try jvm.environment()
let sneakyJavaThis: jobject
do {
let object = JavaObject(environment: environment)
XCTAssert(object.toString().starts(with: "java.lang.Object"))
// Make sure this object was promoted to a global reference.
XCTAssertEqual(
object.javaEnvironment.pointee?.pointee.GetObjectRefType(object.javaEnvironment, object.javaThis),
JNIGlobalRefType
)
// Keep track of the Java object.
sneakyJavaThis = object.javaThis
}
// The reference should now be invalid, because we've deleted the
// global reference.
XCTAssertEqual(environment.pointee?.pointee.GetObjectRefType(environment, sneakyJavaThis), JNIInvalidRefType)
// 'super' and 'as' don't require allocating a new holder.
let url = try URI("http://swift.org", environment: environment).toURL()!
let superURL: JavaObject = url
XCTAssert(url.javaHolder === superURL.javaHolder)
let urlAgain = superURL.as(JavaURL.self)!
XCTAssert(url.javaHolder === urlAgain.javaHolder)
}
func testJavaExceptionsInSwift() throws {
let environment = try jvm.environment()
do {
_ = try URI("bad url", environment: environment)
} catch {
XCTAssertEqual(String(describing: error), "java.net.URISyntaxException: Illegal character in path at index 3: bad url")
}
}
func testStaticMethods() throws {
let environment = try jvm.environment()
let urlConnectionClass = try JavaClass<URLConnection>(environment: environment)
XCTAssert(urlConnectionClass.getDefaultAllowUserInteraction() == false)
}
func testClassInstanceLookup() throws {
let environment = try jvm.environment()
do {
_ = try JavaClass<Nonexistent>(environment: environment)
} catch {
XCTAssertEqual(String(describing: error), "java.lang.NoClassDefFoundError: org/swift/javakit/Nonexistent")
}
}
func testNullJavaStringConversion() throws {
let environment = try jvm.environment()
let nullString = String(fromJNI: nil, in: environment)
XCTAssertEqual(nullString, "")
}
func testCrossThreadAccess() async throws {
let environment = try jvm.environment()
let url = try URI("https://swift.org", environment: environment).toURL()!
let string = await Task.detached {
// This should be called on a different thread
url.toString()
}.value
XCTAssertEqual(string, "https://swift.org")
}
func testListIterator() throws {
let environment = try jvm.environment()
let integerClass = try JavaClass<JavaInteger>(environment: environment)
let javaList = try XCTUnwrap(ArrayList<JavaInteger>(environment: environment).as(List<JavaInteger>.self))
_ = javaList.add(integerClass.valueOf(0))
_ = javaList.add(integerClass.valueOf(1))
_ = javaList.add(integerClass.valueOf(2))
XCTAssertEqual(javaList.map { $0.intValue() }, [0, 1, 2])
}
func testJavaOptional() throws {
let environment = try jvm.environment()
let integerClass = try JavaClass<JavaInteger>(environment: environment)
let javaOptional = Optional.some(integerClass.valueOf(42)).toJavaOptional()
if javaOptional.isPresent() {
XCTAssertEqual(javaOptional.get().intValue(), 42)
} else {
XCTFail("javaOptional is empty")
}
}
}
@JavaClass("org.swift.javakit.Nonexistent")
struct Nonexistent {}