@@ -435,6 +435,99 @@ final class XcodeColorExporterTests: XCTestCase {
435435 """ )
436436 }
437437
438+ func testExport_withAssetsFolderProvidesNamespace_nilFolderName_throws( ) throws {
439+ let output = XcodeColorsOutput (
440+ assetsColorsURL: colorsAssetCatalog,
441+ assetsInMainBundle: true ,
442+ colorSwiftURL: colorsFile,
443+ assetsFolderProvidesNamespace: true ,
444+ assetsFolderName: nil
445+ )
446+ let exporter = XcodeColorExporter ( output: output)
447+
448+ XCTAssertThrowsError ( try exporter. export ( colorPairs: [ colorPair1] ) )
449+ }
450+
451+ func testExport_withAssetsFolderProvidesNamespace_emptyFolderName_throws( ) throws {
452+ let output = XcodeColorsOutput (
453+ assetsColorsURL: colorsAssetCatalog,
454+ assetsInMainBundle: true ,
455+ colorSwiftURL: colorsFile,
456+ assetsFolderProvidesNamespace: true ,
457+ assetsFolderName: " "
458+ )
459+ let exporter = XcodeColorExporter ( output: output)
460+
461+ XCTAssertThrowsError ( try exporter. export ( colorPairs: [ colorPair1] ) )
462+ }
463+
464+ func testExport_withAssetsFolderProvidesNamespace_false_usesFunction( ) throws {
465+ let output = XcodeColorsOutput (
466+ assetsColorsURL: colorsAssetCatalog,
467+ assetsInMainBundle: true ,
468+ colorSwiftURL: colorsFile,
469+ assetsFolderProvidesNamespace: false ,
470+ assetsFolderName: " MyColors "
471+ )
472+ let exporter = XcodeColorExporter ( output: output)
473+
474+ let result = try exporter. export ( colorPairs: [ colorPair1] )
475+
476+ let content = result [ 0 ] . data
477+
478+ try assertCodeEquals ( content, """
479+ \( header)
480+
481+ import UIKit
482+
483+ private class BundleProvider {
484+ static let bundle = Bundle(for: BundleProvider.self)
485+ }
486+
487+ public extension UIColor {
488+ static var colorPair1: UIColor { UIColor(named: #function)! }
489+ }
490+
491+ """ )
492+ }
493+
494+ func testExport_withGroupUsingNamespace_andAssetsFolderProvidesNamespace( ) throws {
495+ let output = XcodeColorsOutput (
496+ assetsColorsURL: colorsAssetCatalog,
497+ assetsInMainBundle: true ,
498+ colorSwiftURL: colorsFile,
499+ groupUsingNamespace: true ,
500+ assetsFolderProvidesNamespace: true ,
501+ assetsFolderName: " MyColors "
502+ )
503+ let exporter = XcodeColorExporter ( output: output)
504+
505+ let result = try exporter. export ( colorPairs: [ colorPair3] )
506+
507+ // Verify folder Contents.json has provides-namespace
508+ let folderContents = try XCTUnwrap ( result [ 1 ] . data)
509+ let folderJson = try XCTUnwrap ( String ( data: folderContents, encoding: . utf8) )
510+ XCTAssertTrue ( folderJson. contains ( " provides-namespace " ) )
511+
512+ // Verify Swift extension uses folder-prefixed originalName
513+ let content = result [ 0 ] . data
514+
515+ try assertCodeEquals ( content, """
516+ \( header)
517+
518+ import UIKit
519+
520+ private class BundleProvider {
521+ static let bundle = Bundle(for: BundleProvider.self)
522+ }
523+
524+ public extension UIColor {
525+ static var backgroundPrimary: UIColor { UIColor(named: " MyColors/background/primary " )! }
526+ }
527+
528+ """ )
529+ }
530+
438531 func testExportWhenNameIsSwiftKeyword( ) throws {
439532 let output = XcodeColorsOutput ( assetsColorsURL: nil , assetsInMainBundle: true , colorSwiftURL: colorsFile)
440533 let exporter = XcodeColorExporter ( output: output)
0 commit comments