Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
114 changes: 114 additions & 0 deletions Tests/BridgeJSRuntimeTests/ArraySupportTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@ import JavaScriptKit
@JSFunction init(id: String) throws(JSException)
}

@JS protocol ArrayElementProtocol {
var value: Int { get set }
}

@JSClass struct ArraySupportImports {
@JSFunction static func jsIntArrayLength(_ items: [Int]) throws(JSException) -> Int

Expand All @@ -22,12 +26,27 @@ import JavaScriptKit
_ values: [ArrayElementObject]
) throws(JSException) -> [ArrayElementObject]

@JSFunction static func jsRoundTripOptionalIntArray(_ values: [Int?]) throws(JSException) -> [Int?]
@JSFunction static func jsRoundTripOptionalStringArray(_ values: [String?]) throws(JSException) -> [String?]
@JSFunction static func jsRoundTripOptionalBoolArray(_ values: [Bool?]) throws(JSException) -> [Bool?]
@JSFunction static func jsRoundTripOptionalJSValueArray(_ values: [JSValue?]) throws(JSException) -> [JSValue?]
@JSFunction static func jsRoundTripOptionalJSObjectArray(_ values: [JSObject?]) throws(JSException) -> [JSObject?]
@JSFunction static func jsRoundTripOptionalJSClassArray(
_ values: [ArrayElementObject?]
) throws(JSException) -> [ArrayElementObject?]

@JSFunction static func jsSumNumberArray(_ values: [Double]) throws(JSException) -> Double
@JSFunction static func jsCreateNumberArray() throws(JSException) -> [Double]

@JSFunction static func runJsArraySupportTests() throws(JSException)
}

