lib/rspec/sorbet/doubles.rb in rspec-sorbet-1.6.0 vs lib/rspec/sorbet/doubles.rb in rspec-sorbet-1.7.0

- old
+ new

@@ -19,30 +19,38 @@ alias_method :allow_instance_doubles!, :allow_doubles! private INLINE_DOUBLE_REGEX = - /T.(let|cast): Expected type (T.(any|nilable)\()?(?<expected_classes>[a-zA-Z:: ,]*)(\))?, got type (.*) with value #<(Instance|Class|Object)?Double([\(]|[ ])(?<doubled_module>[a-zA-Z:: ,]*)(\))?/.freeze + /T.(?:let|cast): Expected type (?:T.(?<t_method>any|nilable|class_of)\()?(?<expected_types>[a-zA-Z:: ,]*)(\))?, got (?:type .* with value )?#<(?<double_type>Instance|Class|Object)?Double([\(]|[ ])(?<doubled_type>[a-zA-Z:: ,]*)(\))?/.freeze def inline_type_error_handler(error) case error when TypeError message = error.message return if unable_to_check_type_for_message?(message) - _, expected_types_string, doubled_module_string = (message.match(INLINE_DOUBLE_REGEX) || [])[0..2] - return unless doubled_module_string + raise error unless (match = message.match(INLINE_DOUBLE_REGEX)) - raise error unless expected_types_string && doubled_module_string + t_method = match[:t_method] + expected_types = match[:expected_types].split(',').map do |expected_type| + Object.const_get(expected_type.strip) + end + double_type = match[:double_type] + doubled_type = Object.const_get(match[:doubled_type]) - expected_types = expected_types_string.split(',').map do |expected_type_string| - Object.const_get(expected_type_string.strip) + if double_type == 'Class' + raise error if t_method != 'class_of' + + valid = expected_types.any? do |expected_type| + doubled_type <= expected_type + end + raise error unless valid end - doubled_module = Object.const_get(doubled_module_string) valid = expected_types.any? do |expected_type| - doubled_module.ancestors.include?(expected_type) + doubled_type.ancestors.include?(expected_type) end raise error unless valid else raise error end @@ -81,9 +89,11 @@ when T::Types::TypedArray, T::Types::TypedEnumerable typing = typing.type end case typing + when T::Types::ClassOf + should_raise = !(target <= typing.type) when T::Types::Simple should_raise = !target.ancestors.include?(typing.raw_type) when T::Types::Union valid = typing.types.map(&:raw_type).any? do |type| target.ancestors.include?(type)