diff options
Diffstat (limited to 'test/reline/test_face.rb')
-rw-r--r-- | test/reline/test_face.rb | 257 |
1 files changed, 257 insertions, 0 deletions
diff --git a/test/reline/test_face.rb b/test/reline/test_face.rb new file mode 100644 index 0000000000..8fa2be8fa4 --- /dev/null +++ b/test/reline/test_face.rb @@ -0,0 +1,257 @@ +# frozen_string_literal: true + +require_relative 'helper' + +class Reline::Face::Test < Reline::TestCase + RESET_SGR = "\e[0m" + + def setup + @colorterm_backup = ENV['COLORTERM'] + ENV['COLORTERM'] = 'truecolor' + end + + def teardown + Reline::Face.reset_to_initial_configs + ENV['COLORTERM'] = @colorterm_backup + end + + class WithInsufficientSetupTest < self + def setup + super + Reline::Face.config(:my_insufficient_config) do |face| + end + @face = Reline::Face[:my_insufficient_config] + end + + def test_my_insufficient_config_line + assert_equal RESET_SGR, @face[:default] + assert_equal RESET_SGR, @face[:enhanced] + assert_equal RESET_SGR, @face[:scrollbar] + end + + def test_my_insufficient_configs + my_configs = Reline::Face.configs[:my_insufficient_config] + assert_equal( + { + default: { style: :reset, escape_sequence: RESET_SGR }, + enhanced: { style: :reset, escape_sequence: RESET_SGR }, + scrollbar: { style: :reset, escape_sequence: RESET_SGR } + }, + my_configs + ) + end + end + + class WithSetupTest < self + def setup + super + Reline::Face.config(:my_config) do |face| + face.define :default, foreground: :blue + face.define :enhanced, foreground: "#FF1020", background: :black, style: [:bold, :underlined] + end + Reline::Face.config(:another_config) do |face| + face.define :another_label, foreground: :red + end + @face = Reline::Face[:my_config] + end + + def test_now_there_are_four_configs + assert_equal %i(default completion_dialog my_config another_config), Reline::Face.configs.keys + end + + def test_resetting_config_discards_user_defined_configs + Reline::Face.reset_to_initial_configs + assert_equal %i(default completion_dialog), Reline::Face.configs.keys + end + + def test_my_configs + my_configs = Reline::Face.configs[:my_config] + assert_equal( + { + default: { + escape_sequence: "#{RESET_SGR}\e[34m", foreground: :blue + }, + enhanced: { + background: :black, + foreground: "#FF1020", + style: [:bold, :underlined], + escape_sequence: "\e[0m\e[38;2;255;16;32;40;1;4m" + }, + scrollbar: { + style: :reset, + escape_sequence: "\e[0m" + } + }, + my_configs + ) + end + + def test_my_config_line + assert_equal "#{RESET_SGR}\e[34m", @face[:default] + end + + def test_my_config_enhanced + assert_equal "#{RESET_SGR}\e[38;2;255;16;32;40;1;4m", @face[:enhanced] + end + + def test_not_respond_to_another_label + assert_equal false, @face.respond_to?(:another_label) + end + end + + class WithoutSetupTest < self + def test_my_config_default + Reline::Face.config(:my_config) do |face| + # do nothing + end + face = Reline::Face[:my_config] + assert_equal RESET_SGR, face[:default] + end + + def test_style_does_not_exist + face = Reline::Face[:default] + assert_raise ArgumentError do + face[:style_does_not_exist] + end + end + + def test_invalid_keyword + assert_raise ArgumentError do + Reline::Face.config(:invalid_config) do |face| + face.define :default, invalid_keyword: :red + end + end + end + + def test_invalid_foreground_name + assert_raise ArgumentError do + Reline::Face.config(:invalid_config) do |face| + face.define :default, foreground: :invalid_name + end + end + end + + def test_invalid_background_name + assert_raise ArgumentError do + Reline::Face.config(:invalid_config) do |face| + face.define :default, background: :invalid_name + end + end + end + + def test_invalid_style_name + assert_raise ArgumentError do + Reline::Face.config(:invalid_config) do |face| + face.define :default, style: :invalid_name + end + end + end + + def test_private_constants + [:SGR_PARAMETER, :Config, :CONFIGS].each do |name| + assert_equal false, Reline::Face.constants.include?(name) + end + end + end + + class ConfigTest < self + def setup + super + @config = Reline::Face.const_get(:Config).new(:my_config) { } + end + + def teardown + super + Reline::Face.instance_variable_set(:@force_truecolor, nil) + end + + def test_rgb? + assert_equal true, @config.send(:rgb_expression?, "#FFFFFF") + end + + def test_invalid_rgb? + assert_equal false, @config.send(:rgb_expression?, "FFFFFF") + assert_equal false, @config.send(:rgb_expression?, "#FFFFF") + end + + def test_format_to_sgr_preserves_order + assert_equal( + "#{RESET_SGR}\e[37;41;1;3m", + @config.send(:format_to_sgr, foreground: :white, background: :red, style: [:bold, :italicized]) + ) + + assert_equal( + "#{RESET_SGR}\e[37;1;3;41m", + @config.send(:format_to_sgr, foreground: :white, style: [:bold, :italicized], background: :red) + ) + end + + def test_format_to_sgr_with_reset + assert_equal( + RESET_SGR, + @config.send(:format_to_sgr, style: :reset) + ) + assert_equal( + "#{RESET_SGR}\e[37;0;41m", + @config.send(:format_to_sgr, foreground: :white, style: :reset, background: :red) + ) + end + + def test_format_to_sgr_with_single_style + assert_equal( + "#{RESET_SGR}\e[37;41;1m", + @config.send(:format_to_sgr, foreground: :white, background: :red, style: :bold) + ) + end + + def test_truecolor + ENV['COLORTERM'] = 'truecolor' + assert_equal true, Reline::Face.truecolor? + ENV['COLORTERM'] = '24bit' + assert_equal true, Reline::Face.truecolor? + ENV['COLORTERM'] = nil + assert_equal false, Reline::Face.truecolor? + Reline::Face.force_truecolor + assert_equal true, Reline::Face.truecolor? + end + + def test_sgr_rgb_truecolor + ENV['COLORTERM'] = 'truecolor' + assert_equal "38;2;255;255;255", @config.send(:sgr_rgb, :foreground, "#ffffff") + assert_equal "48;2;18;52;86", @config.send(:sgr_rgb, :background, "#123456") + end + + def test_sgr_rgb_256color + ENV['COLORTERM'] = nil + assert_equal '38;5;231', @config.send(:sgr_rgb, :foreground, '#ffffff') + assert_equal '48;5;16', @config.send(:sgr_rgb, :background, '#000000') + # Color steps are [0x00, 0x5f, 0x87, 0xaf, 0xd7, 0xff] + assert_equal '38;5;24', @config.send(:sgr_rgb, :foreground, '#005f87') + assert_equal '38;5;67', @config.send(:sgr_rgb, :foreground, '#5f87af') + assert_equal '48;5;110', @config.send(:sgr_rgb, :background, '#87afd7') + assert_equal '48;5;153', @config.send(:sgr_rgb, :background, '#afd7ff') + # Boundary values are [0x30, 0x73, 0x9b, 0xc3, 0xeb] + assert_equal '38;5;24', @config.send(:sgr_rgb, :foreground, '#2f729a') + assert_equal '38;5;67', @config.send(:sgr_rgb, :foreground, '#30739b') + assert_equal '48;5;110', @config.send(:sgr_rgb, :background, '#9ac2ea') + assert_equal '48;5;153', @config.send(:sgr_rgb, :background, '#9bc3eb') + end + + def test_force_truecolor_reconfigure + ENV['COLORTERM'] = nil + + Reline::Face.config(:my_config) do |face| + face.define :default, foreground: '#005f87' + face.define :enhanced, background: '#afd7ff' + end + + assert_equal "\e[0m\e[38;5;24m", Reline::Face[:my_config][:default] + assert_equal "\e[0m\e[48;5;153m", Reline::Face[:my_config][:enhanced] + + Reline::Face.force_truecolor + + assert_equal "\e[0m\e[38;2;0;95;135m", Reline::Face[:my_config][:default] + assert_equal "\e[0m\e[48;2;175;215;255m", Reline::Face[:my_config][:enhanced] + end + end +end |