// Copyright 2014 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.

'use strict';

// Mock LoadTimeData strings.
window.loadTimeData.data = {
  COPY_PROGRESS_SUMMARY: 'Copying...',
  ERROR_PROGRESS_SUMMARY: '1 Error.',
  ERROR_PROGRESS_SUMMARY_PLURAL: '$1 Errors.'
};
window.loadTimeData.getString = id => {
  return window.loadTimeData.data_[id] || id;
};

function testSimpleProgress() {
  const group = new ProgressCenterItemGroup(/* name */ 'test', /* quite */ false);
  assertEquals(ProgressCenterItemGroup.State.EMPTY, group.state);

  const item = new ProgressCenterItem();
  item.id = 'test-item-1';
  item.message = 'TestItemMessage1';
  item.state = ProgressItemState.PROGRESSING;
  item.progressMax = 1.0;

  // Add an item.
  group.update(item);
  assertFalse(group.isAnimated(item.id));
  assertFalse(group.isSummarizedAnimated());
  assertEquals('TestItemMessage1', group.getItem(item.id).message);
  assertEquals('TestItemMessage1', group.getSummarizedItem(0).message);
  assertEquals(ProgressCenterItemGroup.State.ACTIVE, group.state);

  // Start an animation of the item.
  item.progressValue = 0.5;
  group.update(item);
  assertTrue(group.isAnimated(item.id));
  assertTrue(group.isSummarizedAnimated());
  assertEquals(0.5, group.getItem(item.id).progressValue);
  assertEquals(0.5, group.getSummarizedItem(0).progressValue);
  assertEquals(ProgressCenterItemGroup.State.ACTIVE, group.state);

  // Item is completed, but the animation is still on going.
  item.progressValue = 1.0;
  item.state = ProgressItemState.COMPLETED;
  group.update(item);
  assertTrue(group.isAnimated(item.id));
  assertTrue(group.isSummarizedAnimated());
  assertEquals(100, group.getItem(item.id).progressRateInPercent);
  assertEquals(100, group.getSummarizedItem(0).progressRateInPercent);
  assertEquals(ProgressCenterItemGroup.State.ACTIVE, group.state);

  // The animation of the item is completed.
  group.completeItemAnimation(item.id);
  assertFalse(group.isAnimated(item.id));
  assertTrue(group.isSummarizedAnimated());
  assertEquals(null, group.getItem(item.id));
  assertTrue(!!group.getSummarizedItem(0));
  assertEquals(ProgressCenterItemGroup.State.ACTIVE, group.state);

  // The animation of the summarized item is completed.
  group.completeSummarizedItemAnimation();
  assertEquals(ProgressCenterItemGroup.State.EMPTY, group.state);
}

function testCompleteAnimationDuringProgress() {
  const group = new ProgressCenterItemGroup(/* name */ 'test', /* quite */ false);
  const item = new ProgressCenterItem();
  item.id = 'test-item-1';
  item.message = 'TestItemMessage1';
  item.state = ProgressItemState.PROGRESSING;
  item.progressMax = 1.0;

  // Add an item.
  group.update(item);
  assertFalse(group.isAnimated(item.id));
  assertFalse(group.isSummarizedAnimated());
  assertEquals('TestItemMessage1', group.getItem(item.id).message);
  assertEquals('TestItemMessage1', group.getSummarizedItem(0).message);
  assertEquals(ProgressCenterItemGroup.State.ACTIVE, group.state);

  // Start an animation of the item.
  item.progressValue = 0.5;
  group.update(item);
  assertTrue(group.isAnimated(item.id));
  assertTrue(group.isSummarizedAnimated());
  assertEquals(0.5, group.getItem(item.id).progressValue);
  assertEquals(0.5, group.getSummarizedItem(0).progressValue);
  assertEquals(ProgressCenterItemGroup.State.ACTIVE, group.state);

  // The animation of the item to 50% progress is completed.
  group.completeItemAnimation(item.id);
  assertFalse(group.isAnimated(item.id));
  assertTrue(group.isSummarizedAnimated());
  assertTrue(!!group.getItem(item.id));
  assertTrue(!!group.getSummarizedItem(0));
  assertEquals(ProgressCenterItemGroup.State.ACTIVE, group.state);

  // The animation of the summarized item to 50% progress is completed.
  group.completeSummarizedItemAnimation();
  assertFalse(group.isSummarizedAnimated());
  assertTrue(!!group.getSummarizedItem(0));
  assertEquals(ProgressCenterItemGroup.State.ACTIVE, group.state);

  // The item is completed. The animation to 100% progress starts.
  item.progressValue = 1.0;
  item.state = ProgressItemState.COMPLETED;
  group.update(item);
  assertTrue(group.isAnimated(item.id));
  assertTrue(group.isSummarizedAnimated());
  assertEquals(100, group.getItem(item.id).progressRateInPercent);
  assertEquals(100, group.getSummarizedItem(0).progressRateInPercent);
  assertEquals(ProgressCenterItemGroup.State.ACTIVE, group.state);

  // The animation of the summarized item to 100% progress is completed.
  group.completeSummarizedItemAnimation();
  assertEquals(ProgressCenterItemGroup.State.ACTIVE, group.state);

  // The animation of the item to 100% progress is completed.
  group.completeItemAnimation(item.id);
  assertFalse(group.isAnimated(item.id));
  assertFalse(group.isSummarizedAnimated());
  assertFalse(!!group.getItem(item.id));
  assertFalse(!!group.getSummarizedItem(0));
  assertEquals(ProgressCenterItemGroup.State.EMPTY, group.state);
}

