<!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="/core/test_utils.html">
<link rel="import" href="/core/timeline_viewport.html">
<link rel="import" href="/core/tracks/drawing_container.html">
<link rel="import" href="/core/tracks/alert_track.html">
<link rel="import" href="/model/global_memory_dump.html">
<link rel="import" href="/model/selection_state.html">

<script>
'use strict';

tr.b.unittest.testSuite(function() {
  var AlertTrack = tr.c.tracks.AlertTrack;
  var Selection = tr.c.Selection;
  var SelectionState = tr.model.SelectionState;
  var Viewport = tr.c.TimelineViewport;

  var ALERT_INFO_1 = new tr.model.EventInfo(
    'Alert 1', 'One alert');
  var ALERT_INFO_2 = new tr.model.EventInfo(
    'Alert 2', 'Another alert');

  var createAlerts = function() {
    var alerts = [
      new tr.model.Alert(ALERT_INFO_1, 5),
      new tr.model.Alert(ALERT_INFO_1, 20),
      new tr.model.Alert(ALERT_INFO_2, 35),
      new tr.model.Alert(ALERT_INFO_2, 50)
    ];
    return alerts;
  };

  test('instantiate', function() {
    var alerts = createAlerts();
    alerts[1].selectionState = SelectionState.SELECTED;

    var div = document.createElement('div');
    var viewport = new Viewport(div);
    var drawingContainer = new tr.c.tracks.DrawingContainer(viewport);
    div.appendChild(drawingContainer);

    var track = AlertTrack(viewport);
    drawingContainer.appendChild(track);

    this.addHTMLOutput(div);
    drawingContainer.invalidate();

    track.alerts = alerts;
    var dt = new tr.c.TimelineDisplayTransform();
    dt.xSetWorldBounds(0, 50, track.clientWidth);
    track.viewport.setDisplayTransformImmediately(dt);


    assert.equal(5, track.items[0].start);
  });

  test('modelMapping', function() {
    var alerts = createAlerts();

    var div = document.createElement('div');
    var viewport = new Viewport(div);
    var track = AlertTrack(viewport);
    track.alerts = alerts;

    var a0 = track.items[0].modelItem;
    assert.equal(a0, alerts[0]);
  });
});
</script>

