<!DOCTYPE html>
<!--
Copyright 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.
-->

<script src="/jquery/jquery-2.1.4.min.js"></script>
<script src="/flot/jquery.flot.min.js"></script>
<script src="/flot/jquery.flot.crosshair.min.js"></script>
<script src="/flot/jquery.flot.fillbetween.min.js"></script>
<script src="/flot/jquery.flot.selection.min.js"></script>

<link rel="import" href="/dashboard/elements/chart-container.html">
<link rel="import" href="/dashboard/static/graph.html">
<link rel="import" href="/dashboard/static/testing_common.html">
<link rel="import" href="/dashboard/static/uri.html">

<link rel="import" href="/tracing/core/test_utils.html">

<script>
'use strict';

tr.b.unittest.testSuite(function() {

  var GRAPH_JSON = {
    'data': {
      '0': {
        'color': 0,
        'data': [[348164, 24290], [348167, 22206], [348182, 24170],
                 [348198, 22847], [348224, 25224]],
        'id': 'line_0'
      }
    },
    'error_bars': {
      '0': [
        {
          'fillBetween': 'line_0',
          'clickable': false,
          'hoverable': false,
          'data': [[348164, 24290], [348167, 22206], [348182, 24170],
                   [348198, 22847], [348224, 25224]],
          'color': 0,
          'id': 'bottom_0',
          'lines': {
            'fill': 0.2,
            'lineWidth': 0,
            'show': true
          }
        },
        {
          'fillBetween': 'line_0',
          'clickable': false,
          'hoverable': false,
          'data': [[348164, 24290], [348167, 22206], [348182, 24170],
                   [348198, 22847], [348224, 25224]],
          'color': 0,
          'id': 'top_0',
          'lines': {
            'fill': 0.2,
            'lineWidth': 0,
            'show': true
          }
        }
      ]
    },
    'annotations': {
      '0': {
        '0': {
          'a_trace_rerun_options': null,
          'error': 0,
          'r_webkit_rev': '202058',
          'a_stdio_uri': '[Buildbot stdio](//dromaeo/stdio)',
          'r_commit_pos': '348164',
          'timestamp': (new Date).getTime(),
          'r_chromium': '0c554b0e1233639e7428facc13ff674741368fb2'
        }
      },
      'series': {
        '0': {
          'name': 'dom',
          'description': null,
          'better': 'Higher',
          'units': 'runs/s',
          'path': 'ChromiumPerf/win/dromaeo/dom'
        }
      }
    }
  };

  var GRAPH_REVISION_JSON = [
     [348164, 24290, 1445661677000],
     [348167, 22206, 1445674668000],
     [348182, 24170, 1445685601000],
     [348198, 22847, 1445696455000],
     [348224, 25224, 1445707715000]
  ];

  var testOptions = {
    tearDown: function() {
      testing_common.clearXhrMock();
      testing_common.clearFixture();
    }
  };

  function createBasicChart() {
    var params = {
      'test_path_dict': {
        'ChromiumPerf/win/dromaeo': []
      },
      'is_selected': true
    };
    var graphQuery = ('/graph_json?graphs=' +
                      encodeURIComponent(JSON.stringify(params)));
    testing_common.addXhrMock(graphQuery, JSON.stringify(GRAPH_JSON));
    var revisionQuery = ('/graph_revisions?test_path=' +
        encodeURIComponent('ChromiumPerf/win/dromaeo/dom'));
    testing_common.addXhrMock(revisionQuery,
                              JSON.stringify(GRAPH_REVISION_JSON));
    var chart = document.createElement('chart-container');
    return chart;
  };

  test('instantiate basic', function() {
    var chart = createBasicChart();
    chart.addSeriesGroup([['ChromiumPerf/win/dromaeo', ['important']]]);
    this.addHTMLOutput(chart);
  }, testOptions);

  test('data is loaded when a series group is added', function() {
    var chart = createBasicChart();
    testing_common.addToFixture(chart);
    chart.addSeriesGroup([['ChromiumPerf/win/dromaeo', ['important']]]);
    assert.equal(chart.getDataForFlot().length, 3);
  }, testOptions);

  test('warning added for stale series', function() {
    var params = {
      'test_path_dict': {
        'ChromiumPerf/win/dromaeo': []
      },
      'is_selected': true
    };
    var graphJson = testing_common.deepCopy(GRAPH_JSON);
    graphJson['annotations']['0']['0']['timestamp'] -= 8 * 86400000;
    var graphQuery = ('/graph_json?graphs=' +
                      encodeURIComponent(JSON.stringify(params)));
    testing_common.addXhrMock(graphQuery, JSON.stringify(graphJson));

    var chart = document.createElement('chart-container');
    testing_common.addToFixture(chart);
    chart.addSeriesGroup([['ChromiumPerf/win/dromaeo', ['important']]]);

    return new Promise(function(resolve) {
      function check() {
        assert.notEqual(-1, chart.warnings[0].indexOf('Graph out of date!'));
        resolve();
      }
      setTimeout(check, 10);
    });
  }, testOptions);

});
</script>
