This commit is contained in:
Andrew Konchin 2024-06-07 19:01:53 +03:00 committed by Benoit Daloze
parent e8bd745c17
commit 3ebab4b64d
12 changed files with 1238 additions and 1268 deletions

View File

@ -1,7 +1,7 @@
inherit_from: .rubocop_todo.yml
AllCops:
TargetRubyVersion: 3.0
TargetRubyVersion: 3.1
DisplayCopNames: true
Exclude:
- command_line/fixtures/bad_syntax.rb

View File

@ -56,23 +56,20 @@ module ArraySpecs
101.621, 102.816, 104.010, 105.202, 106.393, 107.583, 108.771, 109.958, 111.144, 112.329,
113.512, 114.695, 115.876, 117.057, 118.236, 119.414, 120.591, 121.767, 122.942, 124.116,
125.289, 126.462, 127.633, 128.803, 129.973, 131.141, 132.309, 133.476, 134.642, 135.807,
]
]
def self.measure_sample_fairness(size, samples, iters)
ary = Array.new(size) { |x| x }
expected = iters.fdiv size
(samples).times do |i|
chi_results = []
3.times do
counts = Array.new(size) { 0 }
expected = iters / size
counts = Array.new(size, 0)
iters.times do
x = ary.sample(samples)[i]
counts[x] += 1
end
chi_squared = 0.0
counts.each do |count|
chi_squared += (((count - expected) ** 2) * 1.0 / expected)
end
chi_squared = counts.sum {|count| (count - expected) ** 2} / expected
chi_results << chi_squared
break if chi_squared <= CHI_SQUARED_CRITICAL_VALUES[size]
end
@ -83,17 +80,14 @@ module ArraySpecs
def self.measure_sample_fairness_large_sample_size(size, samples, iters)
ary = Array.new(size) { |x| x }
counts = Array.new(size) { 0 }
expected = iters * samples / size
counts = Array.new(size, 0)
expected = (iters * samples).fdiv size
iters.times do
ary.sample(samples).each do |sample|
counts[sample] += 1
end
end
chi_squared = 0.0
counts.each do |count|
chi_squared += (((count - expected) ** 2) * 1.0 / expected)
end
chi_squared = counts.sum {|count| (count - expected) ** 2} / expected
# Chi squared critical values for tests with 4 degrees of freedom
# Values obtained from NIST Engineering Statistic Handbook at
@ -223,366 +217,370 @@ module ArraySpecs
obj
end
LargeArray = ["test_create_table_with_force_true_does_not_drop_nonexisting_table",
"test_add_table",
"assert_difference",
"assert_operator",
"instance_variables",
"class",
"instance_variable_get",
"__class__",
"expects",
"assert_no_difference",
"name",
"assert_blank",
"assert_not_same",
"is_a?",
"test_add_table_with_decimals",
"test_create_table_with_timestamps_should_create_datetime_columns",
"assert_present",
"assert_no_match",
"__instance_of__",
"assert_deprecated",
"assert",
"assert_throws",
"kind_of?",
"try",
"__instance_variable_get__",
"object_id",
"timeout",
"instance_variable_set",
"assert_nothing_thrown",
"__instance_variable_set__",
"copy_object",
"test_create_table_with_timestamps_should_create_datetime_columns_with_options",
"assert_not_deprecated",
"assert_in_delta",
"id",
"copy_metaclass",
"test_create_table_without_a_block",
"dup",
"assert_not_nil",
"send",
"__instance_variables__",
"to_sql",
"mock",
"assert_send",
"instance_variable_defined?",
"clone",
"require",
"test_migrator",
"__instance_variable_defined_eh__",
"frozen?",
"test_add_column_not_null_with_default",
"freeze",
"test_migrator_one_up",
"test_migrator_one_down",
"singleton_methods",
"method_exists?",
"create_fixtures",
"test_migrator_one_up_one_down",
"test_native_decimal_insert_manual_vs_automatic",
"instance_exec",
"__is_a__",
"test_migrator_double_up",
"stub",
"private_methods",
"stubs",
"test_migrator_double_down",
"fixture_path",
"private_singleton_methods",
"stub_everything",
"test_migrator_one_up_with_exception_and_rollback",
"sequence",
"protected_methods",
"enum_for",
"test_finds_migrations",
"run_before_mocha",
"states",
"protected_singleton_methods",
"to_json",
"instance_values",
"==",
"mocha_setup",
"public_methods",
"test_finds_pending_migrations",
"mocha_verify",
"assert_kind_of",
"===",
"=~",
"test_relative_migrations",
"mocha_teardown",
"gem",
"mocha",
"test_only_loads_pending_migrations",
"test_add_column_with_precision_and_scale",
"require_or_load",
"eql?",
"require_dependency",
"test_native_types",
"test_target_version_zero_should_run_only_once",
"extend",
"to_matcher",
"unloadable",
"require_association",
"hash",
"__id__",
"load_dependency",
"equals",
"test_migrator_db_has_no_schema_migrations_table",
"test_migrator_verbosity",
"kind_of",
"to_yaml",
"to_bool",
"test_migrator_verbosity_off",
"taint",
"test_migrator_going_down_due_to_version_target",
"tainted?",
"mocha_inspect",
"test_migrator_rollback",
"vim",
"untaint",
"taguri=",
"test_migrator_forward",
"test_schema_migrations_table_name",
"test_proper_table_name",
"all_of",
"test_add_drop_table_with_prefix_and_suffix",
"_setup_callbacks",
"setup",
"Not",
"test_create_table_with_binary_column",
"assert_not_equal",
"enable_warnings",
"acts_like?",
"Rational",
"_removed_setup_callbacks",
"Table",
"bind",
"any_of",
"__method__",
"test_migrator_with_duplicates",
"_teardown_callbacks",
"method",
"test_migrator_with_duplicate_names",
"_removed_teardown_callbacks",
"any_parameters",
"test_migrator_with_missing_version_numbers",
"test_add_remove_single_field_using_string_arguments",
"test_create_table_with_custom_sequence_name",
"test_add_remove_single_field_using_symbol_arguments",
"_one_time_conditions_valid_14?",
"_one_time_conditions_valid_16?",
"run_callbacks",
"anything",
"silence_warnings",
"instance_variable_names",
"_fixture_path",
"copy_instance_variables_from",
"fixture_path?",
"has_entry",
"__marshal__",
"_fixture_table_names",
"__kind_of__",
"fixture_table_names?",
"test_add_rename",
"assert_equal",
"_fixture_class_names",
"fixture_class_names?",
"has_entries",
"_use_transactional_fixtures",
"people",
"test_rename_column_using_symbol_arguments",
"use_transactional_fixtures?",
"instance_eval",
"blank?",
"with_warnings",
"__nil__",
"load",
"metaclass",
"_use_instantiated_fixtures",
"has_key",
"class_eval",
"present?",
"test_rename_column",
"teardown",
"use_instantiated_fixtures?",
"method_name",
"silence_stderr",
"presence",
"test_rename_column_preserves_default_value_not_null",
"silence_stream",
"_pre_loaded_fixtures",
"__metaclass__",
"__fixnum__",
"pre_loaded_fixtures?",
"has_value",
"suppress",
"to_yaml_properties",
"test_rename_nonexistent_column",
"test_add_index",
"includes",
"find_correlate_in",
"equality_predicate_sql",
"assert_nothing_raised",
"let",
"not_predicate_sql",
"test_rename_column_with_sql_reserved_word",
"singleton_class",
"test_rename_column_with_an_index",
"display",
"taguri",
"to_yaml_style",
"test_remove_column_with_index",
"size",
"current_adapter?",
"test_remove_column_with_multi_column_index",
"respond_to?",
"test_change_type_of_not_null_column",
"is_a",
"to_a",
"test_rename_table_for_sqlite_should_work_with_reserved_words",
"require_library_or_gem",
"setup_fixtures",
"equal?",
"teardown_fixtures",
"nil?",
"fixture_table_names",
"fixture_class_names",
"test_create_table_without_id",
"use_transactional_fixtures",
"test_add_column_with_primary_key_attribute",
"repair_validations",
"use_instantiated_fixtures",
"instance_of?",
"test_create_table_adds_id",
"test_rename_table",
"pre_loaded_fixtures",
"to_enum",
"test_create_table_with_not_null_column",
"instance_of",
"test_change_column_nullability",
"optionally",
"test_rename_table_with_an_index",
"run",
"test_change_column",
"default_test",
"assert_raise",
"test_create_table_with_defaults",
"assert_nil",
"flunk",
"regexp_matches",
"duplicable?",
"reset_mocha",
"stubba_method",
"filter_backtrace",
"test_create_table_with_limits",
"responds_with",
"stubba_object",
"test_change_column_with_nil_default",
"assert_block",
"__show__",
"assert_date_from_db",
"__respond_to_eh__",
"run_in_transaction?",
"inspect",
"assert_sql",
"test_change_column_with_new_default",
"yaml_equivalent",
"build_message",
"to_s",
"test_change_column_default",
"assert_queries",
"pending",
"as_json",
"assert_no_queries",
"test_change_column_quotes_column_names",
"assert_match",
"test_keeping_default_and_notnull_constraint_on_change",
"methods",
"connection_allow_concurrency_setup",
"connection_allow_concurrency_teardown",
"test_create_table_with_primary_key_prefix_as_table_name_with_underscore",
"__send__",
"make_connection",
"assert_raises",
"tap",
"with_kcode",
"assert_instance_of",
"test_create_table_with_primary_key_prefix_as_table_name",
"assert_respond_to",
"test_change_column_default_to_null",
"assert_same",
"__extend__"]
LargeArray = [
"test_create_table_with_force_true_does_not_drop_nonexisting_table",
"test_add_table",
"assert_difference",
"assert_operator",
"instance_variables",
"class",
"instance_variable_get",
"__class__",
"expects",
"assert_no_difference",
"name",
"assert_blank",
"assert_not_same",
"is_a?",
"test_add_table_with_decimals",
"test_create_table_with_timestamps_should_create_datetime_columns",
"assert_present",
"assert_no_match",
"__instance_of__",
"assert_deprecated",
"assert",
"assert_throws",
"kind_of?",
"try",
"__instance_variable_get__",
"object_id",
"timeout",
"instance_variable_set",
"assert_nothing_thrown",
"__instance_variable_set__",
"copy_object",
"test_create_table_with_timestamps_should_create_datetime_columns_with_options",
"assert_not_deprecated",
"assert_in_delta",
"id",
"copy_metaclass",
"test_create_table_without_a_block",
"dup",
"assert_not_nil",
"send",
"__instance_variables__",
"to_sql",
"mock",
"assert_send",
"instance_variable_defined?",
"clone",
"require",
"test_migrator",
"__instance_variable_defined_eh__",
"frozen?",
"test_add_column_not_null_with_default",
"freeze",
"test_migrator_one_up",
"test_migrator_one_down",
"singleton_methods",
"method_exists?",
"create_fixtures",
"test_migrator_one_up_one_down",
"test_native_decimal_insert_manual_vs_automatic",
"instance_exec",
"__is_a__",
"test_migrator_double_up",
"stub",
"private_methods",
"stubs",
"test_migrator_double_down",
"fixture_path",
"private_singleton_methods",
"stub_everything",
"test_migrator_one_up_with_exception_and_rollback",
"sequence",
"protected_methods",
"enum_for",
"test_finds_migrations",
"run_before_mocha",
"states",
"protected_singleton_methods",
"to_json",
"instance_values",
"==",
"mocha_setup",
"public_methods",
"test_finds_pending_migrations",
"mocha_verify",
"assert_kind_of",
"===",
"=~",
"test_relative_migrations",
"mocha_teardown",
"gem",
"mocha",
"test_only_loads_pending_migrations",
"test_add_column_with_precision_and_scale",
"require_or_load",
"eql?",
"require_dependency",
"test_native_types",
"test_target_version_zero_should_run_only_once",
"extend",
"to_matcher",
"unloadable",
"require_association",
"hash",
"__id__",
"load_dependency",
"equals",
"test_migrator_db_has_no_schema_migrations_table",
"test_migrator_verbosity",
"kind_of",
"to_yaml",
"to_bool",
"test_migrator_verbosity_off",
"taint",
"test_migrator_going_down_due_to_version_target",
"tainted?",
"mocha_inspect",
"test_migrator_rollback",
"vim",
"untaint",
"taguri=",
"test_migrator_forward",
"test_schema_migrations_table_name",
"test_proper_table_name",
"all_of",
"test_add_drop_table_with_prefix_and_suffix",
"_setup_callbacks",
"setup",
"Not",
"test_create_table_with_binary_column",
"assert_not_equal",
"enable_warnings",
"acts_like?",
"Rational",
"_removed_setup_callbacks",
"Table",
"bind",
"any_of",
"__method__",
"test_migrator_with_duplicates",
"_teardown_callbacks",
"method",
"test_migrator_with_duplicate_names",
"_removed_teardown_callbacks",
"any_parameters",
"test_migrator_with_missing_version_numbers",
"test_add_remove_single_field_using_string_arguments",
"test_create_table_with_custom_sequence_name",
"test_add_remove_single_field_using_symbol_arguments",
"_one_time_conditions_valid_14?",
"_one_time_conditions_valid_16?",
"run_callbacks",
"anything",
"silence_warnings",
"instance_variable_names",
"_fixture_path",
"copy_instance_variables_from",
"fixture_path?",
"has_entry",
"__marshal__",
"_fixture_table_names",
"__kind_of__",
"fixture_table_names?",
"test_add_rename",
"assert_equal",
"_fixture_class_names",
"fixture_class_names?",
"has_entries",
"_use_transactional_fixtures",
"people",
"test_rename_column_using_symbol_arguments",
"use_transactional_fixtures?",
"instance_eval",
"blank?",
"with_warnings",
"__nil__",
"load",
"metaclass",
"_use_instantiated_fixtures",
"has_key",
"class_eval",
"present?",
"test_rename_column",
"teardown",
"use_instantiated_fixtures?",
"method_name",
"silence_stderr",
"presence",
"test_rename_column_preserves_default_value_not_null",
"silence_stream",
"_pre_loaded_fixtures",
"__metaclass__",
"__fixnum__",
"pre_loaded_fixtures?",
"has_value",
"suppress",
"to_yaml_properties",
"test_rename_nonexistent_column",
"test_add_index",
"includes",
"find_correlate_in",
"equality_predicate_sql",
"assert_nothing_raised",
"let",
"not_predicate_sql",
"test_rename_column_with_sql_reserved_word",
"singleton_class",
"test_rename_column_with_an_index",
"display",
"taguri",
"to_yaml_style",
"test_remove_column_with_index",
"size",
"current_adapter?",
"test_remove_column_with_multi_column_index",
"respond_to?",
"test_change_type_of_not_null_column",
"is_a",
"to_a",
"test_rename_table_for_sqlite_should_work_with_reserved_words",
"require_library_or_gem",
"setup_fixtures",
"equal?",
"teardown_fixtures",
"nil?",
"fixture_table_names",
"fixture_class_names",
"test_create_table_without_id",
"use_transactional_fixtures",
"test_add_column_with_primary_key_attribute",
"repair_validations",
"use_instantiated_fixtures",
"instance_of?",
"test_create_table_adds_id",
"test_rename_table",
"pre_loaded_fixtures",
"to_enum",
"test_create_table_with_not_null_column",
"instance_of",
"test_change_column_nullability",
"optionally",
"test_rename_table_with_an_index",
"run",
"test_change_column",
"default_test",
"assert_raise",
"test_create_table_with_defaults",
"assert_nil",
"flunk",
"regexp_matches",
"duplicable?",
"reset_mocha",
"stubba_method",
"filter_backtrace",
"test_create_table_with_limits",
"responds_with",
"stubba_object",
"test_change_column_with_nil_default",
"assert_block",
"__show__",
"assert_date_from_db",
"__respond_to_eh__",
"run_in_transaction?",
"inspect",
"assert_sql",
"test_change_column_with_new_default",
"yaml_equivalent",
"build_message",
"to_s",
"test_change_column_default",
"assert_queries",
"pending",
"as_json",
"assert_no_queries",
"test_change_column_quotes_column_names",
"assert_match",
"test_keeping_default_and_notnull_constraint_on_change",
"methods",
"connection_allow_concurrency_setup",
"connection_allow_concurrency_teardown",
"test_create_table_with_primary_key_prefix_as_table_name_with_underscore",
"__send__",
"make_connection",
"assert_raises",
"tap",
"with_kcode",
"assert_instance_of",
"test_create_table_with_primary_key_prefix_as_table_name",
"assert_respond_to",
"test_change_column_default_to_null",
"assert_same",
"__extend__",
]
LargeTestArraySorted = ["test_add_column_not_null_with_default",
"test_add_column_with_precision_and_scale",
"test_add_column_with_primary_key_attribute",
"test_add_drop_table_with_prefix_and_suffix",
"test_add_index",
"test_add_remove_single_field_using_string_arguments",
"test_add_remove_single_field_using_symbol_arguments",
"test_add_rename",
"test_add_table",
"test_add_table_with_decimals",
"test_change_column",
"test_change_column_default",
"test_change_column_default_to_null",
"test_change_column_nullability",
"test_change_column_quotes_column_names",
"test_change_column_with_new_default",
"test_change_column_with_nil_default",
"test_change_type_of_not_null_column",
"test_create_table_adds_id",
"test_create_table_with_binary_column",
"test_create_table_with_custom_sequence_name",
"test_create_table_with_defaults",
"test_create_table_with_force_true_does_not_drop_nonexisting_table",
"test_create_table_with_limits",
"test_create_table_with_not_null_column",
"test_create_table_with_primary_key_prefix_as_table_name",
"test_create_table_with_primary_key_prefix_as_table_name_with_underscore",
"test_create_table_with_timestamps_should_create_datetime_columns",
"test_create_table_with_timestamps_should_create_datetime_columns_with_options",
"test_create_table_without_a_block",
"test_create_table_without_id",
"test_finds_migrations",
"test_finds_pending_migrations",
"test_keeping_default_and_notnull_constraint_on_change",
"test_migrator",
"test_migrator_db_has_no_schema_migrations_table",
"test_migrator_double_down",
"test_migrator_double_up",
"test_migrator_forward",
"test_migrator_going_down_due_to_version_target",
"test_migrator_one_down",
"test_migrator_one_up",
"test_migrator_one_up_one_down",
"test_migrator_one_up_with_exception_and_rollback",
"test_migrator_rollback",
"test_migrator_verbosity",
"test_migrator_verbosity_off",
"test_migrator_with_duplicate_names",
"test_migrator_with_duplicates",
"test_migrator_with_missing_version_numbers",
"test_native_decimal_insert_manual_vs_automatic",
"test_native_types",
"test_only_loads_pending_migrations",
"test_proper_table_name",
"test_relative_migrations",
"test_remove_column_with_index",
"test_remove_column_with_multi_column_index",
"test_rename_column",
"test_rename_column_preserves_default_value_not_null",
"test_rename_column_using_symbol_arguments",
"test_rename_column_with_an_index",
"test_rename_column_with_sql_reserved_word",
"test_rename_nonexistent_column",
"test_rename_table",
"test_rename_table_for_sqlite_should_work_with_reserved_words",
"test_rename_table_with_an_index",
"test_schema_migrations_table_name",
"test_target_version_zero_should_run_only_once"]
LargeTestArraySorted = [
"test_add_column_not_null_with_default",
"test_add_column_with_precision_and_scale",
"test_add_column_with_primary_key_attribute",
"test_add_drop_table_with_prefix_and_suffix",
"test_add_index",
"test_add_remove_single_field_using_string_arguments",
"test_add_remove_single_field_using_symbol_arguments",
"test_add_rename",
"test_add_table",
"test_add_table_with_decimals",
"test_change_column",
"test_change_column_default",
"test_change_column_default_to_null",
"test_change_column_nullability",
"test_change_column_quotes_column_names",
"test_change_column_with_new_default",
"test_change_column_with_nil_default",
"test_change_type_of_not_null_column",
"test_create_table_adds_id",
"test_create_table_with_binary_column",
"test_create_table_with_custom_sequence_name",
"test_create_table_with_defaults",
"test_create_table_with_force_true_does_not_drop_nonexisting_table",
"test_create_table_with_limits",
"test_create_table_with_not_null_column",
"test_create_table_with_primary_key_prefix_as_table_name",
"test_create_table_with_primary_key_prefix_as_table_name_with_underscore",
"test_create_table_with_timestamps_should_create_datetime_columns",
"test_create_table_with_timestamps_should_create_datetime_columns_with_options",
"test_create_table_without_a_block",
"test_create_table_without_id",
"test_finds_migrations",
"test_finds_pending_migrations",
"test_keeping_default_and_notnull_constraint_on_change",
"test_migrator",
"test_migrator_db_has_no_schema_migrations_table",
"test_migrator_double_down",
"test_migrator_double_up",
"test_migrator_forward",
"test_migrator_going_down_due_to_version_target",
"test_migrator_one_down",
"test_migrator_one_up",
"test_migrator_one_up_one_down",
"test_migrator_one_up_with_exception_and_rollback",
"test_migrator_rollback",
"test_migrator_verbosity",
"test_migrator_verbosity_off",
"test_migrator_with_duplicate_names",
"test_migrator_with_duplicates",
"test_migrator_with_missing_version_numbers",
"test_native_decimal_insert_manual_vs_automatic",
"test_native_types",
"test_only_loads_pending_migrations",
"test_proper_table_name",
"test_relative_migrations",
"test_remove_column_with_index",
"test_remove_column_with_multi_column_index",
"test_rename_column",
"test_rename_column_preserves_default_value_not_null",
"test_rename_column_using_symbol_arguments",
"test_rename_column_with_an_index",
"test_rename_column_with_sql_reserved_word",
"test_rename_nonexistent_column",
"test_rename_table",
"test_rename_table_for_sqlite_should_work_with_reserved_words",
"test_rename_table_with_an_index",
"test_schema_migrations_table_name",
"test_target_version_zero_should_run_only_once",
]
class PrivateToAry
private

