@@ -53,6 +53,135 @@ describe('.from()', () => {
5353 } ) ;
5454} ) ;
5555
56+ describe ( '.at()' , ( ) => {
57+ describe ( 'collapsed' , ( ) => {
58+ test ( 'can set caret to absolute start' , ( ) => {
59+ const { peritext} = setup ( ) ;
60+ const range = peritext . rangeAt ( 0 ) ;
61+ expect ( range . start . isAbsStart ( ) ) . toBe ( true ) ;
62+ expect ( range . end . isAbsStart ( ) ) . toBe ( true ) ;
63+ expect ( range . start ) . not . toBe ( range . end ) ;
64+ } ) ;
65+
66+ test ( 'can set caret to various text positions' , ( ) => {
67+ const { peritext} = setup ( ) ;
68+ const length = peritext . str . length ( ) ;
69+ for ( let i = 1 ; i <= length ; i ++ ) {
70+ const range = peritext . rangeAt ( i ) ;
71+ expect ( range . start . viewPos ( ) ) . toBe ( i ) ;
72+ expect ( range . end . viewPos ( ) ) . toBe ( i ) ;
73+ expect ( range . start ) . not . toBe ( range . end ) ;
74+ }
75+ } ) ;
76+
77+ test ( 'truncates lower bound' , ( ) => {
78+ const { peritext} = setup ( ) ;
79+ const range = peritext . rangeAt ( - 123 ) ;
80+ expect ( range . start . isAbsStart ( ) ) . toBe ( true ) ;
81+ } ) ;
82+
83+ test ( 'truncates upper bound' , ( ) => {
84+ const { peritext} = setup ( ) ;
85+ const range = peritext . rangeAt ( 123 ) ;
86+ expect ( range . start . viewPos ( ) ) . toBe ( peritext . str . length ( ) ) ;
87+ } ) ;
88+ } ) ;
89+
90+ describe ( 'expanded' , ( ) => {
91+ test ( 'can select first character' , ( ) => {
92+ const { peritext} = setup ( ) ;
93+ const range = peritext . rangeAt ( 0 , 1 ) ;
94+ expect ( range . length ( ) ) . toBe ( 1 ) ;
95+ expect ( range . text ( ) ) . toBe ( 'H' ) ;
96+ expect ( range . start . anchor ) . toBe ( Anchor . Before ) ;
97+ expect ( range . end . anchor ) . toBe ( Anchor . After ) ;
98+ expect ( range . start . id . time ) . toBe ( range . end . id . time ) ;
99+ } ) ;
100+
101+ test ( 'can select any combination of characters' , ( ) => {
102+ const { peritext} = setupEvenDeleted ( ) ;
103+ const length = peritext . str . length ( ) ;
104+ for ( let i = 0 ; i < length ; i ++ ) {
105+ for ( let j = 1 ; j <= length - i ; j ++ ) {
106+ const range = peritext . rangeAt ( i , j ) ;
107+ expect ( range . length ( ) ) . toBe ( j ) ;
108+ expect ( range . text ( ) ) . toBe ( peritext . str . view ( ) . slice ( i , i + j ) ) ;
109+ expect ( range . start . anchor ) . toBe ( Anchor . Before ) ;
110+ expect ( range . end . anchor ) . toBe ( Anchor . After ) ;
111+ }
112+ }
113+ } ) ;
114+
115+ test ( 'truncates lower bound' , ( ) => {
116+ const { peritext} = setup ( ) ;
117+ const range = peritext . rangeAt ( - 2 , 5 ) ;
118+ expect ( range . text ( ) ) . toBe ( 'Hel' ) ;
119+ expect ( range . start . isRelStart ( ) ) . toBe ( true ) ;
120+ expect ( range . end . anchor ) . toBe ( Anchor . After ) ;
121+ } ) ;
122+
123+ test ( 'truncates upper bound' , ( ) => {
124+ const { peritext} = setup ( ) ;
125+ const range = peritext . rangeAt ( 2 , peritext . str . length ( ) + 10 ) ;
126+ expect ( range . text ( ) ) . toBe ( 'llo world!' ) ;
127+ expect ( range . start . anchor ) . toBe ( Anchor . Before ) ;
128+ expect ( range . end . isRelEnd ( ) ) . toBe ( true ) ;
129+ } ) ;
130+
131+ test ( 'truncates lower and upper bounds to select all text' , ( ) => {
132+ const { peritext} = setup ( ) ;
133+ const range = peritext . rangeAt ( - 123 , 256 ) ;
134+ expect ( range . text ( ) ) . toBe ( 'Hello world!' ) ;
135+ expect ( range . start . isRelStart ( ) ) . toBe ( true ) ;
136+ expect ( range . end . isRelEnd ( ) ) . toBe ( true ) ;
137+ } ) ;
138+
139+ describe ( 'when negative size' , ( ) => {
140+ test ( 'can select range backwards' , ( ) => {
141+ const { peritext} = setup ( ) ;
142+ const range = peritext . rangeAt ( 2 , - 1 ) ;
143+ expect ( range . text ( ) ) . toBe ( 'e' ) ;
144+ expect ( range . start . anchor ) . toBe ( Anchor . Before ) ;
145+ expect ( range . end . anchor ) . toBe ( Anchor . After ) ;
146+ } ) ;
147+
148+ test ( 'can select range backwards, all combinations' , ( ) => {
149+ const { peritext} = setupEvenDeleted ( ) ;
150+ const length = peritext . str . length ( ) ;
151+ for ( let i = 1 ; i < length ; i ++ ) {
152+ for ( let j = 1 ; j <= i ; j ++ ) {
153+ const range = peritext . rangeAt ( i , - j ) ;
154+ expect ( range . length ( ) ) . toBe ( j ) ;
155+ expect ( range . text ( ) ) . toBe ( peritext . str . view ( ) . slice ( i - j , i ) ) ;
156+ expect ( range . start . anchor ) . toBe ( Anchor . Before ) ;
157+ expect ( range . end . anchor ) . toBe ( Anchor . After ) ;
158+ }
159+ }
160+ } ) ;
161+
162+ test ( 'truncates lower bound' , ( ) => {
163+ const { peritext} = setupEvenDeleted ( ) ;
164+ const range = peritext . rangeAt ( 2 , - 5 ) ;
165+ expect ( range . text ( ) ) . toBe ( '13' ) ;
166+ } ) ;
167+
168+ test ( 'truncates upper bound' , ( ) => {
169+ const { peritext} = setupEvenDeleted ( ) ;
170+ const range = peritext . rangeAt ( 7 , - 4 ) ;
171+ expect ( range . text ( ) ) . toBe ( '79' ) ;
172+ } ) ;
173+
174+ test ( 'truncates upper and lower bounds, can select all text' , ( ) => {
175+ const { peritext} = setupEvenDeleted ( ) ;
176+ const range = peritext . rangeAt ( 10 , - 20 ) ;
177+ expect ( range . text ( ) ) . toBe ( '13579' ) ;
178+ expect ( range . start . isRelStart ( ) ) . toBe ( true ) ;
179+ expect ( range . end . isRelEnd ( ) ) . toBe ( true ) ;
180+ } ) ;
181+ } ) ;
182+ } ) ;
183+ } ) ;
184+
56185describe ( '.clone()' , ( ) => {
57186 test ( 'can clone a range' , ( ) => {
58187 const { peritext} = setup ( ) ;
@@ -185,7 +314,7 @@ describe('.view()', () => {
185314 test ( 'returns correct view' , ( ) => {
186315 const { peritext} = setup ( ) ;
187316 const range = peritext . rangeAt ( 2 , 3 ) ;
188- expect ( range . views ( ) ) . toEqual ( [ 2 , 3 ] ) ;
317+ expect ( range . view ( ) ) . toEqual ( [ 2 , 3 ] ) ;
189318 } ) ;
190319} ) ;
191320
0 commit comments