# Javascript Node CircleCI 2.0 configuration file
#
# Check https://circleci.com/docs/2.0/language-javascript/ for more details
#
version: 2

references:
  js_deps_cache_key: &js_deps_cache_key
    v1-dependency-js-deps-{{ checksum "package.json" }}
  js_deps_backup_cache_key: &js_deps_backup_cache_key
    v1-dependency-js-deps
  node_latest: &node_latest
    circleci/node:lts

restore_cache: &restore_cache
  restore_cache:
    keys:
      - *js_deps_cache_key
      - *js_deps_backup_cache_key

save_cache: &save_cache
  save_cache:
    paths:
      - node_modules
    key: *js_deps_cache_key

execution_steps: &execution_steps
  steps:
    - checkout
    - *restore_cache
    - run: npm install
    - *save_cache
    - run:
        name: fetch engines from esvu
        command: |
          ./node_modules/.bin/esvu install $hostName
    - run: hostPath=$HOME/.esvu/bin/$hostPath npm run ci

jobs:
  "Test262: verify tools; build & lint tests (Python 2)":
    docker:
      - image: circleci/python:2.7
    working_directory: ~/test262
    steps:
      - checkout
      - run:
          name: "Install requirements for generation tool"
          command: python -m pip install --user --requirement tools/generation/requirements.txt
      - run:
          name: "Install requirements for lint tool"
          command: python -m pip install --user --requirement tools/lint/requirements.txt
      - run:
          name: "Test the generation tool"
          command: ./tools/generation/test/run.py
      - run:
          name: "Test the lint tool"
          command: ./tools/lint/test/run.py
      - run:
          name: "Build tests; check for new changes"
          command: ./tools/scripts/ci_build.sh
      - run:
          name: "Lint tests"
          command: ./tools/scripts/ci_lint.sh
      # - run:
      #     name: "Run deploy"
      #     command: ./tools/scripts/deploy.sh
  "Test262: verify tools; build & lint tests (Python 3)":
    docker:
      - image: circleci/python:3.7.4
    working_directory: ~/test262
    steps:
      - checkout
      - run:
          name: "Install requirements for generation tool"
          command: python -m pip install --user --requirement tools/generation/requirements.txt
      - run:
          name: "Install requirements for lint tool"
          command: python -m pip install --user --requirement tools/lint/requirements.txt
      - run:
          name: "Test the generation tool"
          command: ./tools/generation/test/run.py
      - run:
          name: "Test the lint tool"
          command: ./tools/lint/test/run.py
      - run:
          name: "Build tests; check for new changes"
          command: ./tools/scripts/ci_build.sh
      - run:
          name: "Lint tests"
          command: ./tools/scripts/ci_lint.sh
  "V8: New or modified tests execution":
    docker:
      - image: *node_latest
      # Specify service dependencies here if necessary
      # CircleCI maintains a library of pre-built images
      # documented at https://circleci.com/docs/2.0/circleci-images/
    working_directory: ~/test262
    environment:
      hostType: d8
      hostPath: v8
      hostName: v8
    <<: [*execution_steps]
  "V8 --harmony: New or modified tests execution":
    docker:
      - image: *node_latest
    working_directory: ~/test262
    environment:
      hostType: d8
      hostPath: v8
      hostName: v8
      hostArgs: --harmony
    <<: [*execution_steps]
  "SpiderMonkey: New or modified tests execution":
    docker:
      - image: *node_latest
    working_directory: ~/test262
    environment:
      hostType: jsshell
      hostPath: spidermonkey
      hostName: spidermonkey
    <<: [*execution_steps]
  "ChakraCore: New or modified tests execution":
    docker:
      - image: *node_latest
    working_directory: ~/test262
    environment:
      hostType: ch
      hostPath: chakra
      hostName: chakra
    <<: [*execution_steps]
  "JSC: New or modified tests execution":
    docker:
      - image: *node_latest
    working_directory: ~/test262
    environment:
      LANG: C
      hostType: jsc
      hostPath: javascriptcore
      hostName: javascriptcore
    <<: [*execution_steps]
  "XS: New or modified tests execution":
    docker:
      - image: *node_latest
    working_directory: ~/test262
    environment:
      hostType: xs
      hostPath: xs
      hostName: xs
    <<: [*execution_steps]
  "engine262: New or modified tests execution":
    docker:
      - image: *node_latest
    working_directory: ~/test262
    environment:
      hostType: engine262
      hostPath: engine262
      hostName: engine262
      hostArgs: --features=all
    <<: [*execution_steps]
  "GraalJS: New or modified tests execution":
    docker:
      - image: *node_latest
    working_directory: ~/test262
    environment:
      hostType: graaljs
      hostPath: graaljs
      hostName: graaljs
    <<: [*execution_steps]
workflows:
  version: 2
  Tools:
    jobs:
      - "Test262: verify tools; build & lint tests (Python 2)"
      - "Test262: verify tools; build & lint tests (Python 3)"
  Tests execution:
    jobs:
      - "ChakraCore: New or modified tests execution"
      - "JSC: New or modified tests execution"
      - "SpiderMonkey: New or modified tests execution"
      - "V8: New or modified tests execution"
      - "V8 --harmony: New or modified tests execution"
      - "XS: New or modified tests execution"
      - "engine262: New or modified tests execution"
      - "GraalJS: New or modified tests execution"