function testAddMaxProgressItem() {
  const group = new ProgressCenterItemGroup(/* name */ 'test', /* quite */ false);
  const item = new ProgressCenterItem();
  item.id = 'test-item-1';
  item.message = 'TestItemMessage1';
  item.state = ProgressItemState.PROGRESSING;
  item.progressMax = 1.0;
  item.progressValue = 1.0;

  // Add an item with 100% progress.
  group.update(item);
  assertFalse(group.isAnimated(item.id));
  assertFalse(group.isSummarizedAnimated());
  assertEquals('TestItemMessage1', group.getItem(item.id).message);
  assertEquals('TestItemMessage1', group.getSummarizedItem(0).message);
  assertEquals(ProgressCenterItemGroup.State.ACTIVE, group.state);

  // Complete the item without animation.
  item.state = ProgressItemState.COMPLETED;
  group.update(item);
  assertFalse(group.isAnimated(item.id));
  assertFalse(group.isSummarizedAnimated());
  assertEquals(null, group.getItem(item.id));
  assertEquals(null, group.getSummarizedItem(0));
  assertEquals(ProgressCenterItemGroup.State.EMPTY, group.state);
}

function testCompleteDuringAnimation() {
  const group = new ProgressCenterItemGroup(/* name */ 'test', /* quite */ false);
  const item = new ProgressCenterItem();
  item.id = 'test-item-1';
  item.message = 'TestItemMessage1';
  item.state = ProgressItemState.PROGRESSING;
  item.progressMax = 1.0;
  item.progressValue = 0.0;

  // Add an item.
  group.update(item);
  assertFalse(group.isAnimated(item.id));
  assertFalse(group.isSummarizedAnimated());
  assertEquals('TestItemMessage1', group.getItem(item.id).message);
  assertEquals('TestItemMessage1', group.getSummarizedItem(0).message);
  assertEquals(ProgressCenterItemGroup.State.ACTIVE, group.state);

  // Update the progress of the item to 100%. The animation starts.
  item.progressValue = 1.0;
  group.update(item);
  assertTrue(group.isAnimated(item.id));
  assertTrue(group.isSummarizedAnimated());
  assertEquals('TestItemMessage1', group.getItem(item.id).message);
  assertEquals('TestItemMessage1', group.getSummarizedItem(0).message);
  assertEquals(ProgressCenterItemGroup.State.ACTIVE, group.state);

  // Complete the item. The animation is still on going.
  item.state = ProgressItemState.COMPLETED;
  group.update(item);
  assertTrue(group.isAnimated(item.id));
  assertTrue(group.isSummarizedAnimated());
  assertTrue(!!group.getItem(item.id));
  assertTrue(!!group.getSummarizedItem(0));
  assertEquals(ProgressCenterItemGroup.State.ACTIVE, group.state);
}

