@@ -492,6 +492,76 @@ mod tests {
492492 assert_rgb_close ( cell_pixel ( & image, 4 , 7 , 0.42 , 0.75 ) , PALETTE [ YELLOW ] , 0 ) ;
493493 }
494494
495+ #[ test]
496+ fn swash_renders_powerline_symbols_as_cell_geometry ( ) {
497+ let mut renderer = swash ( settings_without_symbol_fallback ( ) ) ;
498+
499+ let image = renderer. render (
500+ & lines_for ( concat ! (
501+ "\x1b [38;5;2m" ,
502+ "\u{e0b0} \u{e0b1} \u{e0b2} \u{e0b3} " ,
503+ "\u{e0b4} \u{e0b5} \u{e0b6} \u{e0b7} " ,
504+ "\u{e0b8} \u{e0b9} \u{e0ba} \u{e0bb} " ,
505+ "\u{e0bc} \u{e0bd} \u{e0be} \u{e0bf} " ,
506+ "\x1b [39m" ,
507+ ) ) ,
508+ None ,
509+ ) ;
510+
511+ for ( col, x, y) in [
512+ ( 0 , 0.25 , 0.50 ) , // right full triangle
513+ ( 1 , 0.50 , 0.25 ) , // right bracket
514+ ( 2 , 0.75 , 0.50 ) , // left full triangle
515+ ( 3 , 0.50 , 0.25 ) , // left bracket
516+ ( 4 , 0.50 , 0.50 ) , // right thick cap
517+ ( 5 , 0.85 , 0.25 ) , // right thin cap
518+ ( 6 , 0.50 , 0.50 ) , // left thick cap
519+ ( 7 , 0.12 , 0.25 ) , // left thin cap
520+ ( 8 , 0.25 , 0.75 ) , // lower-left triangle
521+ ( 9 , 0.50 , 0.50 ) , // backslash
522+ ( 10 , 0.75 , 0.75 ) , // lower-right triangle
523+ ( 11 , 0.50 , 0.50 ) , // forward slash
524+ ( 12 , 0.25 , 0.25 ) , // upper-left triangle
525+ ( 13 , 0.50 , 0.50 ) , // redundant forward slash
526+ ( 14 , 0.75 , 0.25 ) , // upper-right triangle
527+ ( 15 , 0.50 , 0.50 ) , // redundant backslash
528+ ] {
529+ let actual = cell_pixel ( & image, col, 0 , x, y) ;
530+ let ink = rgb_distance ( actual, BG ) ;
531+
532+ assert ! (
533+ ink > 40 ,
534+ "expected powerline cell {col} at ({x}, {y}) to have green ink, got {actual:?}" ,
535+ ) ;
536+ }
537+
538+ for ( col, x, y) in [
539+ ( 0 , 0.85 , 0.15 ) , // right full triangle
540+ ( 1 , 0.25 , 0.50 ) , // right bracket interior
541+ ( 2 , 0.15 , 0.15 ) , // left full triangle
542+ ( 3 , 0.75 , 0.50 ) , // left bracket interior
543+ ( 4 , 0.90 , 0.10 ) , // right thick cap corner
544+ ( 5 , 0.50 , 0.50 ) , // right thin cap interior
545+ ( 6 , 0.10 , 0.10 ) , // left thick cap corner
546+ ( 7 , 0.50 , 0.50 ) , // left thin cap interior
547+ ( 8 , 0.90 , 0.10 ) , // lower-left triangle
548+ ( 9 , 0.90 , 0.10 ) , // backslash off diagonal
549+ ( 10 , 0.10 , 0.10 ) , // lower-right triangle
550+ ( 11 , 0.10 , 0.10 ) , // forward slash off diagonal
551+ ( 12 , 0.90 , 0.90 ) , // upper-left triangle
552+ ( 13 , 0.90 , 0.90 ) , // redundant forward slash off diagonal
553+ ( 14 , 0.10 , 0.90 ) , // upper-right triangle
554+ ( 15 , 0.10 , 0.90 ) , // redundant backslash off diagonal
555+ ] {
556+ let actual = cell_pixel ( & image, col, 0 , x, y) ;
557+
558+ assert ! (
559+ rgb_distance( actual, BG ) <= 4 ,
560+ "expected powerline cell {col} at ({x}, {y}) to stay background, got {actual:?}" ,
561+ ) ;
562+ }
563+ }
564+
495565 #[ test]
496566 fn swash_heavy_box_corners_join_without_notches ( ) {
497567 let mut settings = settings ( false ) ;
@@ -731,6 +801,22 @@ mod tests {
731801 }
732802 }
733803
804+ fn settings_without_symbol_fallback ( ) -> Settings {
805+ let mut font_db = fontdb:: Database :: new ( ) ;
806+ font_db. load_font_data ( include_bytes ! ( "../fonts/JetBrainsMono-Regular.ttf" ) . to_vec ( ) ) ;
807+
808+ Settings {
809+ terminal_size : ( COLS , ROWS ) ,
810+ font_db,
811+ font_families : vec ! [ FONT_FAMILY . to_owned( ) ] ,
812+ text_family : FONT_FAMILY . to_owned ( ) ,
813+ font_size : FONT_SIZE ,
814+ line_height : LINE_HEIGHT ,
815+ theme : theme ( ) ,
816+ bold_is_bright : false ,
817+ }
818+ }
819+
734820 fn theme ( ) -> Theme {
735821 [ BG , FG ]
736822 . into_iter ( )
0 commit comments