# Copyright 2017 Google Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# This module holds util functions that are used in more than one test module.

from mobly import records


def validate_test_result(result):
  """Validate basic properties of a test result.

  The records in each bucket of the test result should have the corresponding
  result enum.

  Args:
    result: The `records.TestResult` object to validate.
  """
  buckets = [
    (result.passed, records.TestResultEnums.TEST_RESULT_PASS),
    (result.failed, records.TestResultEnums.TEST_RESULT_FAIL),
    (result.error, records.TestResultEnums.TEST_RESULT_ERROR),
    (result.skipped, records.TestResultEnums.TEST_RESULT_SKIP),
  ]
  for bucket_list, expected_enum in buckets:
    for record in bucket_list:
      if record.result != expected_enum:
        raise AssertionError('Expected result %s, got %s.' %
                   (expected_enum, record.result))