function testTwoItems() {
  const group = new ProgressCenterItemGroup(/* name */ 'test', /* quite */ false);
  const item1 = new ProgressCenterItem();
  item1.id = 'test-item-1';
  item1.message = 'TestItemMessage1';
  item1.state = ProgressItemState.PROGRESSING;
  item1.progressMax = 1.0;
  item1.progressValue = 0.0;
  item1.type = ProgressItemType.COPY;

  const item2 = new ProgressCenterItem();
  item2.id = 'test-item-2';
  item2.message = 'TestItemMessage2';
  item2.state = ProgressItemState.PROGRESSING;
  item2.progressMax = 2.0;
  item2.progressValue = 1.0;
  item2.type = ProgressItemType.COPY;

  // Item 1 is added.
  group.update(item1);
  assertFalse(group.isAnimated(item1.id));
  assertFalse(group.isSummarizedAnimated());
  assertEquals('TestItemMessage1', group.getItem(item1.id).message);
  assertEquals('TestItemMessage1', group.getSummarizedItem(0).message);
  assertEquals(ProgressCenterItemGroup.State.ACTIVE, group.state);

  // Item 2 is added.
  group.update(item2);
  assertFalse(group.isAnimated(item1.id));
  assertFalse(group.isAnimated(item2.id));
  assertTrue(group.isSummarizedAnimated());
  assertEquals('TestItemMessage1', group.getItem(item1.id).message);
  assertEquals('TestItemMessage2', group.getItem(item2.id).message);
  assertEquals('Copying...', group.getSummarizedItem(0).message);
  assertEquals('Copying... 1 Error.', group.getSummarizedItem(1).message);
  assertEquals('Copying... 2 Errors.', group.getSummarizedItem(2).message);
  assertEquals(3.0, group.getSummarizedItem(0).progressMax);
  assertEquals(1.0, group.getSummarizedItem(0).progressValue);
  assertEquals(ProgressCenterItemGroup.State.ACTIVE, group.state);

  // Item 1 is completed.
  item1.state = ProgressItemState.COMPLETED;
  item1.progressValue = 1.0;
  group.update(item1);
  assertTrue(group.isAnimated(item1.id));
  assertFalse(group.isAnimated(item2.id));
  assertTrue(group.isSummarizedAnimated());
  assertEquals('Copying...', group.getSummarizedItem(0).message);
  assertEquals(3.0, group.getSummarizedItem(0).progressMax);
  assertEquals(2.0, group.getSummarizedItem(0).progressValue);
  assertEquals(ProgressCenterItemGroup.State.ACTIVE, group.state);

  // Item 1's animation is completed.
  group.completeItemAnimation(item1.id);
  assertFalse(group.isAnimated(item1.id));
  assertTrue(group.isSummarizedAnimated());
  assertEquals('TestItemMessage2', group.getSummarizedItem(0).message);
  assertEquals(3.0, group.getSummarizedItem(0).progressMax);
  assertEquals(2.0, group.getSummarizedItem(0).progressValue);
  assertFalse(!!group.getItem(item1.id));
  assertTrue(!!group.getItem(item2.id));

  // Item 2 is completed.
  item2.state = ProgressItemState.COMPLETED;
  item2.progressValue = 2.0;
  group.update(item2);
  assertTrue(group.isSummarizedAnimated());
  assertEquals('TestItemMessage2', group.getSummarizedItem(0).message);
  assertEquals(ProgressItemState.COMPLETED, group.getSummarizedItem(0).state);
  assertEquals(3.0, group.getSummarizedItem(0).progressMax);
  assertEquals(3.0, group.getSummarizedItem(0).progressValue);
  assertTrue(!!group.getItem(item2.id));

  // Item 2's animation is completed.
  group.completeItemAnimation(item2.id);
  assertFalse(group.isAnimated(item2.id));
  assertFalse(!!group.getItem(item2.id));
  assertEquals(3.0, group.getSummarizedItem(0).progressMax);
  assertEquals(3.0, group.getSummarizedItem(0).progressValue);
  assertEquals(ProgressItemState.COMPLETED, group.getSummarizedItem(0).state);
  assertTrue(group.isSummarizedAnimated());
  assertEquals(ProgressCenterItemGroup.State.ACTIVE, group.state);

  // Summarized item's animation is completed.
  group.completeSummarizedItemAnimation();
  assertFalse(!!group.getSummarizedItem(0));
  assertFalse(group.isSummarizedAnimated());
  assertEquals(ProgressCenterItemGroup.State.EMPTY, group.state);
}

