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