name: "SDWebImage CI"

on:
  push:
    branches:
      - master
  pull_request:
    branches:
      - '*'

permissions:
  contents: read

jobs:
  Pods:
    name: Cocoapods Lint
    runs-on: macos-11
    env:
      DEVELOPER_DIR: /Applications/Xcode_13.2.1.app
    steps:
      - name: Checkout
        uses: actions/checkout@v3

      - name: Install Cocoapods
        run: gem install cocoapods --no-document --quiet
        
      - name: Install Xcpretty
        run: gem install xcpretty --no-document --quiet
        
      - name: Pod Update.
        run: pod repo update --silent
        
      - name: Pod Install.
        run: pod install

      - name: Run SDWebImage podspec lint
        run: |
          set -o pipefail
          pod lib lint SDWebImage.podspec --allow-warnings --skip-tests
          
  Demo:
    name: Run Demo
    runs-on: macos-11
    env:
      DEVELOPER_DIR: /Applications/Xcode_13.2.1.app
      WORKSPACE_NAME: SDWebImage.xcworkspace
      OSXSCHEME: SDWebImage OSX Demo
      iOSSCHEME: SDWebImage iOS Demo
      TVSCHEME: SDWebImage TV Demo
      WATCHSCHEME: SDWebImage Watch Demo
    strategy:
      matrix:
        iosDestination: ["name=iPhone 13 Pro"]
        tvOSDestination: ["name=Apple TV 4K"]
        watchOSDestination: ["platform=watchOS Simulator,name=Apple Watch Series 7 - 45mm"]
        macOSDestination: ["platform=macOS"]
        macCatalystDestination: ["platform=macOS,arch=x86_64,variant=Mac Catalyst"]
    steps:
      - name: Checkout
        uses: actions/checkout@v3

      - name: Install Cocoapods
        run: gem install cocoapods --no-document --quiet
        
      - name: Install Xcpretty
        run: gem install xcpretty --no-document --quiet
        
      - name: Pod Update
        run: pod repo update --silent
        
      - name: Pod Install
        run: pod install

      - name: Run demo for OSX
        run: |
          set -o pipefail
          xcodebuild build -workspace "${{ env.WORKSPACE_NAME }}" -scheme "${{ env.OSXSCHEME }}" -destination "${{ matrix.macOSDestination }}" -configuration Debug CODE_SIGNING_ALLOWED=NO | xcpretty -c
          
      - name: Run demo for iOS
        run: |
          set -o pipefail
          xcodebuild build -workspace "${{ env.WORKSPACE_NAME }}" -scheme "${{ env.iOSSCHEME }}" -destination "${{ matrix.iosDestination }}" -configuration Debug CODE_SIGNING_ALLOWED=NO | xcpretty -c
          
      - name: Run demo for TV
        run: |
          set -o pipefail
          xcodebuild build -workspace "${{ env.WORKSPACE_NAME }}" -scheme "${{ env.TVSCHEME }}" -destination "${{ matrix.tvOSDestination }}" -configuration Debug CODE_SIGNING_ALLOWED=NO | xcpretty -c
          
      - name: Run demo for Watch
        run: |
          set -o pipefail
          xcodebuild build -workspace "${{ env.WORKSPACE_NAME }}" -scheme "${{ env.WATCHSCHEME }}" -destination "${{ matrix.watchOSDestination }}" -configuration Debug CODE_SIGNING_ALLOWED=NO | xcpretty -c
          
  Test:
    name: Unit Test
    runs-on: macos-11
    env:
      DEVELOPER_DIR: /Applications/Xcode_13.2.1.app
      WORKSPACE_NAME: SDWebImage.xcworkspace
      CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
    strategy:
      matrix:
        iosDestination: ["platform=iOS Simulator,name=iPhone 13 Pro"]
        macOSDestination: ["platform=macOS,arch=x86_64"]
        tvOSDestination: ["platform=tvOS Simulator,name=Apple TV 4K"]
    steps:
      - name: Checkout
        uses: actions/checkout@v3

      - name: Install Cocoapods
        run: gem install cocoapods --no-document --quiet
        
      - name: Install Xcpretty
        run: gem install xcpretty --no-document --quiet
        
      - name: Pod Update
        run: pod repo update --silent
        
      - name: Pod Install
        run: pod install
        
      - name: Clean DerivedData
        run: |
          rm -rf ~/Library/Developer/Xcode/DerivedData/
          mkdir DerivedData
        
      - name: Test - ${{ matrix.iosDestination }}
        run: |
          set -o pipefail
          xcodebuild test -workspace "${{ env.WORKSPACE_NAME }}" -scheme "Tests iOS" -destination "${{ matrix.iosDestination }}" -configuration Debug CODE_SIGNING_ALLOWED=NO
          mv ~/Library/Developer/Xcode/DerivedData/ ./DerivedData/iOS
          
      - name: Test - ${{ matrix.macOSDestination }}
        run: |
          set -o pipefail
          xcodebuild test -workspace "${{ env.WORKSPACE_NAME }}" -scheme "Tests Mac" -destination "${{ matrix.macOSDestination }}" -configuration Debug CODE_SIGNING_ALLOWED=NO
          mv ~/Library/Developer/Xcode/DerivedData/ ./DerivedData/macOS
    
      - name: Test - ${{ matrix.tvOSDestination }}
        run: |
          set -o pipefail
          xcodebuild test -workspace "${{ env.WORKSPACE_NAME }}" -scheme "Tests TV" -destination "${{ matrix.tvOSDestination }}" -configuration Debug CODE_SIGNING_ALLOWED=NO
          mv ~/Library/Developer/Xcode/DerivedData/ ./DerivedData/tvOS
          
      - name: Code Coverage
        run: |
          set -o pipefail
          export PATH="/usr/local/opt/curl/bin:$PATH"
          curl --version
          bash <(curl -s https://codecov.io/bash) -v -D './DerivedData/macOS' -J '^SDWebImage$' -c -X gcov -F macos
          bash <(curl -s https://codecov.io/bash) -v -D './DerivedData/iOS' -J '^SDWebImage$' -c -X gcov -F ios
          bash <(curl -s https://codecov.io/bash) -v -D './DerivedData/tvOS' -J '^SDWebImage$' -c -X gcov -F tvos
          
  Build:
    name: Build Library
    runs-on: macos-11
    env:
      DEVELOPER_DIR: /Applications/Xcode_13.2.1.app
      PROJECT_NAME: SDWebImage.xcodeproj
      SCHEME_NAME: SDWebImage
    steps:
      - name: Checkout
        uses: actions/checkout@v3

      - name: Install Cocoapods
        run: gem install cocoapods --no-document --quiet
        
      - name: Install Xcpretty
        run: gem install xcpretty --no-document --quiet
        
      - name: Pod Update
        run: pod repo update --silent
        
      - name: Pod Install
        run: pod install

      - name: Build the SwiftPM
        run: |
          set -o pipefail
          swift build
          rm -rf ~/.build
          
      - name: Build as static library
        run: |
          set -o pipefail
          xcodebuild build -project "${{ env.PROJECT_NAME }}" -scheme "SDWebImage static" -sdk iphonesimulator PLATFORM_NAME=iphonesimulator -configuration Release | xcpretty -c
          rm -rf ~/Library/Developer/Xcode/DerivedData/
      - name: Build as dynamic frameworks
        run: |
          set -o pipefail
          xcodebuild build -project "${{ env.PROJECT_NAME }}" -scheme "${{ env.SCHEME_NAME }}" -sdk macosx -configuration Release | xcpretty -c
          xcodebuild build -project "${{ env.PROJECT_NAME }}" -scheme "${{ env.SCHEME_NAME }}" -sdk iphonesimulator PLATFORM_NAME=iphonesimulator -configuration Release | xcpretty -c
          xcodebuild build -project "${{ env.PROJECT_NAME }}" -scheme "${{ env.SCHEME_NAME }}" -sdk appletvsimulator -configuration Release | xcpretty -c
          xcodebuild build -project "${{ env.PROJECT_NAME }}" -scheme "${{ env.SCHEME_NAME }}" -sdk watchsimulator -configuration Release | xcpretty -c
          xcodebuild build -project "${{ env.PROJECT_NAME }}" -scheme "${{ env.SCHEME_NAME }}" -destination "platform=macOS,arch=x86_64,variant=Mac Catalyst" -configuration Release | xcpretty -c
          rm -rf ~/Library/Developer/Xcode/DerivedData/