function testOneError() {
  const group = new ProgressCenterItemGroup(/* name */ 'test', /* quite */ false);
  const item1 = new ProgressCenterItem();
  item1.id = 'test-item-1';
  item1.message = 'TestItemMessage1';
  item1.state = ProgressItemState.PROGRESSING;
  item1.progressMax = 2.0;
  item1.progressValue = 1.0;
  item1.type = ProgressItemType.COPY;

  // Item 1 is added.
  group.update(item1);

  // Item 1 becomes error.
  item1.message = "Error.";
  item1.state = ProgressItemState.ERROR;
  group.update(item1);

  assertTrue(!!group.getItem(item1.id));
  assertFalse(group.isAnimated(item1.id));
  assertEquals(null, group.getSummarizedItem(0));
  assertFalse(group.isSummarizedAnimated());
  assertEquals(ProgressCenterItemGroup.State.INACTIVE, group.state);

  // Add another item without dismissing the error item.
  const item2 = new ProgressCenterItem();
  item2.id = 'test-item-2';
  item2.message = 'TestItemMessage2';
  item2.state = ProgressItemState.PROGRESSING;
  item2.progressMax = 4.0;
  item2.progressValue = 1.0;
  item2.type = ProgressItemType.COPY;

  // Item 2 is added.
  group.update(item2);

  assertTrue(!!group.getItem(item1.id));
  assertTrue(!!group.getItem(item2.id));
  assertEquals('Copying... 1 Error.', group.getSummarizedItem(0).message);
  assertEquals(4.0, group.getSummarizedItem(0).progressMax);
  assertEquals(1.0, group.getSummarizedItem(0).progressValue);
  assertEquals(ProgressCenterItemGroup.State.ACTIVE, group.state);

  // Dismiss the error item.
  group.dismissErrorItem(item1.id);

  assertFalse(!!group.getItem(item1.id));
  assertTrue(!!group.getItem(item2.id));
  assertEquals('TestItemMessage2', group.getSummarizedItem(0).message);
  assertEquals(4.0, group.getSummarizedItem(0).progressMax);
  assertEquals(1.0, group.getSummarizedItem(0).progressValue);
  assertEquals(ProgressCenterItemGroup.State.ACTIVE, group.state);
}

function testOneItemWithError() {
  const group = new ProgressCenterItemGroup(/* name */ 'test', /* quite */ false);
  const item1 = new ProgressCenterItem();
  item1.id = 'test-item-1';
  item1.message = 'TestItemMessage1';
  item1.state = ProgressItemState.PROGRESSING;
  item1.progressMax = 1.0;
  item1.progressValue = 0.0;
  item1.type = ProgressItemType.COPY;

  const item2 = new ProgressCenterItem();
  item2.id = 'test-item-2';
  item2.message = 'TestItemMessage2';
  item2.state = ProgressItemState.PROGRESSING;
  item2.progressMax = 2.0;
  item2.progressValue = 1.0;
  item2.type = ProgressItemType.COPY;

  // Item 1 is added.
  group.update(item1);

  // Item 2 is added.
  group.update(item2);

  // Item 2 becomes error.
  item2.state = ProgressItemState.ERROR;
  item2.message = 'Error message.';
  group.update(item2);
  assertFalse(group.isAnimated(item1.id));
  assertFalse(group.isAnimated(item2.id));
  assertFalse(group.isSummarizedAnimated());
  assertEquals('Copying... 1 Error.', group.getSummarizedItem(0).message);
  assertEquals('Copying... 2 Errors.', group.getSummarizedItem(1).message);
  assertEquals(1.0, group.getSummarizedItem(0).progressMax);
  assertEquals(0.0, group.getSummarizedItem(0).progressValue);
  assertEquals(ProgressCenterItemGroup.State.ACTIVE, group.state);

  // Item 1 is completed.
  item1.state = ProgressItemState.COMPLETED;
  item1.progressValue = 1.0;
  group.update(item1);
  assertTrue(group.isAnimated(item1.id));
  assertFalse(group.isAnimated(item2.id));
  assertTrue(group.isSummarizedAnimated());
  assertEquals('Copying... 1 Error.', group.getSummarizedItem(0).message);
  assertEquals(1.0, group.getSummarizedItem(0).progressMax);
  assertEquals(1.0, group.getSummarizedItem(0).progressValue);
  assertEquals(ProgressCenterItemGroup.State.ACTIVE, group.state);

  // Item 1's animation is completed.
  group.completeItemAnimation(item1.id);
  // Summarized item's animation is completed.
  group.completeSummarizedItemAnimation();

  assertFalse(group.isAnimated(item1.id));
  assertFalse(group.isSummarizedAnimated());
  assertFalse(!!group.getSummarizedItem(0));
  assertEquals('Error message.',
               ProgressCenterItemGroup.getSummarizedErrorItem(group).message);
  assertEquals('2 Errors.',
               ProgressCenterItemGroup.getSummarizedErrorItem(
                   group, group).message);
  assertFalse(!!group.getItem(item1.id));
  assertTrue(!!group.getItem(item2.id));

  assertEquals('Error message.',
               ProgressCenterItemGroup.getSummarizedErrorItem(group).message);
  assertFalse(group.isSummarizedAnimated());
  assertEquals(ProgressCenterItemGroup.State.INACTIVE, group.state);

  // Dismiss error item.
  group.dismissErrorItem(item2.id);
  assertFalse(!!group.getItem(item2.id));
  assertEquals(ProgressCenterItemGroup.State.EMPTY, group.state);
}

