blob: c8a974c8ba9224922735e3c46d0a0d36dbb1e7da [file] [log] [blame]
<!DOCTYPE html>
<!--
Copyright (c) 2015 The Chromium Authors. All rights reserved.
Use of this source code is governed by a BSD-style license that can be
found in the LICENSE file.
-->
<link rel="import" href="/tracing/core/test_utils.html">
<link rel="import" href="/tracing/model/event.html">
<link rel="import" href="/tracing/model/event_set.html">
<link rel="import" href="/tracing/ui/timeline_display_transform.html">
<link rel="import" href="/tracing/ui/tracks/chart_axis.html">
<link rel="import" href="/tracing/ui/tracks/chart_point.html">
<link rel="import" href="/tracing/ui/tracks/chart_series.html">
<link rel="import" href="/tracing/ui/tracks/chart_transform.html">
<script>
'use strict';
tr.b.unittest.testSuite(function() {
var EventSet = tr.model.EventSet;
var TimelineDisplayTransform = tr.ui.TimelineDisplayTransform;
var Event = tr.model.Event;
var ChartAxis = tr.ui.tracks.ChartAxis;
var ChartPoint = tr.ui.tracks.ChartPoint;
var ChartSeries = tr.ui.tracks.ChartSeries;
var ChartTransform = tr.ui.tracks.ChartTransform;
var ChartSeriesType = tr.ui.tracks.ChartSeriesType;
var CANVAS_WIDTH = 800;
var CANVAS_HEIGHT = 80;
function buildSeries(renderingConfig) {
var points = [];
for (var i = 0; i < 60; i++) {
var event = new Event();
event.index = i;
var phase = i * Math.PI / 15;
var value = Math.sin(phase);
var peakIndex = Math.floor((phase + Math.PI / 2) / (2 * Math.PI));
var base = peakIndex % 2 === 0 ? undefined : -1 + value / 1.5;
var point = new ChartPoint(event, i - 30, value, base);
points.push(point);
}
var axis = new ChartAxis(-1, 1);
return new ChartSeries(points, axis, renderingConfig);
}
function drawSeriesWithDetails(test, series, highDetails) {
var div = document.createElement('div');
var canvas = document.createElement('canvas');
Polymer.dom(div).appendChild(canvas);
var pixelRatio = window.devicePixelRatio || 1;
canvas.width = CANVAS_WIDTH * pixelRatio;
canvas.style.width = CANVAS_WIDTH + 'px';
canvas.height = CANVAS_HEIGHT * pixelRatio;
canvas.style.height = CANVAS_HEIGHT + 'px';
var displayTransform = new TimelineDisplayTransform();
displayTransform.scaleX = CANVAS_WIDTH * pixelRatio / 60;
displayTransform.panX = 30;
var transform = new ChartTransform(
displayTransform,
series.axis,
CANVAS_WIDTH * pixelRatio,
CANVAS_HEIGHT * pixelRatio,
10 * pixelRatio,
10 * pixelRatio,
pixelRatio);
series.draw(canvas.getContext('2d'), transform, highDetails);
test.addHTMLOutput(div);
}
function drawSeries(test, series) {
drawSeriesWithDetails(test, series, false);
drawSeriesWithDetails(test, series, true);
}
test('instantiate_defaultConfig', function() {
var series = buildSeries(undefined);
drawSeries(this, series);
});
test('instantiate_lineChart', function() {
var series = buildSeries({
chartType: ChartSeriesType.LINE,
colorId: 4,
unselectedPointSize: 6,
lineWidth: 2,
unselectedPointDensityOpaque: 0.08
});
drawSeries(this, series);
});
test('instantiate_areaChart', function() {
var series = buildSeries({
chartType: ChartSeriesType.AREA,
colorId: 2,
backgroundOpacity: 0.2
});
drawSeries(this, series);
});
test('instantiate_largeSkipDistance', function() {
var series = buildSeries({
chartType: ChartSeriesType.AREA,
colorId: 1,
skipDistance: 40,
unselectedPointDensityTransparent: 0.07
});
drawSeries(this, series);
});
test('instantiate_selection', function() {
var series = buildSeries({
chartType: ChartSeriesType.AREA,
colorId: 10
});
series.points.forEach(function(point, index) {
point.modelItem.selectionState = index % 4;
});
drawSeries(this, series);
});
test('instantiate_selectionWithAllConfigFlags', function() {
var series = buildSeries({
chartType: ChartSeriesType.AREA,
selectedPointSize: 10,
unselectedPointSize: 6,
colorId: 15,
lineWidth: 2,
skipDistance: 25,
unselectedPointDensityOpaque: 0.07,
unselectedPointDensityTransparent: 0.09,
backgroundOpacity: 0.8
});
series.points.forEach(function(point, index) {
point.modelItem.selectionState = index % 4;
});
drawSeries(this, series);
});
test('checkRange', function() {
var series = buildSeries();
var range = series.range;
assert.isFalse(range.isEmpty);
assert.closeTo(range.min, -1, 0.05);
assert.closeTo(range.max, 1, 0.05);
});
test('checkaddIntersectingEventsInRangeToSelectionInWorldSpace', function() {
var series = buildSeries();
// Too far left.
var sel = new EventSet();
series.addIntersectingEventsInRangeToSelectionInWorldSpace(
-1000, -30.5, 40, sel);
assert.lengthOf(sel, 0);
// Select first point.
var sel = new EventSet();
series.addIntersectingEventsInRangeToSelectionInWorldSpace(
-30.5, -29.5, 40, sel);
assert.equal(tr.b.getOnlyElement(sel).index, 0);
// Select second point.
var sel = new EventSet();
series.addIntersectingEventsInRangeToSelectionInWorldSpace(
-28.8, -28.2, 40, sel);
assert.equal(tr.b.getOnlyElement(sel).index, 1);
// Select points in the middle.
var sel = new EventSet();
series.addIntersectingEventsInRangeToSelectionInWorldSpace(
-0.99, 1.01, 40, sel);
assert.lengthOf(sel, 3);
var iterator = sel[Symbol.iterator]();
assert.equal(iterator.next().value.index, 29);
assert.equal(iterator.next().value.index, 30);
assert.equal(iterator.next().value.index, 31);
// Select the last point.
var sel = new EventSet();
series.addIntersectingEventsInRangeToSelectionInWorldSpace(
668.99, 668.99, 40, sel);
assert.equal(tr.b.getOnlyElement(sel).index, 59);
// Too far right.
var sel = new EventSet();
series.addIntersectingEventsInRangeToSelectionInWorldSpace(
669.01, 2000, 40, sel);
assert.lengthOf(sel, 0);
// Select everything.
var sel = new EventSet();
series.addIntersectingEventsInRangeToSelectionInWorldSpace(
-29.01, 669.01, 40, sel);
assert.lengthOf(sel, 60);
});
test('checkaddEventNearToProvidedEventToSelection', function() {
var series = buildSeries();
// Invalid event.
var sel = new EventSet();
assert.isFalse(series.addEventNearToProvidedEventToSelection(
new Event(), 1, sel));
assert.lengthOf(sel, 0);
var sel = new EventSet();
assert.isFalse(series.addEventNearToProvidedEventToSelection(
new Event(), -1, sel));
assert.lengthOf(sel, 0);
// First point.
var sel = new EventSet();
assert.isTrue(series.addEventNearToProvidedEventToSelection(
series.points[0].modelItem, 1, sel));
assert.equal(tr.b.getOnlyElement(sel).index, 1);
var sel = new EventSet();
assert.isFalse(series.addEventNearToProvidedEventToSelection(
series.points[0].modelItem, -1, sel));
assert.lengthOf(sel, 0);
// Middle point.
var sel = new EventSet();
assert.isTrue(series.addEventNearToProvidedEventToSelection(
series.points[30].modelItem, 1, sel));
assert.equal(tr.b.getOnlyElement(sel).index, 31);
var sel = new EventSet();
assert.isTrue(series.addEventNearToProvidedEventToSelection(
series.points[30].modelItem, -1, sel));
assert.equal(tr.b.getOnlyElement(sel).index, 29);
// Last point.
var sel = new EventSet();
assert.isFalse(series.addEventNearToProvidedEventToSelection(
series.points[59].modelItem, 1, sel));
assert.lengthOf(sel, 0);
var sel = new EventSet();
assert.isTrue(series.addEventNearToProvidedEventToSelection(
series.points[59].modelItem, -1, sel));
assert.equal(tr.b.getOnlyElement(sel).index, 58);
});
test('checkAddClosestEventToSelection', function() {
var series = buildSeries();
// Left of first point.
var sel = new EventSet();
series.addClosestEventToSelection(-40, 9, -0.5, 0.5, sel);
assert.lengthOf(sel, 0);
var sel = new EventSet();
series.addClosestEventToSelection(-40, 11, -0.5, 0.5, sel);
assert.equal(tr.b.getOnlyElement(sel).index, 0);
// Between two points.
var sel = new EventSet();
series.addClosestEventToSelection(0.4, 0.3, -0.5, 0.5, sel);
assert.lengthOf(sel, 0);
var sel = new EventSet();
series.addClosestEventToSelection(0.4, 0.4, -0.5, 0.5, sel);
assert.equal(tr.b.getOnlyElement(sel).index, 30);
// Right of last point.
var sel = new EventSet();
series.addClosestEventToSelection(40, 10, -0.5, 0.5, sel);
assert.lengthOf(sel, 0);
var sel = new EventSet();
series.addClosestEventToSelection(40, 12, -0.5, 0.5, sel);
assert.equal(tr.b.getOnlyElement(sel).index, 59);
});
});
</script>