@@ -312,6 +312,8 @@ mod test {
312312 use super :: * ;
313313 use proptest:: prelude:: * ;
314314
315+ const URL : & str = "https://example.com" ;
316+
315317 #[ track_caller]
316318 fn verify ( input : & str , expected : Vec < Element > ) {
317319 let expected = expected. into_iter ( ) . collect :: < Vec < _ > > ( ) ;
@@ -320,6 +322,10 @@ mod test {
320322 assert_eq ! ( expected, actual, "{input:?}" ) ;
321323 }
322324
325+ fn hyperlink ( input : & str , url : & str ) -> String {
326+ format ! ( "\x1B ]8;;{url}\x1B \\ {input}\x1B ]8;;\x1B \\ " )
327+ }
328+
323329 #[ test]
324330 fn start ( ) {
325331 let green_on_red = anstyle:: AnsiColor :: Green . on ( anstyle:: AnsiColor :: Red ) ;
@@ -397,6 +403,134 @@ mod test {
397403 verify ( & input, expected) ;
398404 }
399405
406+ #[ test]
407+ fn hyperlink_start ( ) {
408+ let green_on_red = anstyle:: AnsiColor :: Green . on ( anstyle:: AnsiColor :: Red ) ;
409+ let input = format ! (
410+ "{green_on_red}{}{green_on_red:#} world!" ,
411+ hyperlink( "Hello" , URL )
412+ ) ;
413+ let expected = vec ! [
414+ Element {
415+ text: "Hello" . to_owned( ) ,
416+ style: green_on_red,
417+ } ,
418+ Element {
419+ text: " world!" . to_owned( ) ,
420+ style: anstyle:: Style :: default ( ) ,
421+ } ,
422+ ] ;
423+ verify ( & input, expected) ;
424+ }
425+
426+ #[ test]
427+ fn hyperlink_middle ( ) {
428+ let green_on_red = anstyle:: AnsiColor :: Green . on ( anstyle:: AnsiColor :: Red ) ;
429+ let input = format ! (
430+ "Hello {green_on_red}{}{green_on_red:#}!" ,
431+ hyperlink( "world" , URL )
432+ ) ;
433+ let expected = vec ! [
434+ Element {
435+ text: "Hello " . to_owned( ) ,
436+ style: anstyle:: Style :: default ( ) ,
437+ } ,
438+ Element {
439+ text: "world" . to_owned( ) ,
440+ style: green_on_red,
441+ } ,
442+ Element {
443+ text: "!" . to_owned( ) ,
444+ style: anstyle:: Style :: default ( ) ,
445+ } ,
446+ ] ;
447+ verify ( & input, expected) ;
448+ }
449+
450+ #[ test]
451+ fn hyperlink_end ( ) {
452+ let green_on_red = anstyle:: AnsiColor :: Green . on ( anstyle:: AnsiColor :: Red ) ;
453+ let input = format ! (
454+ "Hello {green_on_red}{}{green_on_red:#}" ,
455+ hyperlink( "world!" , URL )
456+ ) ;
457+ let expected = vec ! [
458+ Element {
459+ text: "Hello " . to_owned( ) ,
460+ style: anstyle:: Style :: default ( ) ,
461+ } ,
462+ Element {
463+ text: "world!" . to_owned( ) ,
464+ style: green_on_red,
465+ } ,
466+ ] ;
467+ verify ( & input, expected) ;
468+ }
469+
470+ #[ test]
471+ fn hyperlink_ansi256_colors ( ) {
472+ let ansi_11 = anstyle:: Ansi256Color ( 11 ) . on_default ( ) ;
473+ // termcolor only supports "brights" via these
474+ let input = format ! ( "Hello {ansi_11}{}{ansi_11:#}!" , hyperlink( "world" , URL ) ) ;
475+ let expected = vec ! [
476+ Element {
477+ text: "Hello " . to_owned( ) ,
478+ style: anstyle:: Style :: default ( ) ,
479+ } ,
480+ Element {
481+ text: "world" . to_owned( ) ,
482+ style: ansi_11,
483+ } ,
484+ Element {
485+ text: "!" . to_owned( ) ,
486+ style: anstyle:: Style :: default ( ) ,
487+ } ,
488+ ] ;
489+ verify ( & input, expected) ;
490+ }
491+
492+ #[ test]
493+ fn style_mid_hyperlink_text ( ) {
494+ let green_on_red = anstyle:: AnsiColor :: Green . on ( anstyle:: AnsiColor :: Red ) ;
495+ let styled_str = format ! ( "Hello {green_on_red}world{green_on_red:#}!" ) ;
496+ let input = hyperlink ( & styled_str, URL ) ;
497+ let expected = vec ! [
498+ Element {
499+ text: "Hello " . to_owned( ) ,
500+ style: anstyle:: Style :: default ( ) ,
501+ } ,
502+ Element {
503+ text: "world" . to_owned( ) ,
504+ style: green_on_red,
505+ } ,
506+ Element {
507+ text: "!" . to_owned( ) ,
508+ style: anstyle:: Style :: default ( ) ,
509+ } ,
510+ ] ;
511+ verify ( & input, expected) ;
512+ }
513+
514+ #[ test]
515+ fn hyperlink_empty ( ) {
516+ let green_on_red = anstyle:: AnsiColor :: Green . on ( anstyle:: AnsiColor :: Red ) ;
517+ let input = format ! (
518+ "{green_on_red}{}{green_on_red:#} world!" ,
519+ hyperlink( "Hello" , "" )
520+ ) ;
521+ let expected = vec ! [
522+ Element {
523+ text: "Hello" . to_owned( ) ,
524+ style: green_on_red,
525+ } ,
526+ Element {
527+ text: " world!" . to_owned( ) ,
528+ style: anstyle:: Style :: default ( ) ,
529+ } ,
530+ ] ;
531+ verify ( & input, expected) ;
532+ }
533+
400534 proptest ! {
401535 #[ test]
402536 #[ cfg_attr( miri, ignore) ] // See https://github.com/AltSysrq/proptest/issues/253
0 commit comments