// Copyright 2015 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

/**
 * @fileoverview Jasmine test file for process_log.js.
 */

describe('ProcessLog', function() {
  var doc;
  var managerDiv;

  beforeEach((function() {
    doc = document;
    managerDiv = doc.createElement('div');
    managerDiv.className = 'managers';
    var fileInput = document.createElement('input');
    fileInput.type = 'file';
    fileInput.id = 'file_name';
    managerDiv.appendChild(fileInput);
    doc.body.appendChild(managerDiv);
  }));

  afterEach((function() {
    managerDiv.parentNode.removeChild(managerDiv);
    doc = null;
    managerDiv = null;
  }));

  it('should properly clean up when a new file is selected', function() {
    var checkDiv;
    var child1 = doc.createElement('h2');
    managerDiv.appendChild(child1);
    checkDiv = document.getElementsByClassName('managers');
    expect(checkDiv[0].childNodes.length).toBe(2);

    cleanupForNewFile();
    checkDiv = document.getElementsByClassName('managers');
    expect(checkDiv[0].hasChildNodes()).toBe(false);
  });

  it('should not process a log when a file is not selected', function() {
    var readFileSpy = jasmine.createSpy('readFile');
    parseFile();
    expect(readFileSpy.calls.any()).toEqual(false);
  });

  it('should add end state for supplicant states for Android logs',
      function() {
    var logSummary = new LogSummary();
    var wsm = new WifiStateMachine(0, 0, 0);
    logSummary.wifiStateMachines = [wsm];
    wsm.endTime = 10;

    wsm.supplicantStates.push({'x': 0, 'y': 'SCANNING'});
    wsm.supplicantStates.push({'x': 1, 'y': 'SCANNING'});
    wsm.supplicantStates.push({'x': 1, 'y': 'ASSOCIATING'});

    spyOn(androidStateGraph, 'createGraph');  // Mock out call

    displayAndroidLogSummary(logSummary);

    expect(wsm.supplicantStates.length).toBe(4);
    expect(wsm.supplicantStates[3].x).toBe(10);
    expect(wsm.supplicantStates[3].y).toBe('ASSOCIATING');
  });

  it('should add end state for single supplicant state for Android logs',
      function() {
    var logSummary = new LogSummary();
    var wsm = new WifiStateMachine(0, 0, 0);
    logSummary.wifiStateMachines = [wsm];
    wsm.endTime = 10;

    wsm.supplicantStates.push({'x': 0, 'y': 'SCANNING'});

    spyOn(androidStateGraph, 'createGraph');

    displayAndroidLogSummary(logSummary);

    expect(wsm.supplicantStates.length).toBe(2);
    expect(wsm.supplicantStates[1].x).toBe(10);
    expect(wsm.supplicantStates[1].y).toBe('SCANNING');
  });

  it('should add end state for WifiStateMachine states for Android logs',
      function() {
    var logSummary = new LogSummary();
    var wsm = new WifiStateMachine(0, 0, 0);
    logSummary.wifiStateMachines = [wsm];
    wsm.endTime = 10;

    wsm.networkDetailedStates.push({'x': 0, 'y': 'SCANNING'});
    wsm.networkDetailedStates.push({'x': 1, 'y': 'SCANNING'});
    wsm.networkDetailedStates.push({'x': 1, 'y': 'ASSOCIATING'});

    spyOn(androidStateGraph, 'createGraph');

    displayAndroidLogSummary(logSummary);

    expect(wsm.networkDetailedStates.length).toBe(4);
    expect(wsm.networkDetailedStates[3].x).toBe(10);
    expect(wsm.networkDetailedStates[3].y).toBe('ASSOCIATING');
  });

  it('should add end state for single WifiStateMachine state for Android logs',
      function() {
    var logSummary = new LogSummary();
    var wsm = new WifiStateMachine(0, 0, 0);
    logSummary.wifiStateMachines = [wsm];
    wsm.endTime = 10;

    wsm.networkDetailedStates.push({'x': 0, 'y': 'SCANNING'});

    spyOn(androidStateGraph, 'createGraph');

    displayAndroidLogSummary(logSummary);

    expect(wsm.networkDetailedStates.length).toBe(2);
    expect(wsm.networkDetailedStates[1].x).toBe(10);
    expect(wsm.networkDetailedStates[1].y).toBe('SCANNING');
  });

  it('should add end state for supplicant states for shill logs',
      function() {
    var logSummary = new LogSummary();
    var manager = new Manager(0, 0, 0);
    logSummary.managers = [manager];
    manager.endTime = 10;

    manager.supplicantStates.push({'x': 0, 'y': 'SCANNING'});
    manager.supplicantStates.push({'x': 1, 'y': 'SCANNING'});
    manager.supplicantStates.push({'x': 1, 'y': 'ASSOCIATING'});

    spyOn(stateGraph, 'createGraph');

    displayLogSummary(logSummary);

    expect(manager.supplicantStates.length).toBe(4);
    expect(manager.supplicantStates[3].x).toBe(10);
    expect(manager.supplicantStates[3].y).toBe('ASSOCIATING');
  });

  it('should add end state for single supplicant state for shill logs',
      function() {
    var logSummary = new LogSummary();
    var manager = new Manager(0, 0, 0);
    logSummary.managers = [manager];
    manager.endTime = 10;

    manager.supplicantStates.push({'x': 0, 'y': 'SCANNING'});

    spyOn(stateGraph, 'createGraph');

    displayLogSummary(logSummary);

    expect(manager.supplicantStates.length).toBe(2);
    expect(manager.supplicantStates[1].x).toBe(10);
    expect(manager.supplicantStates[1].y).toBe('SCANNING');
  });

  it('should add end state for service states for shill logs',
      function() {
    var logSummary = new LogSummary();
    var manager = new Manager(0, 0, 0);
    logSummary.managers = [manager];
    manager.endTime = 10;
    var service = new Service(0);
    service.isActive = true;

    service.graphData.push({'x': 0, 'y': 'SCANNING'});
    service.graphData.push({'x': 1, 'y': 'SCANNING'});
    service.graphData.push({'x': 1, 'y': 'ASSOCIATING'});
    manager.services.push(service);

    spyOn(stateGraph, 'createGraph');

    displayLogSummary(logSummary);

    expect(service.graphData.length).toBe(4);
    expect(service.graphData[3].x).toBe(10);
    expect(service.graphData[3].y).toBe('ASSOCIATING');
  });

  it('should add end state for single service state for shill logs',
      function() {
    var logSummary = new LogSummary();
    var manager = new Manager(0, 0, 0);
    logSummary.managers = [manager];
    manager.endTime = 10;
    var service = new Service(0);
    service.isActive = true;

    service.graphData.push({'x': 0, 'y': 'SCANNING'});
    manager.services.push(service);

    spyOn(stateGraph, 'createGraph');

    displayLogSummary(logSummary);

    expect(service.graphData.length).toBe(2);
    expect(service.graphData[1].x).toBe(10);
    expect(service.graphData[1].y).toBe('SCANNING');
  });

});
