| require File.expand_path('../../spec_helper', __FILE__) |
| |
| module Pod |
| # Expose to unit test file |
| class Project |
| public :group_for_path_in_group |
| end |
| |
| describe Project do |
| before do |
| @project = Project.new(config.sandbox.project_path) |
| end |
| |
| #-------------------------------------------------------------------------# |
| |
| describe 'In general' do |
| it 'creates the support files group on initialization' do |
| @project.support_files_group.name.should == 'Targets Support Files' |
| end |
| |
| it 'creates the Pods group on initialization' do |
| @project.pods.name.should == 'Pods' |
| end |
| |
| it 'creates the development Pods group on initialization' do |
| @project.development_pods.name.should == 'Development Pods' |
| end |
| |
| def settings_for_root_configs(key) |
| @project.root_object.build_configuration_list.build_configurations.map do |config| |
| config.build_settings[key] |
| end |
| end |
| |
| it 'assigns a SYMROOT to each root build configuration' do |
| @project.symroot = 'some/build/path' |
| settings_for_root_configs('SYMROOT').uniq.should == ['some/build/path'] |
| end |
| |
| it 'sets a default SYMROOT for legacy Xcode build setups' do |
| settings_for_root_configs('SYMROOT').uniq.should == [Project::LEGACY_BUILD_ROOT] |
| end |
| end |
| |
| #-------------------------------------------------------------------------# |
| |
| describe 'Pod Groups' do |
| describe '#add_pod_group' do |
| before do |
| @path = config.sandbox.pod_dir('BananaLib') |
| end |
| |
| it 'adds the group for a Pod' do |
| group = @project.add_pod_group('BananaLib', @path) |
| group.parent.should == @project.pods |
| group.name.should == 'BananaLib' |
| end |
| |
| it 'adds the group for a development Pod' do |
| config.sandbox.pod_dir('BananaLib') |
| group = @project.add_pod_group('BananaLib', @path, true) |
| group.parent.should == @project.development_pods |
| group.name.should == 'BananaLib' |
| end |
| |
| it 'configures the path of a new Pod group' do |
| config.sandbox.pod_dir('BananaLib') |
| group = @project.add_pod_group('BananaLib', @path) |
| group.source_tree.should == '<group>' |
| group.path.should == 'BananaLib' |
| Pathname.new(group.path).should.be.relative |
| end |
| |
| it 'configures the path of a new Pod group as absolute if requested' do |
| config.sandbox.pod_dir('BananaLib') |
| group = @project.add_pod_group('BananaLib', @path, false, true) |
| group.source_tree.should == '<absolute>' |
| group.path.should == @path.to_s |
| Pathname.new(group.path).should.be.absolute |
| end |
| end |
| |
| #----------------------------------------# |
| |
| describe '#pod_groups' do |
| before do |
| @project.add_pod_group('BananaLib', config.sandbox.pod_dir('BananaLib')) |
| @project.add_pod_group('OrangeLib', config.sandbox.pod_dir('OrangeLib'), true) |
| end |
| |
| it 'returns the pod groups' do |
| @project.pod_groups.map(&:name).sort.should == %w(BananaLib OrangeLib) |
| end |
| |
| it "doesn't alters the original groups" do |
| @project.pods.children.map(&:name).sort.should == ['BananaLib'] |
| @project.development_pods.children.map(&:name).sort.should == ['OrangeLib'] |
| end |
| end |
| |
| #----------------------------------------# |
| |
| it 'returns the group of a Pod with a given name' do |
| @project.add_pod_group('BananaLib', config.sandbox.pod_dir('BananaLib')) |
| @project.pod_group('BananaLib').name.should == 'BananaLib' |
| end |
| |
| #----------------------------------------# |
| |
| describe '#group_for_spec' do |
| before do |
| @project.add_pod_group('BananaLib', config.sandbox.pod_dir('BananaLib')) |
| end |
| |
| it 'returns the group for the spec with the given name' do |
| group = @project.group_for_spec('BananaLib/Tree') |
| group.hierarchy_path.should == '/Pods/BananaLib/Tree' |
| end |
| |
| it "doesn't duplicate the groups" do |
| group_1 = @project.group_for_spec('BananaLib/Tree') |
| group_2 = @project.group_for_spec('BananaLib/Tree') |
| group_1.uuid.should == group_2.uuid |
| end |
| |
| it 'returns the subgroup with the given key' do |
| group = @project.group_for_spec('BananaLib/Tree', :resources) |
| group.hierarchy_path.should == '/Pods/BananaLib/Tree/Resources' |
| end |
| |
| it "doesn't duplicates subgroups" do |
| group_1 = @project.group_for_spec('BananaLib/Tree', :resources) |
| group_2 = @project.group_for_spec('BananaLib/Tree', :resources) |
| group_1.uuid.should == group_2.uuid |
| end |
| |
| it 'raises if the subgroup key is unrecognized' do |
| should.raise ArgumentError do |
| @project.group_for_spec('BananaLib/Tree', :bananaland) |
| end.message.should.match /Unrecognized.*key/ |
| end |
| end |
| |
| #----------------------------------------# |
| |
| describe '#pod_support_files_group' do |
| before do |
| @project.add_pod_group('BananaLib', @path, false, true) |
| end |
| |
| it 'creates a support file group relative to the project' do |
| group = @project.pod_support_files_group('BananaLib', 'path') |
| group.path.should == 'path' |
| end |
| |
| it "doesn't duplicate the groups" do |
| group_1 = @project.pod_support_files_group('BananaLib', 'path') |
| group_2 = @project.pod_support_files_group('BananaLib', 'path') |
| group_1.uuid.should == group_2.uuid |
| end |
| end |
| end |
| |
| #-------------------------------------------------------------------------# |
| |
| describe 'File references' do |
| describe '#reference_for_path' do |
| before do |
| @project.add_pod_group('BananaLib', config.sandbox.pod_dir('BananaLib'), false) |
| @file = config.sandbox.pod_dir('BananaLib') + 'file.m' |
| @pod_dir = config.sandbox.pod_dir('BananaLib') |
| @nested_file = config.sandbox.pod_dir('BananaLib') + 'Dir/SubDir/nested_file.m' |
| @localized_file = config.sandbox.pod_dir('BananaLib') + 'Dir/SubDir/de.lproj/Foo.strings' |
| @group = @project.group_for_spec('BananaLib') |
| end |
| |
| it 'adds a file references to the given file' do |
| Pathname.any_instance.stubs(:realpath).returns(@file) |
| ref = @project.add_file_reference(@file, @group) |
| ref.hierarchy_path.should == '/Pods/BananaLib/file.m' |
| end |
| |
| it 'adds subgroups for a file reference if requested' do |
| Pathname.any_instance.stubs(:realpath).returns(@nested_file) |
| ref = @project.add_file_reference(@nested_file, @group, true) |
| ref.hierarchy_path.should == '/Pods/BananaLib/Dir/SubDir/nested_file.m' |
| end |
| |
| it 'does not add subgroups for a file reference if not requested' do |
| Pathname.any_instance.stubs(:realpath).returns(@nested_file) |
| ref = @project.add_file_reference(@nested_file, @group) |
| ref.hierarchy_path.should == '/Pods/BananaLib/nested_file.m' |
| end |
| |
| it 'does not add subgroups for a file reference if requested not to' do |
| Pathname.any_instance.stubs(:realpath).returns(@nested_file) |
| ref = @project.add_file_reference(@nested_file, @group, false) |
| ref.hierarchy_path.should == '/Pods/BananaLib/nested_file.m' |
| end |
| |
| it 'adds subgroups relative to shared base if requested' do |
| base_path = @pod_dir + 'Dir' |
| Pathname.any_instance.stubs(:realdirpath).returns(@pod_dir + 'Dir') |
| Pathname.any_instance.stubs(:realpath).returns(@nested_file) |
| ref = @project.add_file_reference(@nested_file, @group, true, base_path) |
| ref.hierarchy_path.should == '/Pods/BananaLib/SubDir/nested_file.m' |
| ref.parent.path.should == 'Dir/SubDir' |
| end |
| |
| it "it doesn't duplicate file references for a single path" do |
| Pathname.any_instance.stubs(:realpath).returns(@file) |
| ref_1 = @project.add_file_reference(@file, @group) |
| ref_2 = @project.add_file_reference(@file, @group) |
| ref_1.uuid.should == ref_2.uuid |
| @group.children.count.should == 1 |
| end |
| |
| it 'creates variant group for localized file' do |
| Pathname.any_instance.stubs(:realpath).returns(@localized_file) |
| ref = @project.add_file_reference(@localized_file, @group) |
| ref.hierarchy_path.should == '/Pods/BananaLib/Foo.strings/Foo.strings' |
| ref.parent.class.should == Xcodeproj::Project::Object::PBXVariantGroup |
| end |
| |
| it 'creates variant group for localized file in subgroup' do |
| Pathname.any_instance.stubs(:realpath).returns(@localized_file) |
| ref = @project.add_file_reference(@localized_file, @group, true) |
| ref.hierarchy_path.should == '/Pods/BananaLib/Dir/SubDir/Foo.strings/Foo.strings' |
| ref.parent.class.should == Xcodeproj::Project::Object::PBXVariantGroup |
| end |
| |
| it 'raises if the given path is not absolute' do |
| should.raise ArgumentError do |
| @project.add_file_reference('relative/path/to/file.m', @group) |
| end.message.should.match /Paths must be absolute/ |
| end |
| |
| it 'uses realpath for resolving symlinks' do |
| file = Pathname.new(Dir.tmpdir) + 'file.m' |
| FileUtils.rm_f(file) |
| File.open(file, 'w') { |f| f.write('') } |
| sym_file = Pathname.new(Dir.tmpdir) + 'symlinked_file.m' |
| FileUtils.rm_f(sym_file) |
| File.symlink(file, sym_file) |
| |
| ref = @project.add_file_reference(sym_file, @group) |
| ref.hierarchy_path.should == '/Pods/BananaLib/file.m' |
| end |
| end |
| |
| #----------------------------------------# |
| |
| describe '#group_for_path_in_group' do |
| before do |
| @project.add_pod_group('BananaLib', config.sandbox.pod_dir('BananaLib'), false) |
| poddir = config.sandbox.pod_dir('BananaLib') |
| subdir = poddir + 'Dir/SubDir/' |
| @file = poddir + 'file.m' |
| @nested_file = subdir + 'nested_file.h' |
| @nested_file2 = subdir + 'nested_file.m' |
| @localized_base_foo = subdir + 'Base.lproj/Foo.storyboard' |
| @localized_de_foo = subdir + 'de.lproj/Foo.strings' |
| @localized_de_foo_jpg = subdir + 'de.lproj/Foo.jpg' |
| @localized_de_bar = subdir + 'de.lproj/Bar.strings' |
| @localized_different_foo = poddir + 'Base.lproj/Foo.jpg' |
| @group = @project.group_for_spec('BananaLib') |
| end |
| |
| it 'returns parent group when file is in main group directory' do |
| group = @project.group_for_path_in_group(@file, @group, true) |
| group.uuid.should == @group.uuid |
| end |
| |
| it 'returns parent group when not localized or reflecting structure' do |
| group = @project.group_for_path_in_group(@nested_file, @group, false) |
| group.uuid.should == @group.uuid |
| end |
| |
| it 'adds subgroups if reflecting file system structure' do |
| group = @project.group_for_path_in_group(@nested_file, @group, true) |
| group.hierarchy_path.should == '/Pods/BananaLib/Dir/SubDir' |
| end |
| |
| it "doesn't duplicate groups for a single directory path" do |
| group_1 = @project.group_for_path_in_group(@nested_file, @group, true) |
| group_2 = @project.group_for_path_in_group(@nested_file2, @group, true) |
| group_1.uuid.should == group_2.uuid |
| end |
| |
| it 'creates variant group for localized file' do |
| group = @project.group_for_path_in_group(@localized_base_foo, @group, false) |
| group.hierarchy_path.should == '/Pods/BananaLib/Foo.storyboard' |
| group.class.should == Xcodeproj::Project::Object::PBXVariantGroup |
| end |
| |
| it 'creates variant group for localized file when adding subgroups' do |
| group = @project.group_for_path_in_group(@localized_base_foo, @group, true) |
| group.hierarchy_path.should == '/Pods/BananaLib/Dir/SubDir/Foo.storyboard' |
| group.class.should == Xcodeproj::Project::Object::PBXVariantGroup |
| end |
| |
| it 'sets variant group path to the folder that contains .lproj bundles' do |
| group = @project.group_for_path_in_group(@localized_base_foo, @group, false) |
| group.real_path.should == config.sandbox.pod_dir('BananaLib') + 'Dir/SubDir' |
| end |
| |
| it "doesn't duplicate variant groups for interface and strings files with " \ |
| 'same name and directory' do |
| Pathname.any_instance.stubs(:exist?).returns(false).then.returns(true) |
| |
| group_1 = @project.group_for_path_in_group(@localized_base_foo, @group, false) |
| group_2 = @project.group_for_path_in_group(@localized_de_foo, @group, false) |
| |
| group_1.uuid.should == group_2.uuid |
| @group.children.count.should == 1 |
| end |
| |
| it 'creates own variant groups for localized non-interface files with same name' do |
| # An image and a strings file should not be combined. |
| group_1 = @project.group_for_path_in_group(@localized_de_foo, @group, false) |
| group_2 = @project.group_for_path_in_group(@localized_de_foo_jpg, @group, false) |
| |
| group_1.uuid.should != group_2.uuid |
| @group.children.count.should == 2 |
| end |
| |
| it 'makes separate variant groups for different names' do |
| group_1 = @project.group_for_path_in_group(@localized_base_foo, @group, false) |
| group_2 = @project.group_for_path_in_group(@localized_de_bar, @group, false) |
| group_1.uuid.should != group_2.uuid |
| @group.children.count.should == 2 |
| end |
| |
| it 'makes separate variant groups for different directory levels' do |
| group_1 = @project.group_for_path_in_group(@localized_base_foo, @group, false) |
| group_2 = @project.group_for_path_in_group(@localized_different_foo, @group, false) |
| group_1.uuid.should != group_2.uuid |
| @group.children.count.should == 2 |
| end |
| |
| it 'raises if the given path is not absolute' do |
| should.raise ArgumentError do |
| @project.add_file_reference('relative/path/to/file.m', @group, true) |
| end.message.should.match /Paths must be absolute/ |
| should.raise ArgumentError do |
| @project.add_file_reference('relative/path/to/file.m', @group, false) |
| end.message.should.match /Paths must be absolute/ |
| end |
| end |
| |
| #----------------------------------------# |
| |
| describe '#reference_for_path' do |
| before do |
| @project.add_pod_group('BananaLib', config.sandbox.pod_dir('BananaLib'), false) |
| @file = config.sandbox.pod_dir('BananaLib') + 'file.m' |
| @group = @project.group_for_spec('BananaLib') |
| Pathname.any_instance.stubs(:realpath).returns(@file) |
| @project.add_file_reference(@file, @group) |
| end |
| |
| it 'returns the reference for the given path' do |
| ref = @project.reference_for_path(@file) |
| ref.hierarchy_path.should == '/Pods/BananaLib/file.m' |
| end |
| |
| it 'returns nil if no reference for the given path is available' do |
| another_file = config.sandbox.pod_dir('BananaLib') + 'another_file.m' |
| ref = @project.reference_for_path(another_file) |
| ref.should.be.nil |
| end |
| |
| it 'raises if the given path is not absolute' do |
| should.raise ArgumentError do |
| @project.reference_for_path('relative/path/to/file.m') |
| end.message.should.match /Paths must be absolute/ |
| end |
| end |
| |
| #----------------------------------------# |
| |
| it 'adds the Podfile configured as a Ruby file' do |
| @project.add_podfile(config.sandbox.root + '../Podfile') |
| f = @project['Podfile'] |
| f.source_tree.should == 'SOURCE_ROOT' |
| f.xc_language_specification_identifier.should == 'xcode.lang.ruby' |
| f.explicit_file_type.should == 'text.script.ruby' |
| f.path.should == '../Podfile' |
| end |
| |
| #----------------------------------------# |
| |
| describe '#add_build_configuration' do |
| it 'adds a preprocessor definition for build configurations' do |
| configuration = @project.add_build_configuration('Release', :release) |
| settings = configuration.build_settings |
| settings['GCC_PREPROCESSOR_DEFINITIONS'].should == ['POD_CONFIGURATION_RELEASE=1', '$(inherited)'] |
| end |
| |
| it "doesn't create invalid preprocessor definitions for configurations" do |
| configuration = @project.add_build_configuration('1 Release-Foo.bar', :release) |
| settings = configuration.build_settings |
| settings['GCC_PREPROCESSOR_DEFINITIONS'].should.include('POD_CONFIGURATION_1_RELEASE_FOO_BAR=1') |
| end |
| |
| it "doesn't duplicate values" do |
| original = @project.build_configuration_list['Debug'] |
| original_settings = original.build_settings |
| original_settings['GCC_PREPROCESSOR_DEFINITIONS'].should == |
| ['POD_CONFIGURATION_DEBUG=1', 'DEBUG=1', '$(inherited)'] |
| |
| configuration = @project.add_build_configuration('Debug', :debug) |
| settings = configuration.build_settings |
| settings['GCC_PREPROCESSOR_DEFINITIONS'].should == |
| ['POD_CONFIGURATION_DEBUG=1', 'DEBUG=1', '$(inherited)'] |
| |
| configuration = @project.add_build_configuration('Debug-Based', :debug) |
| settings = configuration.build_settings |
| settings['GCC_PREPROCESSOR_DEFINITIONS'].should == |
| ['POD_CONFIGURATION_DEBUG_BASED=1', 'DEBUG=1', '$(inherited)'] |
| end |
| |
| it 'normalizes the name of the configuration' do |
| configuration = @project.add_build_configuration( |
| 'My Awesome Configuration', :release) |
| settings = configuration.build_settings |
| settings['GCC_PREPROCESSOR_DEFINITIONS'].should == |
| ['POD_CONFIGURATION_MY_AWESOME_CONFIGURATION=1', '$(inherited)'] |
| end |
| |
| it 'transforms camel-cased configuration names to snake case' do |
| configuration = @project.add_build_configuration( |
| 'MyAwesomeConfiguration', :release) |
| settings = configuration.build_settings |
| settings['GCC_PREPROCESSOR_DEFINITIONS'].should == |
| ['POD_CONFIGURATION_MY_AWESOME_CONFIGURATION=1', '$(inherited)'] |
| end |
| |
| it 'adds DEBUG for configurations based upon :debug' do |
| configuration = @project.add_build_configuration( |
| 'Config', :debug) |
| settings = configuration.build_settings |
| settings['GCC_PREPROCESSOR_DEFINITIONS'].should == |
| ['POD_CONFIGURATION_CONFIG=1', 'DEBUG=1', '$(inherited)'] |
| end |
| end |
| end |
| |
| #-------------------------------------------------------------------------# |
| end |
| end |