gamifying_formatter 0.0.2 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|