From 9f0b9a709e60d3414d689514728884a5cc24c2de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?fn=20=E2=8C=83=20=E2=8C=A5?= <70830482+FnControlOption@users.noreply.github.com> Date: Sat, 23 Oct 2021 01:37:24 -0700 Subject: [PATCH] Allow named replacements in expect_issue --- spec/ameba/rule/style/large_numbers_spec.cr | 11 +++++++---- src/ameba/rule/style/large_numbers.cr | 8 +++++++- src/ameba/spec/expect_issue.cr | 14 +++++++++++++- 3 files changed, 27 insertions(+), 6 deletions(-) diff --git a/spec/ameba/rule/style/large_numbers_spec.cr b/spec/ameba/rule/style/large_numbers_spec.cr index cd1f14f6..87fe95c6 100644 --- a/spec/ameba/rule/style/large_numbers_spec.cr +++ b/spec/ameba/rule/style/large_numbers_spec.cr @@ -5,9 +5,12 @@ module Ameba private def it_transforms(number, expected) it "transforms large number #{number}" do - s = Source.new number - Rule::Style::LargeNumbers.new.catch(s).should_not be_valid - s.issues.first.message.should contain expected + rule = Rule::Style::LargeNumbers.new + + expect_issue rule, <<-CRYSTAL, number: number + number = %{number} + # ^{number} error: Large numbers should be written with underscores: #{expected} + CRYSTAL end end @@ -118,7 +121,7 @@ module Ameba issue = s.issues.first issue.rule.should_not be_nil issue.location.to_s.should eq "source.cr:1:1" - issue.end_location.should be_nil + issue.end_location.to_s.should eq "source.cr:1:7" issue.message.should match /1_200_000/ end diff --git a/src/ameba/rule/style/large_numbers.cr b/src/ameba/rule/style/large_numbers.cr index e36c4c0f..8608abe3 100644 --- a/src/ameba/rule/style/large_numbers.cr +++ b/src/ameba/rule/style/large_numbers.cr @@ -42,7 +42,13 @@ module Ameba::Rule::Style parsed = parse_number token.raw if allowed?(*parsed) && (expected = underscored *parsed) != token.raw - issue_for token, MSG % expected + location = token.location + end_location = Crystal::Location.new( + location.filename, + location.line_number, + location.column_number + token.raw.size - 1 + ) + issue_for location, end_location, MSG % expected end end end diff --git a/src/ameba/spec/expect_issue.cr b/src/ameba/spec/expect_issue.cr index 2456969c..fd8d1871 100644 --- a/src/ameba/spec/expect_issue.cr +++ b/src/ameba/spec/expect_issue.cr @@ -53,8 +53,10 @@ module Ameba::Spec::ExpectIssue normalize = true, *, file = __FILE__, - line = __LINE__) + line = __LINE__, + **replacements) annotated_code = normalize_code(annotated_code) if normalize + annotated_code = format_issue(annotated_code, **replacements) expected_annotations = AnnotatedSource.parse(annotated_code) lines = expected_annotations.lines code = lines.join('\n') @@ -105,4 +107,14 @@ module Ameba::Spec::ExpectIssue end AnnotatedSource.new(lines, source.issues) end + + private def format_issue(code, **replacements) + replacements.each do |keyword, value| + value = value.to_s + code = code.gsub("%{#{keyword}}", value) + code = code.gsub("^{#{keyword}}", "^" * value.size) + code = code.gsub("_{#{keyword}}", " " * value.size) + end + code + end end