function testOneItemWithErrorDuringAnimation() {
  const group = new ProgressCenterItemGroup(/* name */ 'test', /* quite */ false);
  const item1 = new ProgressCenterItem();
  item1.id = 'test-item-1';
  item1.message = 'TestItemMessage1';
  item1.state = ProgressItemState.PROGRESSING;
  item1.progressMax = 1.0;
  item1.progressValue = 0.0;
  item1.type = ProgressItemType.COPY;

  const item2 = new ProgressCenterItem();
  item2.id = 'test-item-2';
  item2.message = 'TestItemMessage2';
  item2.state = ProgressItemState.PROGRESSING;
  item2.progressMax = 2.0;
  item2.progressValue = 1.0;
  item2.type = ProgressItemType.COPY;

  // Item 1 is added.
  group.update(item1);

  // Item 2 is added.
  group.update(item2);

  // Item 2 starts an animation.
  item2.progressValue = 1.5;
  group.update(item2);
  assertTrue(group.isAnimated(item2.id));
  assertTrue(group.isSummarizedAnimated());

  // Item 2 enters the error state.
  item2.state = ProgressItemState.ERROR;
  item2.message = 'Error message.';
  group.update(item2);
  assertFalse(group.isAnimated(item2.id));
  assertFalse(group.isSummarizedAnimated());
  assertEquals('Copying... 1 Error.', group.getSummarizedItem(0).message);
  assertEquals('Copying... 2 Errors.', group.getSummarizedItem(1).message);
  assertEquals(1.0, group.getSummarizedItem(0).progressMax);
  assertEquals(0.0, group.getSummarizedItem(0).progressValue);
  assertEquals(ProgressCenterItemGroup.State.ACTIVE, group.state);
}

function testTwoErrors() {
  const group = new ProgressCenterItemGroup(/* name */ 'test', /* quite */ false);
  const item1 = new ProgressCenterItem();
  item1.id = 'test-item-1';
  item1.message = 'Error message 1';
  item1.state = ProgressItemState.ERROR;
  item1.type = ProgressItemType.COPY;

  const item2 = new ProgressCenterItem();
  item2.id = 'test-item-2';
  item2.message = 'Error message 2';
  item2.state = ProgressItemState.ERROR;
  item2.type = ProgressItemType.COPY;

  // Add an error item.
  group.update(item1);
  assertFalse(group.isAnimated(item1.id));
  assertFalse(group.isSummarizedAnimated());
  assertEquals('Error message 1',
               ProgressCenterItemGroup.getSummarizedErrorItem(group).message);
  assertEquals(ProgressCenterItemGroup.State.INACTIVE, group.state);

  // Add another error item.
  group.update(item2);
  assertTrue(!!group.getItem(item1.id));
  assertTrue(!!group.getItem(item2.id));
  assertFalse(group.isAnimated(item2.id));
  assertFalse(group.isSummarizedAnimated());
  assertEquals('2 Errors.',
               ProgressCenterItemGroup.getSummarizedErrorItem(group).message);
  assertEquals(ProgressCenterItemGroup.State.INACTIVE, group.state);

  // Dismiss Error message 1.
  group.dismissErrorItem(item1.id);

  assertFalse(!!group.getItem(item1.id));
  assertTrue(!!group.getItem(item2.id));
  assertEquals('Error message 2',
      ProgressCenterItemGroup.getSummarizedErrorItem(group).message);
  assertEquals(ProgressCenterItemGroup.State.INACTIVE, group.state);
}

