<!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>
