Skip to content

Commit c9ee545

Browse files
committed
add tests
1 parent dc30a0d commit c9ee545

File tree

7 files changed

+159
-48
lines changed

7 files changed

+159
-48
lines changed

Sources/JExtractSwiftLib/JNI/JNISwift2JavaGenerator.swift

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414

1515
import JavaTypes
1616

17-
class JNISwift2JavaGenerator: Swift2JavaGenerator {
17+
package class JNISwift2JavaGenerator: Swift2JavaGenerator {
1818
let analysis: AnalysisResult
1919
let swiftModuleName: String
2020
let javaPackage: String
@@ -28,7 +28,7 @@ class JNISwift2JavaGenerator: Swift2JavaGenerator {
2828

2929
var thunkNameRegistry = ThunkNameRegistry()
3030

31-
init(
31+
package init(
3232
translator: Swift2JavaTranslator,
3333
javaPackage: String,
3434
swiftOutputDirectory: String,
@@ -51,7 +51,10 @@ class JNISwift2JavaGenerator: Swift2JavaGenerator {
5151
extension JNISwift2JavaGenerator {
5252
func writeExportedJavaSources() throws {
5353
var printer = CodePrinter()
54+
try writeExportedJavaSources(&printer)
55+
}
5456

57+
package func writeExportedJavaSources(_ printer: inout CodePrinter) throws {
5558
let filename = "\(self.swiftModuleName).java"
5659
logger.trace("Printing module class: \(filename)")
5760
printModule(&printer)
@@ -67,20 +70,27 @@ extension JNISwift2JavaGenerator {
6770

6871
func writeSwiftThunkSources() throws {
6972
var printer = CodePrinter()
73+
try writeSwiftThunkSources(&printer)
74+
}
7075

76+
package func writeSwiftThunkSources(_ printer: inout CodePrinter) throws {
7177
let moduleFilenameBase = "\(self.swiftModuleName)Module+SwiftJava"
7278
let moduleFilename = "\(moduleFilenameBase).swift"
7379

74-
logger.trace("Printing swift module class: \(moduleFilename)")
80+
do {
81+
logger.trace("Printing swift module class: \(moduleFilename)")
7582

76-
try printGlobalSwiftThunkSources(&printer)
83+
try printGlobalSwiftThunkSources(&printer)
7784

78-
if let outputFile = try printer.writeContents(
79-
outputDirectory: self.swiftOutputDirectory,
80-
javaPackagePath: nil,
81-
filename: moduleFilename)
82-
{
83-
print("[swift-java] Generated: \(moduleFilenameBase.bold).swift (at \(outputFile)")
85+
if let outputFile = try printer.writeContents(
86+
outputDirectory: self.swiftOutputDirectory,
87+
javaPackagePath: javaPackagePath,
88+
filename: moduleFilename
89+
) {
90+
print("[swift-java] Generated: \(moduleFilenameBase.bold).swift (at \(outputFile)")
91+
}
92+
} catch {
93+
logger.warning("Failed to write to Swift thunks: \(moduleFilename)")
8494
}
8595
}
8696
}
@@ -125,10 +135,9 @@ extension JNISwift2JavaGenerator {
125135
) { printer in
126136
let downcallParameters = zip(decl.functionSignature.parameters, translatedParameters).map { originalParam, translatedParam in
127137
let label = originalParam.argumentLabel ?? originalParam.parameterName ?? ""
128-
return "\(label)\(!label.isEmpty ? ": " : "")\(translatedParam.0)"
138+
return "\(label)\(!label.isEmpty ? ": " : "")\(originalParam.type)(fromJNI: \(translatedParam.0), in: environment!)"
129139
}
130140
let functionDowncall = "\(swiftModuleName).\(decl.name)(\(downcallParameters.joined(separator: ", ")))"
131-
printer.print("\(functionDowncall)")
132141

133142
if swiftReturnType.isVoid {
134143
printer.print(functionDowncall)

Tests/JExtractSwiftTests/Asserts/TextAssertions.swift

Lines changed: 35 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
import JExtractSwiftLib
1616
import Testing
17+
import JavaKitConfigurationShared
1718
import struct Foundation.CharacterSet
1819

1920
enum RenderKind {
@@ -23,32 +24,53 @@ enum RenderKind {
2324

2425
func assertOutput(
2526
dump: Bool = false,
26-
_ translator: Swift2JavaTranslator,
2727
input: String,
28+
_ mode: GenerationMode,
2829
_ renderKind: RenderKind,
30+
swiftModuleName: String = "SwiftModule",
2931
detectChunkByInitialLines: Int = 4,
3032
expectedChunks: [String],
3133
fileID: String = #fileID,
3234
filePath: String = #filePath,
3335
line: Int = #line,
3436
column: Int = #column
3537
) throws {
36-
try! translator.analyze(file: "/fake/Fake.swiftinterface", text: input)
38+
let translator = Swift2JavaTranslator(swiftModuleName: swiftModuleName)
3739

38-
let generator = FFMSwift2JavaGenerator(
39-
translator: translator,
40-
javaPackage: "com.example.swift",
41-
swiftOutputDirectory: "/fake",
42-
javaOutputDirectory: "/fake"
43-
)
40+
try! translator.analyze(file: "/fake/Fake.swiftinterface", text: input)
4441

4542
let output: String
4643
var printer: CodePrinter = CodePrinter(mode: .accumulateAll)
47-
switch renderKind {
48-
case .swift:
49-
try generator.writeSwiftThunkSources(printer: &printer)
50-
case .java:
51-
try generator.writeExportedJavaSources(printer: &printer)
44+
switch mode {
45+
case .ffm:
46+
let generator = FFMSwift2JavaGenerator(
47+
translator: translator,
48+
javaPackage: "com.example.swift",
49+
swiftOutputDirectory: "/fake",
50+
javaOutputDirectory: "/fake"
51+
)
52+
53+
switch renderKind {
54+
case .swift:
55+
try generator.writeSwiftThunkSources(printer: &printer)
56+
case .java:
57+
try generator.writeExportedJavaSources(printer: &printer)
58+
}
59+
60+
case .jni:
61+
let generator = JNISwift2JavaGenerator(
62+
translator: translator,
63+
javaPackage: "com.example.swift",
64+
swiftOutputDirectory: "/fake",
65+
javaOutputDirectory: "/fake"
66+
)
67+
68+
switch renderKind {
69+
case .swift:
70+
try generator.writeSwiftThunkSources(&printer)
71+
case .java:
72+
try generator.writeExportedJavaSources(&printer)
73+
}
5274
}
5375
output = printer.finalize()
5476

Tests/JExtractSwiftTests/ClassPrintingTests.swift

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,7 @@ struct ClassPrintingTests {
4141

4242
@Test("Import: class layout")
4343
func class_layout() throws {
44-
let st = Swift2JavaTranslator(
45-
swiftModuleName: "__FakeModule"
46-
)
47-
48-
try assertOutput(st, input: class_interfaceFile, .java, expectedChunks: [
44+
try assertOutput(input: class_interfaceFile, .ffm, .java, swiftModuleName: "__FakeModule", expectedChunks: [
4945
"""
5046
public static final SwiftAnyType TYPE_METADATA =
5147
new SwiftAnyType(SwiftKit.swiftjava.getType("__FakeModule", "MySwiftClass"));
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
import JExtractSwiftLib
2+
import Testing
3+
4+
@Suite
5+
struct JNIModuleTests {
6+
let globalMethodWithPrimitives = """
7+
public func helloWorld()
8+
public func takeIntegers(i1: Int8, i2: Int16, i3: Int32, i4: Int) -> UInt16
9+
public func otherPrimitives(b: Bool, f: Float, d: Double)
10+
"""
11+
12+
@Test
13+
func generatesModuleJavaClass() throws {
14+
let input = "public func helloWorld()"
15+
16+
try assertOutput(input: input, .jni, .java, expectedChunks: [
17+
"""
18+
// Generated by jextract-swift
19+
// Swift module: SwiftModule
20+
21+
package com.example.swift;
22+
23+
public final class SwiftModule {
24+
"""
25+
])
26+
}
27+
28+
@Test
29+
func globalMethodWithPrimitives_javaBindings() throws {
30+
try assertOutput(
31+
input: globalMethodWithPrimitives,
32+
.jni,
33+
.java,
34+
expectedChunks: [
35+
"""
36+
/**
37+
* Downcall to Swift:
38+
* {@snippet lang=swift :
39+
* public func helloWorld()
40+
* }
41+
*/
42+
public static native void helloWorld();
43+
""",
44+
"""
45+
/**
46+
* Downcall to Swift:
47+
* {@snippet lang=swift :
48+
* public func takeIntegers(i1: Int8, i2: Int16, i3: Int32, i4: Int) -> UInt16
49+
* }
50+
*/
51+
public static native char takeIntegers(byte i1, short i2, int i3, long i4);
52+
""",
53+
"""
54+
/**
55+
* Downcall to Swift:
56+
* {@snippet lang=swift :
57+
* public func otherPrimitives(b: Bool, f: Float, d: Double)
58+
* }
59+
*/
60+
public static native void otherPrimitives(boolean b, float f, double d);
61+
"""
62+
]
63+
)
64+
}
65+
66+
@Test
67+
func globalMethodWithPrimitives_swiftThunks() throws {
68+
try assertOutput(
69+
input: globalMethodWithPrimitives,
70+
.jni,
71+
.swift,
72+
detectChunkByInitialLines: 1,
73+
expectedChunks: [
74+
"""
75+
@_cdecl("Java_com_example_swift_SwiftModule_helloWorld")
76+
func swiftjava_SwiftModule_helloWorld(environment: UnsafeMutablePointer<JNIEnv?>!, thisClass: jclass) {
77+
SwiftModule.helloWorld()
78+
}
79+
""",
80+
"""
81+
@_cdecl("Java_com_example_swift_SwiftModule_takeIntegers")
82+
func swiftjava_SwiftModule_takeIntegers_i1_i2_i3_i4(environment: UnsafeMutablePointer<JNIEnv?>!, thisClass: jclass, i1: jbyte, i2: jshort, i3: jint, i4: jlong) -> jchar {
83+
let result = SwiftModule.takeIntegers(i1: Int8(fromJNI: i1, in: environment!), i2: Int16(fromJNI: i2, in: environment!), i3: Int32(fromJNI: i3, in: environment!), i4: Int(fromJNI: i4, in: environment!))
84+
return result.getJNIValue(in: environment)")
85+
}
86+
""",
87+
"""
88+
@_cdecl("Java_com_example_swift_SwiftModule_otherPrimitives")
89+
func swiftjava_SwiftModule_otherPrimitives_b_f_d(environment: UnsafeMutablePointer<JNIEnv?>!, thisClass: jclass, b: jboolean, f: jfloat, d: jdouble) {
90+
SwiftModule.otherPrimitives(b: Bool(fromJNI: b, in: environment!), f: Float(fromJNI: f, in: environment!), d: Double(fromJNI: d, in: environment!))
91+
}
92+
"""
93+
]
94+
)
95+
}
96+
}

Tests/JExtractSwiftTests/MethodThunkTests.swift

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,9 @@ final class MethodThunkTests {
3232

3333
@Test("Thunk overloads: globalFunc(a: Int32, b: Int64) & globalFunc(i32: Int32, l: Int64)")
3434
func thunk_overloads() throws {
35-
let st = Swift2JavaTranslator(
36-
swiftModuleName: "FakeModule"
37-
)
38-
st.log.logLevel = .error
39-
4035
try assertOutput(
41-
st, input: input, .swift,
36+
input: input, .ffm, .swift,
37+
swiftModuleName: "FakeModule",
4238
detectChunkByInitialLines: 1,
4339
expectedChunks:
4440
[

Tests/JExtractSwiftTests/StringPassingTests.swift

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,9 @@ final class StringPassingTests {
2525

2626
@Test("Import: public func writeString(string: String) -> Int")
2727
func method_helloWorld() throws {
28-
let st = Swift2JavaTranslator(
29-
swiftModuleName: "__FakeModule"
30-
)
31-
st.log.logLevel = .trace
32-
3328
try assertOutput(
34-
st, input: class_interfaceFile, .java,
29+
input: class_interfaceFile, .ffm, .java,
30+
swiftModuleName: "__FakeModule",
3531
expectedChunks: [
3632
"""
3733
/**

Tests/JExtractSwiftTests/VariableImportTests.swift

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,13 +35,9 @@ final class VariableImportTests {
3535

3636
@Test("Import: var counter: Int")
3737
func variable_int() throws {
38-
let st = Swift2JavaTranslator(
39-
swiftModuleName: "FakeModule"
40-
)
41-
st.log.logLevel = .error
42-
4338
try assertOutput(
44-
st, input: class_interfaceFile, .java,
39+
input: class_interfaceFile, .ffm, .java,
40+
swiftModuleName: "FakeModule",
4541
detectChunkByInitialLines: 8,
4642
expectedChunks: [
4743
"""

0 commit comments

Comments
 (0)