final class ArraySupportTests: XCTestCase {

func testRunJsArraySupportTests() throws {
try ArraySupportImports.runJsArraySupportTests()
}

func testRoundTripIntArray() throws {
let values = [1, 2, 3, 4, 5]
let result = try ArraySupportImports.jsRoundTripIntArray(values)
Expand Down Expand Up @@ -105,4 +124,99 @@ final class ArraySupportTests: XCTestCase {

XCTAssertEqual(try ArraySupportImports.jsRoundTripJSClassArray([]), [])
}

func testRoundTripOptionalIntArray() throws {
let values = [1, nil, 3, nil, 5]
let result = try ArraySupportImports.jsRoundTripOptionalIntArray(values)
XCTAssertEqual(result, values)
}

func testRoundTripOptionalStringArray() throws {
let values = ["hello", nil, "world", nil, "🎉"]
let result = try ArraySupportImports.jsRoundTripOptionalStringArray(values)
XCTAssertEqual(result, values)
}

func testRoundTripOptionalBoolArray() throws {
let values = [true, nil, false, nil, true]
let result = try ArraySupportImports.jsRoundTripOptionalBoolArray(values)
XCTAssertEqual(result, values)
}

func testRoundTripOptionalJSValueArray() throws {
let values: [JSValue?] = [.number(1), nil, .string("hello"), nil, .object(.global)]
let result = try ArraySupportImports.jsRoundTripOptionalJSValueArray(values)
XCTAssertEqual(result, values)
}

func testRoundTripOptionalJSObjectArray() throws {
let values = [.global, nil, JSObject(), nil, ["a": 1, "b": 2]]
let result = try ArraySupportImports.jsRoundTripOptionalJSObjectArray(values)
XCTAssertEqual(result, values)
}

func testRoundTripOptionalJSClassArray() throws {
let values = try [
ArrayElementObject(id: "1"), nil, ArrayElementObject(id: "2"), nil, ArrayElementObject(id: "3"),
]
let result = try ArraySupportImports.jsRoundTripOptionalJSClassArray(values)
XCTAssertEqual(result, values)
XCTAssertEqual(try result[0]?.id, "1")
XCTAssertEqual(result[1], nil)
XCTAssertEqual(try result[2]?.id, "2")
XCTAssertEqual(result[3], nil)
XCTAssertEqual(try result[4]?.id, "3")

XCTAssertEqual(try ArraySupportImports.jsRoundTripOptionalJSClassArray([]), [])
}
}

@JS enum ArraySupportExports {
@JS static func roundTripIntArray(_ v: [Int]) -> [Int] { v }
@JS static func roundTripStringArray(_ v: [String]) -> [String] { v }
@JS static func roundTripDoubleArray(_ v: [Double]) -> [Double] { v }
@JS static func roundTripBoolArray(_ v: [Bool]) -> [Bool] { v }
@JS static func roundTripUnsafeRawPointerArray(_ v: [UnsafeRawPointer]) -> [UnsafeRawPointer] { v }
@JS static func roundTripUnsafeMutableRawPointerArray(_ v: [UnsafeMutableRawPointer]) -> [UnsafeMutableRawPointer] {
v
}
@JS static func roundTripOpaquePointerArray(_ v: [OpaquePointer]) -> [OpaquePointer] { v }
@JS static func roundTripUnsafePointerArray(_ v: [UnsafePointer<UInt8>]) -> [UnsafePointer<UInt8>] { v }
@JS static func roundTripUnsafeMutablePointerArray(
_ v: [UnsafeMutablePointer<UInt8>]
) -> [UnsafeMutablePointer<UInt8>] { v }
@JS static func roundTripJSValueArray(_ v: [JSValue]) -> [JSValue] { v }
@JS static func roundTripJSObjectArray(_ v: [JSObject]) -> [JSObject] { v }
@JS static func roundTripCaseEnumArray(_ v: [Direction]) -> [Direction] { v }
@JS static func roundTripStringRawValueEnumArray(_ v: [Theme]) -> [Theme] { v }
@JS static func roundTripIntRawValueEnumArray(_ v: [HttpStatus]) -> [HttpStatus] { v }
@JS static func roundTripStructArray(_ v: [DataPoint]) -> [DataPoint] { v }
@JS static func roundTripSwiftClassArray(_ v: [Greeter]) -> [Greeter] { v }
@JS static func roundTripNamespacedSwiftClassArray(_ v: [Utils.Converter]) -> [Utils.Converter] { v }
@JS static func roundTripProtocolArray(_ v: [ArrayElementProtocol]) -> [ArrayElementProtocol] { v }
@JS static func roundTripJSClassArray(_ v: [ArrayElementObject]) -> [ArrayElementObject] { v }

@JS static func roundTripOptionalIntArray(_ v: [Int?]) -> [Int?] { v }
@JS static func roundTripOptionalStringArray(_ v: [String?]) -> [String?] { v }
@JS static func roundTripOptionalJSObjectArray(_ v: [JSObject?]) -> [JSObject?] { v }
@JS static func roundTripOptionalCaseEnumArray(_ v: [Direction?]) -> [Direction?] { v }
@JS static func roundTripOptionalStringRawValueEnumArray(_ v: [Theme?]) -> [Theme?] { v }
@JS static func roundTripOptionalIntRawValueEnumArray(_ v: [HttpStatus?]) -> [HttpStatus?] { v }
@JS static func roundTripOptionalStructArray(_ v: [DataPoint?]) -> [DataPoint?] { v }
@JS static func roundTripOptionalSwiftClassArray(_ v: [Greeter?]) -> [Greeter?] { v }
@JS static func roundTripOptionalJSClassArray(_ v: [ArrayElementObject?]) -> [ArrayElementObject?] { v }

@JS static func roundTripNestedIntArray(_ v: [[Int]]) -> [[Int]] { v }
@JS static func roundTripNestedStringArray(_ v: [[String]]) -> [[String]] { v }
@JS static func roundTripNestedDoubleArray(_ v: [[Double]]) -> [[Double]] { v }
@JS static func roundTripNestedBoolArray(_ v: [[Bool]]) -> [[Bool]] { v }
@JS static func roundTripNestedStructArray(_ v: [[DataPoint]]) -> [[DataPoint]] { v }
@JS static func roundTripNestedCaseEnumArray(_ v: [[Direction]]) -> [[Direction]] { v }
@JS static func roundTripNestedSwiftClassArray(_ v: [[Greeter]]) -> [[Greeter]] { v }

// MARK: - Multiple Array Parameters
@JS static func multiArrayFirst(_ a: [Int], _ b: [String]) -> [Int] { a }
@JS static func multiArraySecond(_ a: [Int], _ b: [String]) -> [String] { b }
@JS static func multiOptionalArrayFirst(_ a: [Int]?, _ b: [String]?) -> [Int]? { a }
@JS static func multiOptionalArraySecond(_ a: [Int]?, _ b: [String]?) -> [String]? { b }
}
157 changes: 0 additions & 157 deletions Tests/BridgeJSRuntimeTests/ExportAPITests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -68,10 +68,6 @@ func runJsWorks() -> Void
return v
}

@JS func roundTripJSValueArray(v: [JSValue]) -> [JSValue] {
return v
}

