<!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/trace_model/trace_model.html">
<link rel="import" href="/core/trace_model/trace_model_settings.html">

<script>
'use strict';

tv.b.unittest.testSuite(function() {
  test('process_name_uniqueness_0', function() {
    var model = new tv.c.TraceModel();
    var p1 = model.getOrCreateProcess(1);
    var settings = new tv.c.TraceModelSettings(model);
    assert.isFalse(settings.hasUniqueSettingKey(p1));
  });

  test('process_name_uniqueness_1', function() {
    var model = new tv.c.TraceModel();
    var p1 = model.getOrCreateProcess(1);
    p1.name = 'Browser';
    var settings = new tv.c.TraceModelSettings(model);
    assert.isTrue(settings.hasUniqueSettingKey(p1));
  });

  test('process_name_uniqueness_2', function() {
    var model = new tv.c.TraceModel();
    var p1 = model.getOrCreateProcess(1);
    var p2 = model.getOrCreateProcess(2);
    p1.name = 'Renderer';
    p2.name = 'Renderer';
    var settings = new tv.c.TraceModelSettings(model);
    assert.isFalse(settings.hasUniqueSettingKey(p1));
    assert.isFalse(settings.hasUniqueSettingKey(p2));
  });

  test('process_name_uniqueness_3', function() {
    var model = new tv.c.TraceModel();
    var p1 = model.getOrCreateProcess(1);
    var p2 = model.getOrCreateProcess(2);
    p1.name = 'Renderer';
    p1.labels.push('Google Search');
    p2.name = 'Renderer';
    var settings = new tv.c.TraceModelSettings(model);
    assert.isTrue(settings.hasUniqueSettingKey(p1));
    assert.isTrue(settings.hasUniqueSettingKey(p2));
  });

  test('thread_name_uniqueness_0', function() {
    var model = new tv.c.TraceModel();
    var p1 = model.getOrCreateProcess(1);
    var p2 = model.getOrCreateProcess(2);
    var t1 = p1.getOrCreateThread(1);
    var t2 = p2.getOrCreateThread(2);
    p1.name = 'Browser';
    p2.name = 'Renderer';
    t1.name = 'Main';
    t2.name = 'Main';
    var settings = new tv.c.TraceModelSettings(model);
    assert.isTrue(settings.hasUniqueSettingKey(t1));
    assert.isTrue(settings.hasUniqueSettingKey(t2));
  });

  test('thread_name_uniqueness_1', function() {
    var model = new tv.c.TraceModel();
    var p1 = model.getOrCreateProcess(1);
    var p2 = model.getOrCreateProcess(2);
    var t1 = p1.getOrCreateThread(1);
    var t2 = p2.getOrCreateThread(2);
    p1.name = 'Renderer';
    p2.name = 'Renderer';
    t1.name = 'Main';
    t2.name = 'Main';
    var settings = new tv.c.TraceModelSettings(model);
    assert.isFalse(settings.hasUniqueSettingKey(t1));
    assert.isFalse(settings.hasUniqueSettingKey(t2));
  });

  test('process_persistence_when_not_unique', function() {
    var model = new tv.c.TraceModel();
    var p1 = model.getOrCreateProcess(1);
    var settings = new tv.c.TraceModelSettings(model);
    assert.isTrue(settings.getSettingFor(p1, 'true_by_default', true));

    settings.setSettingFor(p1, 'true_by_default', false);
    assert.isFalse(settings.getSettingFor(p1, 'true_by_default', true));

    // Now, clobber the model, and verify that it didn't persist.
    model = new tv.c.TraceModel();
    p1 = model.getOrCreateProcess(1);
    settings = new tv.c.TraceModelSettings(model);
    assert.isTrue(settings.getSettingFor(p1, 'true_by_default', true));
  });

  test('process_persistence_when_not_unique_with_name', function() {
    var model = new tv.c.TraceModel();
    var p1 = model.getOrCreateProcess(1);
    p1.name = 'Browser';
    var settings = new tv.c.TraceModelSettings(model);
    assert.isTrue(settings.getSettingFor(p1, 'true_by_default', true));

    settings.setSettingFor(p1, 'true_by_default', false);
    assert.isFalse(settings.getSettingFor(p1, 'true_by_default', true));

    // Now, clobber the model, and verify that it persisted.
    model = new tv.c.TraceModel();
    p1 = model.getOrCreateProcess(1);
    p1.name = 'Browser';
    settings = new tv.c.TraceModelSettings(model);
    assert.isFalse(settings.getSettingFor(p1, 'true_by_default', true));
  });

  test('thread_persistence_when_not_unique', function() {
    var model = new tv.c.TraceModel();
    var p1 = model.getOrCreateProcess(1);
    var p2 = model.getOrCreateProcess(2);
    var t1 = p1.getOrCreateThread(1);
    var t2 = p2.getOrCreateThread(2);
    p1.name = 'Renderer';
    p2.name = 'Renderer';
    t1.name = 'Main';
    t2.name = 'Main';
    var settings = new tv.c.TraceModelSettings(model);
    assert.isTrue(settings.getSettingFor(t1, 'true_by_default', true));

    settings.setSettingFor(t1, 'true_by_default', false);
    assert.isFalse(settings.getSettingFor(t1, 'true_by_default', true));

    // Now, clobber the model, and verify that it persisted.
    model = new tv.c.TraceModel();
    p1 = model.getOrCreateProcess(1);
    p2 = model.getOrCreateProcess(2);
    t1 = p1.getOrCreateThread(1);
    t2 = p2.getOrCreateThread(2);
    p1.name = 'Renderer';
    p2.name = 'Renderer';
    t1.name = 'Main';
    t2.name = 'Main';
    settings = new tv.c.TraceModelSettings(model);
    assert.isTrue(settings.getSettingFor(t1, 'true_by_default', true));
  });

  test('thread_persistence_when_unique', function() {
    var model = new tv.c.TraceModel();
    var p1 = model.getOrCreateProcess(1);
    var p2 = model.getOrCreateProcess(2);
    var t1 = p1.getOrCreateThread(1);
    var t2 = p2.getOrCreateThread(2);
    p1.name = 'Browser';
    p2.name = 'Renderer';
    t1.name = 'Main';
    t2.name = 'Main';
    var settings = new tv.c.TraceModelSettings(model);
    assert.isTrue(settings.getSettingFor(t1, 'true_by_default', true));

    settings.setSettingFor(t1, 'true_by_default', false);
    assert.isFalse(settings.getSettingFor(t1, 'true_by_default', true));

    // Now, clobber the model, and verify that it persisted.
    model = new tv.c.TraceModel();
    p1 = model.getOrCreateProcess(1);
    p2 = model.getOrCreateProcess(2);
    t1 = p1.getOrCreateThread(1);
    t2 = p2.getOrCreateThread(2);
    p1.name = 'Browser';
    p2.name = 'Renderer';
    t1.name = 'Main';
    t2.name = 'Main';
    settings = new tv.c.TraceModelSettings(model);
    assert.isFalse(settings.getSettingFor(t1, 'true_by_default', true));
  });
});
</script>

