From fc6b30e3829a4d7fd574da543ea623351180f47f Mon Sep 17 00:00:00 2001 From: Paul Beusterien Date: Wed, 24 Sep 2025 15:43:31 -0700 Subject: [PATCH 1/3] [AI] Update empty parts check for urlContextMetadata --- .../Sources/GenerateContentResponse.swift | 3 +- .../Types/GenerateContentResponseTests.swift | 38 ++++++++++++++++++- 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/FirebaseAI/Sources/GenerateContentResponse.swift b/FirebaseAI/Sources/GenerateContentResponse.swift index c13d3d53c8a..a7d7da85d67 100644 --- a/FirebaseAI/Sources/GenerateContentResponse.swift +++ b/FirebaseAI/Sources/GenerateContentResponse.swift @@ -179,7 +179,8 @@ public struct Candidate: Sendable { // Returns `true` if the candidate contains no information that a developer could use. var isEmpty: Bool { content.parts - .isEmpty && finishReason == nil && citationMetadata == nil && groundingMetadata == nil + .isEmpty && finishReason == nil && citationMetadata == nil && groundingMetadata == nil && + urlContextMetadata == nil } } diff --git a/FirebaseAI/Tests/Unit/Types/GenerateContentResponseTests.swift b/FirebaseAI/Tests/Unit/Types/GenerateContentResponseTests.swift index 276308f63aa..85b6012bb06 100644 --- a/FirebaseAI/Tests/Unit/Types/GenerateContentResponseTests.swift +++ b/FirebaseAI/Tests/Unit/Types/GenerateContentResponseTests.swift @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -import FirebaseAI +@testable import FirebaseAI import XCTest @available(iOS 15.0, macOS 12.0, macCatalyst 15.0, tvOS 15.0, watchOS 8.0, *) @@ -157,4 +157,40 @@ final class GenerateContentResponseTests: XCTestCase { XCTAssertFalse(textPart.isThought) XCTAssertEqual(candidate.finishReason, .stop) } + + // MARK: - Candidate.isEmpty + + func testCandidateIsEmpty_allEmpty_isTrue() throws { + let candidate = Candidate( + content: ModelContent(parts: []), + safetyRatings: [], + finishReason: nil, + citationMetadata: nil, + groundingMetadata: nil, + urlContextMetadata: nil + ) + + XCTAssertTrue(candidate.isEmpty, "A candidate with no content should be empty.") + } + + func testCandidateIsEmpty_withURLContextMetadata_isFalse() throws { + let urlMetadata = URLMetadata( + retrievedURL: URL(string: "https://google.com")!, + retrievalStatus: .success + ) + let urlContextMetadata = URLContextMetadata(urlMetadata: [urlMetadata]) + let candidate = Candidate( + content: ModelContent(parts: []), + safetyRatings: [], + finishReason: nil, + citationMetadata: nil, + groundingMetadata: nil, + urlContextMetadata: urlContextMetadata + ) + + XCTAssertFalse( + candidate.isEmpty, + "A candidate with only `urlContextMetadata` should not be empty." + ) + } } From f0f8477908172cfe08f14c4a6d6fc29e3feaad7d Mon Sep 17 00:00:00 2001 From: Paul Beusterien Date: Wed, 24 Sep 2025 15:53:54 -0700 Subject: [PATCH 2/3] Update FirebaseAI/Tests/Unit/Types/GenerateContentResponseTests.swift Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- FirebaseAI/Tests/Unit/Types/GenerateContentResponseTests.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FirebaseAI/Tests/Unit/Types/GenerateContentResponseTests.swift b/FirebaseAI/Tests/Unit/Types/GenerateContentResponseTests.swift index 85b6012bb06..6eb7382f4d5 100644 --- a/FirebaseAI/Tests/Unit/Types/GenerateContentResponseTests.swift +++ b/FirebaseAI/Tests/Unit/Types/GenerateContentResponseTests.swift @@ -175,7 +175,7 @@ final class GenerateContentResponseTests: XCTestCase { func testCandidateIsEmpty_withURLContextMetadata_isFalse() throws { let urlMetadata = URLMetadata( - retrievedURL: URL(string: "https://google.com")!, + retrievedURL: try XCTUnwrap(URL(string: "https://google.com")), retrievalStatus: .success ) let urlContextMetadata = URLContextMetadata(urlMetadata: [urlMetadata]) From c014f450c3db3aa8d02dc95890c4baa77bffaba6 Mon Sep 17 00:00:00 2001 From: Paul Beusterien Date: Wed, 24 Sep 2025 16:04:11 -0700 Subject: [PATCH 3/3] style --- .../Tests/Unit/Types/GenerateContentResponseTests.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/FirebaseAI/Tests/Unit/Types/GenerateContentResponseTests.swift b/FirebaseAI/Tests/Unit/Types/GenerateContentResponseTests.swift index 6eb7382f4d5..dfc393e2d29 100644 --- a/FirebaseAI/Tests/Unit/Types/GenerateContentResponseTests.swift +++ b/FirebaseAI/Tests/Unit/Types/GenerateContentResponseTests.swift @@ -174,8 +174,8 @@ final class GenerateContentResponseTests: XCTestCase { } func testCandidateIsEmpty_withURLContextMetadata_isFalse() throws { - let urlMetadata = URLMetadata( - retrievedURL: try XCTUnwrap(URL(string: "https://google.com")), + let urlMetadata = try URLMetadata( + retrievedURL: XCTUnwrap(URL(string: "https://google.com")), retrievalStatus: .success ) let urlContextMetadata = URLContextMetadata(urlMetadata: [urlMetadata])