mirror of
https://github.com/ruby/ruby.git
synced 2025-08-15 13:39:04 +02:00

(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
257 lines
7.6 KiB
Ruby
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
|