@@ -85,7 +85,7 @@ class DefaultAvailabilityTests: XCTestCase {
85
85
var translator = RenderNodeTranslator ( context: context, bundle: bundle, identifier: node. reference)
86
86
let renderNode = translator. visit ( node. semantic) as! RenderNode
87
87
88
- XCTAssertEqual ( renderNode. metadata. platforms? . map ( { " \( $0. name ?? " " ) \( $0. introduced ?? " " ) " } ) . sorted ( ) , [ expectedDefaultAvailability . last ?? " " ] )
88
+ XCTAssertEqual ( renderNode. metadata. platforms? . map ( { " \( $0. name ?? " " ) \( $0. introduced ?? " " ) " } ) . sorted ( ) , [ " Mac Catalyst " , " iOS " , " iPadOS " , " macOS 10.15.1 " ] )
89
89
}
90
90
91
91
// Test if the default availability is NOT used for symbols with explicit availability
@@ -579,4 +579,178 @@ class DefaultAvailabilityTests: XCTestCase {
579
579
)
580
580
581
581
}
582
+
583
+ func testInheritDefaultAvailabilityOptions( ) throws {
584
+ func makeInfoPlist(
585
+ defaultAvailability: String
586
+ ) -> String {
587
+ return """
588
+ <plist version= " 1.0 " >
589
+ <dict>
590
+ <key>CDAppleDefaultAvailability</key>
591
+ <dict>
592
+ <key>MyModule</key>
593
+ <array>
594
+ \( defaultAvailability)
595
+ </array>
596
+ </dict>
597
+ </dict>
598
+ </plist>
599
+ """
600
+ }
601
+ func setupContext(
602
+ defaultAvailability: String
603
+ ) throws -> ( DocumentationBundle , DocumentationContext ) {
604
+ // Create an empty bundle
605
+ let targetURL = try createTemporaryDirectory ( named: " test.docc " )
606
+ // Create symbol graph
607
+ let symbolGraphURL = targetURL. appendingPathComponent ( " MyModule.symbols.json " )
608
+ try symbolGraphString. write ( to: symbolGraphURL, atomically: true , encoding: . utf8)
609
+ // Create info plist
610
+ let infoPlistURL = targetURL. appendingPathComponent ( " Info.plist " )
611
+ let infoPlist = makeInfoPlist ( defaultAvailability: defaultAvailability)
612
+ try infoPlist. write ( to: infoPlistURL, atomically: true , encoding: . utf8)
613
+ // Load the bundle & reference resolve symbol graph docs
614
+ let ( _, bundle, context) = try loadBundle ( from: targetURL)
615
+ return ( bundle, context)
616
+ }
617
+
618
+ let symbols = """
619
+ {
620
+ " kind " : {
621
+ " displayName " : " Instance Property " ,
622
+ " identifier " : " swift.property "
623
+ },
624
+ " identifier " : {
625
+ " precise " : " c:@F@SymbolWithAvailability " ,
626
+ " interfaceLanguage " : " swift "
627
+ },
628
+ " pathComponents " : [
629
+ " Foo "
630
+ ],
631
+ " names " : {
632
+ " title " : " Foo " ,
633
+ },
634
+ " accessLevel " : " public " ,
635
+ " availability " : [
636
+ {
637
+ " domain " : " ios " ,
638
+ " introduced " : {
639
+ " major " : 10,
640
+ " minor " : 0
641
+ }
642
+ }
643
+ ]
644
+ },
645
+ {
646
+ " kind " : {
647
+ " displayName " : " Instance Property " ,
648
+ " identifier " : " swift.property "
649
+ },
650
+ " identifier " : {
651
+ " precise " : " c:@F@SymbolWithoutAvailability " ,
652
+ " interfaceLanguage " : " swift "
653
+ },
654
+ " pathComponents " : [
655
+ " Foo "
656
+ ],
657
+ " names " : {
658
+ " title " : " Bar " ,
659
+ },
660
+ " accessLevel " : " public "
661
+ }
662
+ """
663
+ let symbolGraphString = makeSymbolGraphString (
664
+ moduleName: " MyModule " ,
665
+ symbols: symbols,
666
+ platform: """
667
+ " operatingSystem " : {
668
+ " minimumVersion " : {
669
+ " major " : 10,
670
+ " minor " : 0
671
+ },
672
+ " name " : " ios "
673
+ }
674
+ """
675
+ )
676
+
677
+ // Don't use default availability version.
678
+
679
+ var ( bundle, context) = try setupContext (
680
+ defaultAvailability: """
681
+ <dict>
682
+ <key>name</key>
683
+ <string>iOS</string>
684
+ </dict>
685
+ """
686
+ )
687
+
688
+ // Verify we add the version number into the symbols that have availability annotation.
689
+ guard let availability = ( context. documentationCache [ " c:@F@SymbolWithAvailability " ] ? . semantic as? Symbol ) ? . availability? . availability else {
690
+ XCTFail ( " Did not find availability for symbol 'c:@F@SymbolWithAvailability' " )
691
+ return
692
+ }
693
+ XCTAssertNotNil ( availability. first ( where: { $0. domain? . rawValue == " iOS " } ) )
694
+ XCTAssertEqual ( availability. first ( where: { $0. domain? . rawValue == " iOS " } ) ? . introducedVersion, SymbolGraph . SemanticVersion ( major: 10 , minor: 0 , patch: 0 ) )
695
+ // Verify we don't add the version number into the symbols that don't have availability annotation.
696
+ guard let availability = ( context. documentationCache [ " c:@F@SymbolWithoutAvailability " ] ? . semantic as? Symbol ) ? . availability? . availability else {
697
+ XCTFail ( " Did not find availability for symbol 'c:@F@SymbolWithoutAvailability' " )
698
+ return
699
+ }
700
+ XCTAssertNotNil ( availability. first ( where: { $0. domain? . rawValue == " iOS " } ) )
701
+ XCTAssertEqual ( availability. first ( where: { $0. domain? . rawValue == " iOS " } ) ? . introducedVersion, nil )
702
+ // Verify we remove the version from the module availability information.
703
+ var identifier = ResolvedTopicReference ( bundleIdentifier: " test " , path: " /documentation/MyModule " , fragment: nil , sourceLanguage: . swift)
704
+ var node = try context. entity ( with: identifier)
705
+ var translator = RenderNodeTranslator ( context: context, bundle: bundle, identifier: identifier)
706
+ var renderNode = translator. visit ( node. semantic) as! RenderNode
707
+ XCTAssertEqual ( renderNode. metadata. platforms? . count, 1 )
708
+ XCTAssertEqual ( renderNode. metadata. platforms? . first? . name, " iOS " )
709
+ XCTAssertEqual ( renderNode. metadata. platforms? . first? . introduced, nil )
710
+
711
+ // Add an extra default availability to test behaviour when mixin in source with default behaviour.
712
+ ( bundle, context) = try setupContext ( defaultAvailability: """
713
+ <dict>
714
+ <key>name</key>
715
+ <string>iOS</string>
716
+ <key>version</key>
717
+ <string>8.0</string>
718
+ </dict>
719
+ <dict>
720
+ <key>name</key>
721
+ <string>watchOS</string>
722
+ </dict>
723
+ """
724
+ )
725
+
726
+ // Verify we add the version number into the symbols that have availability annotation.
727
+ guard let availability = ( context. documentationCache [ " c:@F@SymbolWithAvailability " ] ? . semantic as? Symbol ) ? . availability? . availability else {
728
+ XCTFail ( " Did not find availability for symbol 'c:@F@SymbolWithAvailability' " )
729
+ return
730
+ }
731
+ XCTAssertNotNil ( availability. first ( where: { $0. domain? . rawValue == " iOS " } ) )
732
+ XCTAssertNotNil ( availability. first ( where: { $0. domain? . rawValue == " watchOS " } ) )
733
+ XCTAssertEqual ( availability. first ( where: { $0. domain? . rawValue == " iOS " } ) ? . introducedVersion, SymbolGraph . SemanticVersion ( major: 10 , minor: 0 , patch: 0 ) )
734
+ XCTAssertEqual ( availability. first ( where: { $0. domain? . rawValue == " watchOS " } ) ? . introducedVersion, nil )
735
+
736
+ guard let availability = ( context. documentationCache [ " c:@F@SymbolWithoutAvailability " ] ? . semantic as? Symbol ) ? . availability? . availability else {
737
+ XCTFail ( " Did not find availability for symbol 'c:@F@SymbolWithAvailability' " )
738
+ return
739
+ }
740
+ XCTAssertNotNil ( availability. first ( where: { $0. domain? . rawValue == " iOS " } ) )
741
+ XCTAssertNotNil ( availability. first ( where: { $0. domain? . rawValue == " watchOS " } ) )
742
+ XCTAssertEqual ( availability. first ( where: { $0. domain? . rawValue == " iOS " } ) ? . introducedVersion, SymbolGraph . SemanticVersion ( major: 8 , minor: 0 , patch: 0 ) )
743
+ XCTAssertEqual ( availability. first ( where: { $0. domain? . rawValue == " watchOS " } ) ? . introducedVersion, nil )
744
+
745
+ // Verify the module availability shows as expected.
746
+ identifier = ResolvedTopicReference ( bundleIdentifier: " test " , path: " /documentation/MyModule " , fragment: nil , sourceLanguage: . swift)
747
+ node = try context. entity ( with: identifier)
748
+ translator = RenderNodeTranslator ( context: context, bundle: bundle, identifier: identifier)
749
+ renderNode = translator. visit ( node. semantic) as! RenderNode
750
+ XCTAssertEqual ( renderNode. metadata. platforms? . count, 4 )
751
+ var moduleAvailability = try XCTUnwrap ( renderNode. metadata. platforms? . first ( where: { $0. name == " iOS " } ) )
752
+ XCTAssertEqual ( moduleAvailability. introduced, " 8.0 " )
753
+ moduleAvailability = try XCTUnwrap ( renderNode. metadata. platforms? . first ( where: { $0. name == " watchOS " } ) )
754
+ XCTAssertEqual ( moduleAvailability. introduced, nil )
755
+ }
582
756
}
0 commit comments