@@ -128,6 +128,30 @@ final class GenerativeModelTests: XCTestCase {
128
128
XCTAssertEqual ( response. functionCalls, [ ] )
129
129
}
130
130
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
+
131
155
func testGenerateContent_success_citations( ) async throws {
132
156
MockURLProtocol
133
157
. requestHandler = try httpRequestHandler (
@@ -488,6 +512,8 @@ final class GenerativeModelTests: XCTestCase {
488
512
XCTAssertEqual ( usageMetadata. promptTokenCount, 6 )
489
513
XCTAssertEqual ( usageMetadata. candidatesTokenCount, 7 )
490
514
XCTAssertEqual ( usageMetadata. totalTokenCount, 13 )
515
+ XCTAssertEqual ( usageMetadata. promptTokensDetails. isEmpty, true )
516
+ XCTAssertEqual ( usageMetadata. candidatesTokensDetails. isEmpty, true )
491
517
}
492
518
493
519
func testGenerateContent_failure_invalidAPIKey( ) async throws {
@@ -1326,6 +1352,23 @@ final class GenerativeModelTests: XCTestCase {
1326
1352
XCTAssertEqual ( response. totalBillableCharacters, 16 )
1327
1353
}
1328
1354
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
+
1329
1372
func testCountTokens_succeeds_allOptions( ) async throws {
1330
1373
MockURLProtocol . requestHandler = try httpRequestHandler (
1331
1374
forResource: " unary-success-total-tokens " ,
0 commit comments