class Rubydex::Linter::RuleTestCase
Base test case for Rubydex linter rules.
Add expected diagnostics below the source:
assert_diagnostics(<<~RUBY) FOO = 123 ^^^ Failure: FOO RUBY
The carets mark the diagnostic range. Use ‘^{}` for a zero-width range. Pass a hash to test multiple files. Repeat an annotation line for each message line. By default, FooTest tests the Foo rule.
Constants
- ANNOTATION_PATTERN
- DEFAULT_FILE
Attributes
workspace_path
[R]
String
Public Class Methods
(String) → void
Source
# File lib/rubydex/linter/rule_test_case.rb, line 35 def initialize(name) super @workspace_path = File.realpath(Dir.mktmpdir("rubydex-rule-test-")) #: String end
Calls superclass method
Public Instance Methods
(*(String | Hash[String | Symbol, String])) ?{ (Graph) → CustomRule } → Array[Diagnostic]
Source
# File lib/rubydex/linter/rule_test_case.rb, line 81 def assert_diagnostics(*args, &rule_builder) sources = validated_shared_source.merge(normalize_sources(args)) clean_per_file, expected_per_file = write_sources(sources) diagnostics = run_rule(&rule_builder) actual_per_file = annotations_for_diagnostics(diagnostics, clean_per_file) surprise_files = actual_per_file.keys - clean_per_file.keys - ignored_diagnostic_files refute_predicate( surprise_files, :any?, "Diagnostics in unexpected files: #{surprise_files.inspect}", ) clean_per_file.each do |filename, clean| expected = render_annotated(clean, expected_per_file[filename] || []) actual = render_annotated(clean, actual_per_file[filename] || []) assert_equal(expected, actual, "Mismatch in #{filename}") end diagnostics end
Runs the rule and compares every diagnostic location with the inline annotations in the corresponding source.
(
Source
# File lib/rubydex/linter/rule_test_case.rb, line 123 def assert_handles_missing_required_dependency(dependency, *args, after_excluding: [], &rule_builder) sources = validated_shared_source.dup #: Hash[String, String] after_excluding.each { |filename| sources.delete(filename) } sources.merge!(normalize_sources(args)) write_sources(sources) error = assert_raises(MissingGraphDependencyError) do run_rule(&rule_builder) end expected_message = MissingGraphDependencyError.new(rule_class.rule_name, dependency).message assert_equal(expected_message, error.message) end
| String, | *(String | Hash[String | Symbol, String]), | ?after_excluding: Array, | ) ?{ (Graph) -> CustomRule } -> void
(*(String | Hash[String | Symbol, String])) ?{ (Graph) → CustomRule } → Array[Diagnostic]
Source
# File lib/rubydex/linter/rule_test_case.rb, line 107 def assert_no_diagnostics(*args, &rule_builder) sources = validated_shared_source.merge(normalize_sources(args)) write_sources(sources) diagnostics = run_rule(&rule_builder) ignored = ignored_diagnostic_files reported = diagnostics.reject { |diagnostic| ignored.include?(diagnostic.location.to_file_path) } assert_empty(reported, "Expected no diagnostics, got #{reported.map(&:message).inspect}") diagnostics end
Runs the rule and asserts no diagnostics are reported in the provided sources. Sources must not contain caret annotations.
→ Array[String]
Source
# File lib/rubydex/linter/rule_test_case.rb, line 69 def ignored_diagnostic_files @ignored_diagnostic_files ||= [] #: Array[String]? end
Returns absolute file paths whose diagnostics should be ignored.
→ singleton(CustomRule)
Source
# File lib/rubydex/linter/rule_test_case.rb, line 48 def rule_class @rule_class ||= begin name = self.class.to_s.delete_suffix("Test") if name == self.class.to_s raise "Could not infer rule class from #{self.class}; override `#rule_class`" end Object.const_get(name) #: as singleton(CustomRule) end #: singleton(CustomRule)? end
Source
# File lib/rubydex/linter/rule_test_case.rb, line 74 def rule_config @rule_config ||= LinterConfig.new({}) #: LinterConfig? end
→ void
Source
# File lib/rubydex/linter/rule_test_case.rb, line 41 def teardown super ensure FileUtils.remove_entry(workspace_path) end
Calls superclass method