gamifying_formatter 0.0.2 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +6 -14
- data/README.md +10 -0
- data/achievement.png +0 -0
- data/gamifying_formatter.gemspec +2 -2
- data/lib/gamifying_formatter/common.rb +139 -0
- data/lib/gamifying_formatter/rspec1.rb +24 -0
- data/lib/gamifying_formatter/rspec2.rb +26 -0
- data/lib/gamifying_formatter/rspec3.rb +41 -0
- data/lib/gamifying_formatter.rb +21 -176
- data/lib/test_info.rb +35 -5
- data/spec/gamifying_formatter/gamifying_formatter_spec.rb +412 -0
- data/spec/spec_helper.rb +1 -0
- data/spec/test_info_spec.rb +66 -0
- metadata +18 -12
- data/spec/gamifying_formatter_spec.rb +0 -93
checksums.yaml
CHANGED
@@ -1,15 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
metadata.gz: !binary |-
|
9
|
-
YWRmZDY2N2NiZTY4OGRhNzAwMmZhZmRhMWUzNWJlZjc4ZTAwMDA2Y2Q4Mzli
|
10
|
-
ZGVkMzI1YzA5ZWM3ZTMyNzc4YzZjNTU1NDVhY2FlNjkzYzkyMDkyOTNlNDRi
|
11
|
-
MDM4ZTZhYjA0YzE2MzAyYTg2NThkNTBiOGM4NDhlYmYzNzNiOTU=
|
12
|
-
data.tar.gz: !binary |-
|
13
|
-
ZmJhZTZiYmY5YTVjZjJjMTBkNTlmZDI3MjVlZGY0NzYyY2NkODJhZTQ1MTJk
|
14
|
-
MmI2NzE2MmQ5YzNhNmJlOTIxZTk3ZTQyY2EyYTc2OTc2MThlYzE1YzZiODNk
|
15
|
-
MmI3MTdjNTc0YWFmODY3NmQwZjY1OWVkNzkxNzg0MzkyYmZhNTY=
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 308f6e820cd5c35d1f0e1cb880c9d9c9947d9a34
|
4
|
+
data.tar.gz: 9149b823cba62dea23420ab53a8b10a8114f9de9
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 8d73b00ff3ed98a0fe1ed512be8f5ea794ed19035157e0964de5ae89b6b85e2b6db074546adf09fa384062003ee0779b78a07e7e0acead924cdc579864188570
|
7
|
+
data.tar.gz: eda62592b01de6398116e154f84f8ba14b526c20025a20187cd8f36fccf6b31d116ac972af4a397f98e476f33905a4a55debc431064687e9e3bde25e2913468f
|
data/README.md
CHANGED
@@ -10,6 +10,10 @@ Adding tests
|
|
10
10
|
|
11
11
|
You receive the trophies based on the amount of points you get which start out small and get bigger.
|
12
12
|
|
13
|
+
Now works on Rspec 1/2/3.
|
14
|
+
|
15
|
+
Thanks goes to the good folks at [nyan-cat-formatter](https://github.com/mattsears/nyan-cat-formatter) for the inspiration to do this and blazing for the trail for creating formatters.
|
16
|
+
|
13
17
|
## Installation
|
14
18
|
|
15
19
|
Add this line to your application's Gemfile:
|
@@ -34,6 +38,12 @@ To use the GamifyingFormatter all you need to do is add this option when you are
|
|
34
38
|
|
35
39
|
--format GamifyingFormatter
|
36
40
|
|
41
|
+
## Example
|
42
|
+
|
43
|
+
Run the example using:
|
44
|
+
|
45
|
+
rspec example/example.rb --require gamifying_formatter.rb --format GamifyingFormatter
|
46
|
+
|
37
47
|
## Contributing
|
38
48
|
|
39
49
|
1. Fork it
|
data/achievement.png
CHANGED
Binary file
|
data/gamifying_formatter.gemspec
CHANGED
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
|
5
5
|
Gem::Specification.new do |gem|
|
6
6
|
gem.name = "gamifying_formatter"
|
7
|
-
gem.version = '0.0
|
7
|
+
gem.version = '1.0.0'
|
8
8
|
gem.authors = ["Chris Belsole"]
|
9
9
|
gem.email = ["cbelsole@gmail.com"]
|
10
10
|
gem.description = %q{The Gamifying Formatter}
|
@@ -15,5 +15,5 @@ Gem::Specification.new do |gem|
|
|
15
15
|
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
16
16
|
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
17
17
|
gem.require_paths = ["lib"]
|
18
|
-
gem.add_dependency 'rspec'
|
18
|
+
gem.add_dependency 'rspec', '= 3.0.0'
|
19
19
|
end
|
@@ -0,0 +1,139 @@
|
|
1
|
+
require 'test_info'
|
2
|
+
require 'yaml'
|
3
|
+
|
4
|
+
module GamifyingFormatters
|
5
|
+
module Common
|
6
|
+
|
7
|
+
def load_test_info
|
8
|
+
if File.exists?('.past_results.yml')
|
9
|
+
@test_info = YAML::load(File.new('.past_results.yml', 'r'))
|
10
|
+
else
|
11
|
+
@test_info = TestInfo.new
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def wrap_up(num_of_examples, num_of_failed_examples, duration)
|
16
|
+
@test_info.number_of_tests = num_of_examples
|
17
|
+
@test_info.number_of_failed_tests = num_of_failed_examples
|
18
|
+
@test_info.total_time = duration
|
19
|
+
File.open('.past_results.yml', 'w') { |file| file.puts @test_info.to_yaml }
|
20
|
+
end
|
21
|
+
|
22
|
+
def calculate_achevements(example_count, failure_count, duration)
|
23
|
+
achievements = []
|
24
|
+
achievements << number_of_tests_achievement(@test_info.number_of_tests, example_count)
|
25
|
+
achievements << number_of_fixed_tests_achievement(@test_info.number_of_failed_tests, failure_count)
|
26
|
+
achievements << decreased_test_time_achievement(@test_info.total_time, duration)
|
27
|
+
|
28
|
+
achievements.delete_if(&:nil?).each { |achievement| @test_info.addAchievement(achievement) }
|
29
|
+
end
|
30
|
+
|
31
|
+
def show_achievements
|
32
|
+
output.puts "\n!!!!!!!!Achievements!!!!!!!!"
|
33
|
+
output.puts get_trophie(@test_info.level)
|
34
|
+
output.puts '-' * (@test_info.achievements.uniq.join(" | ").size + 4)
|
35
|
+
output.puts "| #{@test_info.achievements.uniq.join(" | ")} |"
|
36
|
+
output.puts '-' * (@test_info.achievements.uniq.join(" | ").size + 4)
|
37
|
+
end
|
38
|
+
|
39
|
+
def show_xp_bar
|
40
|
+
case @test_info.level
|
41
|
+
when 1
|
42
|
+
goal_xp = 10
|
43
|
+
when 2
|
44
|
+
goal_xp = 25
|
45
|
+
when 3
|
46
|
+
goal_xp = 50
|
47
|
+
when 4
|
48
|
+
goal_xp = 100
|
49
|
+
else
|
50
|
+
goal_xp = 1000
|
51
|
+
end
|
52
|
+
|
53
|
+
least_common_multiple = goal_xp.lcm(25)
|
54
|
+
numerator = least_common_multiple / goal_xp
|
55
|
+
denominator = least_common_multiple / 25
|
56
|
+
|
57
|
+
xp_chars = '=' * ((@test_info.xp * numerator) / denominator).ceil
|
58
|
+
xp_filler = ' ' * (25 - xp_chars.size)
|
59
|
+
output.puts "Level #{@test_info.level}: #{@test_info.xp}/#{goal_xp} [#{xp_chars}#{xp_filler}]"
|
60
|
+
end
|
61
|
+
|
62
|
+
def number_of_tests_achievement(old_total_tests, new_total_tests)
|
63
|
+
goal = [100, 50, 25, 10, 5, 1].select { |target|
|
64
|
+
new_total_tests - old_total_tests >= target
|
65
|
+
}.max
|
66
|
+
|
67
|
+
goal ? "Added #{goal} test(s)!" : nil
|
68
|
+
end
|
69
|
+
|
70
|
+
def decreased_test_time_achievement(old_total_time, new_total_time)
|
71
|
+
goal = [100, 50, 25, 10, 5, 1, 0.5, 0.2].select { |target|
|
72
|
+
(old_total_time * 100 - new_total_time * 100).round / 100.0 >= target
|
73
|
+
}.max
|
74
|
+
|
75
|
+
goal ? "Reduced testing time by #{goal} second(s)!" : nil
|
76
|
+
end
|
77
|
+
|
78
|
+
def number_of_fixed_tests_achievement(old_failed_tests, new_failed_tests)
|
79
|
+
goal = [100, 50, 25, 10, 5, 1].select { |target|
|
80
|
+
old_failed_tests - new_failed_tests >= target
|
81
|
+
}.max
|
82
|
+
|
83
|
+
goal ? "Fixed #{goal} test(s)!" : nil
|
84
|
+
end
|
85
|
+
|
86
|
+
def get_trophie(level)
|
87
|
+
case level
|
88
|
+
when 1
|
89
|
+
<<-EOS
|
90
|
+
.__.
|
91
|
+
(| |)
|
92
|
+
( )
|
93
|
+
_)(_
|
94
|
+
EOS
|
95
|
+
when 2
|
96
|
+
<<-EOS
|
97
|
+
{}
|
98
|
+
/__\\
|
99
|
+
/| |\\
|
100
|
+
(_| |_)
|
101
|
+
\\ /
|
102
|
+
)(
|
103
|
+
_|__|_
|
104
|
+
_|______|_
|
105
|
+
|__________|
|
106
|
+
EOS
|
107
|
+
when 3
|
108
|
+
<<-EOS
|
109
|
+
___________
|
110
|
+
'._==_==_=_.'
|
111
|
+
.-\\: /-.
|
112
|
+
| (|:. |) |
|
113
|
+
'-|:. |-'
|
114
|
+
\\::. /
|
115
|
+
'::. .'
|
116
|
+
) (
|
117
|
+
_.' '._
|
118
|
+
`"""""""`"
|
119
|
+
EOS
|
120
|
+
when 4
|
121
|
+
<<-EOS
|
122
|
+
.-=========-.
|
123
|
+
\\'-=======-'/
|
124
|
+
_| .=. |_
|
125
|
+
((| {{1}} |))
|
126
|
+
\\| /|\\ |/
|
127
|
+
\\__ '`' __/
|
128
|
+
_`) (`_
|
129
|
+
_/_______\\_
|
130
|
+
/___________\\
|
131
|
+
EOS
|
132
|
+
else
|
133
|
+
''
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
@@ -0,0 +1,24 @@
|
|
1
|
+
include GamifyingFormatters::Common
|
2
|
+
|
3
|
+
class RSpec1 < Spec::Runner::Formatter::BaseTextFormatter
|
4
|
+
def start(example_count)
|
5
|
+
super(example_count)
|
6
|
+
@test_info = load_test_info
|
7
|
+
end
|
8
|
+
|
9
|
+
def close
|
10
|
+
super
|
11
|
+
wrap_up(example_count, failure_count, duration)
|
12
|
+
end
|
13
|
+
|
14
|
+
def dump_summary(duration, example_count, failure_count, pending_count)
|
15
|
+
super(duration, example_count, failure_count, pending_count)
|
16
|
+
|
17
|
+
achievements = calculate_achevements(example_count, failure_count, duration)
|
18
|
+
|
19
|
+
show_achievements unless achievements.empty?
|
20
|
+
|
21
|
+
show_xp_bar
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'rspec/core/formatters/base_text_formatter'
|
2
|
+
|
3
|
+
include GamifyingFormatters::Common
|
4
|
+
|
5
|
+
class RSpec2 < RSpec::Core::Formatters::BaseTextFormatter
|
6
|
+
def initialize(output)
|
7
|
+
super(output)
|
8
|
+
@test_info = load_test_info
|
9
|
+
end
|
10
|
+
|
11
|
+
def close
|
12
|
+
super
|
13
|
+
wrap_up(example_count, failure_count, duration)
|
14
|
+
end
|
15
|
+
|
16
|
+
def dump_summary(duration, example_count, failure_count, pending_count)
|
17
|
+
super(duration, example_count, failure_count, pending_count)
|
18
|
+
|
19
|
+
achievements = calculate_achevements(example_count, failure_count, duration)
|
20
|
+
|
21
|
+
show_achievements unless achievements.empty?
|
22
|
+
|
23
|
+
show_xp_bar
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'rspec/core/formatters/base_text_formatter'
|
2
|
+
|
3
|
+
include GamifyingFormatters::Common
|
4
|
+
|
5
|
+
class RSpec3 < RSpec::Core::Formatters::BaseTextFormatter
|
6
|
+
|
7
|
+
RSpec::Core::Formatters.register self, :dump_summary
|
8
|
+
|
9
|
+
def initialize(output)
|
10
|
+
super(output)
|
11
|
+
@test_info = load_test_info
|
12
|
+
end
|
13
|
+
|
14
|
+
def wrap_up(num_of_examples, num_of_failed_examples, duration)
|
15
|
+
@test_info.number_of_tests = num_of_examples
|
16
|
+
@test_info.number_of_failed_tests = num_of_failed_examples
|
17
|
+
@test_info.total_time = duration
|
18
|
+
File.open('.past_results.yml', 'w') { |file| file.puts @test_info.to_yaml }
|
19
|
+
end
|
20
|
+
|
21
|
+
def dump_summary(summary_notification)
|
22
|
+
super(summary_notification)
|
23
|
+
|
24
|
+
achievements = calculate_achevements(
|
25
|
+
summary_notification.examples.size,
|
26
|
+
summary_notification.failed_examples.size,
|
27
|
+
summary_notification.duration
|
28
|
+
)
|
29
|
+
|
30
|
+
show_achievements unless achievements.empty?
|
31
|
+
|
32
|
+
show_xp_bar
|
33
|
+
|
34
|
+
wrap_up(
|
35
|
+
summary_notification.examples.size,
|
36
|
+
summary_notification.failed_examples.size,
|
37
|
+
summary_notification.duration
|
38
|
+
)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
data/lib/gamifying_formatter.rb
CHANGED
@@ -1,179 +1,24 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require '
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
end
|
22
|
-
|
23
|
-
def close
|
24
|
-
super
|
25
|
-
|
26
|
-
@test_info.number_of_tests = example_count
|
27
|
-
@test_info.total_time = duration
|
28
|
-
@test_info.number_of_failed_tests = failure_count
|
29
|
-
|
30
|
-
File.open('.past_results.yml', 'w') { |file| file.puts @test_info.to_yaml }
|
31
|
-
end
|
32
|
-
|
33
|
-
def dump_summary(duration, example_count, failure_count, pending_count)
|
34
|
-
|
35
|
-
super(duration, example_count, failure_count, pending_count)
|
36
|
-
|
37
|
-
calculate_achevements(example_count, failure_count, duration)
|
38
|
-
|
39
|
-
output_achievements
|
40
|
-
|
41
|
-
output_xp_bar
|
42
|
-
end
|
43
|
-
|
44
|
-
def calculate_achevements(example_count, failure_count, duration)
|
45
|
-
number_of_tests_achievement(@test_info.number_of_tests, example_count)
|
46
|
-
|
47
|
-
number_of_fixed_tests_achievement(@test_info.number_of_failed_tests, failure_count)
|
48
|
-
|
49
|
-
decreased_test_time_achievement(@test_info.total_time, duration)
|
50
|
-
end
|
51
|
-
|
52
|
-
def output_achievements
|
53
|
-
return unless @got_achievement
|
54
|
-
output.puts "\n!!!!!!!!Achievements!!!!!!!!"
|
55
|
-
output.puts get_trophie(@test_info.level)
|
56
|
-
output.puts '-' * (@test_info.achievements.uniq.join(" | ").size + 4)
|
57
|
-
output.puts "| #{@test_info.achievements.uniq.join(" | ")} |"
|
58
|
-
output.puts '-' * (@test_info.achievements.uniq.join(" | ").size + 4)
|
59
|
-
end
|
60
|
-
|
61
|
-
def output_xp_bar
|
62
|
-
case @test_info.level
|
63
|
-
when 1
|
64
|
-
goal_xp = 10
|
65
|
-
when 2
|
66
|
-
goal_xp = 25
|
67
|
-
when 3
|
68
|
-
goal_xp = 50
|
69
|
-
when 4
|
70
|
-
goal_xp = 100
|
71
|
-
else
|
72
|
-
goal_xp = 1000
|
73
|
-
end
|
74
|
-
|
75
|
-
least_common_multiple = goal_xp.lcm(25)
|
76
|
-
numerator = least_common_multiple / goal_xp
|
77
|
-
denominator = least_common_multiple / 25
|
78
|
-
|
79
|
-
xp_chars = '=' * ((@test_info.xp * numerator) / denominator).ceil
|
80
|
-
xp_filler = ' ' * (25 - xp_chars.size)
|
81
|
-
|
82
|
-
output.puts "Level #{@test_info.level}: #{@test_info.xp}/#{goal_xp} [#{xp_chars}#{xp_filler}]"
|
83
|
-
end
|
84
|
-
|
85
|
-
def number_of_tests_achievement(old_total_tests, new_total_tests)
|
86
|
-
[100, 50, 25, 10, 5, 1].each do |number|
|
87
|
-
if new_total_tests - old_total_tests >= number
|
88
|
-
@test_info.achievements.push("Added #{number} test(s)!")
|
89
|
-
@test_info.xp += 1
|
90
|
-
@got_achievement = true
|
91
|
-
check_level_up(@test_info.xp)
|
92
|
-
break
|
93
|
-
end
|
94
|
-
end
|
95
|
-
end
|
96
|
-
|
97
|
-
def decreased_test_time_achievement(old_total_time, new_total_time)
|
98
|
-
[100, 50, 25, 10, 5, 1, 0.5, 0.2].each do |number|
|
99
|
-
if (old_total_time * 100 - new_total_time * 100).round / 100.0 >= number
|
100
|
-
@test_info.achievements.push("Reduced testing time by #{number} second(s)!")
|
101
|
-
@test_info.xp += 1
|
102
|
-
@got_achievement = true
|
103
|
-
check_level_up(@test_info.xp)
|
104
|
-
break
|
105
|
-
end
|
106
|
-
end
|
107
|
-
end
|
108
|
-
|
109
|
-
def number_of_fixed_tests_achievement(old_failed_tests, new_failed_tests)
|
110
|
-
[100, 50, 25, 10, 5, 1].each do |number|
|
111
|
-
if old_failed_tests - new_failed_tests >= number
|
112
|
-
@test_info.achievements.push("Fixed #{number} test(s)!")
|
113
|
-
@test_info.xp += 1
|
114
|
-
@got_achievement = true
|
115
|
-
check_level_up(@test_info.xp)
|
116
|
-
break
|
117
|
-
end
|
118
|
-
end
|
119
|
-
end
|
120
|
-
|
121
|
-
def check_level_up(xp)
|
122
|
-
if xp == 10 || xp == 25 || xp == 50 || xp == 100
|
123
|
-
@test_info.level += 1
|
124
|
-
@test_info.xp = 0
|
125
|
-
end
|
126
|
-
end
|
127
|
-
|
128
|
-
def get_trophie(level)
|
129
|
-
case level
|
130
|
-
when 3
|
131
|
-
<<-EOS
|
132
|
-
___________
|
133
|
-
'._==_==_=_.'
|
134
|
-
.-\\: /-.
|
135
|
-
| (|:. |) |
|
136
|
-
'-|:. |-'
|
137
|
-
\\::. /
|
138
|
-
'::. .'
|
139
|
-
) (
|
140
|
-
_.' '._
|
141
|
-
`"""""""`"
|
142
|
-
EOS
|
143
|
-
when 2
|
144
|
-
<<-EOS
|
145
|
-
{}
|
146
|
-
/__\\
|
147
|
-
/| |\\
|
148
|
-
(_| |_)
|
149
|
-
\\ /
|
150
|
-
)(
|
151
|
-
_|__|_
|
152
|
-
_|______|_
|
153
|
-
|__________|
|
154
|
-
EOS
|
155
|
-
when 4
|
156
|
-
<<-EOS
|
157
|
-
.-=========-.
|
158
|
-
\\'-=======-'/
|
159
|
-
_| .=. |_
|
160
|
-
((| {{1}} |))
|
161
|
-
\\| /|\\ |/
|
162
|
-
\\__ '`' __/
|
163
|
-
_`) (`_
|
164
|
-
_/_______\\_
|
165
|
-
/___________\\
|
166
|
-
EOS
|
167
|
-
when 1
|
168
|
-
<<-EOS
|
169
|
-
.__.
|
170
|
-
(| |)
|
171
|
-
( )
|
172
|
-
_)(_
|
173
|
-
EOS
|
174
|
-
else
|
175
|
-
''
|
176
|
-
end
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'gamifying_formatter/common'
|
4
|
+
|
5
|
+
rspec_bin = $0.split('/').last
|
6
|
+
if rspec_bin == 'spec'
|
7
|
+
[
|
8
|
+
'spec',
|
9
|
+
'spec/runner/formatter/base_text_formatter',
|
10
|
+
'gamifying_formatter/rspec1'
|
11
|
+
].each { |f| require f }
|
12
|
+
formatter = RSpec1
|
13
|
+
else
|
14
|
+
require 'rspec/core/formatters/base_text_formatter'
|
15
|
+
if Gem::Version.new(RSpec::Core::Version::STRING).release >= Gem::Version.new('3.0.0')
|
16
|
+
require 'gamifying_formatter/rspec3'
|
17
|
+
formatter = RSpec3
|
18
|
+
else
|
19
|
+
require 'gamifying_formatter/rspec2'
|
20
|
+
formatter = RSpec2
|
177
21
|
end
|
178
22
|
end
|
179
23
|
|
24
|
+
GamifyingFormatter = formatter
|
data/lib/test_info.rb
CHANGED
@@ -1,15 +1,45 @@
|
|
1
1
|
class TestInfo
|
2
|
-
attr_accessor :number_of_tests, :total_time, :number_of_failed_tests
|
2
|
+
attr_accessor :number_of_tests, :total_time, :number_of_failed_tests
|
3
|
+
attr_reader :xp, :level, :achievements
|
3
4
|
|
4
5
|
def initialize
|
5
6
|
@achievements = []
|
7
|
+
@level = 1
|
8
|
+
@xp = 0
|
9
|
+
@number_of_tests = 0
|
10
|
+
@number_of_failed_tests = 0
|
11
|
+
@total_time = 0.0
|
6
12
|
end
|
7
13
|
|
8
|
-
def
|
9
|
-
|
14
|
+
def addAchievement(value)
|
15
|
+
unless value && value.empty?
|
16
|
+
incrimentXpAndLevel
|
17
|
+
@achievements << value
|
18
|
+
end
|
19
|
+
|
20
|
+
nil
|
21
|
+
end
|
22
|
+
|
23
|
+
def ==(o)
|
24
|
+
o.class == self.class &&
|
25
|
+
o.number_of_tests == number_of_tests &&
|
26
|
+
o.total_time == total_time &&
|
27
|
+
o.number_of_failed_tests == number_of_failed_tests &&
|
28
|
+
o.xp == xp &&
|
29
|
+
o.level == level &&
|
30
|
+
o.achievements == achievements
|
10
31
|
end
|
11
32
|
|
12
|
-
|
13
|
-
|
33
|
+
private
|
34
|
+
|
35
|
+
def incrimentXpAndLevel
|
36
|
+
@xp += 1
|
37
|
+
|
38
|
+
if @xp == 10 || @xp == 25 || @xp == 50 || @xp == 100
|
39
|
+
@level += 1
|
40
|
+
@xp = 0
|
41
|
+
end
|
42
|
+
|
43
|
+
nil
|
14
44
|
end
|
15
45
|
end
|
@@ -0,0 +1,412 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'GamifyingFormatters::Common' do
|
4
|
+
|
5
|
+
let(:output) { StringIO.new }
|
6
|
+
let(:formatter) { TestFormatter.new(output) }
|
7
|
+
|
8
|
+
describe '#load_test_info' do
|
9
|
+
it 'loads yml file when present' do
|
10
|
+
allow(File).to receive(:exists?).and_return(true)
|
11
|
+
expect(File).to receive(:new).with('.past_results.yml', 'r').and_return('--- foo')
|
12
|
+
formatter.load_test_info
|
13
|
+
expect(formatter.instance_variable_get(:@test_info)).to eq('foo')
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'creates new TestInfo when yml file is not present' do
|
17
|
+
allow(File).to receive(:exists?).and_return(false)
|
18
|
+
formatter.load_test_info
|
19
|
+
expect(formatter.instance_variable_get(:@test_info)).to eq(TestInfo.new)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
describe '#wrap_up' do
|
24
|
+
let(:test_info) { formatter.instance_variable_get(:@test_info) }
|
25
|
+
|
26
|
+
it 'saves info to .past_results.yml' do
|
27
|
+
test_info.instance_variable_set(:@xp, 34)
|
28
|
+
test_info.instance_variable_set(:@level, 5)
|
29
|
+
test_info.instance_variable_set(:@achievements, ['something'])
|
30
|
+
|
31
|
+
allow(File).to receive(:open)
|
32
|
+
|
33
|
+
formatter.wrap_up(100, 2, 99)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe '#show_achievements' do
|
38
|
+
let(:test_info) { formatter.instance_variable_get(:@test_info) }
|
39
|
+
|
40
|
+
it 'shows all achievements' do
|
41
|
+
test_info.instance_variable_set(:@achievements, ['one', 'two', 'three'])
|
42
|
+
|
43
|
+
expect(output).to receive(:puts)
|
44
|
+
.with("\n!!!!!!!!Achievements!!!!!!!!")
|
45
|
+
expect(output).to receive(:puts)
|
46
|
+
.with(" .__.\n (| |)\n ( )\n _)(_\n")
|
47
|
+
expect(output).to receive(:puts)
|
48
|
+
.with('---------------------')
|
49
|
+
expect(output).to receive(:puts)
|
50
|
+
.with('| one | two | three |')
|
51
|
+
expect(output).to receive(:puts)
|
52
|
+
.with('---------------------')
|
53
|
+
formatter.show_achievements
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
describe '#show_xp_bar' do
|
58
|
+
let(:test_info) { formatter.instance_variable_get(:@test_info) }
|
59
|
+
|
60
|
+
context 'when level is 1' do
|
61
|
+
it 'shows xp bar for empty xp' do
|
62
|
+
expect(output).to receive(:puts)
|
63
|
+
.with('Level 1: 0/10 [ ]')
|
64
|
+
|
65
|
+
formatter.show_xp_bar
|
66
|
+
end
|
67
|
+
|
68
|
+
it 'shows xp bar for almost full' do
|
69
|
+
expect(output).to receive(:puts)
|
70
|
+
.with('Level 1: 9/10 [====================== ]')
|
71
|
+
test_info.instance_variable_set(:@xp, 9)
|
72
|
+
formatter.show_xp_bar
|
73
|
+
end
|
74
|
+
|
75
|
+
it 'shows xp bar half full' do
|
76
|
+
expect(output).to receive(:puts)
|
77
|
+
.with('Level 1: 5/10 [============ ]')
|
78
|
+
test_info.instance_variable_set(:@xp, 5)
|
79
|
+
formatter.show_xp_bar
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
context 'when level is 2' do
|
84
|
+
before do
|
85
|
+
test_info.instance_variable_set(:@level, 2)
|
86
|
+
end
|
87
|
+
|
88
|
+
it 'shows xp bar for empty xp' do
|
89
|
+
expect(output).to receive(:puts)
|
90
|
+
.with('Level 2: 0/25 [ ]')
|
91
|
+
|
92
|
+
formatter.show_xp_bar
|
93
|
+
end
|
94
|
+
|
95
|
+
it 'shows xp bar for almost full' do
|
96
|
+
expect(output).to receive(:puts)
|
97
|
+
.with('Level 2: 24/25 [======================== ]')
|
98
|
+
test_info.instance_variable_set(:@xp, 24)
|
99
|
+
formatter.show_xp_bar
|
100
|
+
end
|
101
|
+
|
102
|
+
it 'shows xp bar half full' do
|
103
|
+
expect(output).to receive(:puts)
|
104
|
+
.with('Level 2: 13/25 [============= ]')
|
105
|
+
test_info.instance_variable_set(:@xp, 13)
|
106
|
+
formatter.show_xp_bar
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
context 'when level is 3' do
|
111
|
+
before do
|
112
|
+
test_info.instance_variable_set(:@level, 3)
|
113
|
+
end
|
114
|
+
|
115
|
+
it 'shows xp bar for empty xp' do
|
116
|
+
expect(output).to receive(:puts)
|
117
|
+
.with('Level 3: 0/50 [ ]')
|
118
|
+
|
119
|
+
formatter.show_xp_bar
|
120
|
+
end
|
121
|
+
|
122
|
+
it 'shows xp bar for almost full' do
|
123
|
+
expect(output).to receive(:puts)
|
124
|
+
.with('Level 3: 49/50 [======================== ]')
|
125
|
+
test_info.instance_variable_set(:@xp, 49)
|
126
|
+
formatter.show_xp_bar
|
127
|
+
end
|
128
|
+
|
129
|
+
it 'shows xp bar half full' do
|
130
|
+
expect(output).to receive(:puts)
|
131
|
+
.with('Level 3: 25/50 [============ ]')
|
132
|
+
test_info.instance_variable_set(:@xp, 25)
|
133
|
+
formatter.show_xp_bar
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
context 'when level is 4' do
|
138
|
+
before do
|
139
|
+
test_info.instance_variable_set(:@level, 4)
|
140
|
+
end
|
141
|
+
|
142
|
+
it 'shows xp bar for empty xp' do
|
143
|
+
expect(output).to receive(:puts)
|
144
|
+
.with('Level 4: 0/100 [ ]')
|
145
|
+
|
146
|
+
formatter.show_xp_bar
|
147
|
+
end
|
148
|
+
|
149
|
+
it 'shows xp bar for almost full' do
|
150
|
+
expect(output).to receive(:puts)
|
151
|
+
.with('Level 4: 99/100 [======================== ]')
|
152
|
+
test_info.instance_variable_set(:@xp, 99)
|
153
|
+
formatter.show_xp_bar
|
154
|
+
end
|
155
|
+
|
156
|
+
it 'shows xp bar half full' do
|
157
|
+
expect(output).to receive(:puts)
|
158
|
+
.with('Level 4: 50/100 [============ ]')
|
159
|
+
test_info.instance_variable_set(:@xp, 50)
|
160
|
+
formatter.show_xp_bar
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
context 'when level is above 4' do
|
165
|
+
before do
|
166
|
+
test_info.instance_variable_set(:@level, 5)
|
167
|
+
end
|
168
|
+
|
169
|
+
it 'shows xp bar for empty xp' do
|
170
|
+
expect(output).to receive(:puts)
|
171
|
+
.with('Level 5: 0/1000 [ ]')
|
172
|
+
|
173
|
+
formatter.show_xp_bar
|
174
|
+
end
|
175
|
+
|
176
|
+
it 'shows xp bar for almost full' do
|
177
|
+
expect(output).to receive(:puts)
|
178
|
+
.with('Level 5: 999/1000 [======================== ]')
|
179
|
+
test_info.instance_variable_set(:@xp, 999)
|
180
|
+
formatter.show_xp_bar
|
181
|
+
end
|
182
|
+
|
183
|
+
it 'shows xp bar half full' do
|
184
|
+
expect(output).to receive(:puts)
|
185
|
+
.with('Level 5: 500/1000 [============ ]')
|
186
|
+
test_info.instance_variable_set(:@xp, 500)
|
187
|
+
formatter.show_xp_bar
|
188
|
+
end
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
192
|
+
describe '#number_of_tests_achievement' do
|
193
|
+
it 'returns achievement for adding 1 test' do
|
194
|
+
expect(
|
195
|
+
formatter.number_of_tests_achievement(1, 2)
|
196
|
+
).to eq("Added 1 test(s)!")
|
197
|
+
end
|
198
|
+
|
199
|
+
it 'returns achievement for adding 5 tests' do
|
200
|
+
expect(
|
201
|
+
formatter.number_of_tests_achievement(1, 6)
|
202
|
+
).to eq("Added 5 test(s)!")
|
203
|
+
end
|
204
|
+
|
205
|
+
it 'returns achievement for adding 10 tests' do
|
206
|
+
expect(
|
207
|
+
formatter.number_of_tests_achievement(1, 11)
|
208
|
+
).to eq("Added 10 test(s)!")
|
209
|
+
end
|
210
|
+
|
211
|
+
it 'returns achievement for adding 25 tests' do
|
212
|
+
expect(
|
213
|
+
formatter.number_of_tests_achievement(1, 26)
|
214
|
+
).to eq("Added 25 test(s)!")
|
215
|
+
end
|
216
|
+
|
217
|
+
it 'returns achievement for adding 50 tests' do
|
218
|
+
expect(
|
219
|
+
formatter.number_of_tests_achievement(1, 51)
|
220
|
+
).to eq("Added 50 test(s)!")
|
221
|
+
end
|
222
|
+
|
223
|
+
it 'returns achievement for adding 100 tests' do
|
224
|
+
expect(
|
225
|
+
formatter.number_of_tests_achievement(1, 101)
|
226
|
+
).to eq("Added 100 test(s)!")
|
227
|
+
end
|
228
|
+
|
229
|
+
it 'returns nil if added tests are less than 1' do
|
230
|
+
expect(
|
231
|
+
formatter.number_of_tests_achievement(1, 0)
|
232
|
+
).to eq(nil)
|
233
|
+
end
|
234
|
+
end
|
235
|
+
|
236
|
+
describe '#decreased_test_time_achievement' do
|
237
|
+
it 'returns achievement for .2 saved seconds' do
|
238
|
+
expect(
|
239
|
+
formatter.decreased_test_time_achievement(0.3, 0.1)
|
240
|
+
).to eq("Reduced testing time by 0.2 second(s)!")
|
241
|
+
end
|
242
|
+
|
243
|
+
it 'returns achievement for .5 saved seconds' do
|
244
|
+
expect(
|
245
|
+
formatter.decreased_test_time_achievement(0.6, 0.1)
|
246
|
+
).to eq("Reduced testing time by 0.5 second(s)!")
|
247
|
+
end
|
248
|
+
|
249
|
+
it 'returns achievement for 1 saved seconds' do
|
250
|
+
expect(
|
251
|
+
formatter.decreased_test_time_achievement(2, 1)
|
252
|
+
).to eq("Reduced testing time by 1 second(s)!")
|
253
|
+
end
|
254
|
+
|
255
|
+
it 'returns achievement for 5 saved seconds' do
|
256
|
+
expect(
|
257
|
+
formatter.decreased_test_time_achievement(6, 1)
|
258
|
+
).to eq("Reduced testing time by 5 second(s)!")
|
259
|
+
end
|
260
|
+
|
261
|
+
it 'returns achievement for 10 saved seconds' do
|
262
|
+
expect(
|
263
|
+
formatter.decreased_test_time_achievement(11, 1)
|
264
|
+
).to eq("Reduced testing time by 10 second(s)!")
|
265
|
+
end
|
266
|
+
|
267
|
+
it 'returns achievement for 25 saved seconds' do
|
268
|
+
expect(
|
269
|
+
formatter.decreased_test_time_achievement(26, 1)
|
270
|
+
).to eq("Reduced testing time by 25 second(s)!")
|
271
|
+
end
|
272
|
+
|
273
|
+
it 'returns achievement for 50 saved seconds' do
|
274
|
+
expect(
|
275
|
+
formatter.decreased_test_time_achievement(51, 1)
|
276
|
+
).to eq("Reduced testing time by 50 second(s)!")
|
277
|
+
end
|
278
|
+
|
279
|
+
it 'returns achievement for 100 saved seconds' do
|
280
|
+
expect(
|
281
|
+
formatter.decreased_test_time_achievement(101, 1)
|
282
|
+
).to eq("Reduced testing time by 100 second(s)!")
|
283
|
+
end
|
284
|
+
|
285
|
+
it 'returns nil if seconds saved are less than .2' do
|
286
|
+
expect(
|
287
|
+
formatter.decreased_test_time_achievement(0, 1)
|
288
|
+
).to eq(nil)
|
289
|
+
end
|
290
|
+
end
|
291
|
+
|
292
|
+
describe '#number_of_fixed_tests_achievement' do
|
293
|
+
it 'returns achievement for 1 fixed test' do
|
294
|
+
expect(
|
295
|
+
formatter.number_of_fixed_tests_achievement(2, 1)
|
296
|
+
).to eq("Fixed 1 test(s)!")
|
297
|
+
end
|
298
|
+
|
299
|
+
it 'returns achievement for 5 fixed test' do
|
300
|
+
expect(
|
301
|
+
formatter.number_of_fixed_tests_achievement(6, 1)
|
302
|
+
).to eq("Fixed 5 test(s)!")
|
303
|
+
end
|
304
|
+
|
305
|
+
it 'returns achievement for 10 fixed test' do
|
306
|
+
expect(
|
307
|
+
formatter.number_of_fixed_tests_achievement(11, 1)
|
308
|
+
).to eq("Fixed 10 test(s)!")
|
309
|
+
end
|
310
|
+
|
311
|
+
it 'returns achievement for 25 fixed test' do
|
312
|
+
expect(
|
313
|
+
formatter.number_of_fixed_tests_achievement(26, 1)
|
314
|
+
).to eq("Fixed 25 test(s)!")
|
315
|
+
end
|
316
|
+
|
317
|
+
it 'returns achievement for 50 fixed test' do
|
318
|
+
expect(
|
319
|
+
formatter.number_of_fixed_tests_achievement(51, 1)
|
320
|
+
).to eq("Fixed 50 test(s)!")
|
321
|
+
end
|
322
|
+
|
323
|
+
it 'returns achievement for 100 fixed test' do
|
324
|
+
expect(
|
325
|
+
formatter.number_of_fixed_tests_achievement(101, 1)
|
326
|
+
).to eq("Fixed 100 test(s)!")
|
327
|
+
end
|
328
|
+
|
329
|
+
it 'returns nil if fixed tests are less than 1' do
|
330
|
+
expect(
|
331
|
+
formatter.number_of_fixed_tests_achievement(0, 1)
|
332
|
+
).to eq(nil)
|
333
|
+
end
|
334
|
+
end
|
335
|
+
|
336
|
+
describe '#get_trophie' do
|
337
|
+
it 'returns level 1 trophy when level equals 1' do
|
338
|
+
expect(formatter.get_trophie(1)).to eq(
|
339
|
+
<<-EOS
|
340
|
+
.__.
|
341
|
+
(| |)
|
342
|
+
( )
|
343
|
+
_)(_
|
344
|
+
EOS
|
345
|
+
)
|
346
|
+
end
|
347
|
+
|
348
|
+
it 'returns level 2 trophy when level equals 2' do
|
349
|
+
expect(formatter.get_trophie(2)).to eq(
|
350
|
+
<<-EOS
|
351
|
+
{}
|
352
|
+
/__\\
|
353
|
+
/| |\\
|
354
|
+
(_| |_)
|
355
|
+
\\ /
|
356
|
+
)(
|
357
|
+
_|__|_
|
358
|
+
_|______|_
|
359
|
+
|__________|
|
360
|
+
EOS
|
361
|
+
)
|
362
|
+
end
|
363
|
+
|
364
|
+
it 'returns level 3 trophy when level equals 3' do
|
365
|
+
expect(formatter.get_trophie(3)).to eq(
|
366
|
+
<<-EOS
|
367
|
+
___________
|
368
|
+
'._==_==_=_.'
|
369
|
+
.-\\: /-.
|
370
|
+
| (|:. |) |
|
371
|
+
'-|:. |-'
|
372
|
+
\\::. /
|
373
|
+
'::. .'
|
374
|
+
) (
|
375
|
+
_.' '._
|
376
|
+
`"""""""`"
|
377
|
+
EOS
|
378
|
+
)
|
379
|
+
end
|
380
|
+
|
381
|
+
it 'returns level 4 trophy when level equals 4' do
|
382
|
+
expect(formatter.get_trophie(4)).to eq(
|
383
|
+
<<-EOS
|
384
|
+
.-=========-.
|
385
|
+
\\'-=======-'/
|
386
|
+
_| .=. |_
|
387
|
+
((| {{1}} |))
|
388
|
+
\\| /|\\ |/
|
389
|
+
\\__ '`' __/
|
390
|
+
_`) (`_
|
391
|
+
_/_______\\_
|
392
|
+
/___________\\
|
393
|
+
EOS
|
394
|
+
)
|
395
|
+
end
|
396
|
+
|
397
|
+
it 'returns empty string when level is anything else' do
|
398
|
+
expect(formatter.get_trophie(10)).to eq('')
|
399
|
+
end
|
400
|
+
end
|
401
|
+
end
|
402
|
+
|
403
|
+
class TestFormatter
|
404
|
+
include GamifyingFormatters::Common
|
405
|
+
|
406
|
+
attr_reader :output
|
407
|
+
|
408
|
+
def initialize(output)
|
409
|
+
@test_info = TestInfo.new
|
410
|
+
@output = output
|
411
|
+
end
|
412
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -0,0 +1,66 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe TestInfo do
|
4
|
+
let(:test_info) { TestInfo.new }
|
5
|
+
|
6
|
+
describe '#addAchievement' do
|
7
|
+
context 'for a valid achievement' do
|
8
|
+
it 'adds an achievement to the list when the value is not blank' do
|
9
|
+
test_info.addAchievement('some achievement')
|
10
|
+
|
11
|
+
expect(test_info.achievements.size).to eq(1)
|
12
|
+
expect(test_info.achievements.at(0)).to eq('some achievement')
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'increments the level and resets the xp at 10' do
|
16
|
+
test_info.instance_variable_set('@xp', 9)
|
17
|
+
test_info.addAchievement('some achievement')
|
18
|
+
|
19
|
+
expect(test_info.level).to eq(2)
|
20
|
+
expect(test_info.xp).to eq(0)
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'increments the level and resets the xp at 25' do
|
24
|
+
test_info.instance_variable_set('@xp', 24)
|
25
|
+
test_info.addAchievement('some achievement')
|
26
|
+
|
27
|
+
expect(test_info.level).to eq(2)
|
28
|
+
expect(test_info.xp).to eq(0)
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'increments the level and resets the xp at 50' do
|
32
|
+
test_info.instance_variable_set('@xp', 49)
|
33
|
+
test_info.addAchievement('some achievement')
|
34
|
+
|
35
|
+
expect(test_info.level).to eq(2)
|
36
|
+
expect(test_info.xp).to eq(0)
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'increments the level and resets the xp at 100' do
|
40
|
+
test_info.instance_variable_set('@xp', 99)
|
41
|
+
test_info.addAchievement('some achievement')
|
42
|
+
|
43
|
+
expect(test_info.level).to eq(2)
|
44
|
+
expect(test_info.xp).to eq(0)
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'increments the xp and not the level at any other number' do
|
48
|
+
test_info.addAchievement('some achievement')
|
49
|
+
|
50
|
+
expect(test_info.level).to eq(1)
|
51
|
+
expect(test_info.xp).to eq(1)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
it 'does not add an achievement to the list when it is blank' do
|
56
|
+
test_info.addAchievement('')
|
57
|
+
|
58
|
+
expect(test_info.achievements.size).to eq(0)
|
59
|
+
end
|
60
|
+
|
61
|
+
it 'returns nil' do
|
62
|
+
expect(test_info.addAchievement('something')).to be_nil
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
metadata
CHANGED
@@ -1,29 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gamifying_formatter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Chris Belsole
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2014-08-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - '='
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 3.0.0
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - '='
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
26
|
+
version: 3.0.0
|
27
27
|
description: The Gamifying Formatter
|
28
28
|
email:
|
29
29
|
- cbelsole@gmail.com
|
@@ -31,7 +31,7 @@ executables: []
|
|
31
31
|
extensions: []
|
32
32
|
extra_rdoc_files: []
|
33
33
|
files:
|
34
|
-
- .gitignore
|
34
|
+
- ".gitignore"
|
35
35
|
- Gemfile
|
36
36
|
- LICENSE.txt
|
37
37
|
- README.md
|
@@ -40,9 +40,14 @@ files:
|
|
40
40
|
- example/example.rb
|
41
41
|
- gamifying_formatter.gemspec
|
42
42
|
- lib/gamifying_formatter.rb
|
43
|
+
- lib/gamifying_formatter/common.rb
|
44
|
+
- lib/gamifying_formatter/rspec1.rb
|
45
|
+
- lib/gamifying_formatter/rspec2.rb
|
46
|
+
- lib/gamifying_formatter/rspec3.rb
|
43
47
|
- lib/test_info.rb
|
44
|
-
- spec/gamifying_formatter_spec.rb
|
48
|
+
- spec/gamifying_formatter/gamifying_formatter_spec.rb
|
45
49
|
- spec/spec_helper.rb
|
50
|
+
- spec/test_info_spec.rb
|
46
51
|
homepage: ''
|
47
52
|
licenses: []
|
48
53
|
metadata: {}
|
@@ -52,21 +57,22 @@ require_paths:
|
|
52
57
|
- lib
|
53
58
|
required_ruby_version: !ruby/object:Gem::Requirement
|
54
59
|
requirements:
|
55
|
-
- -
|
60
|
+
- - ">="
|
56
61
|
- !ruby/object:Gem::Version
|
57
62
|
version: '0'
|
58
63
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
59
64
|
requirements:
|
60
|
-
- -
|
65
|
+
- - ">="
|
61
66
|
- !ruby/object:Gem::Version
|
62
67
|
version: '0'
|
63
68
|
requirements: []
|
64
69
|
rubyforge_project:
|
65
|
-
rubygems_version: 2.
|
70
|
+
rubygems_version: 2.4.1
|
66
71
|
signing_key:
|
67
72
|
specification_version: 4
|
68
73
|
summary: An rspec formatter for making testing fun.
|
69
74
|
test_files:
|
70
|
-
- spec/gamifying_formatter_spec.rb
|
75
|
+
- spec/gamifying_formatter/gamifying_formatter_spec.rb
|
71
76
|
- spec/spec_helper.rb
|
77
|
+
- spec/test_info_spec.rb
|
72
78
|
has_rdoc:
|
@@ -1,93 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'stringio'
|
3
|
-
|
4
|
-
describe GamifyingFormatter do
|
5
|
-
before do
|
6
|
-
@output = StringIO.new
|
7
|
-
@formatter = GamifyingFormatter.new(@output)
|
8
|
-
@formatter.start(2)
|
9
|
-
end
|
10
|
-
|
11
|
-
context 'achievements' do
|
12
|
-
describe '.number_of_tests_achievement' do
|
13
|
-
it 'should set an achievment for adding 1 test' do
|
14
|
-
@formatter.number_of_tests_achievement(3, 4)
|
15
|
-
expect(@formatter.instance_variable_get(:@test_info).achievements.size).to eq(1)
|
16
|
-
expect(@formatter.instance_variable_get(:@test_info).achievements[0]).to eq('Added 1 test(s)!')
|
17
|
-
end
|
18
|
-
|
19
|
-
it 'should set and achievement for adding 100 tests' do
|
20
|
-
@formatter.number_of_tests_achievement(1, 1000)
|
21
|
-
expect(@formatter.instance_variable_get(:@test_info).achievements.size).to eq(1)
|
22
|
-
expect(@formatter.instance_variable_get(:@test_info).achievements[0]).to eq('Added 100 test(s)!')
|
23
|
-
end
|
24
|
-
|
25
|
-
it 'should not set an achievement for adding tests' do
|
26
|
-
@formatter.number_of_tests_achievement(4, 3)
|
27
|
-
expect(@formatter.instance_variable_get(:@test_info).achievements.size).to eq(0)
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
describe '.decreased_test_time_achievement' do
|
32
|
-
it 'should set an achievment for improving tests time by .2 seconds' do
|
33
|
-
@formatter.decreased_test_time_achievement(0.3, 0.1)
|
34
|
-
expect(@formatter.instance_variable_get(:@test_info).achievements.size).to eq(1)
|
35
|
-
expect(@formatter.instance_variable_get(:@test_info).achievements[0]).to eq('Reduced testing time by 0.2 second(s)!')
|
36
|
-
end
|
37
|
-
|
38
|
-
it 'should set and achievement for improving tests time by 100 seconds' do
|
39
|
-
@formatter.decreased_test_time_achievement(1000, 1)
|
40
|
-
expect(@formatter.instance_variable_get(:@test_info).achievements.size).to eq(1)
|
41
|
-
expect(@formatter.instance_variable_get(:@test_info).achievements[0]).to eq('Reduced testing time by 100 second(s)!')
|
42
|
-
end
|
43
|
-
|
44
|
-
it 'should not set an achievement for improving test time' do
|
45
|
-
@formatter.decreased_test_time_achievement(3, 4)
|
46
|
-
expect(@formatter.instance_variable_get(:@test_info).achievements.size).to eq(0)
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
describe '.number_of_fixed_tests_achievement' do
|
51
|
-
it 'should set an achievment for fixing 1 test' do
|
52
|
-
@formatter.number_of_fixed_tests_achievement(4, 3)
|
53
|
-
expect(@formatter.instance_variable_get(:@test_info).achievements.size).to eq(1)
|
54
|
-
expect(@formatter.instance_variable_get(:@test_info).achievements[0]).to eq('Fixed 1 test(s)!')
|
55
|
-
end
|
56
|
-
|
57
|
-
it 'should set and achievement for fixing 100 tests' do
|
58
|
-
@formatter.number_of_fixed_tests_achievement(10000, 1)
|
59
|
-
expect(@formatter.instance_variable_get(:@test_info).achievements.size).to eq(1)
|
60
|
-
expect(@formatter.instance_variable_get(:@test_info).achievements[0]).to eq('Fixed 100 test(s)!')
|
61
|
-
end
|
62
|
-
|
63
|
-
it 'should not set an achievement for fixing tests' do
|
64
|
-
@formatter.number_of_fixed_tests_achievement(3, 4)
|
65
|
-
expect(@formatter.instance_variable_get(:@test_info).achievements.size).to eq(0)
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
context 'output' do
|
71
|
-
describe '.output_achievements' do
|
72
|
-
it 'outputs all achievemnts in the list' do
|
73
|
-
achievement_array = Array.new(5) { |i| "Achievement #{i}"}
|
74
|
-
@formatter.instance_variable_get(:@test_info).achievements = achievement_array
|
75
|
-
|
76
|
-
@output.should_receive(:puts).exactly(5).times
|
77
|
-
|
78
|
-
@formatter.output_achievements
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
|
-
describe '.get_trophies' do
|
83
|
-
it 'returns the correct trophie based on the number' do
|
84
|
-
expect(@formatter.get_trophie(1)).to eq([
|
85
|
-
" .__.",
|
86
|
-
" (| |)",
|
87
|
-
" ( )",
|
88
|
-
" _)(_"
|
89
|
-
].join("\n"))
|
90
|
-
end
|
91
|
-
end
|
92
|
-
end
|
93
|
-
end
|