ruby/test/reline/test_face.rb
tomoya ishida 90b49024c0 [ruby/reline] Fallback to 256color if COLORTERM != truecolor
(https://github.com/ruby/reline/pull/604)

* Fallback to 256color if COLORTERM != truecolor

* Add Reline::Face.force_truecolor to force truecolor without COLORTERM env

090e1e4df0
2023-11-13 12:42:31 +00:00

257 lines
7.6 KiB
Ruby

# 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