@@ -128,6 +128,30 @@ final class GenerativeModelTests: XCTestCase {
128128 XCTAssertEqual ( response. functionCalls, [ ] )
129129 }
130130
131+ func testGenerateContent_success_basicReplyFullUsageMetadata( ) async throws {
132+ MockURLProtocol
133+ . requestHandler = try httpRequestHandler (
134+ forResource: " unary-success-basic-response-long-usage-metadata " ,
135+ withExtension: " json "
136+ )
137+
138+ let response = try await model. generateContent ( testPrompt)
139+
140+ XCTAssertEqual ( response. candidates. count, 1 )
141+ let candidate = try XCTUnwrap ( response. candidates. first)
142+ let finishReason = try XCTUnwrap ( candidate. finishReason)
143+ XCTAssertEqual ( finishReason, . stop)
144+ let usageMetadata = try XCTUnwrap ( response. usageMetadata)
145+ XCTAssertEqual ( usageMetadata. promptTokensDetails. count, 2 )
146+ XCTAssertEqual ( usageMetadata. promptTokensDetails [ 0 ] . modality, . image)
147+ XCTAssertEqual ( usageMetadata. promptTokensDetails [ 0 ] . tokenCount, 1806 )
148+ XCTAssertEqual ( usageMetadata. promptTokensDetails [ 1 ] . modality, . text)
149+ XCTAssertEqual ( usageMetadata. promptTokensDetails [ 1 ] . tokenCount, 76 )
150+ XCTAssertEqual ( usageMetadata. candidatesTokensDetails. count, 1 )
151+ XCTAssertEqual ( usageMetadata. candidatesTokensDetails [ 0 ] . modality, . text)
152+ XCTAssertEqual ( usageMetadata. candidatesTokensDetails [ 0 ] . tokenCount, 76 )
153+ }
154+
131155 func testGenerateContent_success_citations( ) async throws {
132156 MockURLProtocol
133157 . requestHandler = try httpRequestHandler (
@@ -488,6 +512,8 @@ final class GenerativeModelTests: XCTestCase {
488512 XCTAssertEqual ( usageMetadata. promptTokenCount, 6 )
489513 XCTAssertEqual ( usageMetadata. candidatesTokenCount, 7 )
490514 XCTAssertEqual ( usageMetadata. totalTokenCount, 13 )
515+ XCTAssertEqual ( usageMetadata. promptTokensDetails. isEmpty, true )
516+ XCTAssertEqual ( usageMetadata. candidatesTokensDetails. isEmpty, true )
491517 }
492518
493519 func testGenerateContent_failure_invalidAPIKey( ) async throws {
@@ -1326,6 +1352,23 @@ final class GenerativeModelTests: XCTestCase {
13261352 XCTAssertEqual ( response. totalBillableCharacters, 16 )
13271353 }
13281354
1355+ func testCountTokens_succeeds_detailed( ) async throws {
1356+ MockURLProtocol . requestHandler = try httpRequestHandler (
1357+ forResource: " unary-success-detailed-token-response " ,
1358+ withExtension: " json "
1359+ )
1360+
1361+ let response = try await model. countTokens ( " Why is the sky blue? " )
1362+
1363+ XCTAssertEqual ( response. totalTokens, 1837 )
1364+ XCTAssertEqual ( response. totalBillableCharacters, 117 )
1365+ XCTAssertEqual ( response. promptTokensDetails. count, 2 )
1366+ XCTAssertEqual ( response. promptTokensDetails [ 0 ] . modality, . image)
1367+ XCTAssertEqual ( response. promptTokensDetails [ 0 ] . tokenCount, 1806 )
1368+ XCTAssertEqual ( response. promptTokensDetails [ 1 ] . modality, . text)
1369+ XCTAssertEqual ( response. promptTokensDetails [ 1 ] . tokenCount, 31 )
1370+ }
1371+
13291372 func testCountTokens_succeeds_allOptions( ) async throws {
13301373 MockURLProtocol . requestHandler = try httpRequestHandler (
13311374 forResource: " unary-success-total-tokens " ,
0 commit comments