@@ -303,6 +303,8 @@ mod test {
303303 use super :: * ;
304304 use proptest:: prelude:: * ;
305305
306+ const URL : & str = "https://example.com" ;
307+
306308 #[ track_caller]
307309 fn verify ( input : & str , expected : Vec < ( anstyle:: Style , & str ) > ) {
308310 let expected = expected
@@ -314,6 +316,10 @@ mod test {
314316 assert_eq ! ( expected, actual, "{input:?}" ) ;
315317 }
316318
319+ fn hyperlink ( input : & str ) -> String {
320+ format ! ( "\x1B ]8;;{URL}\x1B \\ {input}\x1B ]8;;\x1B \\ " )
321+ }
322+
317323 #[ test]
318324 fn start ( ) {
319325 let green_on_red = anstyle:: AnsiColor :: Green . on ( anstyle:: AnsiColor :: Red ) ;
@@ -361,6 +367,75 @@ mod test {
361367 verify ( & input, expected) ;
362368 }
363369
370+ #[ test]
371+ fn hyperlink_start ( ) {
372+ let green_on_red = anstyle:: AnsiColor :: Green . on ( anstyle:: AnsiColor :: Red ) ;
373+ let input = format ! (
374+ "{green_on_red}{}{green_on_red:#} world!" ,
375+ hyperlink( "Hello" )
376+ ) ;
377+ let expected = vec ! [
378+ ( green_on_red, "Hello" ) ,
379+ ( anstyle:: Style :: default ( ) , " world!" ) ,
380+ ] ;
381+ verify ( & input, expected) ;
382+ }
383+
384+ #[ test]
385+ fn hyperlink_middle ( ) {
386+ let green_on_red = anstyle:: AnsiColor :: Green . on ( anstyle:: AnsiColor :: Red ) ;
387+ let input = format ! (
388+ "Hello {green_on_red}{}{green_on_red:#}!" ,
389+ hyperlink( "world" )
390+ ) ;
391+ let expected = vec ! [
392+ ( anstyle:: Style :: default ( ) , "Hello " ) ,
393+ ( green_on_red, "world" ) ,
394+ ( anstyle:: Style :: default ( ) , "!" ) ,
395+ ] ;
396+ verify ( & input, expected) ;
397+ }
398+
399+ #[ test]
400+ fn hyperlink_end ( ) {
401+ let green_on_red = anstyle:: AnsiColor :: Green . on ( anstyle:: AnsiColor :: Red ) ;
402+ let input = format ! (
403+ "Hello {green_on_red}{}{green_on_red:#}" ,
404+ hyperlink( "world!" )
405+ ) ;
406+ let expected = vec ! [
407+ ( anstyle:: Style :: default ( ) , "Hello " ) ,
408+ ( green_on_red, "world!" ) ,
409+ ] ;
410+ verify ( & input, expected) ;
411+ }
412+
413+ #[ test]
414+ fn hyperlink_ansi256_colors ( ) {
415+ let ansi_11 = anstyle:: Ansi256Color ( 11 ) . on_default ( ) ;
416+ // termcolor only supports "brights" via these
417+ let input = format ! ( "Hello {ansi_11}{}{ansi_11:#}!" , hyperlink( "world" ) ) ;
418+ let expected = vec ! [
419+ ( anstyle:: Style :: default ( ) , "Hello " ) ,
420+ ( ansi_11, "world" ) ,
421+ ( anstyle:: Style :: default ( ) , "!" ) ,
422+ ] ;
423+ verify ( & input, expected) ;
424+ }
425+
426+ #[ test]
427+ fn style_mid_hyperlink_text ( ) {
428+ let green_on_red = anstyle:: AnsiColor :: Green . on ( anstyle:: AnsiColor :: Red ) ;
429+ let styled_str = format ! ( "Hello {green_on_red}world{green_on_red:#}!" ) ;
430+ let input = hyperlink ( & styled_str) ;
431+ let expected = vec ! [
432+ ( anstyle:: Style :: default ( ) , "Hello " ) ,
433+ ( green_on_red, "world" ) ,
434+ ( anstyle:: Style :: default ( ) , "!" ) ,
435+ ] ;
436+ verify ( & input, expected) ;
437+ }
438+
364439 proptest ! {
365440 #[ test]
366441 #[ cfg_attr( miri, ignore) ] // See https://github.com/AltSysrq/proptest/issues/253
0 commit comments