<!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="/model/event.html">
<link rel="import" href="/model/selectable_item.html">
<link rel="import" href="/model/selection_state.html">
<link rel="import" href="/ui/tracks/event_to_track_map.html">

<script>
'use strict';

tr.b.unittest.testSuite(function() {
  var Event = tr.model.Event;
  var EventToTrackMap = tr.ui.tracks.EventToTrackMap;
  var SelectableItem = tr.model.SelectableItem;
  var SelectionState = tr.model.SelectionState;

  test('checkModelItem', function() {
    var selectableItem1 = new SelectableItem(undefined);
    assert.isUndefined(selectableItem1.modelItem);

    var event = new Event();
    var selectableItem2 = new SelectableItem(event);
    assert.equal(selectableItem2.modelItem, event);
  });

  test('checkSelected', function() {
    var selectableItem = new SelectableItem(undefined);

    selectableItem.selectionState = SelectionState.NONE;
    assert.isFalse(selectableItem.selected);

    selectableItem.selectionState = SelectionState.SELECTED;
    assert.isTrue(selectableItem.selected);

    selectableItem.selectionState = SelectionState.HIGHLIGHTED;
    assert.isFalse(selectableItem.selected);
  });

  test('checkAddToSelection_undefinedModelItem', function() {
    var selectableItem = new SelectableItem(undefined);
    var selection = [];
    selectableItem.addToSelection(selection);
    assert.lengthOf(selection, 0);
  });

  test('checkAddToSelection_definedModelItem', function() {
    var event = new Event();
    var selectableItem = new SelectableItem(event);
    var selection = [];
    selectableItem.addToSelection(selection);
    assert.lengthOf(selection, 1);
    assert.equal(selection[0], event);
  });

  test('checkAddToTrackMap_undefinedModelItem', function() {
    var selectableItem = new SelectableItem(undefined);
    var eventToTrackMap = new EventToTrackMap();
    var track = {};
    selectableItem.addToTrackMap(eventToTrackMap, track);
    assert.lengthOf(Object.keys(eventToTrackMap), 0);
  });

  test('checkAddToTrackMap_definedModelItem', function() {
    var event = new Event();
    var selectableItem = new SelectableItem(event);
    var eventToTrackMap = new EventToTrackMap();
    var track = {};
    selectableItem.addToTrackMap(eventToTrackMap, track);
    assert.lengthOf(Object.keys(eventToTrackMap), 1);
    assert.equal(eventToTrackMap[event.guid], track);
  });
});
</script>

