# Copyright 2017 the V8 project authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

from ..local import statusfile
from ..outproc import base as outproc_base
from ..testproc.result import Result


# Only check the exit code of the predictable_wrapper in
# verify-predictable mode. Negative tests are not supported as they
# usually also don't print allocation hashes. There are two versions of
# negative tests: one specified by the test, the other specified through
# the status file (e.g. known bugs).


def get_outproc(test):
  output_proc = test.output_proc
  if output_proc.negative or statusfile.FAIL in test.expected_outcomes:
    # TODO(majeski): Skip these tests instead of having special outproc.
    return NeverUnexpectedOutputOutProc(output_proc)
  return OutProc(output_proc)


class OutProc(outproc_base.BaseOutProc):
  """Output processor wrapper for predictable mode. It has custom process and
  has_unexpected_output implementation, but for all other methods it simply
  calls wrapped output processor.
  """
  def __init__(self, _outproc):
    super(OutProc, self).__init__()
    self._outproc = _outproc

  def process(self, output):
    return Result(self.has_unexpected_output(output), output)

  def has_unexpected_output(self, output):
    return output.exit_code != 0

  def get_outcome(self, output):
    return self._outproc.get_outcome(output)

  @property
  def negative(self):
    return self._outproc.negative

  @property
  def expected_outcomes(self):
    return self._outproc.expected_outcomes


class NeverUnexpectedOutputOutProc(OutProc):
  """Output processor wrapper for tests that we will return False for
  has_unexpected_output in the predictable mode.
  """
  def has_unexpected_output(self, output):
    return False
