require File.expand_path('../../../../spec_helper', __FILE__)

module Pod
  describe Generator::PrivatePodXCConfig do

    describe "in general" do
      before do
        @spec = fixture_spec('banana-lib/BananaLib.podspec')
        @consumer = @spec.consumer(:ios)
        target_definition = Podfile::TargetDefinition.new('Pods', nil)
        @pod_target = PodTarget.new([@spec], target_definition, config.sandbox)
        @pod_target.stubs(:platform).returns(:ios)
        public_xcconfig = Xcodeproj::Config.new({"OTHER_LDFLAGS"=>"-framework SystemConfiguration"})
        @generator = Generator::PrivatePodXCConfig.new(@pod_target, public_xcconfig)
      end

      it "returns the sandbox" do
        @generator.sandbox.class.should == Sandbox
      end

      before do
        @podfile = Podfile.new
        @pod_target.target_definition.stubs(:podfile).returns(@podfile)
        @xcconfig = @generator.generate
      end

      it "generates the xcconfig" do
        @xcconfig.class.should == Xcodeproj::Config
      end

      it "configures the project to load all members that implement Objective-c classes or categories from the static library" do
        @xcconfig.to_hash['OTHER_LDFLAGS'].should.include '-ObjC'
      end

      it 'does not add the -fobjc-arc to OTHER_LDFLAGS by default as Xcode 4.3.2 does not support it' do
        @consumer.stubs(:requires_arc?).returns(true)
        @xcconfig.to_hash['OTHER_LDFLAGS'].should.not.include("-fobjc-arc")
      end

      it 'adds the -fobjc-arc to OTHER_LDFLAGS if any pods require arc and the podfile explicitly requires it' do
        @podfile.stubs(:set_arc_compatibility_flag?).returns(true)
        @consumer.stubs(:requires_arc?).returns(true)
        @xcconfig = @generator.generate
        @xcconfig.to_hash['OTHER_LDFLAGS'].split(" ").should.include("-fobjc-arc")
      end

      it "sets the PODS_ROOT build variable" do
        @xcconfig.to_hash['PODS_ROOT'].should.not == nil
      end

      it 'adds the library build headers and public headers search paths to the xcconfig, with quotes' do
        private_headers = "\"#{@pod_target.build_headers.search_paths.join('" "')}\""
        public_headers = "\"#{config.sandbox.public_headers.search_paths.join('" "')}\""
        @xcconfig.to_hash['HEADER_SEARCH_PATHS'].should.include private_headers
        @xcconfig.to_hash['HEADER_SEARCH_PATHS'].should.include public_headers
      end

      it 'adds the COCOAPODS macro definition' do
        @xcconfig.to_hash['GCC_PREPROCESSOR_DEFINITIONS'].should.include 'COCOAPODS=1'
      end

      it 'adds the pod namespaced configuration items' do
        @xcconfig.to_hash['OTHER_LDFLAGS'].should.include("${#{@pod_target.xcconfig_prefix}OTHER_LDFLAGS}")
      end

      it 'sets the relative path of the pods root for spec libraries to ${SRCROOT}' do
        @xcconfig.to_hash['PODS_ROOT'].should == '${SRCROOT}'
      end

      it "saves the xcconfig" do
        path = temporary_directory + 'sample.xcconfig'
        @generator.save_as(path)
        generated = Xcodeproj::Config.new(path)
        generated.class.should == Xcodeproj::Config
      end

    end

    #-------------------------------------------------------------------------#

    describe "Private Helpers" do

      before do
        @sut = Generator::PrivatePodXCConfig.new(stub(), stub())
      end

      #----------------------------------------#

      describe "#add_xcconfig_namespaced_keys" do

        it "appends to the values of the keys of the destination the value of the keys of the source" do
          source_config = { 'HEADER_SEARCH_PATHS' => '${PODS_ROOT}/MyPod' }
          destination_config = { 'HEADER_SEARCH_PATHS' => '${PODS_ROOT}/BuildHeaders' }
          result = @sut.send(:add_xcconfig_namespaced_keys, source_config, destination_config, 'PREFIX_')
          result.should == { 'HEADER_SEARCH_PATHS' => '${PODS_ROOT}/BuildHeaders ${PREFIX_HEADER_SEARCH_PATHS}' }
        end

        it "uses the key of the destination xcconfig if not present in the source" do
          source_config = { }
          destination_config = { 'HEADER_SEARCH_PATHS' => '${PODS_ROOT}/BuildHeaders' }
          result = @sut.send(:add_xcconfig_namespaced_keys, source_config, destination_config, 'PREFIX_')
          result.should == { 'HEADER_SEARCH_PATHS' => '${PODS_ROOT}/BuildHeaders' }
        end

        it "preserves any value of the source not present in the destination" do
          source_config = { 'EXCLUDED_SOURCE_FILE_NAMES' => 'ZBarReaderViewImpl_Simulator.m' }
          destination_config = { }
          result = @sut.send(:add_xcconfig_namespaced_keys, source_config, destination_config, 'PREFIX_')
          result.should == { 'EXCLUDED_SOURCE_FILE_NAMES' => '${PREFIX_EXCLUDED_SOURCE_FILE_NAMES}' }
        end

      end

      #----------------------------------------#

      describe "#conditional_less_key" do

        it "returns the key without the xcconfig conditional syntax if present" do
          result = @sut.send(:conditional_less_key, 'EXCLUDED_SOURCE_FILE_NAMES[sdk=iphoneos*][arch=*]')
          result.should == 'EXCLUDED_SOURCE_FILE_NAMES'
        end

        it "returns the key as it is if no conditional syntax is present" do
          result = @sut.send(:conditional_less_key, 'EXCLUDED_SOURCE_FILE_NAMES')
          result.should == 'EXCLUDED_SOURCE_FILE_NAMES'
        end

      end

    end

    #-------------------------------------------------------------------------#

  end
end