@JS func roundTripOptionalJSValueArray(v: [JSValue]?) -> [JSValue]? {
return v
}
Expand Down Expand Up @@ -1275,71 +1271,6 @@ enum GraphOperations {

// MARK: - Array Tests

// Primitive arrays
@JS func roundTripIntArray(_ values: [Int]) -> [Int] {
return values
}

@JS func roundTripStringArray(_ values: [String]) -> [String] {
return values
}

@JS func roundTripDoubleArray(_ values: [Double]) -> [Double] {
return values
}

@JS func roundTripBoolArray(_ values: [Bool]) -> [Bool] {
return values
}

// Enum arrays
@JS func roundTripDirectionArray(_ values: [Direction]) -> [Direction] {
return values
}

@JS func roundTripStatusArray(_ values: [Status]) -> [Status] {
return values
}

@JS func roundTripThemeArray(_ values: [Theme]) -> [Theme] {
return values
}

@JS func roundTripHttpStatusArray(_ values: [HttpStatus]) -> [HttpStatus] {
return values
}

// Struct arrays
@JS func roundTripDataPointArray(_ points: [DataPoint]) -> [DataPoint] {
return points
}

// Class arrays
@JS func roundTripGreeterArray(_ greeters: [Greeter]) -> [Greeter] {
return greeters
}

// Arrays of optional elements
@JS func roundTripOptionalIntArray(_ values: [Int?]) -> [Int?] {
return values
}

@JS func roundTripOptionalStringArray(_ values: [String?]) -> [String?] {
return values
}

@JS func roundTripOptionalDataPointArray(_ points: [DataPoint?]) -> [DataPoint?] {
return points
}

@JS func roundTripOptionalDirectionArray(_ directions: [Direction?]) -> [Direction?] {
return directions
}

@JS func roundTripOptionalStatusArray(_ statuses: [Status?]) -> [Status?] {
return statuses
}

// Optional arrays
@JS func roundTripOptionalIntArrayType(_ values: [Int]?) -> [Int]? {
return values
Expand All @@ -1353,94 +1284,6 @@ enum GraphOperations {
return greeters
}

// Nested arrays

@JS func roundTripNestedIntArray(_ values: [[Int]]) -> [[Int]] {
return values
}

@JS func roundTripNestedStringArray(_ values: [[String]]) -> [[String]] {
return values
}

@JS func roundTripNestedDoubleArray(_ values: [[Double]]) -> [[Double]] {
return values
}

@JS func roundTripNestedBoolArray(_ values: [[Bool]]) -> [[Bool]] {
return values
}

@JS func roundTripNestedDataPointArray(_ points: [[DataPoint]]) -> [[DataPoint]] {
return points
}

@JS func roundTripNestedDirectionArray(_ directions: [[Direction]]) -> [[Direction]] {
return directions
}

@JS func roundTripNestedGreeterArray(_ greeters: [[Greeter]]) -> [[Greeter]] {
return greeters
}

@JS func roundTripUnsafeRawPointerArray(_ values: [UnsafeRawPointer]) -> [UnsafeRawPointer] {
return values
}
@JS func roundTripUnsafeMutableRawPointerArray(_ values: [UnsafeMutableRawPointer]) -> [UnsafeMutableRawPointer] {
return values
}
@JS func roundTripOpaquePointerArray(_ values: [OpaquePointer]) -> [OpaquePointer] {
return values
}
@JS func roundTripUnsafePointerArray(_ values: [UnsafePointer<UInt8>]) -> [UnsafePointer<UInt8>] {
return values
}
@JS func roundTripUnsafeMutablePointerArray(_ values: [UnsafeMutablePointer<UInt8>]) -> [UnsafeMutablePointer<UInt8>] {
return values
}

@JS func consumeDataProcessorArrayType(_ processors: [DataProcessor]) -> Int {
return processors.count
}

@JS func roundTripDataProcessorArrayType(_ processors: [DataProcessor]) -> [DataProcessor] {
return processors
}

@JS func roundTripJSObjectArray(_ objects: [JSObject]) -> [JSObject] {
return objects
}

@JS func roundTripOptionalJSObjectArray(_ objects: [JSObject?]) -> [JSObject?] {
return objects
}

@JS func roundTripFooArray(_ foos: [Foo]) -> [Foo] {
return foos
}

@JS func roundTripOptionalFooArray(_ foos: [Foo?]) -> [Foo?] {
return foos
}

// MARK: - Multiple stack-based parameters (regression test for LIFO ordering)

@JS func multiArrayFirstNums(nums: [Int], strs: [String]) -> [Int] {
return nums
}

@JS func multiArrayFirstStrs(nums: [Int], strs: [String]) -> [String] {
return strs
}

@JS func multiOptionalArrayFirstA(a: [Int]?, b: [String]?) -> [Int]? {
return a
}

@JS func multiOptionalArrayFirstB(a: [Int]?, b: [String]?) -> [String]? {
return b
}

class ExportAPITests: XCTestCase {
func testAll() {
var hasDeinitGreeter = false
Expand Down
Loading