<!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="/perf_insights/mre/mre_result.html">
<link rel="import" href="/perf_insights_examples/map_startup_info.html">
<link rel="import" href="/tracing/base/iteration_helpers.html">
<link rel="import" href="/tracing/core/test_utils.html">
<link rel="import" href="/tracing/model/thread_slice.html">
<link rel="import" href="/tracing/model/user_model/load_expectation.html">

<script>
'use strict';

tr.b.unittest.testSuite(function() {
  var test_utils = tr.c.TestUtils;

  test('mapperTest', function() {
    var m = test_utils.newModel(function(m) {
      var p1 = m.getOrCreateProcess(1);
      var t2 = p1.getOrCreateThread(2);
      t2.name = 'CrBrowserMain';
      var t2_s1 = test_utils.newSliceEx({
        name: 'Some slice',
        start: 10, duration: 20,
        type: tr.model.ThreadSlice
      });
      t2_s1.parentContainer = t2;
      var t2_s2 = test_utils.newSliceEx({
        name: 'Another slice',
        start: 30, duration: 50,
        type: tr.model.ThreadSlice
      });
      t2_s2.parentContainer = t2;
      t2.sliceGroup.pushSlice(t2_s1);
      t2.sliceGroup.pushSlice(t2_s2);
      var loadIr = new tr.model.um.LoadExpectation(
          m, tr.model.um.LOAD_SUBTYPE_NAMES.STARTUP, 15, 45);
      m.userModel.expectations.push(loadIr);
      loadIr.associatedEvents.push(t2_s1);
      loadIr.associatedEvents.push(t2_s2);
    });

    var result = new pi.mre.MreResult();
    pie.mapStartupInfoForTest(result, m);

    assert.equal(tr.b.dictionaryLength(result.pairs), 1);
    assert.equal(result.failures.length, 0);

    var startupInfo = result.pairs.startup_info;

    assert.equal(startupInfo.browserStartup.min, 10);
    assert.equal(startupInfo.browserStartup.max, 80);
    assert.isFalse(startupInfo.browserStartup.isEmpty);
    assert.isTrue(startupInfo.rendererStartup.isEmpty);
  });

  test('mapperTestEmptyTrace', function() {
    var m = test_utils.newModel();

    var result = new pi.mre.MreResult();
    pie.mapStartupInfoForTest(result, m);

    assert.equal(tr.b.dictionaryLength(result.pairs), 1);
    assert.equal(result.pairs.startup_info, null);
  });

});

</script>
