From 096296aabab1f319b9690635ccb5a731c72fe178 Mon Sep 17 00:00:00 2001 From: Andrew Heard Date: Thu, 6 Jun 2024 18:11:08 -0400 Subject: [PATCH 01/12] [Vertex AI] Add CI for visionOS --- .github/workflows/vertexai.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/vertexai.yml b/.github/workflows/vertexai.yml index 8429178df3a..4babcd4f40a 100644 --- a/.github/workflows/vertexai.yml +++ b/.github/workflows/vertexai.yml @@ -18,7 +18,7 @@ jobs: spm-unit: strategy: matrix: - target: [iOS, macOS, catalyst] + target: [iOS, macOS, catalyst, visionOS] os: [macos-14] include: - os: macos-14 From df4d4c83deccb5a6a61c7df510220cd685da763e Mon Sep 17 00:00:00 2001 From: Andrew Heard Date: Thu, 6 Jun 2024 19:37:38 -0400 Subject: [PATCH 02/12] Switch to Xcode 15.3 for visionOS CI --- .github/workflows/vertexai.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/vertexai.yml b/.github/workflows/vertexai.yml index 4babcd4f40a..7a2a9c14a11 100644 --- a/.github/workflows/vertexai.yml +++ b/.github/workflows/vertexai.yml @@ -18,11 +18,14 @@ jobs: spm-unit: strategy: matrix: - target: [iOS, macOS, catalyst, visionOS] + target: [iOS, macOS, catalyst] os: [macos-14] include: - os: macos-14 xcode: Xcode_15.2 + - os: macos-14 + xcode: Xcode_15.3 + target: visionOS runs-on: ${{ matrix.os }} env: FIREBASECI_USE_LATEST_GOOGLEAPPMEASUREMENT: 1 From b79adb661f95e307c37861a3f2b6f28339034fab Mon Sep 17 00:00:00 2001 From: Andrew Heard Date: Thu, 6 Jun 2024 20:04:13 -0400 Subject: [PATCH 03/12] Temporarily disable testModelContentFromInvalidCIImageThrows --- .../Tests/Unit/PartsRepresentableTests.swift | 42 +++++++++---------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/FirebaseVertexAI/Tests/Unit/PartsRepresentableTests.swift b/FirebaseVertexAI/Tests/Unit/PartsRepresentableTests.swift index 4243c2441be..39c2258b4ca 100644 --- a/FirebaseVertexAI/Tests/Unit/PartsRepresentableTests.swift +++ b/FirebaseVertexAI/Tests/Unit/PartsRepresentableTests.swift @@ -51,27 +51,27 @@ final class PartsRepresentableTests: XCTestCase { XCTAssert(modelContent.count > 0, "Expected non-empty model content for CGImage: \(image)") } - func testModelContentFromInvalidCIImageThrows() throws { - let image = CIImage.empty() - do { - let _ = try image.tryPartsValue() - } catch { - guard let imageError = (error as? ImageConversionError) else { - XCTFail("Got unexpected error type: \(error)") - return - } - switch imageError { - case let .couldNotConvertToJPEG(source): - // String(describing:) works around a type error. - XCTAssertEqual(String(describing: source), String(describing: image)) - return - case _: - XCTFail("Expected image conversion error, got \(imageError) instead") - return - } - } - XCTFail("Expected model content from invlaid image to error") - } +// func testModelContentFromInvalidCIImageThrows() throws { +// let image = CIImage.empty() +// do { +// let _ = try image.tryPartsValue() +// } catch { +// guard let imageError = (error as? ImageConversionError) else { +// XCTFail("Got unexpected error type: \(error)") +// return +// } +// switch imageError { +// case let .couldNotConvertToJPEG(source): +// // String(describing:) works around a type error. +// XCTAssertEqual(String(describing: source), String(describing: image)) +// return +// case _: +// XCTFail("Expected image conversion error, got \(imageError) instead") +// return +// } +// } +// XCTFail("Expected model content from invlaid image to error") +// } #if canImport(UIKit) func testModelContentFromInvalidUIImageThrows() throws { From caf8e74739e0f6c22f9ed8b5330891cd9fd6fe23 Mon Sep 17 00:00:00 2001 From: Andrew Heard Date: Thu, 6 Jun 2024 20:13:32 -0400 Subject: [PATCH 04/12] Temporarily disable PartsRepresentableTests on visionOS --- .../Tests/Unit/PartsRepresentableTests.swift | 182 +++++++++--------- 1 file changed, 93 insertions(+), 89 deletions(-) diff --git a/FirebaseVertexAI/Tests/Unit/PartsRepresentableTests.swift b/FirebaseVertexAI/Tests/Unit/PartsRepresentableTests.swift index 39c2258b4ca..1c2b57301fa 100644 --- a/FirebaseVertexAI/Tests/Unit/PartsRepresentableTests.swift +++ b/FirebaseVertexAI/Tests/Unit/PartsRepresentableTests.swift @@ -22,62 +22,41 @@ import XCTest import AppKit #endif -@available(iOS 15.0, macOS 11.0, macCatalyst 15.0, *) -final class PartsRepresentableTests: XCTestCase { - func testModelContentFromCGImageIsNotEmpty() throws { - // adapted from https://forums.swift.org/t/creating-a-cgimage-from-color-array/18634/2 - var srgbArray = [UInt32](repeating: 0xFFFF_FFFF, count: 8 * 8) - let image = srgbArray.withUnsafeMutableBytes { ptr -> CGImage in - let ctx = CGContext( - data: ptr.baseAddress, - width: 8, - height: 8, - bitsPerComponent: 8, - bytesPerRow: 4 * 8, - space: CGColorSpace(name: CGColorSpace.sRGB)!, - bitmapInfo: CGBitmapInfo.byteOrder32Little.rawValue + - CGImageAlphaInfo.premultipliedFirst.rawValue - )! - return ctx.makeImage()! - } - let modelContent = try image.tryPartsValue() - XCTAssert(modelContent.count > 0, "Expected non-empty model content for CGImage: \(image)") - } +#if !os(visionOS) - func testModelContentFromCIImageIsNotEmpty() throws { - let image = CIImage(color: CIColor.red) - .cropped(to: CGRect(origin: CGPointZero, size: CGSize(width: 16, height: 16))) - let modelContent = try image.tryPartsValue() - XCTAssert(modelContent.count > 0, "Expected non-empty model content for CGImage: \(image)") - } + @available(iOS 15.0, macOS 11.0, macCatalyst 15.0, *) + final class PartsRepresentableTests: XCTestCase { + func testModelContentFromCGImageIsNotEmpty() throws { + // adapted from https://forums.swift.org/t/creating-a-cgimage-from-color-array/18634/2 + var srgbArray = [UInt32](repeating: 0xFFFF_FFFF, count: 8 * 8) + let image = srgbArray.withUnsafeMutableBytes { ptr -> CGImage in + let ctx = CGContext( + data: ptr.baseAddress, + width: 8, + height: 8, + bitsPerComponent: 8, + bytesPerRow: 4 * 8, + space: CGColorSpace(name: CGColorSpace.sRGB)!, + bitmapInfo: CGBitmapInfo.byteOrder32Little.rawValue + + CGImageAlphaInfo.premultipliedFirst.rawValue + )! + return ctx.makeImage()! + } + let modelContent = try image.tryPartsValue() + XCTAssert(modelContent.count > 0, "Expected non-empty model content for CGImage: \(image)") + } -// func testModelContentFromInvalidCIImageThrows() throws { -// let image = CIImage.empty() -// do { -// let _ = try image.tryPartsValue() -// } catch { -// guard let imageError = (error as? ImageConversionError) else { -// XCTFail("Got unexpected error type: \(error)") -// return -// } -// switch imageError { -// case let .couldNotConvertToJPEG(source): -// // String(describing:) works around a type error. -// XCTAssertEqual(String(describing: source), String(describing: image)) -// return -// case _: -// XCTFail("Expected image conversion error, got \(imageError) instead") -// return -// } -// } -// XCTFail("Expected model content from invlaid image to error") -// } + func testModelContentFromCIImageIsNotEmpty() throws { + let image = CIImage(color: CIColor.red) + .cropped(to: CGRect(origin: CGPointZero, size: CGSize(width: 16, height: 16))) + let modelContent = try image.tryPartsValue() + XCTAssert(modelContent.count > 0, "Expected non-empty model content for CGImage: \(image)") + } - #if canImport(UIKit) - func testModelContentFromInvalidUIImageThrows() throws { - let image = UIImage() + func testModelContentFromInvalidCIImageThrows() throws { + let image = CIImage.empty() do { - _ = try image.tryPartsValue() + let _ = try image.tryPartsValue() } catch { guard let imageError = (error as? ImageConversionError) else { XCTFail("Got unexpected error type: \(error)") @@ -96,43 +75,68 @@ final class PartsRepresentableTests: XCTestCase { XCTFail("Expected model content from invlaid image to error") } - func testModelContentFromUIImageIsNotEmpty() throws { - let coreImage = CIImage(color: CIColor.red) - .cropped(to: CGRect(origin: CGPointZero, size: CGSize(width: 16, height: 16))) - let image = UIImage(ciImage: coreImage) - let modelContent = try image.tryPartsValue() - XCTAssert(modelContent.count > 0, "Expected non-empty model content for UIImage: \(image)") - } - #else - func testModelContentFromNSImageIsNotEmpty() throws { - let coreImage = CIImage(color: CIColor.red) - .cropped(to: CGRect(origin: CGPointZero, size: CGSize(width: 16, height: 16))) - let rep = NSCIImageRep(ciImage: coreImage) - let image = NSImage(size: rep.size) - image.addRepresentation(rep) - let modelContent = try image.tryPartsValue() - XCTAssert(modelContent.count > 0, "Expected non-empty model content for NSImage: \(image)") - } - - func testModelContentFromInvalidNSImageThrows() throws { - let image = NSImage() - do { - _ = try image.tryPartsValue() - } catch { - guard let imageError = (error as? ImageConversionError) else { - XCTFail("Got unexpected error type: \(error)") - return + #if canImport(UIKit) + func testModelContentFromInvalidUIImageThrows() throws { + let image = UIImage() + do { + _ = try image.tryPartsValue() + } catch { + guard let imageError = (error as? ImageConversionError) else { + XCTFail("Got unexpected error type: \(error)") + return + } + switch imageError { + case let .couldNotConvertToJPEG(source): + // String(describing:) works around a type error. + XCTAssertEqual(String(describing: source), String(describing: image)) + return + case _: + XCTFail("Expected image conversion error, got \(imageError) instead") + return + } } - switch imageError { - case .invalidUnderlyingImage: - // Pass - return - case _: - XCTFail("Expected image conversion error, got \(imageError) instead") - return + XCTFail("Expected model content from invlaid image to error") + } + + func testModelContentFromUIImageIsNotEmpty() throws { + let coreImage = CIImage(color: CIColor.red) + .cropped(to: CGRect(origin: CGPointZero, size: CGSize(width: 16, height: 16))) + let image = UIImage(ciImage: coreImage) + let modelContent = try image.tryPartsValue() + XCTAssert(modelContent.count > 0, "Expected non-empty model content for UIImage: \(image)") + } + #else + func testModelContentFromNSImageIsNotEmpty() throws { + let coreImage = CIImage(color: CIColor.red) + .cropped(to: CGRect(origin: CGPointZero, size: CGSize(width: 16, height: 16))) + let rep = NSCIImageRep(ciImage: coreImage) + let image = NSImage(size: rep.size) + image.addRepresentation(rep) + let modelContent = try image.tryPartsValue() + XCTAssert(modelContent.count > 0, "Expected non-empty model content for NSImage: \(image)") + } + + func testModelContentFromInvalidNSImageThrows() throws { + let image = NSImage() + do { + _ = try image.tryPartsValue() + } catch { + guard let imageError = (error as? ImageConversionError) else { + XCTFail("Got unexpected error type: \(error)") + return + } + switch imageError { + case .invalidUnderlyingImage: + // Pass + return + case _: + XCTFail("Expected image conversion error, got \(imageError) instead") + return + } } + XCTFail("Expected model content from invlaid image to error") } - XCTFail("Expected model content from invlaid image to error") - } - #endif -} + #endif + } + +#endif // !os(visionOS) From 427f186f874a03de43dd212bf850337a5ee162f2 Mon Sep 17 00:00:00 2001 From: Andrew Heard Date: Thu, 6 Jun 2024 20:31:05 -0400 Subject: [PATCH 05/12] Re-enable PartsRepresentableTests and switch to Xcode 15.4 --- .github/workflows/vertexai.yml | 2 +- .../Tests/Unit/PartsRepresentableTests.swift | 180 +++++++++--------- 2 files changed, 89 insertions(+), 93 deletions(-) diff --git a/.github/workflows/vertexai.yml b/.github/workflows/vertexai.yml index 7a2a9c14a11..efbb229afe6 100644 --- a/.github/workflows/vertexai.yml +++ b/.github/workflows/vertexai.yml @@ -24,7 +24,7 @@ jobs: - os: macos-14 xcode: Xcode_15.2 - os: macos-14 - xcode: Xcode_15.3 + xcode: Xcode_15.4 target: visionOS runs-on: ${{ matrix.os }} env: diff --git a/FirebaseVertexAI/Tests/Unit/PartsRepresentableTests.swift b/FirebaseVertexAI/Tests/Unit/PartsRepresentableTests.swift index 1c2b57301fa..4243c2441be 100644 --- a/FirebaseVertexAI/Tests/Unit/PartsRepresentableTests.swift +++ b/FirebaseVertexAI/Tests/Unit/PartsRepresentableTests.swift @@ -22,41 +22,62 @@ import XCTest import AppKit #endif -#if !os(visionOS) - - @available(iOS 15.0, macOS 11.0, macCatalyst 15.0, *) - final class PartsRepresentableTests: XCTestCase { - func testModelContentFromCGImageIsNotEmpty() throws { - // adapted from https://forums.swift.org/t/creating-a-cgimage-from-color-array/18634/2 - var srgbArray = [UInt32](repeating: 0xFFFF_FFFF, count: 8 * 8) - let image = srgbArray.withUnsafeMutableBytes { ptr -> CGImage in - let ctx = CGContext( - data: ptr.baseAddress, - width: 8, - height: 8, - bitsPerComponent: 8, - bytesPerRow: 4 * 8, - space: CGColorSpace(name: CGColorSpace.sRGB)!, - bitmapInfo: CGBitmapInfo.byteOrder32Little.rawValue + - CGImageAlphaInfo.premultipliedFirst.rawValue - )! - return ctx.makeImage()! - } - let modelContent = try image.tryPartsValue() - XCTAssert(modelContent.count > 0, "Expected non-empty model content for CGImage: \(image)") +@available(iOS 15.0, macOS 11.0, macCatalyst 15.0, *) +final class PartsRepresentableTests: XCTestCase { + func testModelContentFromCGImageIsNotEmpty() throws { + // adapted from https://forums.swift.org/t/creating-a-cgimage-from-color-array/18634/2 + var srgbArray = [UInt32](repeating: 0xFFFF_FFFF, count: 8 * 8) + let image = srgbArray.withUnsafeMutableBytes { ptr -> CGImage in + let ctx = CGContext( + data: ptr.baseAddress, + width: 8, + height: 8, + bitsPerComponent: 8, + bytesPerRow: 4 * 8, + space: CGColorSpace(name: CGColorSpace.sRGB)!, + bitmapInfo: CGBitmapInfo.byteOrder32Little.rawValue + + CGImageAlphaInfo.premultipliedFirst.rawValue + )! + return ctx.makeImage()! } + let modelContent = try image.tryPartsValue() + XCTAssert(modelContent.count > 0, "Expected non-empty model content for CGImage: \(image)") + } - func testModelContentFromCIImageIsNotEmpty() throws { - let image = CIImage(color: CIColor.red) - .cropped(to: CGRect(origin: CGPointZero, size: CGSize(width: 16, height: 16))) - let modelContent = try image.tryPartsValue() - XCTAssert(modelContent.count > 0, "Expected non-empty model content for CGImage: \(image)") + func testModelContentFromCIImageIsNotEmpty() throws { + let image = CIImage(color: CIColor.red) + .cropped(to: CGRect(origin: CGPointZero, size: CGSize(width: 16, height: 16))) + let modelContent = try image.tryPartsValue() + XCTAssert(modelContent.count > 0, "Expected non-empty model content for CGImage: \(image)") + } + + func testModelContentFromInvalidCIImageThrows() throws { + let image = CIImage.empty() + do { + let _ = try image.tryPartsValue() + } catch { + guard let imageError = (error as? ImageConversionError) else { + XCTFail("Got unexpected error type: \(error)") + return + } + switch imageError { + case let .couldNotConvertToJPEG(source): + // String(describing:) works around a type error. + XCTAssertEqual(String(describing: source), String(describing: image)) + return + case _: + XCTFail("Expected image conversion error, got \(imageError) instead") + return + } } + XCTFail("Expected model content from invlaid image to error") + } - func testModelContentFromInvalidCIImageThrows() throws { - let image = CIImage.empty() + #if canImport(UIKit) + func testModelContentFromInvalidUIImageThrows() throws { + let image = UIImage() do { - let _ = try image.tryPartsValue() + _ = try image.tryPartsValue() } catch { guard let imageError = (error as? ImageConversionError) else { XCTFail("Got unexpected error type: \(error)") @@ -75,68 +96,43 @@ import XCTest XCTFail("Expected model content from invlaid image to error") } - #if canImport(UIKit) - func testModelContentFromInvalidUIImageThrows() throws { - let image = UIImage() - do { - _ = try image.tryPartsValue() - } catch { - guard let imageError = (error as? ImageConversionError) else { - XCTFail("Got unexpected error type: \(error)") - return - } - switch imageError { - case let .couldNotConvertToJPEG(source): - // String(describing:) works around a type error. - XCTAssertEqual(String(describing: source), String(describing: image)) - return - case _: - XCTFail("Expected image conversion error, got \(imageError) instead") - return - } - } - XCTFail("Expected model content from invlaid image to error") - } - - func testModelContentFromUIImageIsNotEmpty() throws { - let coreImage = CIImage(color: CIColor.red) - .cropped(to: CGRect(origin: CGPointZero, size: CGSize(width: 16, height: 16))) - let image = UIImage(ciImage: coreImage) - let modelContent = try image.tryPartsValue() - XCTAssert(modelContent.count > 0, "Expected non-empty model content for UIImage: \(image)") - } - #else - func testModelContentFromNSImageIsNotEmpty() throws { - let coreImage = CIImage(color: CIColor.red) - .cropped(to: CGRect(origin: CGPointZero, size: CGSize(width: 16, height: 16))) - let rep = NSCIImageRep(ciImage: coreImage) - let image = NSImage(size: rep.size) - image.addRepresentation(rep) - let modelContent = try image.tryPartsValue() - XCTAssert(modelContent.count > 0, "Expected non-empty model content for NSImage: \(image)") - } + func testModelContentFromUIImageIsNotEmpty() throws { + let coreImage = CIImage(color: CIColor.red) + .cropped(to: CGRect(origin: CGPointZero, size: CGSize(width: 16, height: 16))) + let image = UIImage(ciImage: coreImage) + let modelContent = try image.tryPartsValue() + XCTAssert(modelContent.count > 0, "Expected non-empty model content for UIImage: \(image)") + } + #else + func testModelContentFromNSImageIsNotEmpty() throws { + let coreImage = CIImage(color: CIColor.red) + .cropped(to: CGRect(origin: CGPointZero, size: CGSize(width: 16, height: 16))) + let rep = NSCIImageRep(ciImage: coreImage) + let image = NSImage(size: rep.size) + image.addRepresentation(rep) + let modelContent = try image.tryPartsValue() + XCTAssert(modelContent.count > 0, "Expected non-empty model content for NSImage: \(image)") + } - func testModelContentFromInvalidNSImageThrows() throws { - let image = NSImage() - do { - _ = try image.tryPartsValue() - } catch { - guard let imageError = (error as? ImageConversionError) else { - XCTFail("Got unexpected error type: \(error)") - return - } - switch imageError { - case .invalidUnderlyingImage: - // Pass - return - case _: - XCTFail("Expected image conversion error, got \(imageError) instead") - return - } + func testModelContentFromInvalidNSImageThrows() throws { + let image = NSImage() + do { + _ = try image.tryPartsValue() + } catch { + guard let imageError = (error as? ImageConversionError) else { + XCTFail("Got unexpected error type: \(error)") + return + } + switch imageError { + case .invalidUnderlyingImage: + // Pass + return + case _: + XCTFail("Expected image conversion error, got \(imageError) instead") + return } - XCTFail("Expected model content from invlaid image to error") } - #endif - } - -#endif // !os(visionOS) + XCTFail("Expected model content from invlaid image to error") + } + #endif +} From 72ad9b43b119888b6a645e7b3ba30203d98b66f3 Mon Sep 17 00:00:00 2001 From: Andrew Heard Date: Thu, 6 Jun 2024 20:50:16 -0400 Subject: [PATCH 06/12] Disable testModelContentFromInvalidUIImageThrows, revert to Xcode 15.2 --- .github/workflows/vertexai.yml | 5 +-- .../Tests/Unit/PartsRepresentableTests.swift | 40 ++++++++++--------- 2 files changed, 22 insertions(+), 23 deletions(-) diff --git a/.github/workflows/vertexai.yml b/.github/workflows/vertexai.yml index efbb229afe6..4babcd4f40a 100644 --- a/.github/workflows/vertexai.yml +++ b/.github/workflows/vertexai.yml @@ -18,14 +18,11 @@ jobs: spm-unit: strategy: matrix: - target: [iOS, macOS, catalyst] + target: [iOS, macOS, catalyst, visionOS] os: [macos-14] include: - os: macos-14 xcode: Xcode_15.2 - - os: macos-14 - xcode: Xcode_15.4 - target: visionOS runs-on: ${{ matrix.os }} env: FIREBASECI_USE_LATEST_GOOGLEAPPMEASUREMENT: 1 diff --git a/FirebaseVertexAI/Tests/Unit/PartsRepresentableTests.swift b/FirebaseVertexAI/Tests/Unit/PartsRepresentableTests.swift index 4243c2441be..135c38b7fa8 100644 --- a/FirebaseVertexAI/Tests/Unit/PartsRepresentableTests.swift +++ b/FirebaseVertexAI/Tests/Unit/PartsRepresentableTests.swift @@ -74,27 +74,29 @@ final class PartsRepresentableTests: XCTestCase { } #if canImport(UIKit) - func testModelContentFromInvalidUIImageThrows() throws { - let image = UIImage() - do { - _ = try image.tryPartsValue() - } catch { - guard let imageError = (error as? ImageConversionError) else { - XCTFail("Got unexpected error type: \(error)") - return - } - switch imageError { - case let .couldNotConvertToJPEG(source): - // String(describing:) works around a type error. - XCTAssertEqual(String(describing: source), String(describing: image)) - return - case _: - XCTFail("Expected image conversion error, got \(imageError) instead") - return + #if !os(visionOS) + func testModelContentFromInvalidUIImageThrows() throws { + let image = UIImage() + do { + _ = try image.tryPartsValue() + } catch { + guard let imageError = (error as? ImageConversionError) else { + XCTFail("Got unexpected error type: \(error)") + return + } + switch imageError { + case let .couldNotConvertToJPEG(source): + // String(describing:) works around a type error. + XCTAssertEqual(String(describing: source), String(describing: image)) + return + case _: + XCTFail("Expected image conversion error, got \(imageError) instead") + return + } } + XCTFail("Expected model content from invlaid image to error") } - XCTFail("Expected model content from invlaid image to error") - } + #endif // !os(visionOS) func testModelContentFromUIImageIsNotEmpty() throws { let coreImage = CIImage(color: CIColor.red) From 57af3d6616cbcc4607f04d18de916ddb30a320f7 Mon Sep 17 00:00:00 2001 From: Andrew Heard Date: Thu, 6 Jun 2024 21:01:28 -0400 Subject: [PATCH 07/12] Disable testModelContentFromUIImageIsNotEmpty, switch to #elseif canImport(AppKit) --- .../Tests/Unit/PartsRepresentableTests.swift | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/FirebaseVertexAI/Tests/Unit/PartsRepresentableTests.swift b/FirebaseVertexAI/Tests/Unit/PartsRepresentableTests.swift index 135c38b7fa8..7cb37f9502b 100644 --- a/FirebaseVertexAI/Tests/Unit/PartsRepresentableTests.swift +++ b/FirebaseVertexAI/Tests/Unit/PartsRepresentableTests.swift @@ -18,7 +18,7 @@ import FirebaseVertexAI import XCTest #if canImport(UIKit) import UIKit -#else +#elseif canImport(AppKit) import AppKit #endif @@ -96,16 +96,16 @@ final class PartsRepresentableTests: XCTestCase { } XCTFail("Expected model content from invlaid image to error") } - #endif // !os(visionOS) - func testModelContentFromUIImageIsNotEmpty() throws { - let coreImage = CIImage(color: CIColor.red) - .cropped(to: CGRect(origin: CGPointZero, size: CGSize(width: 16, height: 16))) - let image = UIImage(ciImage: coreImage) - let modelContent = try image.tryPartsValue() - XCTAssert(modelContent.count > 0, "Expected non-empty model content for UIImage: \(image)") - } - #else + func testModelContentFromUIImageIsNotEmpty() throws { + let coreImage = CIImage(color: CIColor.red) + .cropped(to: CGRect(origin: CGPointZero, size: CGSize(width: 16, height: 16))) + let image = UIImage(ciImage: coreImage) + let modelContent = try image.tryPartsValue() + XCTAssert(modelContent.count > 0, "Expected non-empty model content for UIImage: \(image)") + } + #endif // !os(visionOS) + #elseif canImport(AppKit) func testModelContentFromNSImageIsNotEmpty() throws { let coreImage = CIImage(color: CIColor.red) .cropped(to: CGRect(origin: CGPointZero, size: CGSize(width: 16, height: 16))) From 7730403aa2def1b71eabd2dece18514d8e2208dd Mon Sep 17 00:00:00 2001 From: Andrew Heard Date: Thu, 6 Jun 2024 21:16:22 -0400 Subject: [PATCH 08/12] Re-enable tests --- .../Tests/Unit/PartsRepresentableTests.swift | 55 +++++++++---------- 1 file changed, 27 insertions(+), 28 deletions(-) diff --git a/FirebaseVertexAI/Tests/Unit/PartsRepresentableTests.swift b/FirebaseVertexAI/Tests/Unit/PartsRepresentableTests.swift index 7cb37f9502b..8789e01d03e 100644 --- a/FirebaseVertexAI/Tests/Unit/PartsRepresentableTests.swift +++ b/FirebaseVertexAI/Tests/Unit/PartsRepresentableTests.swift @@ -74,37 +74,36 @@ final class PartsRepresentableTests: XCTestCase { } #if canImport(UIKit) - #if !os(visionOS) - func testModelContentFromInvalidUIImageThrows() throws { - let image = UIImage() - do { - _ = try image.tryPartsValue() - } catch { - guard let imageError = (error as? ImageConversionError) else { - XCTFail("Got unexpected error type: \(error)") - return - } - switch imageError { - case let .couldNotConvertToJPEG(source): - // String(describing:) works around a type error. - XCTAssertEqual(String(describing: source), String(describing: image)) - return - case _: - XCTFail("Expected image conversion error, got \(imageError) instead") - return - } + func testModelContentFromInvalidUIImageThrows() throws { + let image = UIImage() + do { + _ = try image.tryPartsValue() + } catch { + guard let imageError = (error as? ImageConversionError) else { + XCTFail("Got unexpected error type: \(error)") + return + } + switch imageError { + case let .couldNotConvertToJPEG(source): + // String(describing:) works around a type error. + XCTAssertEqual(String(describing: source), String(describing: image)) + return + case _: + XCTFail("Expected image conversion error, got \(imageError) instead") + return } - XCTFail("Expected model content from invlaid image to error") } + XCTFail("Expected model content from invlaid image to error") + } + + func testModelContentFromUIImageIsNotEmpty() throws { + let coreImage = CIImage(color: CIColor.red) + .cropped(to: CGRect(origin: CGPointZero, size: CGSize(width: 16, height: 16))) + let image = UIImage(ciImage: coreImage) + let modelContent = try image.tryPartsValue() + XCTAssert(modelContent.count > 0, "Expected non-empty model content for UIImage: \(image)") + } - func testModelContentFromUIImageIsNotEmpty() throws { - let coreImage = CIImage(color: CIColor.red) - .cropped(to: CGRect(origin: CGPointZero, size: CGSize(width: 16, height: 16))) - let image = UIImage(ciImage: coreImage) - let modelContent = try image.tryPartsValue() - XCTAssert(modelContent.count > 0, "Expected non-empty model content for UIImage: \(image)") - } - #endif // !os(visionOS) #elseif canImport(AppKit) func testModelContentFromNSImageIsNotEmpty() throws { let coreImage = CIImage(color: CIColor.red) From 12058369bd22252e7a4733790518533196e9b565 Mon Sep 17 00:00:00 2001 From: Andrew Heard Date: Thu, 6 Jun 2024 21:28:58 -0400 Subject: [PATCH 09/12] Revert "Re-enable tests" This reverts commit 7730403aa2def1b71eabd2dece18514d8e2208dd. --- .../Tests/Unit/PartsRepresentableTests.swift | 55 ++++++++++--------- 1 file changed, 28 insertions(+), 27 deletions(-) diff --git a/FirebaseVertexAI/Tests/Unit/PartsRepresentableTests.swift b/FirebaseVertexAI/Tests/Unit/PartsRepresentableTests.swift index 8789e01d03e..7cb37f9502b 100644 --- a/FirebaseVertexAI/Tests/Unit/PartsRepresentableTests.swift +++ b/FirebaseVertexAI/Tests/Unit/PartsRepresentableTests.swift @@ -74,36 +74,37 @@ final class PartsRepresentableTests: XCTestCase { } #if canImport(UIKit) - func testModelContentFromInvalidUIImageThrows() throws { - let image = UIImage() - do { - _ = try image.tryPartsValue() - } catch { - guard let imageError = (error as? ImageConversionError) else { - XCTFail("Got unexpected error type: \(error)") - return - } - switch imageError { - case let .couldNotConvertToJPEG(source): - // String(describing:) works around a type error. - XCTAssertEqual(String(describing: source), String(describing: image)) - return - case _: - XCTFail("Expected image conversion error, got \(imageError) instead") - return + #if !os(visionOS) + func testModelContentFromInvalidUIImageThrows() throws { + let image = UIImage() + do { + _ = try image.tryPartsValue() + } catch { + guard let imageError = (error as? ImageConversionError) else { + XCTFail("Got unexpected error type: \(error)") + return + } + switch imageError { + case let .couldNotConvertToJPEG(source): + // String(describing:) works around a type error. + XCTAssertEqual(String(describing: source), String(describing: image)) + return + case _: + XCTFail("Expected image conversion error, got \(imageError) instead") + return + } } + XCTFail("Expected model content from invlaid image to error") } - XCTFail("Expected model content from invlaid image to error") - } - - func testModelContentFromUIImageIsNotEmpty() throws { - let coreImage = CIImage(color: CIColor.red) - .cropped(to: CGRect(origin: CGPointZero, size: CGSize(width: 16, height: 16))) - let image = UIImage(ciImage: coreImage) - let modelContent = try image.tryPartsValue() - XCTAssert(modelContent.count > 0, "Expected non-empty model content for UIImage: \(image)") - } + func testModelContentFromUIImageIsNotEmpty() throws { + let coreImage = CIImage(color: CIColor.red) + .cropped(to: CGRect(origin: CGPointZero, size: CGSize(width: 16, height: 16))) + let image = UIImage(ciImage: coreImage) + let modelContent = try image.tryPartsValue() + XCTAssert(modelContent.count > 0, "Expected non-empty model content for UIImage: \(image)") + } + #endif // !os(visionOS) #elseif canImport(AppKit) func testModelContentFromNSImageIsNotEmpty() throws { let coreImage = CIImage(color: CIColor.red) From d36111ea326a2ee905b0f2d81180675aadeb2073 Mon Sep 17 00:00:00 2001 From: Andrew Heard Date: Thu, 6 Jun 2024 21:32:23 -0400 Subject: [PATCH 10/12] Reformat and add comment --- .../Tests/Unit/PartsRepresentableTests.swift | 57 +++++++++---------- 1 file changed, 28 insertions(+), 29 deletions(-) diff --git a/FirebaseVertexAI/Tests/Unit/PartsRepresentableTests.swift b/FirebaseVertexAI/Tests/Unit/PartsRepresentableTests.swift index 7cb37f9502b..249b62effbd 100644 --- a/FirebaseVertexAI/Tests/Unit/PartsRepresentableTests.swift +++ b/FirebaseVertexAI/Tests/Unit/PartsRepresentableTests.swift @@ -73,38 +73,37 @@ final class PartsRepresentableTests: XCTestCase { XCTFail("Expected model content from invlaid image to error") } - #if canImport(UIKit) - #if !os(visionOS) - func testModelContentFromInvalidUIImageThrows() throws { - let image = UIImage() - do { - _ = try image.tryPartsValue() - } catch { - guard let imageError = (error as? ImageConversionError) else { - XCTFail("Got unexpected error type: \(error)") - return - } - switch imageError { - case let .couldNotConvertToJPEG(source): - // String(describing:) works around a type error. - XCTAssertEqual(String(describing: source), String(describing: image)) - return - case _: - XCTFail("Expected image conversion error, got \(imageError) instead") - return - } + #if canImport(UIKit) && !os(visionOS) // These tests are stalling in CI on visionOS. + func testModelContentFromInvalidUIImageThrows() throws { + let image = UIImage() + do { + _ = try image.tryPartsValue() + } catch { + guard let imageError = (error as? ImageConversionError) else { + XCTFail("Got unexpected error type: \(error)") + return + } + switch imageError { + case let .couldNotConvertToJPEG(source): + // String(describing:) works around a type error. + XCTAssertEqual(String(describing: source), String(describing: image)) + return + case _: + XCTFail("Expected image conversion error, got \(imageError) instead") + return } - XCTFail("Expected model content from invlaid image to error") } + XCTFail("Expected model content from invlaid image to error") + } + + func testModelContentFromUIImageIsNotEmpty() throws { + let coreImage = CIImage(color: CIColor.red) + .cropped(to: CGRect(origin: CGPointZero, size: CGSize(width: 16, height: 16))) + let image = UIImage(ciImage: coreImage) + let modelContent = try image.tryPartsValue() + XCTAssert(modelContent.count > 0, "Expected non-empty model content for UIImage: \(image)") + } - func testModelContentFromUIImageIsNotEmpty() throws { - let coreImage = CIImage(color: CIColor.red) - .cropped(to: CGRect(origin: CGPointZero, size: CGSize(width: 16, height: 16))) - let image = UIImage(ciImage: coreImage) - let modelContent = try image.tryPartsValue() - XCTAssert(modelContent.count > 0, "Expected non-empty model content for UIImage: \(image)") - } - #endif // !os(visionOS) #elseif canImport(AppKit) func testModelContentFromNSImageIsNotEmpty() throws { let coreImage = CIImage(color: CIColor.red) From 119ea9fa618bac209d059206381b4f14bc96447b Mon Sep 17 00:00:00 2001 From: Andrew Heard Date: Thu, 6 Jun 2024 22:16:59 -0400 Subject: [PATCH 11/12] Try alternative test implementations --- .../Tests/Unit/PartsRepresentableTests.swift | 54 +++++++++++-------- 1 file changed, 32 insertions(+), 22 deletions(-) diff --git a/FirebaseVertexAI/Tests/Unit/PartsRepresentableTests.swift b/FirebaseVertexAI/Tests/Unit/PartsRepresentableTests.swift index 249b62effbd..ca6c2bc0729 100644 --- a/FirebaseVertexAI/Tests/Unit/PartsRepresentableTests.swift +++ b/FirebaseVertexAI/Tests/Unit/PartsRepresentableTests.swift @@ -73,35 +73,45 @@ final class PartsRepresentableTests: XCTestCase { XCTFail("Expected model content from invlaid image to error") } - #if canImport(UIKit) && !os(visionOS) // These tests are stalling in CI on visionOS. - func testModelContentFromInvalidUIImageThrows() throws { + #if canImport(UIKit) + func testModelContentFromInvalidUIImageThrows() { + print("Instantiating UIImage.") let image = UIImage() do { + print("Getting image parts.") _ = try image.tryPartsValue() + XCTFail("Expected ImageConversionError.couldNotConvertToJPEG; no error.") + } catch let ImageConversionError.couldNotConvertToJPEG(source as UIImage) { + print("Checking image equality.") + XCTAssertEqual(source, image) } catch { - guard let imageError = (error as? ImageConversionError) else { - XCTFail("Got unexpected error type: \(error)") - return - } - switch imageError { - case let .couldNotConvertToJPEG(source): - // String(describing:) works around a type error. - XCTAssertEqual(String(describing: source), String(describing: image)) - return - case _: - XCTFail("Expected image conversion error, got \(imageError) instead") - return - } + XCTFail("Expected ImageConversionError.couldNotConvertToJPEG; error thrown: \(error)") } - XCTFail("Expected model content from invlaid image to error") + print("Done testModelContentFromInvalidUIImageThrows.") } - func testModelContentFromUIImageIsNotEmpty() throws { - let coreImage = CIImage(color: CIColor.red) - .cropped(to: CGRect(origin: CGPointZero, size: CGSize(width: 16, height: 16))) - let image = UIImage(ciImage: coreImage) - let modelContent = try image.tryPartsValue() - XCTAssert(modelContent.count > 0, "Expected non-empty model content for UIImage: \(image)") + func testModelContentFromUIImageIsNotEmpty() { + print("Creating UIImage with systemName.") + guard let image = UIImage(systemName: "photo") else { + XCTFail("Failed to create UIImage with system name.") + return + } + print("Getting image parts.") + let modelContent: [ModelContent.Part] + do { + modelContent = try image.tryPartsValue() + print("Got image parts.") + } catch { + XCTFail("Getting image parts failed with error: \(error)") + return + } + print("Checking content part count.") + XCTAssertEqual( + modelContent.count, + 1, + "Expected non-empty model content for UIImage: \(image)" + ) + print("Done testModelContentFromUIImageIsNotEmpty.") } #elseif canImport(AppKit) From 98c0fb9ae7e44d5015c62d0629a442135d470bc3 Mon Sep 17 00:00:00 2001 From: Andrew Heard Date: Thu, 6 Jun 2024 22:24:05 -0400 Subject: [PATCH 12/12] Revert "Try alternative test implementations" This reverts commit 119ea9fa618bac209d059206381b4f14bc96447b. --- .../Tests/Unit/PartsRepresentableTests.swift | 54 ++++++++----------- 1 file changed, 22 insertions(+), 32 deletions(-) diff --git a/FirebaseVertexAI/Tests/Unit/PartsRepresentableTests.swift b/FirebaseVertexAI/Tests/Unit/PartsRepresentableTests.swift index ca6c2bc0729..249b62effbd 100644 --- a/FirebaseVertexAI/Tests/Unit/PartsRepresentableTests.swift +++ b/FirebaseVertexAI/Tests/Unit/PartsRepresentableTests.swift @@ -73,45 +73,35 @@ final class PartsRepresentableTests: XCTestCase { XCTFail("Expected model content from invlaid image to error") } - #if canImport(UIKit) - func testModelContentFromInvalidUIImageThrows() { - print("Instantiating UIImage.") + #if canImport(UIKit) && !os(visionOS) // These tests are stalling in CI on visionOS. + func testModelContentFromInvalidUIImageThrows() throws { let image = UIImage() do { - print("Getting image parts.") _ = try image.tryPartsValue() - XCTFail("Expected ImageConversionError.couldNotConvertToJPEG; no error.") - } catch let ImageConversionError.couldNotConvertToJPEG(source as UIImage) { - print("Checking image equality.") - XCTAssertEqual(source, image) } catch { - XCTFail("Expected ImageConversionError.couldNotConvertToJPEG; error thrown: \(error)") + guard let imageError = (error as? ImageConversionError) else { + XCTFail("Got unexpected error type: \(error)") + return + } + switch imageError { + case let .couldNotConvertToJPEG(source): + // String(describing:) works around a type error. + XCTAssertEqual(String(describing: source), String(describing: image)) + return + case _: + XCTFail("Expected image conversion error, got \(imageError) instead") + return + } } - print("Done testModelContentFromInvalidUIImageThrows.") + XCTFail("Expected model content from invlaid image to error") } - func testModelContentFromUIImageIsNotEmpty() { - print("Creating UIImage with systemName.") - guard let image = UIImage(systemName: "photo") else { - XCTFail("Failed to create UIImage with system name.") - return - } - print("Getting image parts.") - let modelContent: [ModelContent.Part] - do { - modelContent = try image.tryPartsValue() - print("Got image parts.") - } catch { - XCTFail("Getting image parts failed with error: \(error)") - return - } - print("Checking content part count.") - XCTAssertEqual( - modelContent.count, - 1, - "Expected non-empty model content for UIImage: \(image)" - ) - print("Done testModelContentFromUIImageIsNotEmpty.") + func testModelContentFromUIImageIsNotEmpty() throws { + let coreImage = CIImage(color: CIColor.red) + .cropped(to: CGRect(origin: CGPointZero, size: CGSize(width: 16, height: 16))) + let image = UIImage(ciImage: coreImage) + let modelContent = try image.tryPartsValue() + XCTAssert(modelContent.count > 0, "Expected non-empty model content for UIImage: \(image)") } #elseif canImport(AppKit)