| // Copyright 2023 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| /** |
| * @fileoverview Tests for text_tasks.ts. |
| */ |
| |
| import {IdleTaskTracker} from '//ios/web/annotations/resources/text_tasks.js'; |
| import {expectEq, fail, FakeTaskTimer, TestSuite} from '//ios/web/annotations/resources/text_test_utils.js'; |
| |
| export class TestTextTasks extends TestSuite { |
| // Checks for proper task timing when there's no user activity recorded. |
| testIdleTaskTrackerNoActivity() { |
| const timer = new FakeTaskTimer(); |
| const tracker = new IdleTaskTracker(timer, 100, 50); |
| let runCount = 0; |
| tracker.schedule(() => { |
| expectEq(timer.now(), 100, 'time at task 1:'); |
| runCount++; |
| }, 100); |
| tracker.schedule(() => { |
| // Asking for 110, but won't run until 50ms after first task. |
| expectEq(timer.now(), 150, 'time at task 2:'); |
| runCount++; |
| }, 110); |
| tracker.schedule(() => { |
| expectEq(timer.now(), 300, 'time at task 3:'); |
| runCount++; |
| }, 300); |
| // Regardless of the number of tasks, only one timer should run. |
| expectEq(timer.timers.size, 1, 'number of timers :'); |
| timer.moveAhead(/* ms= */ 10, /* times= */ 20); // -> 200ms total |
| expectEq(runCount, 2, 'timer run count :'); |
| timer.moveAhead(/* ms= */ 10, /* times= */ 15); // -> 350ms total |
| expectEq(runCount, 3, 'timer run count :'); |
| // No task, no timer. |
| expectEq(timer.timers.size, 0, 'number of timers :'); |
| } |
| |
| // Checks for proper task timing when there is some user activity recorded. |
| testIdleTaskTrackerWithActivity() { |
| const timer = new FakeTaskTimer(); |
| const tracker = new IdleTaskTracker(timer, 100, 50); |
| let runCount = 0; |
| tracker.schedule(() => { |
| expectEq(timer.now(), 100, 'time at task 1:'); |
| runCount++; |
| }, 100); |
| tracker.schedule(() => { |
| // Asking for 110, but won't run until 50ms after first task (at 150ms). |
| // But at 120ms, there is activity, so the next task is pushed back by |
| // 100ms. |
| expectEq(timer.now(), 220, 'time at task 2:'); |
| runCount++; |
| }, 110); |
| // Regardless of the number of tasks, only one timer should run. |
| expectEq(timer.timers.size, 1, 'number of timers :'); |
| timer.moveAhead(/* ms= */ 10, /* times= */ 12); // -> 120ms total |
| expectEq(runCount, 1, 'timer run count :'); |
| const event = new Event('scroll'); |
| window.dispatchEvent(event); |
| timer.moveAhead(/* ms= */ 10, /* times= */ 13); // -> 250ms total |
| expectEq(runCount, 2, 'timer run count :'); |
| // No task, no timer. |
| expectEq(timer.timers.size, 0, 'number of timers :'); |
| } |
| |
| // Checks for proper task timing when there is some user activity recorded |
| // before any task is scheduled. |
| testIdleTaskTrackerWithPreActivity() { |
| const timer = new FakeTaskTimer(); |
| const tracker = new IdleTaskTracker(timer, 100, 10); |
| const event = new Event('scroll'); |
| let runCount = 0; |
| |
| // Before scheduling this should affect anything. |
| window.dispatchEvent(event); |
| tracker.schedule(() => { |
| expectEq(timer.now(), 50, 'time at task 1:'); |
| runCount++; |
| }, 50); |
| timer.moveAhead(/* ms= */ 10, /* times= */ 10); // -> 100ms total |
| expectEq(runCount, 1, 'timer run count :'); |
| expectEq(timer.timers.size, 0, 'number of timers :'); |
| |
| // Now start prechecks for activity with nothing scheduled. |
| tracker.startActivityListeners(); |
| timer.moveAhead(/* ms= */ 10, /* times= */ 2); // -> 120ms total |
| window.dispatchEvent(event); |
| timer.moveAhead(/* ms= */ 10, /* times= */ 3); // -> 150ms total |
| // Schedule task for 200ms (150 + 50). |
| tracker.schedule(() => { |
| // But considering the activity at 120ms, this should run at 220ms. |
| expectEq(timer.now(), 220, 'time at task 2:'); |
| runCount++; |
| }, 50); |
| timer.moveAhead(/* ms= */ 10, /* times= */ 10); // -> 250ms total |
| expectEq(runCount, 2, 'timer run count :'); |
| // No task, no timer. |
| expectEq(timer.timers.size, 0, 'number of timers :'); |
| |
| // Stop checks. |
| tracker.stopActivityListeners(); |
| window.dispatchEvent(event); |
| tracker.schedule(() => { |
| expectEq(timer.now(), 300, 'time at task 3:'); |
| runCount++; |
| }, 50); |
| timer.moveAhead(/* ms= */ 10, /* times= */ 7); // -> 320ms total |
| expectEq(runCount, 3, 'timer run count :'); |
| // No task, no timer. |
| expectEq(timer.timers.size, 0, 'number of timers :'); |
| } |
| |
| // Tests for proper cleanup when shutdown if called. |
| testIdleTaskTrackerShutdown() { |
| const timer = new FakeTaskTimer(); |
| const tracker = new IdleTaskTracker(timer, 100, 10); |
| tracker.schedule(() => { |
| fail('task should not run'); |
| }, 50); |
| timer.moveAhead(/* ms= */ 10, /* times= */ 4); // -> 40ms total |
| tracker.shutdown(); |
| timer.moveAhead(/* ms= */ 10, /* times= */ 6); // -> 100ms total |
| expectEq(timer.timers.size, 0, 'number of timers :'); |
| } |
| } |