function testCancel() {
  const group = new ProgressCenterItemGroup(/* name */ 'test', /* quite */ false);
  const item = new ProgressCenterItem();
  item.id = 'test-item-1';
  item.message = 'TestItemMessage1';
  item.state = ProgressItemState.PROGRESSING;
  item.progressMax = 1.0;
  item.progressValue = 0.0;
  item.type = ProgressItemType.COPY;

  // Add an item.
  group.update(item);

  // Start an animation of the item.
  item.progressValue = 0.5;
  group.update(item);

  // Cancel the item.
  item.state = ProgressItemState.CANCELED;
  group.update(item);
  assertFalse(group.isAnimated(item.id));
  assertFalse(group.isSummarizedAnimated());
  assertEquals(null, group.getItem(item.id));
  assertEquals(null, group.getSummarizedItem(0));
  assertEquals(ProgressCenterItemGroup.State.EMPTY, group.state);
}

function testCancelWithError() {
  const group = new ProgressCenterItemGroup(/* name */ 'test', /* quite */ false);
  const item1 = new ProgressCenterItem();
  item1.id = 'test-item-1';
  item1.message = 'TestItemMessage1';
  item1.state = ProgressItemState.PROGRESSING;
  item1.progressMax = 1.0;
  item1.progressValue = 0.0;
  item1.type = ProgressItemType.COPY;

  const item2 = new ProgressCenterItem();
  item2.id = 'test-item-2';
  item2.message = 'Error message 2';
  item2.state = ProgressItemState.ERROR;
  item2.type = ProgressItemType.COPY;

  // Add an item.
  group.update(item1);

  // Start an animation of the item.
  item1.progressValue = 0.5;
  group.update(item1);

  // Add an error item.
  group.update(item2);

  // Cancel the item.
  item1.state = ProgressItemState.CANCELED;
  group.update(item1);
  assertFalse(group.isAnimated(item1.id));
  assertFalse(group.isAnimated(item2.id));
  assertFalse(group.isSummarizedAnimated());
  assertEquals(null, group.getItem(item1.id));
  assertTrue(!!group.getItem(item2.id));
  assertEquals(null, group.getSummarizedItem(0));
  assertEquals('Error message 2',
               ProgressCenterItemGroup.getSummarizedErrorItem(group).message);
  assertEquals(ProgressCenterItemGroup.State.INACTIVE, group.state);
}

function testQuietItem() {
  const group = new ProgressCenterItemGroup(/* name */ 'test', /* quite */ true);
  const item = new ProgressCenterItem();
  item.id = 'test-item-1';
  item.message = 'TestItemMessage1';
  item.state = ProgressItemState.PROGRESSING;
  item.progressMax = 1.0;
  item.quiet = true;

  // Add an item.
  group.update(item);
  assertFalse(group.isAnimated(item.id));
  assertFalse(group.isSummarizedAnimated());
  assertEquals(ProgressCenterItemGroup.State.ACTIVE, group.state);

  // Start an animation of the item.
  item.progressValue = 0.5;
  group.update(item);
  assertTrue(group.isAnimated(item.id));
  // Summarized item should not animated because the panel does not show
  // progress bar for quiet and summarized item.
  assertFalse(group.isSummarizedAnimated());
  assertEquals(0.5, group.getItem(item.id).progressValue);
  assertEquals(0.5, group.getSummarizedItem(0).progressValue);
  assertEquals(ProgressCenterItemGroup.State.ACTIVE, group.state);

  // Item is completed, but the animation is still on going.
  item.progressValue = 1.0;
  item.state = ProgressItemState.COMPLETED;
  group.update(item);
  assertTrue(group.isAnimated(item.id));
  assertFalse(group.isSummarizedAnimated());
  assertEquals(100, group.getItem(item.id).progressRateInPercent);
  assertEquals(100, group.getSummarizedItem(0).progressRateInPercent);
  assertEquals(ProgressCenterItemGroup.State.ACTIVE, group.state);

  // The animation of the item is completed.
  group.completeItemAnimation(item.id);
  assertFalse(group.isAnimated(item.id));
  assertFalse(group.isSummarizedAnimated());
  assertEquals(null, group.getItem(item.id));
  assertFalse(!!group.getSummarizedItem(0));
  assertEquals(ProgressCenterItemGroup.State.EMPTY, group.state);
}
