Skip to content

Commit 352517b

Browse files
Add analyzer for leap exercise (#105)
1 parent eb75192 commit 352517b

File tree

4 files changed

+97
-1
lines changed

4 files changed

+97
-1
lines changed

lib/analyzer.rb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
EXERCISES = %w[
22
two_fer
33
acronym
4+
leap
45
].freeze
56

67
FILENAMES = {
78
"acronym" => "acronym.rb",
8-
"two-fer" => "two_fer.rb"
9+
"two-fer" => "two_fer.rb",
10+
"leap" => "leap.rb"
911
}.freeze
1012

1113
require 'mandate'

lib/analyzers/leap/analyze.rb

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
module Leap
2+
class Analyze < ExerciseAnalyzer
3+
include Mandate
4+
5+
def analyze!
6+
if solution.uses_std_lib?
7+
self.status = :disapprove
8+
self.comments = ["ruby.leap.std_lib"]
9+
else
10+
self.status = :refer_to_mentor
11+
end
12+
13+
raise FinishedFlowControlException
14+
end
15+
end
16+
end

lib/analyzers/leap/representation.rb

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
module Leap
2+
class Representation < SolutionRepresentation
3+
def uses_std_lib?
4+
date_node = SA::Helpers.extract_nodes(:const, target_method).find { |node| node.const_name == 'Date' }
5+
return false if date_node.nil?
6+
7+
date_node.parent.children.any? { |node| %i[leap? gregorian_leap? julian_leap?].include? node }
8+
end
9+
10+
private
11+
def target_module
12+
SA::Helpers.extract_module_or_class(root_node, "Year")
13+
end
14+
15+
def target_method
16+
SA::Helpers.extract_module_method(target_module, "leap?")
17+
end
18+
end
19+
end

test/exercises/leap_test.rb

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
require "test_helper"
2+
3+
class LeapTest < Minitest::Test
4+
def test_date_leap_method_is_disapproved
5+
source = <<~SOURCE
6+
class Year
7+
def self.leap?(year)
8+
Date.leap?(year)
9+
end
10+
end
11+
SOURCE
12+
13+
results = Leap::Analyze.(source)
14+
assert_equal :disapprove, results[:status]
15+
assert_equal ["ruby.leap.std_lib"], results[:comments]
16+
end
17+
18+
def test_date_julian_leap_method_is_disapproved
19+
source = <<~SOURCE
20+
class Year
21+
def self.leap?(year)
22+
Date.julian_leap?(year)
23+
end
24+
end
25+
SOURCE
26+
27+
results = Leap::Analyze.(source)
28+
assert_equal :disapprove, results[:status]
29+
assert_equal ["ruby.leap.std_lib"], results[:comments]
30+
end
31+
32+
def test_date_gregorian_leap_method_is_disapproved
33+
source = <<~SOURCE
34+
class Year
35+
def self.leap?(year)
36+
Date.gregorian_leap?(year)
37+
end
38+
end
39+
SOURCE
40+
41+
results = Leap::Analyze.(source)
42+
assert_equal :disapprove, results[:status]
43+
assert_equal ["ruby.leap.std_lib"], results[:comments]
44+
end
45+
46+
def test_custom_implementation_referred_to_mentor
47+
source = <<~SOURCE
48+
class Year
49+
def self.leap?(year)
50+
year % 4 == 0
51+
end
52+
end
53+
SOURCE
54+
55+
results = Leap::Analyze.(source)
56+
assert_equal :refer_to_mentor, results[:status]
57+
assert_empty results[:comments]
58+
end
59+
end

0 commit comments

Comments
 (0)