# Copyright 2012 Google Inc. All Rights Reserved.

"""Tests for the tabulator module."""

__author__ = "asharif@google.com (Ahmad Sharif)"

# System modules
import unittest

# Local modules
import tabulator


class TabulatorTest(unittest.TestCase):
  def testResult(self):
    table = ["k1", ["1", "3"], ["55"]]
    result = tabulator.Result()
    cell = tabulator.Cell()
    result.Compute(cell, table[2], table[1])
    expected = " ".join([str(float(v)) for v in table[2]])
    self.assertTrue(cell.value == expected)

    result = tabulator.AmeanResult()
    cell = tabulator.Cell()
    result.Compute(cell, table[2], table[1])
    self.assertTrue(cell.value == float(table[2][0]))

  def testStringMean(self):
    smr = tabulator.StringMeanResult()
    cell = tabulator.Cell()
    value = "PASS"
    values = [value for _ in range(3)]
    smr.Compute(cell, values, None)
    self.assertTrue(cell.value == value)
    values.append("FAIL")
    smr.Compute(cell, values, None)
    self.assertTrue(cell.value == "?")

  def testStorageFormat(self):
    sf = tabulator.StorageFormat()
    cell = tabulator.Cell()
    base = 1024.0
    cell.value = base
    sf.Compute(cell)
    self.assertTrue(cell.string_value == "1.0K")
    cell.value = base**2
    sf.Compute(cell)
    self.assertTrue(cell.string_value == "1.0M")
    cell.value = base**3
    sf.Compute(cell)
    self.assertTrue(cell.string_value == "1.0G")

  def testLerp(self):
    c1 = tabulator.Color(0, 0, 0, 0)
    c2 = tabulator.Color(255, 0, 0, 0)
    c3 = tabulator.Color.Lerp(0.5, c1, c2)
    self.assertTrue(c3.r == 127.5)
    self.assertTrue(c3.g == 0)
    self.assertTrue(c3.b == 0)
    self.assertTrue(c3.a == 0)
    c3.Round()
    self.assertTrue(c3.r == 127)

  def testGmean(self):
    a = [1.0e+308] * 3
    b = tabulator.Result()._GetGmean(a)
    self.assertTrue(b >= 0.99e+308 and b <= 1.01e+308)

  def testTableGenerator(self):
    runs = [[{"k1": "10", "k2": "12"},
             {"k1": "13", "k2": "14", "k3": "15"}],
            [{"k1": "50", "k2": "51", "k3": "52", "k4": "53"}]]
    labels = ["vanilla", "modified"]
    tg = tabulator.TableGenerator(runs, labels)
    table = tg.GetTable()
    header = table.pop(0)

    self.assertTrue(header == ["keys", "vanilla", "modified"])
    row = table.pop(0)
    self.assertTrue(row == ["k1", ["10", "13"], ["50"]])
    row = table.pop(0)
    self.assertTrue(row == ["k2", ["12", "14"], ["51"]])
    row = table.pop(0)
    self.assertTrue(row == ["k3", [None, "15"], ["52"]])
    row = table.pop(0)
    self.assertTrue(row == ["k4", [None, None], ["53"]])

    table = tg.GetTable()
    columns = [
        tabulator.Column(tabulator.AmeanResult(),
                         tabulator.Format()),
        tabulator.Column(tabulator.AmeanRatioResult(),
                         tabulator.PercentFormat()),
        ]
    tf = tabulator.TableFormatter(table, columns)
    table = tf.GetCellTable()
    self.assertTrue(table)

  def testColspan(self):
    simple_table = [
        ["binary", "b1", "b2", "b3"],
        ["size", 100, 105, 108],
        ["rodata", 100, 80, 70],
        ["data", 100, 100, 100],
        ["debug", 100, 140, 60],
        ]
    columns = [
        tabulator.Column(tabulator.AmeanResult(),
                         tabulator.Format()),
        tabulator.Column(tabulator.MinResult(),
                         tabulator.Format()),
        tabulator.Column(tabulator.AmeanRatioResult(),
                         tabulator.PercentFormat()),
        tabulator.Column(tabulator.AmeanRatioResult(),
                         tabulator.ColorBoxFormat()),
        ]
    our_table = [simple_table[0]]
    for row in simple_table[1:]:
      our_row = [row[0]]
      for v in row[1:]:
        our_row.append([v])
      our_table.append(our_row)

    tf = tabulator.TableFormatter(our_table, columns)
    cell_table = tf.GetCellTable()
    self.assertTrue(cell_table[0][0].colspan == 1)
    self.assertTrue(cell_table[0][1].colspan == 2)
    self.assertTrue(cell_table[0][2].colspan == 4)
    self.assertTrue(cell_table[0][3].colspan == 4)
    for row in cell_table[1:]:
      for cell in row:
        self.assertTrue(cell.colspan == 1)

if __name__ == "__main__":
  unittest.main()
