# 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 ###################################

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

  # Unicode canonicalization is not available with i18n turned off.
  '15.5.4.9_CE': [['no_i18n', SKIP]],

  ###################### 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.fill (currently requires --harmony-arrays)
  'S22.1.3.6_T1': [FAIL],

  # Array.find (currently requires --harmony-arrays)
  'S22.1.2.3_T1': [FAIL],
  'S22.1.2.3_T2': [FAIL],
  'Array.prototype.find_empty-array-undefined': [FAIL],
  'Array.prototype.find_length-property': [FAIL],
  'Array.prototype.find_modify-after-start': [FAIL],
  'Array.prototype.find_non-returning-predicate': [FAIL],
  'Array.prototype.find_predicate-arguments': [FAIL],
  'Array.prototype.find_push-after-start': [FAIL],
  'Array.prototype.find_remove-after-start': [FAIL],
  'Array.prototype.find_return-found-value': [FAIL],
  'Array.prototype.find_skip-empty': [FAIL],
  'Array.prototype.find_this-defined': [FAIL],
  'Array.prototype.find_this-is-object': [FAIL],
  'Array.prototype.find_this-undefined': [FAIL],

  # 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 does ToObject for Object.prototype.getOwnPropertyNames
  '15.2.3.4-1': [FAIL],
  '15.2.3.4-1-4': [FAIL],
  '15.2.3.4-1-5': [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],

  # Tests do not return boolean.
  '15.2.3.14-1-1': [PASS, FAIL_OK],
  '15.2.3.14-1-2': [PASS, FAIL_OK],
  '15.2.3.14-1-3': [PASS, FAIL_OK],

  # String.prototype.contains renamed to 'S.p.includes'
  'String.prototype.contains_FailBadLocation' : [FAIL_OK],
  'String.prototype.contains_FailLocation' : [FAIL_OK],
  'String.prototype.contains_FailMissingLetter' : [FAIL_OK],
  'String.prototype.contains_lengthProp' : [FAIL_OK],
  'String.prototype.contains_Success' : [FAIL_OK],
  'String.prototype.contains_SuccessNoLocation' : [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'
]
