<!DOCTYPE html>
<!--
Copyright (c) 2013 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/timeline_viewport.html">
<link rel="import" href="/core/test_utils.html">
<link rel="import" href="/core/selection.html">
<link rel="import" href="/core/tracks/slice_track.html">
<link rel="import" href="/core/tracks/drawing_container.html">
<link rel="import" href="/model/model.html">

<script>
'use strict';

tr.b.unittest.testSuite(function() {
  test('selectionObject', function() {
    var model = new tr.Model();
    var p1 = model.getOrCreateProcess(1);
    var t1 = p1.getOrCreateThread(1);
    t1.sliceGroup.pushSlice(
        new tr.model.ThreadSlice('', 'a', 0, 1, {}, 3));
    t1.sliceGroup.pushSlice(
        new tr.model.ThreadSlice('', 'a', 0, 5, {}, 1));

    var sel = new tr.c.Selection();
    sel.push(t1.sliceGroup.slices[0]);

    assert.equal(sel.bounds.min, 1);
    assert.equal(sel.bounds.max, 4);
    assert.equal(sel[0], t1.sliceGroup.slices[0]);

    sel.push(t1.sliceGroup.slices[1]);
    assert.equal(sel.bounds.min, 1);
    assert.equal(sel.bounds.max, 6);
    assert.equal(sel[1], t1.sliceGroup.slices[1]);

    sel.clear();
    assert.equal(sel.length, 0);
  });

  test('shiftedSelection', function() {
    var model = new tr.Model();
    var p1 = model.getOrCreateProcess(1);
    var t1 = p1.getOrCreateThread(1);
    t1.sliceGroup.pushSlice(
        new tr.model.ThreadSlice('', 'a', 0, 1, {}, 3));
    t1.sliceGroup.pushSlice(
        new tr.model.ThreadSlice('', 'a', 0, 5, {}, 1));

    var viewport = new tr.c.TimelineViewport();
    var track = new tr.c.tracks.SliceTrack(viewport);
    viewport.modelTrackContainer = track;
    track.slices = t1.sliceGroup.slices;

    viewport.rebuildEventToTrackMap();


    var sel = new tr.c.Selection();
    sel.push(t1.sliceGroup.slices[0]);

    var shifted = sel.getShiftedSelection(track.viewport, 1);
    assert.equal(shifted.length, 1);
    assert.equal(shifted[0], t1.sliceGroup.slices[1]);
  });

  test('uniqueContents', function() {
    var sample1 = {guid: 1};
    var sample2 = {guid: 2};

    var selection = new tr.c.Selection();

    selection.push(sample1);
    selection.push(sample2);
    assert.equal(selection.length, 2);

    selection.push(sample1);
    assert.equal(selection.length, 2);
  });

  test('userFriendlyNameSingular', function() {
    var model = new tr.Model();
    var p1 = model.getOrCreateProcess(1);
    var t1 = p1.getOrCreateThread(1);
    t1.sliceGroup.pushSlice(
        new tr.model.ThreadSlice('', 'a', 0, 1, {}, 3));
    var selection = new tr.c.Selection(t1.sliceGroup.slices[0]);
    assert.isDefined(selection.userFriendlyName);
  });

  test('userFriendlyNamePlural', function() {
    var model = new tr.Model();
    var p1 = model.getOrCreateProcess(1);
    var t1 = p1.getOrCreateThread(1);
    t1.sliceGroup.pushSlice(
        new tr.model.ThreadSlice('', 'a', 0, 1, {}, 3));
    t1.sliceGroup.pushSlice(
        new tr.model.ThreadSlice('', 'a', 0, 2, {}, 3));
    var selection = new tr.c.Selection([
        t1.sliceGroup.slices[0],
        t1.sliceGroup.slices[1]
    ]);
    assert.isDefined(selection.userFriendlyName);
  });

  test('userFriendlyNameMixedPlural', function() {
    var model = new tr.Model();
    var p1 = model.getOrCreateProcess(1);
    var t1 = p1.getOrCreateThread(1);
    t1.sliceGroup.pushSlice(
        new tr.model.ThreadSlice('', 'a', 0, 1, {}, 3));
    t1.sliceGroup.pushSlice(
        new tr.model.ThreadSlice('', 'a', 0, 2, {}, 3));

    var i10 = new tr.model.ObjectInstance(
    {}, '0x1000', 'cat', 'name', 10);
    var s10 = i10.addSnapshot(10, {foo: 1});

    var selection = new tr.c.Selection([
        t1.sliceGroup.slices[0],
        s10
    ]);
    assert.isDefined(selection.userFriendlyName);
  });

  test('groupEventsByTitle', function() {
    var model = new tr.Model();
    var p1 = model.getOrCreateProcess(1);
    var t1 = p1.getOrCreateThread(1);
    t1.sliceGroup.pushSlice(
        new tr.model.ThreadSlice('', 'a', 0, 1, {}, 3));
    t1.sliceGroup.pushSlice(
        new tr.model.ThreadSlice('', 'a', 0, 2, {}, 3));
    t1.sliceGroup.pushSlice(
        new tr.model.ThreadSlice('', 'b', 0, 3, {}, 3));
    var selection = new tr.c.Selection([
        t1.sliceGroup.slices[0],
        t1.sliceGroup.slices[1],
        t1.sliceGroup.slices[2]
    ]);

    var eventsByTitle = selection.getEventsOrganizedByTitle();
    assert.equal(2, tr.b.dictionaryLength(eventsByTitle));
    assert.sameMembers(eventsByTitle['a'],
                 [t1.sliceGroup.slices[0], t1.sliceGroup.slices[1]]);
    assert.sameMembers(eventsByTitle['b'],
                 [t1.sliceGroup.slices[2]]);
  });

  test('equals', function() {
    var model = new tr.Model();
    var p1 = model.getOrCreateProcess(1);
    var t1 = p1.getOrCreateThread(1);
    t1.sliceGroup.pushSlice(
        new tr.model.ThreadSlice('', 'a', 0, 1, {}, 3));
    t1.sliceGroup.pushSlice(
        new tr.model.ThreadSlice('', 'b', 0, 2, {}, 3));
    t1.sliceGroup.pushSlice(
        new tr.model.ThreadSlice('', 'c', 0, 3, {}, 3));
    t1.sliceGroup.pushSlice(
        new tr.model.ThreadSlice('', 'd', 0, 4, {}, 5));

    var s1 = new tr.c.Selection([
        t1.sliceGroup.slices[0],
        t1.sliceGroup.slices[1],
        t1.sliceGroup.slices[2]
    ]);
    var s2 = new tr.c.Selection([
        t1.sliceGroup.slices[1],
        t1.sliceGroup.slices[0],
        t1.sliceGroup.slices[2]
    ]);
    var s3 = new tr.c.Selection([
        t1.sliceGroup.slices[1],
        t1.sliceGroup.slices[0],
        t1.sliceGroup.slices[3]
    ]);
    var s4 = new tr.c.Selection([
        t1.sliceGroup.slices[1],
        t1.sliceGroup.slices[0]
    ]);
    assert.isTrue(s1.equals(s2));
    assert.isFalse(s1.equals(s3));
    assert.isFalse(s1.equals(s4));
  });

});
</script>