View File

@ -28,6 +28,16 @@ describe "Array#pack with :buffer option" do
TypeError, "buffer must be String, not Array")
end
it "raise FrozenError if buffer is frozen" do
-> { [65].pack("c", buffer: "frozen-string".freeze) }.should raise_error(FrozenError)
end
it "preserves the encoding of the given buffer" do
buffer = ''.encode(Encoding::ISO_8859_1)
[65, 66, 67].pack("ccc", buffer: buffer)
buffer.encoding.should == Encoding::ISO_8859_1
end
context "offset (@) is specified" do
it 'keeps buffer content if it is longer than offset' do
n = [ 65, 66, 67 ]

View File

@ -1,12 +1,12 @@
module IOWaitSpec
module IOSpec
def self.exhaust_write_buffer(io)
written = 0
buf = " " * 4096
begin
while true
written += io.write_nonblock(buf)
rescue Errno::EAGAIN, Errno::EWOULDBLOCK
return written
end while true
end
rescue Errno::EAGAIN, Errno::EWOULDBLOCK
written
end
end

View File

@ -427,7 +427,7 @@ describe "The 'case'-construct" do
:bar
end
RUBY
}.should complain(/warning: duplicated .when' clause with line \d+ is ignored/, verbose: true)
}.should complain(/warning: (duplicated .when' clause with line \d+ is ignored|'when' clause on line \d+ duplicates 'when' clause on line \d+ and is ignored)/, verbose: true)
end
end

View File

@ -0,0 +1,75 @@
describe "Pattern matching" do
before :each do
ScratchPad.record []
end
describe "Ruby 3.1 improvements" do
ruby_version_is "3.1" do
it "can omit parentheses in one line pattern matching" do
[1, 2] => a, b
[a, b].should == [1, 2]
{a: 1} => a:
a.should == 1
end
it "supports pinning instance variables" do
@a = /a/
case 'abc'
in ^@a
true
end.should == true
end
it "supports pinning class variables" do
result = nil
Module.new do
result = module_eval(<<~RUBY)
@@a = 0..10
case 2
in ^@@a
true
end
RUBY
end
result.should == true
end
it "supports pinning global variables" do
$a = /a/
case 'abc'
in ^$a
true
end.should == true
end
it "supports pinning expressions" do
case 'abc'
in ^(/a/)
true
end.should == true
case 0
in ^(0 + 0)
true
end.should == true
end
it "supports pinning expressions in array pattern" do
case [3]
in [^(1 + 2)]
true
end.should == true
end
it "supports pinning expressions in hash pattern" do
case {name: '2.6', released_at: Time.new(2018, 12, 25)}
in {released_at: ^(Time.new(2010)..Time.new(2020))}
true
end.should == true
end
end
end
end

File diff suppressed because it is too large Load Diff

View File

@ -24,4 +24,23 @@ describe "IO#wait_readable" do
it "waits for the IO to become readable with the given large timeout" do
@io.wait_readable(365 * 24 * 60 * 60).should == @io
end
it "can be interrupted" do
rd, wr = IO.pipe
start = Process.clock_gettime(Process::CLOCK_MONOTONIC)
t = Thread.new do
rd.wait_readable(10)
end
Thread.pass until t.stop?
t.kill
t.join
finish = Process.clock_gettime(Process::CLOCK_MONOTONIC)
(finish - start).should < 9
ensure
rd.close
wr.close
end
end

View File

@ -1,5 +1,5 @@
require_relative '../../spec_helper'
require_relative 'fixtures/classes'
require_relative '../../fixtures/io'
ruby_version_is ''...'3.2' do
require 'io/wait'
@ -55,7 +55,7 @@ describe "IO#wait" do
end
it "waits for the WRITABLE event to be ready" do
written_bytes = IOWaitSpec.exhaust_write_buffer(@w)
written_bytes = IOSpec.exhaust_write_buffer(@w)
@w.wait(IO::WRITABLE, 0).should == nil
@r.read(written_bytes)
@ -67,7 +67,7 @@ describe "IO#wait" do
end
it "returns nil when the WRITABLE event is not ready during the timeout" do
IOWaitSpec.exhaust_write_buffer(@w)
IOSpec.exhaust_write_buffer(@w)
@w.wait(IO::WRITABLE, 0).should == nil
end
@ -92,7 +92,7 @@ describe "IO#wait" do
end
it "changes thread status to 'sleep' when waits for WRITABLE event" do
written_bytes = IOWaitSpec.exhaust_write_buffer(@w)
IOSpec.exhaust_write_buffer(@w)
t = Thread.new { @w.wait(IO::WRITABLE, 10) }
sleep 1
@ -100,6 +100,37 @@ describe "IO#wait" do
t.kill
t.join # Thread#kill doesn't wait for the thread to end
end
it "can be interrupted when waiting for READABLE event" do
start = Process.clock_gettime(Process::CLOCK_MONOTONIC)
t = Thread.new do
@r.wait(IO::READABLE, 10)
end
Thread.pass until t.stop?
t.kill
t.join # Thread#kill doesn't wait for the thread to end
finish = Process.clock_gettime(Process::CLOCK_MONOTONIC)
(finish - start).should < 9
end
it "can be interrupted when waiting for WRITABLE event" do
IOSpec.exhaust_write_buffer(@w)
start = Process.clock_gettime(Process::CLOCK_MONOTONIC)
t = Thread.new do
@w.wait(IO::WRITABLE, 10)
end
Thread.pass until t.stop?
t.kill
t.join # Thread#kill doesn't wait for the thread to end
finish = Process.clock_gettime(Process::CLOCK_MONOTONIC)
(finish - start).should < 9
end
end
context "[timeout, mode] passed" do

View File

@ -1,4 +1,5 @@
require_relative '../../spec_helper'
require_relative '../../fixtures/io'
ruby_version_is ''...'3.2' do
require 'io/wait'
@ -17,4 +18,24 @@ describe "IO#wait_writable" do
# Represents one year and is larger than a 32-bit int
STDOUT.wait_writable(365 * 24 * 60 * 60).should == STDOUT
end
it "can be interrupted" do
rd, wr = IO.pipe
IOSpec.exhaust_write_buffer(wr)
start = Process.clock_gettime(Process::CLOCK_MONOTONIC)
t = Thread.new do
wr.wait_writable(10)
end
Thread.pass until t.stop?
t.kill
t.join
finish = Process.clock_gettime(Process::CLOCK_MONOTONIC)
(finish - start).should < 9
ensure
rd.close unless rd.closed?
wr.close unless wr.closed?
end
end

View File

@ -88,6 +88,30 @@ describe 'RbConfig::CONFIG' do
end
end
end
guard -> { %w[aarch64 arm64].include? RbConfig::CONFIG['host_cpu'] } do
it "['host_cpu'] returns CPU architecture properly for AArch64" do
platform_is :darwin do
RbConfig::CONFIG['host_cpu'].should == 'arm64'
end
platform_is_not :darwin do
RbConfig::CONFIG['host_cpu'].should == 'aarch64'
end
end
end
guard -> { platform_is(:linux) || platform_is(:darwin) } do
it "['host_os'] returns a proper OS name or platform" do
platform_is :darwin do
RbConfig::CONFIG['host_os'].should.match?(/darwin/)
end
platform_is :linux do
RbConfig::CONFIG['host_os'].should.match?(/linux/)
end
end
end
end
describe "RbConfig::TOPDIR" do
@ -99,3 +123,32 @@ describe "RbConfig::TOPDIR" do
end
end
end
describe "RUBY_PLATFORM" do
it "RUBY_PLATFORM contains a proper CPU architecture" do
RUBY_PLATFORM.should.include? RbConfig::CONFIG['host_cpu']
end
guard -> { platform_is(:linux) || platform_is(:darwin) } do
it "RUBY_PLATFORM contains OS name" do
# don't use RbConfig::CONFIG['host_os'] as far as it could be slightly different, e.g. linux-gnu
platform_is(:linux) do
RUBY_PLATFORM.should.include? 'linux'
end
platform_is(:darwin) do
RUBY_PLATFORM.should.include? 'darwin'
end
end
end
end
describe "RUBY_DESCRIPTION" do
it "contains version" do
RUBY_DESCRIPTION.should.include? RUBY_VERSION
end
it "contains RUBY_PLATFORM" do
RUBY_DESCRIPTION.should.include? RUBY_PLATFORM
end
end

View File

@ -1,4 +1,5 @@
require_relative 'spec_helper'
require_relative '../../fixtures/io'
load_extension('io')
@ -279,6 +280,22 @@ describe "C-API IO function" do
it "raises an IOError if the IO is not initialized" do
-> { @o.rb_io_maybe_wait_writable(0, IO.allocate, nil) }.should raise_error(IOError, "uninitialized stream")
end
it "can be interrupted" do
IOSpec.exhaust_write_buffer(@w_io)
start = Process.clock_gettime(Process::CLOCK_MONOTONIC)
t = Thread.new do
@o.rb_io_maybe_wait_writable(0, @w_io, 10)
end
Thread.pass until t.stop?
t.kill
t.join
finish = Process.clock_gettime(Process::CLOCK_MONOTONIC)
(finish - start).should < 9
end
end
end
@ -355,6 +372,21 @@ describe "C-API IO function" do
thr.join
end
it "can be interrupted" do
start = Process.clock_gettime(Process::CLOCK_MONOTONIC)
t = Thread.new do
@o.rb_io_maybe_wait_readable(0, @r_io, 10, false)
end
Thread.pass until t.stop?
t.kill
t.join
finish = Process.clock_gettime(Process::CLOCK_MONOTONIC)
(finish - start).should < 9
end
it "raises an IOError if the IO is closed" do
@r_io.close
-> { @o.rb_io_maybe_wait_readable(0, @r_io, nil, false) }.should raise_error(IOError, "closed stream")
@ -438,6 +470,37 @@ describe "C-API IO function" do
it "raises an IOError if the IO is not initialized" do
-> { @o.rb_io_maybe_wait(0, IO.allocate, IO::WRITABLE, nil) }.should raise_error(IOError, "uninitialized stream")
end
it "can be interrupted when waiting for READABLE event" do
start = Process.clock_gettime(Process::CLOCK_MONOTONIC)
t = Thread.new do
@o.rb_io_maybe_wait(0, @r_io, IO::READABLE, 10)
end
Thread.pass until t.stop?
t.kill
t.join
finish = Process.clock_gettime(Process::CLOCK_MONOTONIC)
(finish - start).should < 9
end
it "can be interrupted when waiting for WRITABLE event" do
IOSpec.exhaust_write_buffer(@w_io)
start = Process.clock_gettime(Process::CLOCK_MONOTONIC)
t = Thread.new do
@o.rb_io_maybe_wait(0, @w_io, IO::WRITABLE, 10)
end
Thread.pass until t.stop?
t.kill
t.join
finish = Process.clock_gettime(Process::CLOCK_MONOTONIC)
(finish - start).should < 9
end
end
end