# Copyright (C) 2019 Apple Inc. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#
# 1.  Redistributions of source code must retain the above copyright
#     notice, this list of conditions and the following disclaimer.
# 2.  Redistributions in binary form must reproduce the above copyright
#     notice, this list of conditions and the following disclaimer in the
#     documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
# This is for writing a bit complex tests to drive in JSC shell (e.g. including multiple files with some special options).

- path: complex/generator-regeneration.js
  cmd: runComplexTest [], ["generator-regeneration-after.js"], nil, "--useDollarVM=1"

- path: complex/tagged-template-regeneration.js
  cmd: runComplexTest [], ["tagged-template-regeneration-after.js"], nil, "--useDollarVM=1"

- path: complex/timezone-format-de.js
  cmd: runComplexTest [], [], "TZ=Europe/Berlin", "--useDollarVM=1"

- path: complex/timezone-format-en.js
  cmd: runComplexTest [], [], "TZ=America/New_York", "--useDollarVM=1"

- path: complex/timezone-offset-apia.js
  cmd: runComplexTest [], [], "TZ=Pacific/Apia", "--useDollarVM=1"

- path: complex/timezone-offset-before-america-los-angeles-is-defined.js
  cmd: runComplexTest [], [], "TZ=America/Los_Angeles", "--useDollarVM=1"

- path: complex/timezone-offset-and-dst-in-warsaw.js
  cmd: runComplexTest [], [], "TZ=Europe/Warsaw", "--useDollarVM=1"

- path: complex/timezone-range-cache-with-dst.js
  cmd: runComplexTest [], [], "TZ=America/Los_Angeles", "--useDollarVM=1"

- path: complex/date-parse-milliseconds.js
  cmd: runComplexTest [], [], "TZ=America/Los_Angeles", "--useDollarVM=1"

- path: complex/intl-timezone-check.js
  cmd: runComplexTest [], [], "TZ=America/Los_Angeles", "--useDollarVM=1"

- path: complex/temporal-now-timezone-check.js
  cmd: runComplexTest [], [], "TZ=America/Los_Angeles", "--useDollarVM=1", "--useTemporal=1"

- path: complex/temporal-now-timezone-with-broken-tz.js
  cmd: |
      if ($hostOS == "windows")
          skip
      else
          runComplexTest [], [], "TZ=UNDEFINED", "--useDollarVM=1", "--useTemporal=1"
      end

- path: complex/intl-default-timezone-backward-link.js
  cmd: |
      if ($hostOS == "windows" || $hostOS == "linux")
          skip
      else
          runComplexTest [], [], "TZ=Asia/Calcutta", "--useDollarVM=1", "--useTemporal=1"
      end

- path: complex/intl-default-timezone-utc-alias.js
  cmd: |
      if ($hostOS == "windows")
          skip
      else
          runComplexTest [], [], "TZ=Etc/UTC", "--useDollarVM=1", "--useTemporal=1"
      end

- path: complex/intl-default-timezone-three-letter-alias.js
  cmd: |
      if ($hostOS == "windows")
          skip
      else
          runComplexTest [], [], "TZ=ACT", "--useDollarVM=1", "--useTemporal=1"
      end

- path: complex/intl-default-timezone-etc-gmt-offset.js
  cmd: |
      if ($hostOS == "windows")
          skip
      else
          runComplexTest [], [], "TZ=Etc/GMT+5", "--useDollarVM=1", "--useTemporal=1"
      end

- path: complex/intl-default-timezone-region-alias.js
  cmd: |
      if ($hostOS == "windows")
          skip
      else
          runComplexTest [], [], "TZ=US/Eastern", "--useDollarVM=1", "--useTemporal=1"
      end

- path: complex/intl-default-timezone-etc-unknown.js
  cmd: |
      if ($hostOS == "windows")
          skip
      else
          runComplexTest [], [], "TZ=Etc/Unknown", "--useDollarVM=1", "--useTemporal=1"
      end

- path: complex/for-in-clobberize.js
  cmd: runComplexTest [], [], nil, "--destroy-vm"

- path: complex/intl-date-time-format-date-parse.js
  cmd: runComplexTest [], [], "TZ=America/New_York"

- path: complex/date-parse-with-narrow-no-break-space.js
  cmd: runComplexTest [], [], "TZ=America/Los_Angeles"
