xref: /aosp_15_r20/external/toolchain-utils/cros_utils/tabulator_test.py (revision 760c253c1ed00ce9abd48f8546f08516e57485fe)
1*760c253cSXin Li#!/usr/bin/env python3
2*760c253cSXin Li# -*- coding: utf-8 -*-
3*760c253cSXin Li# Copyright 2012 The ChromiumOS Authors
4*760c253cSXin Li# Use of this source code is governed by a BSD-style license that can be
5*760c253cSXin Li# found in the LICENSE file.
6*760c253cSXin Li
7*760c253cSXin Li"""Tests for the tabulator module."""
8*760c253cSXin Li
9*760c253cSXin Li
10*760c253cSXin Li__author__ = '[email protected] (Ahmad Sharif)'
11*760c253cSXin Li
12*760c253cSXin Li# System modules
13*760c253cSXin Liimport unittest
14*760c253cSXin Li
15*760c253cSXin Li# Local modules
16*760c253cSXin Lifrom cros_utils import tabulator
17*760c253cSXin Li
18*760c253cSXin Li
19*760c253cSXin Liclass TabulatorTest(unittest.TestCase):
20*760c253cSXin Li  """Tests for the Tabulator class."""
21*760c253cSXin Li
22*760c253cSXin Li  def testResult(self):
23*760c253cSXin Li    table = ['k1', ['1', '3'], ['55']]
24*760c253cSXin Li    result = tabulator.Result()
25*760c253cSXin Li    cell = tabulator.Cell()
26*760c253cSXin Li    result.Compute(cell, table[2], table[1])
27*760c253cSXin Li    expected = ' '.join([str(float(v)) for v in table[2]])
28*760c253cSXin Li    self.assertTrue(cell.value == expected)
29*760c253cSXin Li
30*760c253cSXin Li    result = tabulator.AmeanResult()
31*760c253cSXin Li    cell = tabulator.Cell()
32*760c253cSXin Li    result.Compute(cell, table[2], table[1])
33*760c253cSXin Li    self.assertTrue(cell.value == float(table[2][0]))
34*760c253cSXin Li
35*760c253cSXin Li  def testStdResult(self):
36*760c253cSXin Li    table = ['k1', [], ['1', '2']]
37*760c253cSXin Li    result = tabulator.StdResult()
38*760c253cSXin Li    cell = tabulator.Cell()
39*760c253cSXin Li    result.Compute(cell, table[2], table[1])
40*760c253cSXin Li    self.assertTrue(cell.value == 0.5)
41*760c253cSXin Li
42*760c253cSXin Li  def testStdResultOfSampleSize1(self):
43*760c253cSXin Li    table = ['k1', [], ['1']]
44*760c253cSXin Li    result = tabulator.StdResult()
45*760c253cSXin Li    cell = tabulator.Cell()
46*760c253cSXin Li    result.Compute(cell, table[2], table[1])
47*760c253cSXin Li    self.assertTrue(cell.value == 0.0)
48*760c253cSXin Li
49*760c253cSXin Li  def testStringMean(self):
50*760c253cSXin Li    smr = tabulator.StringMeanResult()
51*760c253cSXin Li    cell = tabulator.Cell()
52*760c253cSXin Li    value = 'PASS'
53*760c253cSXin Li    values = [value for _ in range(3)]
54*760c253cSXin Li    smr.Compute(cell, values, None)
55*760c253cSXin Li    self.assertTrue(cell.value == value)
56*760c253cSXin Li    values.append('FAIL')
57*760c253cSXin Li    smr.Compute(cell, values, None)
58*760c253cSXin Li    self.assertTrue(cell.value == '?')
59*760c253cSXin Li
60*760c253cSXin Li  def testStorageFormat(self):
61*760c253cSXin Li    sf = tabulator.StorageFormat()
62*760c253cSXin Li    cell = tabulator.Cell()
63*760c253cSXin Li    base = 1024.0
64*760c253cSXin Li    cell.value = base
65*760c253cSXin Li    sf.Compute(cell)
66*760c253cSXin Li    self.assertTrue(cell.string_value == '1.0K')
67*760c253cSXin Li    cell.value = base**2
68*760c253cSXin Li    sf.Compute(cell)
69*760c253cSXin Li    self.assertTrue(cell.string_value == '1.0M')
70*760c253cSXin Li    cell.value = base**3
71*760c253cSXin Li    sf.Compute(cell)
72*760c253cSXin Li    self.assertTrue(cell.string_value == '1.0G')
73*760c253cSXin Li
74*760c253cSXin Li  def testLerp(self):
75*760c253cSXin Li    c1 = tabulator.Color(0, 0, 0, 0)
76*760c253cSXin Li    c2 = tabulator.Color(255, 0, 0, 0)
77*760c253cSXin Li    c3 = tabulator.Color.Lerp(0.5, c1, c2)
78*760c253cSXin Li    self.assertTrue(c3.r == 127.5)
79*760c253cSXin Li    self.assertTrue(c3.g == 0)
80*760c253cSXin Li    self.assertTrue(c3.b == 0)
81*760c253cSXin Li    self.assertTrue(c3.a == 0)
82*760c253cSXin Li    c3.Round()
83*760c253cSXin Li    self.assertTrue(c3.r == 127)
84*760c253cSXin Li
85*760c253cSXin Li  def testGmean(self):
86*760c253cSXin Li    a = [1.0e+308] * 3
87*760c253cSXin Li    # pylint: disable=protected-access
88*760c253cSXin Li    b = tabulator.Result()._GetGmean(a)
89*760c253cSXin Li    self.assertTrue(0.99e+308 <= b <= 1.01e+308)
90*760c253cSXin Li
91*760c253cSXin Li  def testIgnoreMinMax(self):
92*760c253cSXin Li    amr = tabulator.AmeanResult(ignore_min_max=True)
93*760c253cSXin Li    cell = tabulator.Cell()
94*760c253cSXin Li    values = [1, 2]
95*760c253cSXin Li    amr.Compute(cell, values, None)
96*760c253cSXin Li    self.assertTrue(cell.value == 1.5)
97*760c253cSXin Li    values = [1, 2, 8]
98*760c253cSXin Li    amr.Compute(cell, values, None)
99*760c253cSXin Li    self.assertTrue(cell.value == 2)
100*760c253cSXin Li
101*760c253cSXin Li  def testTableGenerator(self):
102*760c253cSXin Li    # yapf: disable
103*760c253cSXin Li    runs = [[{'k1': '10', 'k2': '12'},
104*760c253cSXin Li             {'k1': '13', 'k2': '14', 'k3': '15'}],
105*760c253cSXin Li            [{'k1': '50', 'k2': '51', 'k3': '52', 'k4': '53'}]]
106*760c253cSXin Li    # yapf: enable
107*760c253cSXin Li    labels = ['vanilla', 'modified']
108*760c253cSXin Li    tg = tabulator.TableGenerator(runs, labels)
109*760c253cSXin Li    table = tg.GetTable()
110*760c253cSXin Li    header = table.pop(0)
111*760c253cSXin Li
112*760c253cSXin Li    self.assertTrue(header == ['keys', 'vanilla', 'modified'])
113*760c253cSXin Li    row = table.pop(0)
114*760c253cSXin Li    self.assertTrue(row == ['k1', ['10', '13'], ['50']])
115*760c253cSXin Li    row = table.pop(0)
116*760c253cSXin Li    self.assertTrue(row == ['k2', ['12', '14'], ['51']])
117*760c253cSXin Li    row = table.pop(0)
118*760c253cSXin Li    self.assertTrue(row == ['k3', [None, '15'], ['52']])
119*760c253cSXin Li    row = table.pop(0)
120*760c253cSXin Li    self.assertTrue(row == ['k4', [None, None], ['53']])
121*760c253cSXin Li
122*760c253cSXin Li    table = tg.GetTable()
123*760c253cSXin Li    columns = [
124*760c253cSXin Li        tabulator.Column(tabulator.AmeanResult(), tabulator.Format()),
125*760c253cSXin Li        tabulator.Column(tabulator.AmeanRatioResult(),
126*760c253cSXin Li                         tabulator.PercentFormat()),
127*760c253cSXin Li    ]
128*760c253cSXin Li    tf = tabulator.TableFormatter(table, columns)
129*760c253cSXin Li    table = tf.GetCellTable()
130*760c253cSXin Li    self.assertTrue(table)
131*760c253cSXin Li
132*760c253cSXin Li  def testSamplesTableGenerator(self):
133*760c253cSXin Li    # yapf: disable
134*760c253cSXin Li    keyvals = {
135*760c253cSXin Li        'bench1': [[{'samples': 1}, {'samples': 2}],
136*760c253cSXin Li                   [{'samples': 3}, {'samples': 4}]],
137*760c253cSXin Li        'bench2': [[{'samples': 5}, {}],
138*760c253cSXin Li                   [{'samples': 6}, {'samples': 7}]]
139*760c253cSXin Li    }
140*760c253cSXin Li    # yapf: enable
141*760c253cSXin Li    weights = {'bench1': 0.2, 'bench2': 0.7}
142*760c253cSXin Li    iter_counts = {'bench1': 2, 'bench2': 2}
143*760c253cSXin Li    labels = ['vanilla', 'modified']
144*760c253cSXin Li    tg = tabulator.SamplesTableGenerator(keyvals, labels, iter_counts, weights)
145*760c253cSXin Li    (table, new_keyvals, new_iter_counts) = tg.GetTable()
146*760c253cSXin Li
147*760c253cSXin Li    columns = [
148*760c253cSXin Li        tabulator.Column(tabulator.IterationResult(), tabulator.Format()),
149*760c253cSXin Li        tabulator.Column(tabulator.AmeanResult(), tabulator.Format()),
150*760c253cSXin Li        tabulator.Column(tabulator.AmeanRatioResult(),
151*760c253cSXin Li                         tabulator.PercentFormat()),
152*760c253cSXin Li    ]
153*760c253cSXin Li    # This is the function to load column info.
154*760c253cSXin Li    tf = tabulator.TableFormatter(table, columns, samples_table=True)
155*760c253cSXin Li    # This is the function where to do all weighting calculation.
156*760c253cSXin Li    cell_table = tf.GetCellTable('summary')
157*760c253cSXin Li    self.assertTrue(cell_table)
158*760c253cSXin Li
159*760c253cSXin Li    header = table.pop(0)
160*760c253cSXin Li    self.assertTrue(header == ['Benchmarks', 'Weights', 'vanilla', 'modified'])
161*760c253cSXin Li    row = table.pop(0)
162*760c253cSXin Li    # yapf: disable
163*760c253cSXin Li    self.assertTrue(row == ['bench1', 0.2,
164*760c253cSXin Li                            ((2, 0), [1 * 0.2, 2 * 0.2]),
165*760c253cSXin Li                            ((2, 0), [3 * 0.2, 4 * 0.2])])
166*760c253cSXin Li    row = table.pop(0)
167*760c253cSXin Li    self.assertTrue(row == ['bench2', 0.7,
168*760c253cSXin Li                            ((1, 1), [5 * 0.7, None]),
169*760c253cSXin Li                            ((2, 0), [6 * 0.7, 7 * 0.7])])
170*760c253cSXin Li    row = table.pop(0)
171*760c253cSXin Li    self.assertTrue(row == ['Composite Benchmark (samples)', 'N/A',
172*760c253cSXin Li                            ((1, 1), [1 * 0.2 + 5 * 0.7, None]),
173*760c253cSXin Li                            ((2, 0), [3 * 0.2 + 6 * 0.7, 4 * 0.2 + 7 * 0.7])])
174*760c253cSXin Li    # yapf: enable
175*760c253cSXin Li    self.assertTrue('Composite Benchmark' in new_keyvals.keys())
176*760c253cSXin Li    self.assertTrue('Composite Benchmark' in new_iter_counts.keys())
177*760c253cSXin Li
178*760c253cSXin Li  def testColspan(self):
179*760c253cSXin Li    simple_table = [
180*760c253cSXin Li        ['binary', 'b1', 'b2', 'b3'],
181*760c253cSXin Li        ['size', 100, 105, 108],
182*760c253cSXin Li        ['rodata', 100, 80, 70],
183*760c253cSXin Li        ['data', 100, 100, 100],
184*760c253cSXin Li        ['debug', 100, 140, 60],
185*760c253cSXin Li    ]
186*760c253cSXin Li    columns = [
187*760c253cSXin Li        tabulator.Column(tabulator.AmeanResult(), tabulator.Format()),
188*760c253cSXin Li        tabulator.Column(tabulator.MinResult(), tabulator.Format()),
189*760c253cSXin Li        tabulator.Column(tabulator.AmeanRatioResult(),
190*760c253cSXin Li                         tabulator.PercentFormat()),
191*760c253cSXin Li        tabulator.Column(tabulator.AmeanRatioResult(),
192*760c253cSXin Li                         tabulator.ColorBoxFormat()),
193*760c253cSXin Li    ]
194*760c253cSXin Li    our_table = [simple_table[0]]
195*760c253cSXin Li    for row in simple_table[1:]:
196*760c253cSXin Li      our_row = [row[0]]
197*760c253cSXin Li      for v in row[1:]:
198*760c253cSXin Li        our_row.append([v])
199*760c253cSXin Li      our_table.append(our_row)
200*760c253cSXin Li
201*760c253cSXin Li    tf = tabulator.TableFormatter(our_table, columns)
202*760c253cSXin Li    cell_table = tf.GetCellTable()
203*760c253cSXin Li    self.assertTrue(cell_table[0][0].colspan == 1)
204*760c253cSXin Li    self.assertTrue(cell_table[0][1].colspan == 2)
205*760c253cSXin Li    self.assertTrue(cell_table[0][2].colspan == 4)
206*760c253cSXin Li    self.assertTrue(cell_table[0][3].colspan == 4)
207*760c253cSXin Li    for row in cell_table[1:]:
208*760c253cSXin Li      for cell in row:
209*760c253cSXin Li        self.assertTrue(cell.colspan == 1)
210*760c253cSXin Li
211*760c253cSXin Li
212*760c253cSXin Liif __name__ == '__main__':
213*760c253cSXin Li  unittest.main()
214