Chris Craik | 44c2820 | 2015-05-12 17:25:16 -0700 | [diff] [blame^] | 1 | <!DOCTYPE html> |
| 2 | <!-- |
| 3 | Copyright (c) 2015 The Chromium Authors. All rights reserved. |
| 4 | Use of this source code is governed by a BSD-style license that can be |
| 5 | found in the LICENSE file. |
| 6 | --> |
| 7 | |
| 8 | <link rel="import" href="/core/analysis/memory_dump_sub_view_util.html"> |
| 9 | <link rel="import" href="/core/test_utils.html"> |
| 10 | <link rel="import" href="/core/trace_model/attribute.html"> |
| 11 | |
| 12 | <script> |
| 13 | 'use strict'; |
| 14 | |
| 15 | tv.b.unittest.testSuite(function() { |
| 16 | var MemoryColumn = tv.c.analysis.MemoryColumn; |
| 17 | var ScalarMemoryColumn = tv.c.analysis.ScalarMemoryColumn; |
| 18 | var MemoryCell = tv.c.analysis.MemoryCell; |
| 19 | var fieldGetter = tv.c.analysis.fieldGetter; |
| 20 | var StringAttribute = tv.c.trace_model.StringAttribute; |
| 21 | var ScalarAttribute = tv.c.trace_model.ScalarAttribute; |
| 22 | |
| 23 | function checkPercent(string, expectedPercent) { |
| 24 | assert.equal(Number(string.slice(0, -1)), expectedPercent); |
| 25 | assert.equal(string.slice(-1), '%'); |
| 26 | } |
| 27 | |
| 28 | function buildStringCell(value, units) { |
| 29 | return new MemoryCell(new StringAttribute(value, units)); |
| 30 | } |
| 31 | |
| 32 | function buildScalarCell(value, units) { |
| 33 | return new MemoryCell(new ScalarAttribute(value, units)); |
| 34 | } |
| 35 | |
| 36 | test('checkMemoryColumn_fromRows', function() { |
| 37 | var rows = [ |
| 38 | { |
| 39 | title: 'Row 1', |
| 40 | attributes: { |
| 41 | 'cpu_temperature': buildStringCell('C', 'below zero') |
| 42 | }, |
| 43 | subRows: [ |
| 44 | { |
| 45 | title: 'Row 1A', |
| 46 | attributes: { |
| 47 | 'page_size': buildScalarCell('bytes', 1024) |
| 48 | } |
| 49 | }, |
| 50 | { |
| 51 | title: 'Row 1B', |
| 52 | attributes: { |
| 53 | 'page_size': buildScalarCell('bytes', 512), |
| 54 | 'mixed': buildStringCell('ms', '0.01') |
| 55 | } |
| 56 | } |
| 57 | ] |
| 58 | }, |
| 59 | { |
| 60 | title: 'Row 2', |
| 61 | attributes: { |
| 62 | 'cpu_temperature': undefined, |
| 63 | 'mixed': buildScalarCell('ms', 0.99) |
| 64 | } |
| 65 | } |
| 66 | ]; |
| 67 | |
| 68 | var columns = MemoryColumn.fromRows(rows, 'attributes'); |
| 69 | assert.lengthOf(columns, 3); |
| 70 | |
| 71 | var cpuTemperatureColumn = columns[0]; |
| 72 | assert.equal(cpuTemperatureColumn.title, 'cpu_temperature'); |
| 73 | assert.equal(cpuTemperatureColumn.units, 'C'); |
| 74 | assert.instanceOf(cpuTemperatureColumn, MemoryColumn); |
| 75 | assert.notInstanceOf(cpuTemperatureColumn, ScalarMemoryColumn); |
| 76 | |
| 77 | var pageSizeColumn = columns[1]; |
| 78 | assert.equal(pageSizeColumn.title, 'page_size'); |
| 79 | assert.equal(pageSizeColumn.units, 'bytes'); |
| 80 | assert.instanceOf(pageSizeColumn, ScalarMemoryColumn); |
| 81 | |
| 82 | var mixedColumn = columns[2]; |
| 83 | assert.equal(mixedColumn.title, 'mixed'); |
| 84 | assert.isUndefined(mixedColumn.units); |
| 85 | assert.instanceOf(mixedColumn, MemoryColumn); |
| 86 | assert.notInstanceOf(mixedColumn, ScalarMemoryColumn); |
| 87 | }); |
| 88 | |
| 89 | test('checkMemoryColumn_fromAttributeTraits', function() { |
| 90 | // String attribute. |
| 91 | var traits = { |
| 92 | constructor: StringAttribute, |
| 93 | units: 'Mbps' |
| 94 | }; |
| 95 | var column = MemoryColumn.fromAttributeTraits( |
| 96 | 'First Column', traits, fieldGetter('x')); |
| 97 | assert.instanceOf(column, MemoryColumn); |
| 98 | assert.equal(column.title, 'First Column'); |
| 99 | assert.isUndefined(column.width); |
| 100 | assert.equal(column.value({x: buildStringCell('Mbps', 'very fast')}), |
| 101 | 'very fast'); |
| 102 | assert.isAbove(column.cmp({x: buildStringCell('Mbps', 'slow')}, |
| 103 | {x: buildStringCell('Mbps', 'fast')}), 0); |
| 104 | |
| 105 | // Scalar attribute. |
| 106 | var traits = { |
| 107 | constructor: ScalarAttribute, |
| 108 | units: 'bytes' |
| 109 | }; |
| 110 | var column = MemoryColumn.fromAttributeTraits( |
| 111 | 'Second Column', traits, fieldGetter('x')); |
| 112 | assert.instanceOf(column, MemoryColumn); |
| 113 | assert.equal(column.title, 'Second Column'); |
| 114 | assert.isUndefined(column.width); |
| 115 | assert.equal(column.value({x: buildScalarCell('bytes', 1024)}).numBytes, |
| 116 | 1024); |
| 117 | assert.isAbove(column.cmp({x: buildScalarCell('bytes', 100)}, |
| 118 | {x: buildScalarCell('bytes', 99.99)}), 0); |
| 119 | }); |
| 120 | |
| 121 | test('checkMemoryColumn_spaceEqually', function() { |
| 122 | // Zero columns. |
| 123 | var columns = []; |
| 124 | MemoryColumn.spaceEqually(columns); |
| 125 | |
| 126 | // One column. |
| 127 | var columns = [ |
| 128 | { |
| 129 | title: 'First Column', |
| 130 | value: function(row) { return row.firstData; } |
| 131 | } |
| 132 | ]; |
| 133 | MemoryColumn.spaceEqually(columns); |
| 134 | checkPercent(columns[0].width, 100); |
| 135 | |
| 136 | // Two columns. |
| 137 | var columns = [ |
| 138 | { |
| 139 | title: 'First Column', |
| 140 | value: function(row) { return row.firstData; } |
| 141 | }, |
| 142 | { |
| 143 | title: 'Second Column', |
| 144 | value: function(row) { return row.firstData; } |
| 145 | } |
| 146 | ]; |
| 147 | MemoryColumn.spaceEqually(columns); |
| 148 | checkPercent(columns[0].width, 50); |
| 149 | checkPercent(columns[1].width, 50); |
| 150 | }); |
| 151 | |
| 152 | test('checkMemoryColumn_attr', function() { |
| 153 | var c = new MemoryColumn('Test Column', 'ms', fieldGetter('x')); |
| 154 | |
| 155 | // Undefined cell. |
| 156 | var row = {}; |
| 157 | assert.isUndefined(c.attr(row)); |
| 158 | |
| 159 | // Undefined attribute inside cell. |
| 160 | var row = {x: new MemoryCell(undefined)}; |
| 161 | assert.isUndefined(c.attr(row)); |
| 162 | |
| 163 | // Defined attribute inside cell. |
| 164 | var attr = new ScalarAttribute('hPa', 1013.25); |
| 165 | var row = {x: new MemoryCell(attr)}; |
| 166 | assert.strictEqual(c.attr(row), attr); |
| 167 | }); |
| 168 | |
| 169 | test('checkMemoryColumn_value', function() { |
| 170 | var c = new MemoryColumn('Test Column', 'ms', fieldGetter('x')); |
| 171 | assert.equal(c.title, 'Test Column'); |
| 172 | assert.isUndefined(c.width); |
| 173 | |
| 174 | // Undefined cell. |
| 175 | var row = {}; |
| 176 | assert.equal(c.value(row), ''); |
| 177 | |
| 178 | // Defined cell. |
| 179 | var row = {x: buildScalarCell('ms', 123)}; |
| 180 | assert.equal(c.value(row), '123'); |
| 181 | }); |
| 182 | |
| 183 | test('checkMemoryColumn_cmp', function() { |
| 184 | var c = new MemoryColumn('Test Column', 'ms', fieldGetter('x')); |
| 185 | |
| 186 | // Cell (or the associated attribute) undefined in one or both rows. |
| 187 | assert.equal(c.cmp({}, {y: new MemoryCell(undefined)}), 0); |
| 188 | assert.isAbove(c.cmp({x: buildStringCell('ms', 'negative')}, {}), 0); |
| 189 | assert.isBelow(c.cmp({}, {x: buildStringCell('ms', 'positive')}), 0); |
| 190 | |
| 191 | // Cell defined in both rows |
| 192 | assert.equal(c.cmp({x: buildStringCell('t', 'equal')}, |
| 193 | {x: buildStringCell('t', 'equal')}), 0); |
| 194 | assert.isAbove(c.cmp({x: buildStringCell('u', 'bigger')}, |
| 195 | {x: buildStringCell('u', 'BIG')}), 0); |
| 196 | assert.isBelow(c.cmp({x: buildStringCell('v', 'small')}, |
| 197 | {x: buildStringCell('v', 'smaLL')}), 0); |
| 198 | }); |
| 199 | |
| 200 | test('checkScalarMemoryColumn_value', function() { |
| 201 | var c = new ScalarMemoryColumn('Test Column', 'bytes', fieldGetter('x')); |
| 202 | assert.equal(c.title, 'Test Column'); |
| 203 | assert.isUndefined(c.width); |
| 204 | |
| 205 | // Undefined cell. |
| 206 | var row = {}; |
| 207 | assert.equal(c.value(row), ''); |
| 208 | |
| 209 | // Defined cell. |
| 210 | var row = {x: buildScalarCell('bytes', 1024)}; |
| 211 | assert.equal(c.value(row).numBytes, 1024); |
| 212 | }); |
| 213 | |
| 214 | test('checkScalarMemoryColumn_cmp', function() { |
| 215 | var c = new ScalarMemoryColumn('Test Column', 'ms', fieldGetter('x')); |
| 216 | |
| 217 | // Cell (or the associated attribute) undefined in one or both rows. |
| 218 | assert.equal(c.cmp({}, {y: new MemoryCell(undefined)}), 0); |
| 219 | assert.isAbove(c.cmp({x: buildScalarCell('ms', -10)}, {}), 0); |
| 220 | assert.isBelow(c.cmp({}, {x: buildScalarCell('ms', 20)}), 0); |
| 221 | |
| 222 | // Cell defined in both rows |
| 223 | assert.equal(c.cmp({x: buildScalarCell('ms', 0.01)}, |
| 224 | {x: buildScalarCell('ms', 0.01)}), 0); |
| 225 | assert.isAbove(c.cmp({x: buildScalarCell('ms', -1)}, |
| 226 | {x: buildScalarCell('ms', -2)}), 0); |
| 227 | assert.isBelow(c.cmp({x: buildScalarCell('ms', 999)}, |
| 228 | {x: buildScalarCell('ms', 1000)}), 0); |
| 229 | }); |
| 230 | |
| 231 | test('checkFieldGetter', function() { |
| 232 | // Zero cells. |
| 233 | var f = fieldGetter(); |
| 234 | var row = {a: 5}; |
| 235 | assert.equal(f(row), row); |
| 236 | |
| 237 | // One cell. |
| 238 | var f = fieldGetter('p2'); |
| 239 | assert.equal(f({p1: 'wrong', p2: 'right'}), 'right'); |
| 240 | assert.isUndefined(f({p1: 'wrong'})); |
| 241 | |
| 242 | // Multiple cells. |
| 243 | var f = fieldGetter('b', 'd', 'f'); |
| 244 | assert.equal(f({a: 0, b: {c: 0, d: {e: 0, f: 42}}}), 42); |
| 245 | }); |
| 246 | }); |
| 247 | </script> |