@@ -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 , url : & 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,89 @@ 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" , URL )
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" , URL )
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!" , URL )
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" , URL ) ) ;
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, URL ) ;
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+
439+ #[ test]
440+ fn hyperlink_empty ( ) {
441+ let green_on_red = anstyle:: AnsiColor :: Green . on ( anstyle:: AnsiColor :: Red ) ;
442+ let input = format ! (
443+ "{green_on_red}{}{green_on_red:#} world!" ,
444+ hyperlink( "Hello" , "" )
445+ ) ;
446+ let expected = vec ! [
447+ ( green_on_red, "Hello" ) ,
448+ ( anstyle:: Style :: default ( ) , " world!" ) ,
449+ ] ;
450+ verify ( & input, expected) ;
451+ }
452+
364453 proptest ! {
365454 #[ test]
366455 #[ cfg_attr( miri, ignore) ] // See https://github.com/AltSysrq/proptest/issues/253
0 commit comments