blob: ab4351f81adf38da38775c8d9f06aaaeb9dd0c94 [file] [log] [blame]
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