@@ -287,4 +287,235 @@ public void testEmbeddedLinkFollowedByComma() throws Exception
287287 assertEquals (", bar" , fragments .get (2 ).toString ());
288288 assertFalse (fragments .get (2 ).isLink ());
289289 }
290+
291+ @ Test
292+ public void testMultipleLinksInLongerText () throws Exception
293+ {
294+ // Setup test fixture.
295+ final String input = "Please visit https://www.example.org and https://example.com at your convenience." ;
296+ Fragment fragmentUnderTest ;
297+
298+ // Execute system under test.
299+ final List <Fragment > fragments = LinkDetector .parse (input );
300+
301+ // Verify results.
302+ assertEquals (5 , fragments .size ());
303+
304+ fragmentUnderTest = fragments .get (0 );
305+ assertEquals (0 , fragmentUnderTest .startIndex ());
306+ assertEquals ("Please visit " .length (), fragmentUnderTest .endIndex ());
307+ assertEquals ("Please visit " , fragmentUnderTest .toString ());
308+ assertFalse (fragmentUnderTest .isLink ());
309+
310+ fragmentUnderTest = fragments .get (1 );
311+ assertEquals ("Please visit " .length (), fragmentUnderTest .startIndex ());
312+ assertEquals ("Please visit https://www.example.org" .length (), fragmentUnderTest .endIndex ());
313+ assertEquals ("https://www.example.org" , fragmentUnderTest .toString ());
314+ assertTrue (fragmentUnderTest .isLink ());
315+
316+ fragmentUnderTest = fragments .get (2 );
317+ assertEquals ("Please visit https://www.example.org" .length (), fragmentUnderTest .startIndex ());
318+ assertEquals ("Please visit https://www.example.org and " .length (), fragmentUnderTest .endIndex ());
319+ assertEquals (" and " , fragmentUnderTest .toString ());
320+ assertFalse (fragmentUnderTest .isLink ());
321+
322+ fragmentUnderTest = fragments .get (3 );
323+ assertEquals ("Please visit https://www.example.org and " .length (), fragmentUnderTest .startIndex ());
324+ assertEquals ("Please visit https://www.example.org and https://example.com" .length (), fragmentUnderTest .endIndex ());
325+ assertEquals ("https://example.com" , fragmentUnderTest .toString ());
326+ assertTrue (fragmentUnderTest .isLink ());
327+
328+ fragmentUnderTest = fragments .get (4 );
329+ assertEquals ("Please visit https://www.example.org and https://example.com" .length (), fragmentUnderTest .startIndex ());
330+ assertEquals ("Please visit https://www.example.org and https://example.com at your convenience." .length (), fragmentUnderTest .endIndex ());
331+ assertEquals (" at your convenience." , fragmentUnderTest .toString ());
332+ assertFalse (fragmentUnderTest .isLink ());
333+ }
334+
335+ @ Test
336+ public void testLinkWithQueryString () throws Exception
337+ {
338+ // Setup test fixture.
339+ final String input = "https://www.example.org?foo=bar" ;
340+
341+ // Execute system under test.
342+ final List <Fragment > fragments = LinkDetector .parse (input );
343+
344+ // Verify results.
345+ assertEquals (1 , fragments .size ());
346+ assertEquals (0 , fragments .get (0 ).startIndex ());
347+ assertEquals (input .length (), fragments .get (0 ).endIndex ());
348+ assertEquals (input , fragments .get (0 ).toString ());
349+ assertTrue (fragments .get (0 ).isLink ());
350+ }
351+
352+ @ Test
353+ public void testLinkWithQueryStringWithExtraParams () throws Exception
354+ {
355+ // Setup test fixture.
356+ final String input = "https://www.example.org?foo=bar&baz=qux&a=3&b=_a" ;
357+
358+ // Execute system under test.
359+ final List <Fragment > fragments = LinkDetector .parse (input );
360+
361+ // Verify results.
362+ assertEquals (1 , fragments .size ());
363+ assertEquals (0 , fragments .get (0 ).startIndex ());
364+ assertEquals (input .length (), fragments .get (0 ).endIndex ());
365+ assertEquals (input , fragments .get (0 ).toString ());
366+ assertTrue (fragments .get (0 ).isLink ());
367+ }
368+
369+ @ Test
370+ public void testFtpLink () throws Exception
371+ {
372+ // Setup test fixture.
373+ final String input = "ftp://www.example.org" ;
374+
375+ // Execute system under test.
376+ final List <Fragment > fragments = LinkDetector .parse (input );
377+
378+ // Verify results.
379+ assertEquals (1 , fragments .size ());
380+ assertEquals (0 , fragments .get (0 ).startIndex ());
381+ assertEquals (input .length (), fragments .get (0 ).endIndex ());
382+ assertEquals (input , fragments .get (0 ).toString ());
383+ assertTrue (fragments .get (0 ).isLink ());
384+ }
385+
386+ @ Test
387+ public void testLinkWithBasicAuthentication () throws Exception
388+ {
389+ // Setup test fixture.
390+ final String input = "https://foo:bar@www.example.org" ;
391+
392+ // Execute system under test.
393+ final List <Fragment > fragments = LinkDetector .parse (input );
394+
395+ // Verify results.
396+ assertEquals (1 , fragments .size ());
397+ assertEquals (0 , fragments .get (0 ).startIndex ());
398+ assertEquals (input .length (), fragments .get (0 ).endIndex ());
399+ assertEquals (input , fragments .get (0 ).toString ());
400+ assertTrue (fragments .get (0 ).isLink ());
401+ }
402+
403+ @ Test
404+ public void testLinkWithPort () throws Exception
405+ {
406+ // Setup test fixture.
407+ final String input = "https://www.example.org:8080" ;
408+
409+ // Execute system under test.
410+ final List <Fragment > fragments = LinkDetector .parse (input );
411+
412+ // Verify results.
413+ assertEquals (1 , fragments .size ());
414+ assertEquals (0 , fragments .get (0 ).startIndex ());
415+ assertEquals (input .length (), fragments .get (0 ).endIndex ());
416+ assertEquals (input , fragments .get (0 ).toString ());
417+ assertTrue (fragments .get (0 ).isLink ());
418+ }
419+
420+ @ Test
421+ public void testLinkWithFragment () throws Exception
422+ {
423+ // Setup test fixture.
424+ final String input = "https://www.example.org#fragment" ;
425+
426+ // Execute system under test.
427+ final List <Fragment > fragments = LinkDetector .parse (input );
428+
429+ // Verify results.
430+ assertEquals (1 , fragments .size ());
431+ assertEquals (0 , fragments .get (0 ).startIndex ());
432+ assertEquals (input .length (), fragments .get (0 ).endIndex ());
433+ assertEquals (input , fragments .get (0 ).toString ());
434+ assertTrue (fragments .get (0 ).isLink ());
435+ }
436+
437+ @ Test
438+ public void testLinkWithFileExtension () throws Exception
439+ {
440+ // Setup test fixture.
441+ final String input = "https://www.example.org/file.html" ;
442+
443+ // Execute system under test.
444+ final List <Fragment > fragments = LinkDetector .parse (input );
445+
446+ // Verify results.
447+ assertEquals (1 , fragments .size ());
448+ assertEquals (0 , fragments .get (0 ).startIndex ());
449+ assertEquals (input .length (), fragments .get (0 ).endIndex ());
450+ assertEquals (input , fragments .get (0 ).toString ());
451+ assertTrue (fragments .get (0 ).isLink ());
452+ }
453+
454+ @ Test
455+ public void testLinkWithLinkInQueryString () throws Exception
456+ {
457+ // Setup test fixture.
458+ final String input = "https://duckduckgo.com/?q=https://example.com" ;
459+
460+ // Execute system under test.
461+ final List <Fragment > fragments = LinkDetector .parse (input );
462+
463+ // Verify results.
464+ assertEquals (1 , fragments .size ());
465+ assertEquals (0 , fragments .get (0 ).startIndex ());
466+ assertEquals (input .length (), fragments .get (0 ).endIndex ());
467+ assertEquals (input , fragments .get (0 ).toString ());
468+ assertTrue (fragments .get (0 ).isLink ());
469+ }
470+
471+ @ Test
472+ public void testLinkWithIpAddress () throws Exception
473+ {
474+ // Setup test fixture.
475+ final String input = "http://127.0.0.1/local/" ;
476+
477+ // Execute system under test.
478+ final List <Fragment > fragments = LinkDetector .parse (input );
479+
480+ // Verify results.
481+ assertEquals (1 , fragments .size ());
482+ assertEquals (0 , fragments .get (0 ).startIndex ());
483+ assertEquals (input .length (), fragments .get (0 ).endIndex ());
484+ assertEquals (input , fragments .get (0 ).toString ());
485+ assertTrue (fragments .get (0 ).isLink ());
486+ }
487+
488+ @ Test
489+ public void testObfuscatedLink () throws Exception
490+ {
491+ // Setup test fixture.
492+ final String input = "https://e%78a%6Dpl%65.com" ;
493+
494+ // Execute system under test.
495+ final List <Fragment > fragments = LinkDetector .parse (input );
496+
497+ // Verify results.
498+ assertEquals (1 , fragments .size ());
499+ assertEquals (0 , fragments .get (0 ).startIndex ());
500+ assertEquals (input .length (), fragments .get (0 ).endIndex ());
501+ assertEquals (input , fragments .get (0 ).toString ());
502+ assertTrue (fragments .get (0 ).isLink ());
503+ }
504+
505+ @ Test
506+ public void testTextWithLinkCharacters () throws Exception
507+ {
508+ // Setup test fixture.
509+ final String input = "A hyperlink begins with https:// and is followed by a domain, such as example.com" ;
510+
511+ // Execute system under test.
512+ final List <Fragment > fragments = LinkDetector .parse (input );
513+
514+ // Verify results.
515+ assertEquals (1 , fragments .size ());
516+ assertEquals (0 , fragments .get (0 ).startIndex ());
517+ assertEquals (input .length (), fragments .get (0 ).endIndex ());
518+ assertEquals (input , fragments .get (0 ).toString ());
519+ assertFalse (fragments .get (0 ).isLink ());
520+ }
290521}
0 commit comments