| require File.expand_path('../../../spec_helper', __FILE__) |
| |
| module Pod |
| describe FileAccessor = Sandbox::FileAccessor do |
| before do |
| @root = fixture('banana-lib') |
| @path_list = Sandbox::PathList.new(@root) |
| @spec = fixture_spec('banana-lib/BananaLib.podspec') |
| @spec_consumer = @spec.consumer(:ios) |
| @accessor = FileAccessor.new(@path_list, @spec_consumer) |
| end |
| |
| describe 'In general' do |
| it 'raises if the consumer is nil' do |
| e = lambda { FileAccessor.new(@path_list, nil) }.should.raise Informative |
| e.message.should.match /without a specification consumer/ |
| end |
| |
| it 'raises if the root does not exits' do |
| root = temporary_directory + 'missing_folder' |
| path_list = Sandbox::PathList.new(root) |
| file_accessor = FileAccessor.new(path_list, @spec_consumer) |
| e = lambda { file_accessor.source_files }.should.raise Informative |
| e.message.should.match /non existent folder/ |
| end |
| |
| it 'returns the root' do |
| @accessor.root.should == @path_list.root |
| end |
| |
| it 'returns the specification' do |
| @accessor.spec.should == @spec |
| end |
| |
| it 'returns the platform for which the spec is being consumed' do |
| @accessor.platform_name.should == :ios |
| end |
| end |
| |
| #-------------------------------------------------------------------------# |
| |
| describe 'Returning files' do |
| it 'returns the source files' do |
| @accessor.source_files.sort.should == [ |
| @root + 'Classes/Banana.h', |
| @root + 'Classes/Banana.m', |
| @root + 'Classes/BananaPrivate.h', |
| @root + 'Classes/BananaTrace.d', |
| @root + 'framework/Source/MoreBanana.h', |
| ] |
| end |
| |
| it 'returns the source files that use arc' do |
| @accessor.arc_source_files.sort.should == [ |
| @root + 'Classes/Banana.h', |
| @root + 'Classes/Banana.m', |
| @root + 'Classes/BananaPrivate.h', |
| @root + 'Classes/BananaTrace.d', |
| @root + 'framework/Source/MoreBanana.h', |
| ] |
| end |
| |
| it 'returns the source files that do not use arc' do |
| @accessor.non_arc_source_files.sort.should == [] |
| end |
| |
| it 'returns the header files' do |
| @accessor.headers.sort.should == [ |
| @root + 'Classes/Banana.h', |
| @root + 'Classes/BananaPrivate.h', |
| @root + 'framework/Source/MoreBanana.h', |
| ] |
| end |
| |
| it 'returns the public headers' do |
| @accessor.public_headers.sort.should == [ |
| @root + 'Classes/Banana.h', |
| @root + 'framework/Source/MoreBanana.h', |
| ] |
| end |
| |
| it 'returns all the headers if no public headers are defined' do |
| @spec_consumer.stubs(:public_header_files).returns([]) |
| @accessor.public_headers.sort.should == [ |
| @root + 'Classes/Banana.h', |
| @root + 'Classes/BananaPrivate.h', |
| @root + 'framework/Source/MoreBanana.h', |
| ] |
| end |
| |
| it 'filters the private headers from the public headers' do |
| @spec_consumer.stubs(:public_header_files).returns([]) |
| @spec_consumer.stubs(:private_header_files).returns(['**/*Private*']) |
| @accessor.public_headers.sort.should == [ |
| @root + 'Classes/Banana.h', |
| @root + 'framework/Source/MoreBanana.h', |
| ] |
| end |
| |
| it 'includes the vendored framework headers if requested' do |
| @accessor.public_headers(true).sort.should == [ |
| @root + 'Bananalib.framework/Versions/A/Headers/Bananalib.h', |
| @root + 'Bananalib.framework/Versions/A/Headers/SubDir/SubBananalib.h', |
| @root + 'Classes/Banana.h', |
| @root + 'framework/Source/MoreBanana.h', |
| ] |
| end |
| |
| it 'returns the resources' do |
| @accessor.resources.sort.should == [ |
| @root + 'Resources/Base.lproj', |
| @root + 'Resources/Images.xcassets', |
| @root + 'Resources/Migration.xcmappingmodel', |
| @root + 'Resources/Sample.xcdatamodeld', |
| @root + 'Resources/de.lproj', |
| @root + 'Resources/en.lproj', |
| @root + 'Resources/logo-sidebar.png', |
| @root + 'Resources/sub_dir', |
| ] |
| end |
| |
| it 'includes folders in the resources' do |
| @accessor.resources.should.include?(@root + 'Resources/sub_dir') |
| end |
| |
| it 'returns the preserve paths' do |
| @accessor.preserve_paths.sort.should == [ |
| @root + 'preserve_me.txt', |
| ] |
| end |
| |
| it 'includes folders in the preserve paths' do |
| @spec_consumer.stubs(:preserve_paths).returns(['Resources']) |
| @accessor.preserve_paths.should.include?(@root + 'Resources') |
| end |
| |
| it 'returns the paths of the framework bundles' do |
| @accessor.vendored_frameworks.should.include?(@root + 'Bananalib.framework') |
| end |
| |
| it 'returns the paths of the framework headers' do |
| @accessor.vendored_frameworks_headers.sort.should == [ |
| @root + 'Bananalib.framework/Versions/A/Headers/Bananalib.h', |
| @root + 'Bananalib.framework/Versions/A/Headers/SubDir/SubBananalib.h', |
| ].sort |
| end |
| |
| it 'handles when the framework headers directory does not exist' do |
| Pathname.any_instance.stubs(:directory?).returns(false) |
| FileAccessor.vendored_frameworks_headers_dir(@root + 'Bananalib.framework').should == @root + 'Bananalib.framework/Headers' |
| end |
| |
| it 'returns the paths of the library files' do |
| @accessor.vendored_libraries.should.include?(@root + 'libBananalib.a') |
| end |
| |
| it 'returns the resource bundles of the pod' do |
| @spec_consumer.stubs(:resource_bundles).returns('BananaLib' => 'Resources/*') |
| resource_paths = [ |
| @root + 'Resources/logo-sidebar.png', |
| @root + 'Resources/Base.lproj', |
| @root + 'Resources/de.lproj', |
| @root + 'Resources/en.lproj', |
| @root + 'Resources/Images.xcassets', |
| @root + 'Resources/Migration.xcmappingmodel', |
| @root + 'Resources/Sample.xcdatamodeld', |
| @root + 'Resources/sub_dir', |
| ] |
| @accessor.resource_bundles.should == { 'BananaLib' => resource_paths } |
| end |
| |
| it 'returns the paths of the files of the resource bundles' do |
| @spec_consumer.stubs(:resource_bundles).returns('BananaLib' => 'Resources/*') |
| resource_paths = [ |
| @root + 'Resources/logo-sidebar.png', |
| @root + 'Resources/Base.lproj', |
| @root + 'Resources/de.lproj', |
| @root + 'Resources/en.lproj', |
| @root + 'Resources/Images.xcassets', |
| @root + 'Resources/Migration.xcmappingmodel', |
| @root + 'Resources/Sample.xcdatamodeld', |
| @root + 'Resources/sub_dir', |
| ] |
| @accessor.resource_bundle_files.should == resource_paths |
| end |
| |
| it 'takes into account exclude_files when creating the resource bundles of the pod' do |
| @spec_consumer.stubs(:exclude_files).returns(['**/*.png']) |
| @spec_consumer.stubs(:resource_bundles).returns('BananaLib' => 'Resources/*') |
| resource_paths = [ |
| @root + 'Resources/Base.lproj', |
| @root + 'Resources/de.lproj', |
| @root + 'Resources/en.lproj', |
| @root + 'Resources/Images.xcassets', |
| @root + 'Resources/Migration.xcmappingmodel', |
| @root + 'Resources/Sample.xcdatamodeld', |
| @root + 'Resources/sub_dir', |
| ] |
| @accessor.resource_bundles.should == { 'BananaLib' => resource_paths } |
| end |
| |
| it 'returns the prefix header of the specification' do |
| @accessor.prefix_header.should == @root + 'Classes/BananaLib.pch' |
| end |
| |
| it 'returns the README file of the specification' do |
| @accessor.readme.should == @root + 'README' |
| end |
| |
| it 'returns the license file of the specification' do |
| @accessor.license.should == @root + 'LICENSE' |
| end |
| |
| it 'returns the docs of the specification' do |
| @accessor.docs.should == [ |
| @root + 'docs/guide1.md', |
| @root + 'docs/subdir/guide2.md', |
| ] |
| end |
| |
| it 'returns the podspecs of the specification' do |
| @accessor.specs.should == [ |
| @root + 'BananaLib.podspec', |
| ] |
| end |
| |
| it 'returns the matching podspec of the specification' do |
| @accessor.stubs(:specs).returns([@root + 'BananaLib.podspec', @root + 'OtherLib.podspec']) |
| @accessor.send(:podspec_file).should == @root + 'BananaLib.podspec' |
| end |
| |
| it 'returns the developer files of the specification' do |
| @accessor.developer_files.should == [ |
| @root + 'Banana.modulemap', |
| @root + 'BananaLib.podspec', |
| @root + 'Classes/BananaLib.pch', |
| @root + 'LICENSE', |
| @root + 'README', |
| @root + 'docs/guide1.md', |
| @root + 'docs/subdir/guide2.md', |
| ] |
| end |
| |
| it 'does not return auto-detected developer files when there are multiple podspecs' do |
| @accessor.stubs(:specs).returns([@root + 'BananaLib.podspec', @root + 'OtherLib.podspec']) |
| @accessor.developer_files.should == [ |
| @root + 'Banana.modulemap', |
| @root + 'BananaLib.podspec', |
| @root + 'Classes/BananaLib.pch', |
| @root + 'LICENSE', |
| ] |
| end |
| |
| #--------------------------------------# |
| |
| it 'respects the exclude files' do |
| @spec_consumer.stubs(:exclude_files).returns(['Classes/BananaPrivate.h']) |
| @accessor.source_files.sort.should == [ |
| @root + 'Classes/Banana.h', |
| @root + 'Classes/Banana.m', |
| @root + 'Classes/BananaTrace.d', |
| @root + 'framework/Source/MoreBanana.h', |
| ] |
| end |
| |
| describe 'using requires_arc' do |
| it 'when false returns all source files as non-arc' do |
| @spec_consumer.stubs(:requires_arc).returns(false) |
| @accessor.non_arc_source_files.should == @accessor.source_files |
| @accessor.arc_source_files.should.be.empty? |
| end |
| |
| it 'when true returns all source files as arc' do |
| @spec_consumer.stubs(:requires_arc).returns(true) |
| @accessor.arc_source_files.should == @accessor.source_files |
| @accessor.non_arc_source_files.should.be.empty? |
| end |
| |
| it 'when a file pattern returns all source files as arc that match' do |
| @spec_consumer.stubs(:requires_arc).returns(['Classes/Banana.m']) |
| @accessor.arc_source_files.should == [@root + 'Classes/Banana.m'] |
| @accessor.non_arc_source_files.sort.should == [ |
| @root + 'Classes/Banana.h', |
| @root + 'Classes/BananaPrivate.h', |
| @root + 'Classes/BananaTrace.d', |
| @root + 'framework/Source/MoreBanana.h', |
| ] |
| end |
| end |
| end |
| |
| #-------------------------------------------------------------------------# |
| |
| describe 'Private helpers' do |
| describe '#paths_for_attribute' do |
| it 'takes into account dir patterns and excluded files' do |
| file_patterns = ['Classes/*.{h,m,d}', 'Vendor', 'framework/Source/*.h'] |
| options = { |
| :exclude_patterns => ['Classes/**/osx/**/*', 'Resources/**/osx/**/*'], |
| :dir_pattern => '*{.m,.mm,.i,.c,.cc,.cxx,.cpp,.c++,.swift,.h,.hh,.hpp,.ipp,.tpp,.hxx,.def}', |
| :include_dirs => false, |
| } |
| @spec.exclude_files = options[:exclude_patterns] |
| @accessor.expects(:expanded_paths).with(file_patterns, options) |
| @accessor.send(:paths_for_attribute, :source_files) |
| end |
| end |
| |
| describe '#dynamic_binary?' do |
| it 'not a dynamic binary if its not a file' do |
| binary = stub(:file? => false) |
| @accessor.send(:dynamic_binary?, binary).should.be.false |
| end |
| |
| it 'uses the cache after the first time' do |
| binary = stub(:file? => true) |
| macho_file = stub(:dylib? => true) |
| MachO.stubs(:open).once.returns(macho_file) |
| @accessor.send(:dynamic_binary?, binary).should.be.true |
| @accessor.send(:dynamic_binary?, binary).should.be.true |
| end |
| end |
| end |
| |
| #-------------------------------------------------------------------------# |
| end |
| end |