@@ -1538,6 +1538,92 @@ final class GenerativeModelTests: XCTestCase {
1538
1538
XCTAssertEqual ( response. totalTokens, 6 )
1539
1539
}
1540
1540
1541
+ // MARK: - GenerateContentResponse Computed Properties
1542
+
1543
+ func testGenerateContentResponse_inlineDataParts_success( ) throws {
1544
+ // 1. Create mock parts
1545
+ let imageData = Data ( " sample image data " . utf8) // Placeholder data
1546
+ let inlineDataPart = InlineDataPart ( mimeType: " image/png " , data: imageData)
1547
+ let textPart = TextPart ( " This is the text part. " )
1548
+
1549
+ // 2. Create ModelContent
1550
+ let modelContent = ModelContent ( parts: [ textPart, inlineDataPart] ) // Mixed parts
1551
+
1552
+ // 3. Create Candidate
1553
+ let candidate = Candidate (
1554
+ content: modelContent,
1555
+ safetyRatings: [ ] , // Assuming negligible for this test
1556
+ finishReason: . stop,
1557
+ citationMetadata: nil
1558
+ )
1559
+
1560
+ // 4. Create GenerateContentResponse
1561
+ let response = GenerateContentResponse ( candidates: [ candidate] )
1562
+
1563
+ // 5. Assertions for inlineDataParts
1564
+ let inlineParts = response. inlineDataParts
1565
+ XCTAssertFalse ( inlineParts. isEmpty, " inlineDataParts should not be empty. " )
1566
+ XCTAssertEqual ( inlineParts. count, 1 , " There should be exactly one InlineDataPart. " )
1567
+
1568
+ let firstInlinePart = try XCTUnwrap ( inlineParts. first, " Could not get the first inline part. " )
1569
+ XCTAssertEqual ( firstInlinePart. mimeType, " image/png " , " MimeType should match. " )
1570
+ XCTAssertFalse ( firstInlinePart. data. isEmpty, " Inline data should not be empty. " )
1571
+ XCTAssertEqual ( firstInlinePart. data, imageData) // Verify data content
1572
+
1573
+ // 6. Assertion for text (ensure other properties still work)
1574
+ XCTAssertEqual ( response. text, " This is the text part. " )
1575
+
1576
+ // 7. Assertion for function calls (ensure it's empty)
1577
+ XCTAssertTrue ( response. functionCalls. isEmpty, " functionCalls should be empty. " )
1578
+ }
1579
+
1580
+ func testGenerateContentResponse_inlineDataParts_noInlineData( ) throws {
1581
+ // 1. Create mock parts (only text)
1582
+ let textPart = TextPart ( " This is the text part. " )
1583
+ let funcCallPart = FunctionCallPart ( name: " testFunc " , args: nil ) // Add another part type
1584
+
1585
+ // 2. Create ModelContent
1586
+ let modelContent = ModelContent ( parts: [ textPart, funcCallPart] )
1587
+
1588
+ // 3. Create Candidate
1589
+ let candidate = Candidate (
1590
+ content: modelContent,
1591
+ safetyRatings: [ ] ,
1592
+ finishReason: . stop,
1593
+ citationMetadata: nil
1594
+ )
1595
+
1596
+ // 4. Create GenerateContentResponse
1597
+ let response = GenerateContentResponse ( candidates: [ candidate] )
1598
+
1599
+ // 5. Assertions for inlineDataParts
1600
+ let inlineParts = response. inlineDataParts
1601
+ XCTAssertTrue ( inlineParts. isEmpty, " inlineDataParts should be empty. " )
1602
+
1603
+ // 6. Assertion for text
1604
+ XCTAssertEqual ( response. text, " This is the text part. " )
1605
+
1606
+ // 7. Assertion for function calls
1607
+ XCTAssertEqual ( response. functionCalls. count, 1 )
1608
+ XCTAssertEqual ( response. functionCalls. first? . name, " testFunc " )
1609
+ }
1610
+
1611
+ func testGenerateContentResponse_inlineDataParts_noCandidates( ) throws {
1612
+ // 1. Create GenerateContentResponse with no candidates
1613
+ let response = GenerateContentResponse ( candidates: [ ] )
1614
+
1615
+ // 2. Assertions for inlineDataParts
1616
+ let inlineParts = response. inlineDataParts
1617
+ XCTAssertTrue ( inlineParts. isEmpty, " inlineDataParts should be empty when there are no candidates. " )
1618
+
1619
+ // 3. Assertion for text
1620
+ XCTAssertNil ( response. text, " Text should be nil when there are no candidates. " )
1621
+
1622
+ // 4. Assertion for function calls
1623
+ XCTAssertTrue ( response. functionCalls. isEmpty, " functionCalls should be empty when there are no candidates. " )
1624
+ }
1625
+
1626
+
1541
1627
// MARK: - Helpers
1542
1628
1543
1629
private func testFirebaseInfo( appCheck: AppCheckInterop ? = nil ,
0 commit comments