| // 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_annotation_list.ts. |
| */ |
| |
| import type {TextViewportAnnotation} from '//ios/web/annotations/resources/text_annotation_list.js'; |
| import {TextAnnotationList} from '//ios/web/annotations/resources/text_annotation_list.js'; |
| import {expectEq, TestSuite} from '//ios/web/annotations/resources/text_test_utils.js'; |
| |
| export class TestTextAnnotationList extends TestSuite { |
| annotation(start: number, end: number): TextViewportAnnotation { |
| return {start, end, text: '', type: 'EMAIL', data: '#' + start}; |
| } |
| |
| // Tests that annotation are sorted properly and that, for overlapping |
| // annotations, only one survives. |
| testTextAnnotationListSortAndOverlap() { |
| const list = new TextAnnotationList([ |
| this.annotation(10, 20), // Should be removed |
| this.annotation(5, 15), // Should be first |
| this.annotation(50, 60), // Should be third and last |
| this.annotation(35, 45), // Should be removed |
| this.annotation(30, 40), // Should be second |
| ]); |
| expectEq(false, list.done); |
| expectEq(list.currentAnnotation!.start, 5); |
| list.next(); |
| expectEq(false, list.done); |
| expectEq(list.currentAnnotation!.start, 30); |
| list.next(); |
| expectEq(false, list.done); |
| expectEq(list.currentAnnotation!.start, 50); |
| list.next(); |
| expectEq(true, list.done); |
| |
| expectEq(3, list.successes); |
| expectEq(2, list.failures); |
| expectEq(2, list.cancelled.length); |
| expectEq('#10', list.cancelled[0]!.data); |
| expectEq('#35', list.cancelled[1]!.data); |
| } |
| |
| // Tests that annotation are clipped properly. |
| testTextAnnotationListClip() { |
| const list = new TextAnnotationList( |
| [ |
| this.annotation(10, 20), |
| this.annotation(30, 40), |
| this.annotation(50, 60), |
| this.annotation(70, 80), |
| this.annotation(90, 100), |
| ], |
| 35, 75); |
| expectEq(list.currentAnnotation!.start, 30); |
| list.next(); |
| expectEq(list.currentAnnotation!.start, 50); |
| list.next(); |
| expectEq(list.currentAnnotation!.start, 70); |
| list.next(); |
| expectEq(true, list.done); |
| |
| expectEq(3, list.successes); |
| expectEq(2, list.failures); |
| expectEq(2, list.cancelled.length); |
| expectEq('#10', list.cancelled[0]!.data); |
| expectEq('#90', list.cancelled[1]!.data); |
| } |
| |
| // Tests `next`, `skip` and `fail` cursor movers. |
| testTextAnnotationListSkipFail() { |
| const list = new TextAnnotationList([ |
| this.annotation(10, 20), |
| this.annotation(30, 40), |
| this.annotation(50, 60), |
| this.annotation(70, 80), |
| this.annotation(90, 100), |
| ]); |
| expectEq(list.currentAnnotation!.start, 10); |
| list.next(); |
| expectEq(list.currentAnnotation!.start, 30); |
| list.skip(); |
| expectEq(list.currentAnnotation!.start, 50); |
| list.next(); |
| expectEq(list.currentAnnotation!.start, 70); |
| list.fail(); |
| expectEq(true, list.done); |
| |
| expectEq(2, list.successes); |
| expectEq(3, list.failures); |
| expectEq(3, list.cancelled.length); |
| expectEq('#30', list.cancelled[0]!.data); |
| expectEq('#70', list.cancelled[1]!.data); |
| expectEq('#90', list.cancelled[2]!.data); |
| } |
| } |