# Copyright 2011 the V8 project authors. All rights reserved.
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
#     * Redistributions of source code must retain the above copyright
#       notice, this list of conditions and the following disclaimer.
#     * 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.
#     * Neither the name of Google Inc. nor the names of its
#       contributors may be used to endorse or promote products derived
#       from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
# OWNER OR 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.

[
[ALWAYS, {
  ############################### BUGS ###################################

  '15.5.4.9_CE': [['no_i18n', SKIP]],

  # BUG(v8:3455)
  '11.2.3_b': [FAIL],
  '12.2.3_b': [FAIL],

  ###################### NEEDS INVESTIGATION #######################

  # Possibly same cause as S8.5_A2.1, below: floating-point tests.
  'S15.8.2.16_A7': [PASS, FAIL_OK],
  'S15.8.2.18_A7': [PASS, FAIL_OK],
  'S15.8.2.7_A7': [PASS, FAIL_OK],

  # This is an incompatibility between ES5 and V8 on enumerating
  # shadowed elements in a for..in loop.
  # https://code.google.com/p/v8/issues/detail?id=705
  '12.6.4-2': [PASS, FAIL_OK],

  ###################### MISSING ES6 FEATURES #######################

  # Array.from
  'S22.1.2.1_T1': [FAIL],
  'S22.1.2.1_T2': [FAIL],

  # Direct proxies
  'Array.prototype.find_callable-predicate': [FAIL],

  ######################## OBSOLETED BY ES6 ###########################

  # ES6 allows duplicate properties
  # TODO(arv): Reactivate when check removal has relanded.
  # '11.1.5-4-4-a-1-s': [FAIL],
  # '11.1.5_4-4-b-1': [FAIL],
  # '11.1.5_4-4-b-2': [FAIL],
  # '11.1.5_4-4-c-1': [FAIL],
  # '11.1.5_4-4-c-2': [FAIL],
  # '11.1.5_4-4-d-1': [FAIL],
  # '11.1.5_4-4-d-2': [FAIL],
  # '11.1.5_4-4-d-3': [FAIL],
  # '11.1.5_4-4-d-4': [FAIL],

  # ES6 allows block-local functions.
  'Sbp_A1_T1': [FAIL],
  'Sbp_A2_T1': [FAIL],
  'Sbp_A2_T2': [FAIL],
  'Sbp_A3_T1': [FAIL],
  'Sbp_A3_T2': [FAIL],
  'Sbp_A4_T1': [FAIL],
  'Sbp_A4_T2': [FAIL],
  'Sbp_A5_T1': [PASS], # Test is broken (strict reference to unbound variable)
  'Sbp_A5_T2': [FAIL],

  ######################## NEEDS INVESTIGATION ###########################

  # These test failures are specific to the intl402 suite and need investigation
  # to be either marked as bugs with issues filed for them or as deliberate
  # incompatibilities if the test cases turn out to be broken or ambiguous.
  '6.2.3': [FAIL],
  '9.2.1_2': [FAIL],
  '9.2.6_2': [FAIL],
  '10.1.1_a': [FAIL],
  '10.1.1_19_c': [PASS, FAIL, NO_VARIANTS],
  '10.1.2.1_4': [FAIL],
  '10.2.3_b': [PASS, FAIL],
  '10.3_a': [FAIL],
  '11.1.1_17': [PASS, FAIL],
  '11.1.1_19': [PASS, FAIL],
  '11.1.1_20_c': [FAIL],
  '11.1.1_a': [FAIL],
  '11.1.2.1_4': [FAIL],
  '11.3.2_FN_2': [PASS, FAIL],
  '11.3.2_TRF': [PASS, FAIL],
  '11.3_a': [FAIL],
  '12.1.1_a': [FAIL],
  '12.1.2.1_4': [FAIL],
  '12.3.2_FDT_7_a_iv': [FAIL],
  '12.3.3': [FAIL],
  '12.3_a': [FAIL],
  '15.5.4.9_3': [PASS, FAIL],

  ##################### DELIBERATE INCOMPATIBILITIES #####################

  'S15.8.2.8_A6': [PASS, FAIL_OK],  # Math.exp (less precise with --fast-math)

  # Linux for ia32 (and therefore simulators) default to extended 80 bit
  # floating point formats, so these tests checking 64-bit FP precision fail.
  # The other platforms/arch's pass these tests.
  # We follow the other major JS engines by keeping this default.
  'S8.5_A2.1': [PASS, FAIL_OK],
  'S8.5_A2.2': [PASS, FAIL_OK],

  ############################ INVALID TESTS #############################

  # The reference value calculated by Test262 is incorrect if you run these
  # tests in PST/PDT between first Sunday in March and first Sunday in April.
  # The DST switch was moved in 2007 whereas Test262 bases the reference value
  # on 2000. Test262 Bug: https://bugs.ecmascript.org/show_bug.cgi?id=293
  'S15.9.3.1_A5_T1': [PASS, FAIL_OK],
  'S15.9.3.1_A5_T2': [PASS, FAIL_OK],
  'S15.9.3.1_A5_T3': [PASS, FAIL_OK],
  'S15.9.3.1_A5_T4': [PASS, FAIL_OK],
  'S15.9.3.1_A5_T5': [PASS, FAIL_OK],
  'S15.9.3.1_A5_T6': [PASS, FAIL_OK],

  # Test makes unjustified assumptions about the number of calls to SortCompare.
  # Test262 Bug: https://bugs.ecmascript.org/show_bug.cgi?id=596
  'bug_596_1': [PASS, FAIL_OK],

  ############################ SKIPPED TESTS #############################

  # These tests take a looong time to run in debug mode.
  'S15.1.3.1_A2.5_T1': [PASS, ['mode == debug', SKIP]],
  'S15.1.3.2_A2.5_T1': [PASS, ['mode == debug', SKIP]],
}],  # ALWAYS

['system == macos', {
  '11.3.2_TRP': [FAIL],
  '9.2.5_11_g_ii_2': [FAIL],
}],  # system == macos

['arch == arm or arch == mipsel or arch == mips or arch == arm64 or arch == mips64el', {

  # TODO(mstarzinger): Causes stack overflow on simulators due to eager
  # compilation of parenthesized function literals. Needs investigation.
  'S13.2.1_A1_T1': [SKIP],

  # BUG(3251225): Tests that timeout with --nocrankshaft.
  'S15.1.3.1_A2.4_T1': [SKIP],
  'S15.1.3.1_A2.5_T1': [SKIP],
  'S15.1.3.2_A2.4_T1': [SKIP],
  'S15.1.3.2_A2.5_T1': [SKIP],
  'S15.1.3.3_A2.3_T1': [SKIP],
  'S15.1.3.4_A2.3_T1': [SKIP],
}],  # 'arch == arm or arch == mipsel or arch == mips or arch == arm64'
]
