<!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="/model/model.html">
<link rel="import" href="/model/model_settings.html">

<script>
'use strict';

tr.b.unittest.testSuite(function() {
  test('process_name_uniqueness_0', function() {
    var model = new tr.Model();
    var p1 = model.getOrCreateProcess(1);
    var settings = new tr.model.ModelSettings(model);
    assert.isFalse(settings.hasUniqueSettingKey(p1));
  });

  test('process_name_uniqueness_1', function() {
    var model = new tr.Model();
    var p1 = model.getOrCreateProcess(1);
    p1.name = 'Browser';
    var settings = new tr.model.ModelSettings(model);
    assert.isTrue(settings.hasUniqueSettingKey(p1));
  });

  test('process_name_uniqueness_2', function() {
    var model = new tr.Model();
    var p1 = model.getOrCreateProcess(1);
    var p2 = model.getOrCreateProcess(2);
    p1.name = 'Renderer';
    p2.name = 'Renderer';
    var settings = new tr.model.ModelSettings(model);
    assert.isFalse(settings.hasUniqueSettingKey(p1));
    assert.isFalse(settings.hasUniqueSettingKey(p2));
  });

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

  test('thread_name_uniqueness_0', function() {
    var model = new tr.Model();
    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 tr.model.ModelSettings(model);
    assert.isTrue(settings.hasUniqueSettingKey(t1));
    assert.isTrue(settings.hasUniqueSettingKey(t2));
  });

  test('thread_name_uniqueness_1', function() {
    var model = new tr.Model();
    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 tr.model.ModelSettings(model);
    assert.isFalse(settings.hasUniqueSettingKey(t1));
    assert.isFalse(settings.hasUniqueSettingKey(t2));
  });

  test('process_persistence_when_not_unique', function() {
    var model = new tr.Model();
    var p1 = model.getOrCreateProcess(1);
    var settings = new tr.model.ModelSettings(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 tr.Model();
    p1 = model.getOrCreateProcess(1);
    settings = new tr.model.ModelSettings(model);
    assert.isTrue(settings.getSettingFor(p1, 'true_by_default', true));
  });

  test('process_persistence_when_not_unique_with_name', function() {
    var model = new tr.Model();
    var p1 = model.getOrCreateProcess(1);
    p1.name = 'Browser';
    var settings = new tr.model.ModelSettings(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 tr.Model();
    p1 = model.getOrCreateProcess(1);
    p1.name = 'Browser';
    settings = new tr.model.ModelSettings(model);
    assert.isFalse(settings.getSettingFor(p1, 'true_by_default', true));
  });

  test('thread_persistence_when_not_unique', function() {
    var model = new tr.Model();
    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 tr.model.ModelSettings(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 tr.Model();
    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 tr.model.ModelSettings(model);
    assert.isTrue(settings.getSettingFor(t1, 'true_by_default', true));
  });

  test('thread_persistence_when_unique', function() {
    var model = new tr.Model();
    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 tr.model.ModelSettings(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 tr.Model();
    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 tr.model.ModelSettings(model);
    assert.isFalse(settings.getSettingFor(t1, 'true_by_default', true));
  });
});
</script>

