diff --git a/lib/analyze_solution.rb b/lib/analyze_solution.rb index 979a975..4ebf50e 100644 --- a/lib/analyze_solution.rb +++ b/lib/analyze_solution.rb @@ -6,11 +6,10 @@ class AnalyzeSolution def call code_to_analyze = File.read(solution_path / FILENAMES[exercise_slug]) - puts "Analysing #{exercise_slug}" - classified_exercise = exercise_slug.tr('-', '_').classify + classified_exercise = exercise_slug.split('-').map(&:capitalize).join results = "#{classified_exercise}::Analyze".constantize.(code_to_analyze) - File.open(output_path / "analysis.json", "w") do |f| + File.open(output_path / ANALYSIS_FILENAME, "w") do |f| f.write("#{results.to_json}\n") end end diff --git a/lib/analyzer.rb b/lib/analyzer.rb index fa84323..af27bba 100644 --- a/lib/analyzer.rb +++ b/lib/analyzer.rb @@ -12,6 +12,8 @@ "high-scores" => "high_scores.rb" }.freeze +ANALYSIS_FILENAME = "analysis.json".freeze + require 'mandate' require 'json' require 'rubocop' diff --git a/test/analyze_solution_test.rb b/test/analyze_solution_test.rb deleted file mode 100644 index b93d876..0000000 --- a/test/analyze_solution_test.rb +++ /dev/null @@ -1,19 +0,0 @@ -require "test_helper" - -class AnalyzeSolutionTest < Minitest::Test - def test_that_it_constantizes_correctly - code = mock - analyzer = mock - results_json = mock - results = mock(to_json: results_json) - - File.expects(:read).with(SOLUTION_PATH / "two_fer.rb").returns(code) - File.expects(:open). - with(SAFE_WRITE_PATH / "analysis.json", "w").yields( - mock(write: results_json) - ) - TwoFer::Analyze.expects(:new).with(code).returns(analyzer) - analyzer.expects(:call).returns(results) - AnalyzeSolution.('two-fer', SOLUTION_PATH, SAFE_WRITE_PATH) - end -end diff --git a/test/analyzer_test.rb b/test/analyzer_test.rb index 8da1bad..7dc8286 100644 --- a/test/analyzer_test.rb +++ b/test/analyzer_test.rb @@ -1,16 +1,21 @@ require "test_helper" class AnalyzerTest < Minitest::Test - def test_that_it_converts_to_path_and_runs - slug = mock - solution_path = mock - output_path = mock - solution_pathname = mock - output_pathname = mock - Pathname.expects(:new).with(solution_path).returns(solution_pathname) - Pathname.expects(:new).with(output_path).returns(output_pathname) + TMP_PATH = Pathname.new('/tmp') - AnalyzeSolution.expects(:call).with(slug, solution_pathname, output_pathname) - Analyzer.analyze(slug, solution_path, output_path) + protected + attr_reader :exercise_slug + + def analysis_results(code = "") + solution_path = "#{TMP_PATH}/#{FILENAMES[exercise_slug]}" + analysis_path = "#{TMP_PATH}/#{ANALYSIS_FILENAME}" + File.open(solution_path, "w") do |f| + f.write("#{code}\n") + end + AnalyzeSolution.(exercise_slug, TMP_PATH, TMP_PATH) + JSON.parse(File.read(analysis_path)) + ensure + File.delete solution_path if File.exist? solution_path + File.delete analysis_path if File.exist? analysis_path end end diff --git a/test/exercises/acronym_test.rb b/test/exercises/acronym_test.rb index 693aa7c..305d35b 100644 --- a/test/exercises/acronym_test.rb +++ b/test/exercises/acronym_test.rb @@ -1,7 +1,11 @@ require "test_helper" require 'pry' -class AcronymTest < Minitest::Test +class AcronymTest < AnalyzerTest + def setup + @exercise_slug = "acronym" + end + def test_method_chaining_passes source = " class Acronym @@ -10,9 +14,9 @@ def self.abbreviate(words) end end " - results = Acronym::Analyze.(source) - assert_equal :approve, results[:status] - assert_empty results[:comments] + results = analysis_results(source) + assert_equal "approve", results["status"] + assert_empty results["comments"] end def test_lvar_name_not_tightly_coupled @@ -23,9 +27,9 @@ def self.abbreviate(sentence) end end " - results = Acronym::Analyze.(source) - assert_equal :approve, results[:status] - assert_empty results[:comments] + results = analysis_results(source) + assert_equal "approve", results["status"] + assert_empty results["comments"] end def test_method_chaining_with_block_syntax_passes_with_comment @@ -36,9 +40,9 @@ def self.abbreviate(words) end end " - results = Acronym::Analyze.(source) - assert_equal :approve, results[:status] - assert_equal ["ruby.acronym.block_syntax.shorthand"], results[:comments] + results = analysis_results(source) + assert_equal "approve", results["status"] + assert_equal ["ruby.acronym.block_syntax.shorthand"], results["comments"] end def test_method_chaining_with_block_syntax_with_arbitrary_arg_passes @@ -49,9 +53,9 @@ def self.abbreviate(words) end end " - results = Acronym::Analyze.(source) - assert_equal :approve, results[:status] - assert_equal ["ruby.acronym.block_syntax.shorthand"], results[:comments] + results = analysis_results(source) + assert_equal "approve", results["status"] + assert_equal ["ruby.acronym.block_syntax.shorthand"], results["comments"] end def test_module_method_passes @@ -62,9 +66,9 @@ def self.abbreviate(words) end end " - results = Acronym::Analyze.(source) - assert_equal :approve, results[:status] - assert_empty results[:comments] + results = analysis_results(source) + assert_equal "approve", results["status"] + assert_empty results["comments"] end def test_refers_to_mentor_with_method_not_matching @@ -75,8 +79,8 @@ def self.abbreviate(words) end end " - results = Acronym::Analyze.(source) - assert_equal :refer_to_mentor, results[:status] + results = analysis_results(source) + assert_equal "refer_to_mentor", results["status"] end def test_refers_to_mentor_with_random_method_body @@ -87,8 +91,8 @@ def self.abbreviate(words) end end ' - results = Acronym::Analyze.(source) - assert_equal :refer_to_mentor, results[:status] + results = analysis_results(source) + assert_equal "refer_to_mentor", results["status"] end def test_scan_with_any_regex_passes @@ -99,9 +103,9 @@ def self.abbreviate(words) end end ' - results = Acronym::Analyze.(source) - assert_equal :approve, results[:status] - assert_empty results[:comments] + results = analysis_results(source) + assert_equal "approve", results["status"] + assert_empty results["comments"] end def test_split_with_any_regex_passes @@ -112,8 +116,8 @@ def self.abbreviate(words) end end ' - results = Acronym::Analyze.(source) - assert_equal :approve, results[:status] - assert_empty results[:comments] + results = analysis_results(source) + assert_equal "approve", results["status"] + assert_empty results["comments"] end end diff --git a/test/exercises/high_scores_test.rb b/test/exercises/high_scores_test.rb index 4fb7d0d..a0ed38e 100644 --- a/test/exercises/high_scores_test.rb +++ b/test/exercises/high_scores_test.rb @@ -1,6 +1,10 @@ require "test_helper" -class HighScoresTest < Minitest::Test +class HighScoresTest < AnalyzerTest + def setup + @exercise_slug = "high-scores" + end + def test_accepted_solution_is_approved_without_comment source = <<~SOURCE class HighScores @@ -28,9 +32,9 @@ def latest_is_personal_best? end SOURCE - results = HighScores::Analyze.(source) - assert_equal :approve, results[:status] - assert_empty results[:comments] + results = analysis_results(source) + assert_equal "approve", results["status"] + assert_empty results["comments"] end def test_solution_without_attr_reader_is_approved_with_comment @@ -62,9 +66,9 @@ def latest_is_personal_best? end SOURCE - results = HighScores::Analyze.(source) - assert_equal :approve, results[:status] - assert_equal ["ruby.high-scores.attr_reader"], results[:comments] + results = analysis_results(source) + assert_equal "approve", results["status"] + assert_equal ["ruby.high-scores.attr_reader"], results["comments"] end def test_reordered_accepted_solution_is_approved_without_comment @@ -94,9 +98,9 @@ def latest_is_personal_best? end SOURCE - results = HighScores::Analyze.(source) - assert_equal :approve, results[:status] - assert_empty results[:comments] + results = analysis_results(source) + assert_equal "approve", results["status"] + assert_empty results["comments"] end def test_non_accepted_solution_is_referred_to_mentor @@ -126,9 +130,9 @@ def latest_is_personal_best? end SOURCE - results = HighScores::Analyze.(source) - assert_equal :refer_to_mentor, results[:status] - assert_empty results[:comments] + results = analysis_results(source) + assert_equal "refer_to_mentor", results["status"] + assert_empty results["comments"] end def test_solution_with_incorrect_indentation_is_disapproved @@ -158,8 +162,8 @@ def latest_is_personal_best? end SOURCE - results = HighScores::Analyze.(source) - assert_equal :disapprove, results[:status] - assert_equal ["ruby.general.incorrect_indentation"], results[:comments] + results = analysis_results(source) + assert_equal "disapprove", results["status"] + assert_equal ["ruby.general.incorrect_indentation"], results["comments"] end end diff --git a/test/exercises/leap_test.rb b/test/exercises/leap_test.rb index 174b8ba..ddf1003 100644 --- a/test/exercises/leap_test.rb +++ b/test/exercises/leap_test.rb @@ -1,6 +1,10 @@ require "test_helper" -class LeapTest < Minitest::Test +class LeapTest < AnalyzerTest + def setup + @exercise_slug = "leap" + end + def test_date_leap_method_is_disapproved source = <<~SOURCE class Year @@ -10,9 +14,9 @@ def self.leap?(year) end SOURCE - results = Leap::Analyze.(source) - assert_equal :disapprove, results[:status] - assert_equal ["ruby.leap.std_lib"], results[:comments] + results = analysis_results(source) + assert_equal "disapprove", results["status"] + assert_equal ["ruby.leap.std_lib"], results["comments"] end def test_date_julian_leap_method_is_disapproved @@ -24,9 +28,9 @@ def self.leap?(year) end SOURCE - results = Leap::Analyze.(source) - assert_equal :disapprove, results[:status] - assert_equal ["ruby.leap.std_lib"], results[:comments] + results = analysis_results(source) + assert_equal "disapprove", results["status"] + assert_equal ["ruby.leap.std_lib"], results["comments"] end def test_date_gregorian_leap_method_is_disapproved @@ -38,9 +42,9 @@ def self.leap?(year) end SOURCE - results = Leap::Analyze.(source) - assert_equal :disapprove, results[:status] - assert_equal ["ruby.leap.std_lib"], results[:comments] + results = analysis_results(source) + assert_equal "disapprove", results["status"] + assert_equal ["ruby.leap.std_lib"], results["comments"] end def test_custom_implementation_referred_to_mentor @@ -52,8 +56,8 @@ def self.leap?(year) end SOURCE - results = Leap::Analyze.(source) - assert_equal :refer_to_mentor, results[:status] - assert_empty results[:comments] + results = analysis_results(source) + assert_equal "refer_to_mentor", results["status"] + assert_empty results["comments"] end end diff --git a/test/exercises/two_fer_test.rb b/test/exercises/two_fer_test.rb index e6d2fb7..032fced 100644 --- a/test/exercises/two_fer_test.rb +++ b/test/exercises/two_fer_test.rb @@ -1,7 +1,11 @@ require "test_helper" require 'pry' -class TwoFerTest < Minitest::Test +class TwoFerTest < AnalyzerTest + def setup + @exercise_slug = 'two-fer' + end + def test_fixtures skip fixtures_dir = File.expand_path("#{__FILE__}/../../fixtures/two-fer/") @@ -17,8 +21,8 @@ def test_fixtures actual = TwoFer::Analyze.(File.read("#{tmp_dir}/#{id}/two_fer.rb")) expected = JSON.parse(File.read("#{tmp_dir}/#{id}/analysis.json")) - assert_equal expected['status'].to_s, actual[:status].to_s - assert_equal expected['comments'], actual[:comments] + assert_equal expected['status'].to_s, actual["status"].to_s + assert_equal expected['comments'], actual["comments"] end end @@ -34,8 +38,7 @@ def self.two_fer(name="you") end end } - results = TwoFer::Analyze.(source) - assert_equal :approve, results[:status] + assert_equal "approve", analysis_results(source)["status"] end def test_simple_module_passes @@ -47,8 +50,7 @@ def self.two_fer(name="you") end end } - results = TwoFer::Analyze.(source) - assert_equal :approve, results[:status] + assert_equal "approve", analysis_results(source)["status"] end def test_simple_module_with_bookkeeping_passes @@ -64,8 +66,7 @@ module Bookkeeping VERSION = 10 end } - results = TwoFer::Analyze.(source) - assert_equal :approve, results[:status] + assert_equal "approve", analysis_results(source)["status"] end def test_different_module_name_fails @@ -77,9 +78,9 @@ def self.two_fer(name="you") end end } - results = TwoFer::Analyze.(source) - assert_equal :disapprove, results[:status] - assert_equal ["ruby.general.no_target_module"], results[:comments] + results = analysis_results(source) + assert_equal "disapprove", results["status"] + assert_equal ["ruby.general.no_target_module"], results["comments"] end # ### @@ -95,9 +96,9 @@ def self.foobar(name="you") end end } - results = TwoFer::Analyze.(source) - assert_equal :disapprove, results[:status] - assert_equal ["ruby.general.no_target_method"], results[:comments] + results = analysis_results(source) + assert_equal "disapprove", results["status"] + assert_equal ["ruby.general.no_target_method"], results["comments"] end def test_missing_param @@ -109,9 +110,9 @@ def self.two_fer end end ) - results = TwoFer::Analyze.(source) - assert_equal :disapprove, results[:status] - assert_equal ["ruby.two-fer.missing_default_param"], results[:comments] + results = analysis_results(source) + assert_equal "disapprove", results["status"] + assert_equal ["ruby.two-fer.missing_default_param"], results["comments"] end def test_missing_default_value_fails @@ -123,9 +124,9 @@ def self.two_fer(name) end end } - results = TwoFer::Analyze.(source) - assert_equal :disapprove, results[:status] - assert_equal ["ruby.two-fer.missing_default_param"], results[:comments] + results = analysis_results(source) + assert_equal "disapprove", results["status"] + assert_equal ["ruby.two-fer.missing_default_param"], results["comments"] end def test_splat_fails @@ -137,9 +138,9 @@ def self.two_fer(*foos) end end } - results = TwoFer::Analyze.(source) - assert_equal :disapprove, results[:status] - assert_equal [{comment: "ruby.two-fer.splat_args", params: {name_variable: :foos}}], results[:comments] + results = analysis_results(source) + assert_equal "disapprove", results["status"] + assert_equal [{"comment" => "ruby.two-fer.splat_args", "params" => {"name_variable" => "foos"}}], results["comments"] end # ### @@ -154,9 +155,9 @@ def self.two_fer(name="you") end end ' - results = TwoFer::Analyze.(source) - assert_equal :approve, results[:status] - assert_equal [{comment: "ruby.two-fer.string_concatenation", params: {name_variable: :name}}], results[:comments] + results = analysis_results(source) + assert_equal "approve", results["status"] + assert_equal [{"comment" => "ruby.two-fer.string_concatenation", "params" => {"name_variable" => "name"}}], results["comments"] end def test_string_interpolation_passes @@ -167,9 +168,9 @@ def self.two_fer(name="you") end end } - results = TwoFer::Analyze.(source) - assert_equal :approve, results[:status] - assert_equal [{comment: "ruby.two-fer.string_interpolation", params: {name_variable: :name}}], results[:comments] + results = analysis_results(source) + assert_equal "approve", results["status"] + assert_equal [{"comment" => "ruby.two-fer.string_interpolation", "params" => {"name_variable" => "name"}}], results["comments"] end def test_for_kernel_format @@ -181,9 +182,9 @@ def self.two_fer(name="you") end end ' - results = TwoFer::Analyze.(source) - assert_equal :approve, results[:status] - assert_equal [{comment: "ruby.two-fer.kernel_format", params: {name_variable: :name}}], results[:comments] + results = analysis_results(source) + assert_equal "approve", results["status"] + assert_equal [{"comment" => "ruby.two-fer.kernel_format", "params" => {"name_variable" => "name"}}], results["comments"] end def test_for_string_format @@ -195,9 +196,9 @@ def self.two_fer(name="you") end end ' - results = TwoFer::Analyze.(source) - assert_equal :approve, results[:status] - assert_equal [{comment: "ruby.two-fer.string_format", params: {name_variable: :name}}], results[:comments] + results = analysis_results(source) + assert_equal "approve", results["status"] + assert_equal [{"comment" => "ruby.two-fer.string_format", "params" => {"name_variable" => "name"}}], results["comments"] end def test_conditional_as_boolean @@ -213,9 +214,9 @@ def self.two_fer(name=nil) end end } - results = TwoFer::Analyze.(source) - assert_equal :disapprove, results[:status] - assert_equal ["ruby.two-fer.incorrect_default_param"], results[:comments] + results = analysis_results(source) + assert_equal "disapprove", results["status"] + assert_equal ["ruby.two-fer.incorrect_default_param"], results["comments"] end def test_conditional_with_nil @@ -231,9 +232,9 @@ def self.two_fer(name=nil) end end } - results = TwoFer::Analyze.(source) - assert_equal :disapprove, results[:status] - assert_equal ["ruby.two-fer.incorrect_default_param"], results[:comments] + results = analysis_results(source) + assert_equal "disapprove", results["status"] + assert_equal ["ruby.two-fer.incorrect_default_param"], results["comments"] end def test_conditional_with_nil_reversed @@ -249,9 +250,9 @@ def self.two_fer(name=nil) end end } - results = TwoFer::Analyze.(source) - assert_equal :disapprove, results[:status] - assert_equal ["ruby.two-fer.incorrect_default_param"], results[:comments] + results = analysis_results(source) + assert_equal "disapprove", results["status"] + assert_equal ["ruby.two-fer.incorrect_default_param"], results["comments"] end def test_conditional_with_string @@ -267,9 +268,9 @@ def self.two_fer(name='dog') end end } - results = TwoFer::Analyze.(source) - assert_equal :disapprove, results[:status] - assert_equal ["ruby.two-fer.incorrect_default_param"], results[:comments] + results = analysis_results(source) + assert_equal "disapprove", results["status"] + assert_equal ["ruby.two-fer.incorrect_default_param"], results["comments"] end def test_conditional_with_brackets @@ -285,9 +286,9 @@ def self.two_fer(name="you") end end } - results = TwoFer::Analyze.(source) - assert_equal :disapprove, results[:status] - assert_equal ["ruby.two-fer.incorrect_default_param"], results[:comments] + results = analysis_results(source) + assert_equal "disapprove", results["status"] + assert_equal ["ruby.two-fer.incorrect_default_param"], results["comments"] end def test_interpolated_ternary @@ -299,9 +300,9 @@ def self.two_fer(name=nil) end end } - results = TwoFer::Analyze.(source) - assert_equal :disapprove, results[:status] - assert_equal ["ruby.two-fer.incorrect_default_param"], results[:comments] + results = analysis_results(source) + assert_equal "disapprove", results["status"] + assert_equal ["ruby.two-fer.incorrect_default_param"], results["comments"] end def test_unknown_solution @@ -313,9 +314,9 @@ def self.two_fer(name=nil) end end ' - results = TwoFer::Analyze.(source) - assert_equal :refer_to_mentor, results[:status] - assert_empty results[:comments] + results = analysis_results(source) + assert_equal "refer_to_mentor", results["status"] + assert_empty results["comments"] end [' @@ -344,9 +345,9 @@ def self.two_fer(name="you") end'].each.with_index do |source, idx| define_method "test_incorrect_indentation_#{idx}" do # skip - results = TwoFer::Analyze.(source) - assert_equal :disapprove, results[:status] - assert_equal ["ruby.general.incorrect_indentation"], results[:comments] + results = analysis_results(source) + assert_equal "disapprove", results["status"] + assert_equal ["ruby.general.incorrect_indentation"], results["comments"] end end @@ -359,9 +360,9 @@ def self.two_fer(name="you") end end } - results = TwoFer::Analyze.(source) - assert_equal :disapprove, results[:status] - assert_equal ["ruby.general.explicit_return"], results[:comments] + results = analysis_results(source) + assert_equal "disapprove", results["status"] + assert_equal ["ruby.general.explicit_return"], results["comments"] end def test_reassigned_param @@ -374,9 +375,9 @@ def self.two_fer(name=nil) end end } - results = TwoFer::Analyze.(source) - assert_equal :disapprove, results[:status] - assert_equal ["ruby.two-fer.reassigning_param"], results[:comments] + results = analysis_results(source) + assert_equal "disapprove", results["status"] + assert_equal ["ruby.two-fer.reassigning_param"], results["comments"] end def test_reassigned_param_using_conditional @@ -390,9 +391,9 @@ def self.two_fer(name = nil) end end } - results = TwoFer::Analyze.(source) - assert_equal :disapprove, results[:status] - assert_equal ["ruby.two-fer.incorrect_default_param"], results[:comments] + results = analysis_results(source) + assert_equal "disapprove", results["status"] + assert_equal ["ruby.two-fer.incorrect_default_param"], results["comments"] end end diff --git a/test/test_helper.rb b/test/test_helper.rb index 017ded5..7f81dbe 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -10,11 +10,6 @@ require 'minitest/pride' require "mocha/minitest" -class Minitest::Test - SAFE_WRITE_PATH = Pathname.new('/tmp/output') - SOLUTION_PATH = Pathname.new('/tmp') -end - $LOAD_PATH.unshift File.expand_path('../lib', __dir__) require "analyzer"