#
# Copyright (C) 2017 The Android Open Source Project
#
# 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.
#

import json


class GoogleBenchmarkJsonParser(object):
    """This class parses the JSON output of Google benchmark.

    Example
    {
      "context": {
        "date": "2017-05-16 11:57:21",
        "num_cpus": 4,
        "mhz_per_cpu": 19,
        "cpu_scaling_enabled": true,
        "library_build_type": "release"
      },
      "benchmarks": [
        {
          "name": "BM_sendVec_binder/4",
          "iterations": 27744,
          "real_time": 51485,
          "cpu_time": 23655,
          "time_unit": "ns"
        },
        ...
      ]
    }

    Attributes:
        _benchmarks: The "benchmarks" property of the JSON object.
    """

    _BENCHMARKS = "benchmarks"
    _NAME = "name"
    _ITERATIONS = "iterations"
    _REAL_TIME = "real_time"
    _CPU_TIME = "cpu_time"

    def __init__(self, json_string):
        """Converts the JSON string to internal data structure.

        Args:
            json_string: The output of Google benchmark in JSON format.
        """
        json_obj = json.loads(json_string)
        self._benchmarks = json_obj[self._BENCHMARKS]

    def GetArguments(self):
        """Returns the "name" properties with function names stripped.

        Returns:
            A list of strings.
        """
        args = []
        for bm in self._benchmarks:
            name = bm[self._NAME].split("/", 1)
            args.append(name[1].encode("utf-8") if len(name) >= 2 else "")
        return args

    def GetRealTime(self):
        """Returns the "real_time" properties.

        Returns:
            A list of integers.
        """
        return [int(float(x[self._REAL_TIME])) for x in self._benchmarks]

    def ToTable(self):
        """Returns the benchmarks in a table.

        Returns:
            A 2-dimensional list. The first row contains the column names. The
            following rows are the benchmarks.
        """
        table = [[self._NAME, self._REAL_TIME, self._CPU_TIME,
                  self._ITERATIONS]]
        for record in self._benchmarks:
            table.append([record[x] for x in table[0]])
        return table