rainbow_formatter 0.1.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +4 -0
- data/.rspec +2 -0
- data/.rubocop.yml +11 -0
- data/.ruby-version +1 -0
- data/CHANGELOG.md +0 -0
- data/Gemfile +6 -0
- data/LICENSE.md +22 -0
- data/README.md +117 -0
- data/Rakefile +10 -0
- data/data/car.gif +0 -0
- data/data/dog.gif +0 -0
- data/data/monkey.gif +0 -0
- data/data/tina_bike.gif +0 -0
- data/data/tina_bike.mp3 +0 -0
- data/data/tina_dream.gif +0 -0
- data/data/tina_dream.mp3 +0 -0
- data/demo.rb +24 -0
- data/lib/formatter/common.rb +249 -0
- data/lib/formatter/configuration.rb +17 -0
- data/lib/formatter/custom/car.rb +18 -0
- data/lib/formatter/custom/dog.rb +20 -0
- data/lib/formatter/custom/monkey.rb +18 -0
- data/lib/formatter/custom/tina_bike.rb +18 -0
- data/lib/formatter/custom/tina_dream.rb +26 -0
- data/lib/formatter/insta_fail.rb +12 -0
- data/lib/formatter/music.rb +79 -0
- data/lib/formatter/verbose.rb +15 -0
- data/lib/formatter/version.rb +5 -0
- data/lib/rainbow_formatter.rb +88 -0
- data/lib/rainbow_insta_fail_formatter.rb +10 -0
- data/lib/rainbow_music_formatter.rb +10 -0
- data/lib/rainbow_verbose_formatter.rb +10 -0
- data/rainbow_formatter.gemspec +26 -0
- data/spec/rainbow_formatter_spec.rb +156 -0
- data/spec/rainbow_insta_fail_formatter_spec.rb +23 -0
- data/spec/rainbow_music_formatter_spec.rb +122 -0
- data/spec/rainbow_verbose_formatter_spec.rb +20 -0
- data/spec/spec_helper.rb +5 -0
- metadata +129 -0
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'formatter/custom/car'
|
4
|
+
require 'formatter/custom/dog'
|
5
|
+
require 'formatter/custom/monkey'
|
6
|
+
require 'formatter/custom/tina_bike'
|
7
|
+
require 'formatter/custom/tina_dream'
|
8
|
+
|
9
|
+
module Formatter
|
10
|
+
class Configuration
|
11
|
+
attr_accessor :formatter
|
12
|
+
|
13
|
+
def initialize
|
14
|
+
@formatter = :tina_bike
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Formatter
|
4
|
+
module Custom
|
5
|
+
module Car
|
6
|
+
# rubocop:disable Metrics/LineLength
|
7
|
+
def ascii_array
|
8
|
+
[" - __\r\n -- ~( @\\ \\ \r\n--- _________]_[__/_>________\r\n / ____ \\ <> | ____ \\\r\n =\\_/ __ \\_\\_______|_/ __ \\__D\r\n________(__)_____________(__)____",
|
9
|
+
" - __\r\n -- ~( @\\ \\\r\n --- _________]_[__/_>________\r\n / ____ \\ <> | ____ \\\r\n =\\_/ __ \\_\\_______|_/ __ \\__D\r\n________(__)_____________(__)____"]
|
10
|
+
end
|
11
|
+
# rubocop:enable Metrics/LineLength
|
12
|
+
|
13
|
+
def rainbow_mp3
|
14
|
+
File.expand_path('../../../data/tina_dream.mp3', __dir__)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Formatter
|
4
|
+
module Custom
|
5
|
+
module Dog
|
6
|
+
# rubocop:disable Metrics/LineLength
|
7
|
+
def ascii_array
|
8
|
+
[" ;~~,__\r\n :-....,-------'`-'._.'\r\n `-,,, , ,'~~'\r\n ; ,'~.__; /\r\n :| :|\r\n `-' `-'",
|
9
|
+
" ;~~,__\r\n :-....,-------'`-'._.'\r\n `-,,, , ,'~~'\r\n ; ,'~.__; /--.\r\n :| :| :|``(;\r\n `-'`-' `-'",
|
10
|
+
" ;~~,__\r\n :-....,-------'`-'._.'\r\n `-,,, , ;'~~'\r\n ,'_,'~.__; '--.\r\n //' ````(;\r\n `-'",
|
11
|
+
" .--~~,__\r\n :-....,-------`~~'._.'\r\n `-,,, ,_ ;'~U'\r\n _,-' ,'`-__; '--.\r\n (_/'~~ ''''(;"]
|
12
|
+
end
|
13
|
+
# rubocop:enable Metrics/LineLength
|
14
|
+
|
15
|
+
def rainbow_mp3
|
16
|
+
File.expand_path('../../../data/tina_dream.mp3', __dir__)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Formatter
|
4
|
+
module Custom
|
5
|
+
module Monkey
|
6
|
+
# rubocop:disable Metrics/LineLength
|
7
|
+
def ascii_array
|
8
|
+
[" .-\"-. \r\n _/.-.-.\\\r\n /|( o o )|\\\r\n | // \" \\\\ |\r\n / / \\'---'/ \\ \\\r\n \\ \\_/`\"\"\"`\\_/ /\r\n \\ /",
|
9
|
+
" .-\"-.\r\n _/_-.-_\\\r\n / __} {__ \\\r\n / // \" \\\\ \\\r\n / / \\'---'/ \\ \\\r\n \\ \\_/`\"\"\"`\\_/ /\r\n \\ /"]
|
10
|
+
end
|
11
|
+
# rubocop:enable Metrics/LineLength
|
12
|
+
|
13
|
+
def rainbow_mp3
|
14
|
+
File.expand_path('../../../data/tina_dream.mp3', __dir__)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Formatter
|
4
|
+
module Custom
|
5
|
+
module TinaBike
|
6
|
+
# rubocop:disable Metrics/LineLength
|
7
|
+
def ascii_array
|
8
|
+
[" - /\\**/\\ \r\n -- _( o_o ) \r\n --- (_/ u--u) \r\n /==( ___||)\r\n /d\\\"P\\ )=\\d\\\"Pb, \r\n 8 || ===/8=== || 8| \r\n P, ,d P, ,d` \r\n `\"\"\" `\"\"\"",
|
9
|
+
" - /\\**/\\ \n -- _( o_o ) \n --- (_/ u--u) \n /==( ___||)\n /d\\\"P\\ )=\\d\\\"Pb, \n 8 || ===/8=== || 8|\n P, ,d P, ,d`\n `\"\"\" `\"\"\""]
|
10
|
+
end
|
11
|
+
# rubocop:enable Metrics/LineLength
|
12
|
+
|
13
|
+
def rainbow_mp3
|
14
|
+
File.expand_path('../../../data/tina_bike.mp3', __dir__)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Formatter
|
4
|
+
module Custom
|
5
|
+
module TinaDream
|
6
|
+
# rubocop:disable Metrics/LineLength
|
7
|
+
def ascii_array
|
8
|
+
[" \r\n /\\_____/\\\r\n / o o \\ \r\n ( == ^ == )\r\n ) (\r\n ( )\r\n ( ( ) ( ) )\r\n (__(__)___(__)__)",
|
9
|
+
" \r\n /\\_____/\\\r\n / -- -- \\ \r\n ( == ^ == )\r\n ) (\r\n ( )\r\n ( ( ) ( ) )\r\n (__(__)___(__)__)",
|
10
|
+
" \r\n /\\_____/\\\r\n / -- -- \\ \r\n ( == o == )\r\n ) (\r\n ( )\r\n ( ( ) ( ) )\r\n (__(__)___(__)__)",
|
11
|
+
" ZzzZ \r\n /\\_____/\\\r\n / -- -- \\ \r\n ( == o == )\r\n ) (\r\n ( )\r\n ( ( ) ( ) )\r\n (__(__)___(__)__)",
|
12
|
+
" ZzzZz \r\n /\\_____/\\\r\n / -- -- \\ \r\n ( == o == )\r\n ) (\r\n ( )\r\n ( ( ) ( ) )\r\n (__(__)___(__)__)",
|
13
|
+
" ZzzZzz \r\n /\\_____/\\\r\n / -- -- \\ \r\n ( == o == )\r\n ) (\r\n ( )\r\n ( ( ) ( ) )\r\n (__(__)___(__)__)",
|
14
|
+
" ZzzZzzZ \r\n /\\_____/\\\r\n / -- -- \\ \r\n ( == o == )\r\n ) (\r\n ( )\r\n ( ( ) ( ) )\r\n (__(__)___(__)__)",
|
15
|
+
" ZzzZzzZz \r\n /\\_____/\\\r\n / -- -- \\ \r\n ( == o == )\r\n ) (\r\n ( )\r\n ( ( ) ( ) )\r\n (__(__)___(__)__)",
|
16
|
+
" ZzzZzzZzz \r\n /\\_____/\\\r\n / -- -- \\ \r\n ( == o == )\r\n ) (\r\n ( )\r\n ( ( ) ( ) )\r\n (__(__)___(__)__)",
|
17
|
+
" \r\n /\\_____/\\\r\n / 0 0 \\ \r\n ( == o == )\r\n ) (\r\n ( )\r\n ( ( ) ( ) )\r\n (__(__)___(__)__)"]
|
18
|
+
end
|
19
|
+
# rubocop:enable Metrics/LineLength
|
20
|
+
|
21
|
+
def rainbow_mp3
|
22
|
+
File.expand_path('../../../data/tina_dream.mp3', __dir__)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Formatter
|
4
|
+
module InstaFail
|
5
|
+
def progress_lines
|
6
|
+
# Display last failed example output
|
7
|
+
errors_dump = []
|
8
|
+
errors_dump.concat(@failed_examples.last.fully_formatted(@failure_count).split("\n")) if @failed_examples.size.positive?
|
9
|
+
super.concat(errors_dump)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Formatter
|
4
|
+
module Music
|
5
|
+
def osx?
|
6
|
+
platform.downcase.include?('darwin')
|
7
|
+
end
|
8
|
+
|
9
|
+
def linux?
|
10
|
+
platform.downcase.include?('linux')
|
11
|
+
end
|
12
|
+
|
13
|
+
def kernel=(kernel)
|
14
|
+
@kernel = kernel
|
15
|
+
end
|
16
|
+
|
17
|
+
def kernel
|
18
|
+
@kernel ||= Kernel
|
19
|
+
end
|
20
|
+
|
21
|
+
def platform=(platform)
|
22
|
+
@platform = platform
|
23
|
+
end
|
24
|
+
|
25
|
+
def platform
|
26
|
+
@platform ||= RUBY_PLATFORM
|
27
|
+
end
|
28
|
+
|
29
|
+
def start(input)
|
30
|
+
super
|
31
|
+
@music_thread = Thread.new { start_music_or_kill(Thread.current) }
|
32
|
+
wait_for_music_to_start(@music_thread)
|
33
|
+
end
|
34
|
+
|
35
|
+
def dump_summary(*args)
|
36
|
+
kill_music
|
37
|
+
super
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def kill_music
|
43
|
+
if @music_thread && @music_thread['music_pid']
|
44
|
+
@music_thread.kill
|
45
|
+
Process.kill('KILL', @music_thread['music_pid'])
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def linux_player
|
50
|
+
%w[mpg321 mpg123].find do |player|
|
51
|
+
kernel.system("which #{player} >/dev/null 2>&1 && type #{player} >/dev/null 2>&1")
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def music_command
|
56
|
+
# this isn't really threadsafe but it'll work if we're careful
|
57
|
+
return @music_command if @music_command
|
58
|
+
|
59
|
+
if osx?
|
60
|
+
@music_command = "afplay #{rainbow_mp3}"
|
61
|
+
elsif linux? && linux_player
|
62
|
+
@music_command = "#{linux_player} #{rainbow_mp3} >/dev/null 2>&1"
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def start_music_or_kill(thread)
|
67
|
+
thread.exit unless File.exist?(rainbow_mp3) && music_command
|
68
|
+
loop do
|
69
|
+
thread['music_pid'] = kernel.spawn(music_command)
|
70
|
+
thread['started_playing'] ||= true
|
71
|
+
Process.wait(thread['music_pid'])
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def wait_for_music_to_start(music_thread)
|
76
|
+
sleep 0.001 while !music_thread['started_playing'] && music_thread.status
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Formatter
|
4
|
+
module Verbose
|
5
|
+
def progress_lines
|
6
|
+
label = "running: #{example_name}"
|
7
|
+
label = label.slice(0, terminal_width - 3).concat('...') if label.size > terminal_width
|
8
|
+
super.concat(
|
9
|
+
[
|
10
|
+
format("%-#{terminal_width}s", finished? ? '' : label)
|
11
|
+
]
|
12
|
+
)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'formatter/configuration'
|
4
|
+
require 'formatter/common'
|
5
|
+
require 'ostruct'
|
6
|
+
require 'pry'
|
7
|
+
|
8
|
+
class RainbowFormatter
|
9
|
+
include Formatter::Common
|
10
|
+
|
11
|
+
attr_reader :example_name, :ascii_array, :output
|
12
|
+
|
13
|
+
RSpec::Core::Formatters.register self, :start, :example_started, :example_passed, :example_pending, :example_failed,
|
14
|
+
:start_dump, :dump_summary
|
15
|
+
|
16
|
+
BUNDLED_MODES = {
|
17
|
+
tina_bike: Formatter::Custom::TinaBike,
|
18
|
+
tina_dream: Formatter::Custom::TinaDream,
|
19
|
+
car: Formatter::Custom::Car,
|
20
|
+
dog: Formatter::Custom::Dog,
|
21
|
+
monkey: Formatter::Custom::Monkey
|
22
|
+
}.freeze
|
23
|
+
|
24
|
+
def initialize(output)
|
25
|
+
@output = output
|
26
|
+
@current = @color_index = @passing_count = @failure_count = @pending_count = @animation_index = 0
|
27
|
+
@example_results = []
|
28
|
+
@failed_examples = []
|
29
|
+
@pending_examples = []
|
30
|
+
setup_formatter
|
31
|
+
end
|
32
|
+
|
33
|
+
def setup_formatter
|
34
|
+
formatter = RainbowFormatter.configuration.formatter
|
35
|
+
formatter = BUNDLED_MODES.dig(formatter) unless formatter.is_a?(Module)
|
36
|
+
singleton_class.send(:include, formatter)
|
37
|
+
end
|
38
|
+
|
39
|
+
def self.configuration
|
40
|
+
@configuration ||= Formatter::Configuration.new
|
41
|
+
end
|
42
|
+
|
43
|
+
def self.configure
|
44
|
+
yield configuration if block_given?
|
45
|
+
end
|
46
|
+
|
47
|
+
def start(start_notification)
|
48
|
+
# TODO: Lazy fix for specs.
|
49
|
+
@example_count = if start_notification.is_a?(Integer)
|
50
|
+
start_notification
|
51
|
+
else
|
52
|
+
start_notification.count
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def start_dump(_notification)
|
57
|
+
@current = @example_count
|
58
|
+
end
|
59
|
+
|
60
|
+
def example_started(notification)
|
61
|
+
notification = notification.example if notification.respond_to?(:example)
|
62
|
+
@example_name = notification.full_description
|
63
|
+
end
|
64
|
+
|
65
|
+
def example_passed(_notification)
|
66
|
+
tick
|
67
|
+
end
|
68
|
+
|
69
|
+
def example_pending(notification)
|
70
|
+
@pending_examples << notification
|
71
|
+
@pending_count += 1
|
72
|
+
tick(mark: PENDING)
|
73
|
+
end
|
74
|
+
|
75
|
+
def example_failed(notification)
|
76
|
+
@failed_examples << notification
|
77
|
+
@failure_count += 1
|
78
|
+
tick(mark: FAIL)
|
79
|
+
end
|
80
|
+
|
81
|
+
def dump_summary(notification)
|
82
|
+
duration = notification.duration
|
83
|
+
summary = "\nYou've rainbowified for #{format_duration(duration)}\n".split(//).map { |c| rainbowify(c) }
|
84
|
+
output.puts summary.join
|
85
|
+
output.puts notification.fully_formatted
|
86
|
+
dump_commands_to_rerun_failed_examples if respond_to?(:dump_commands_to_rerun_failed_examples)
|
87
|
+
end
|
88
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rainbow_formatter'
|
4
|
+
require 'formatter/insta_fail'
|
5
|
+
|
6
|
+
RainbowInstaFailFormatter = Class.new(RainbowFormatter) do
|
7
|
+
include Formatter::InstaFail
|
8
|
+
|
9
|
+
RSpec::Core::Formatters.register(self, :example_passed, :example_pending, :example_failed, :start_dump, :start)
|
10
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rainbow_formatter'
|
4
|
+
require 'formatter/music'
|
5
|
+
|
6
|
+
RainbowMusicFormatter = Class.new(RainbowFormatter) do
|
7
|
+
include Formatter::Music
|
8
|
+
|
9
|
+
RSpec::Core::Formatters.register(self, :example_passed, :example_pending, :example_failed, :start_dump, :start)
|
10
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rainbow_formatter'
|
4
|
+
require 'formatter/verbose'
|
5
|
+
|
6
|
+
RainbowVerboseFormatter = Class.new(RainbowFormatter) do
|
7
|
+
include Formatter::Verbose
|
8
|
+
|
9
|
+
RSpec::Core::Formatters.register(self, :example_passed, :example_pending, :example_failed, :start_dump, :start)
|
10
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
$LOAD_PATH.push File.expand_path('lib', __dir__)
|
4
|
+
require 'formatter/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = 'rainbow_formatter'
|
8
|
+
s.version = Formatter::VERSION
|
9
|
+
s.authors = ['Federico Farina']
|
10
|
+
s.email = ['federicojosefarina@gmail.com']
|
11
|
+
s.platform = Gem::Platform::RUBY
|
12
|
+
s.homepage = 'https://github.com/fedefa/rainbow-formatter'
|
13
|
+
s.summary = 'Customizable RSpec formatter'
|
14
|
+
s.description = 'Customizable ascii-music RSpec formattter'
|
15
|
+
s.license = 'MIT'
|
16
|
+
|
17
|
+
s.files = `git ls-files`.split("\n")
|
18
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
19
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
|
20
|
+
s.require_paths = ['lib']
|
21
|
+
|
22
|
+
s.add_dependency 'rspec', '>= 3', '< 4'
|
23
|
+
|
24
|
+
s.add_development_dependency 'pry'
|
25
|
+
s.add_development_dependency 'rake'
|
26
|
+
end
|
@@ -0,0 +1,156 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
require 'stringio'
|
5
|
+
|
6
|
+
describe RainbowFormatter do
|
7
|
+
before do
|
8
|
+
rspec_bin = $PROGRAM_NAME.split('/').last
|
9
|
+
@output = StringIO.new
|
10
|
+
if rspec_bin == 'rspec'
|
11
|
+
@formatter = RainbowFormatter.new(@output)
|
12
|
+
@example = RSpec::Core::ExampleGroup.describe.example
|
13
|
+
else
|
14
|
+
formatter_options = OpenStruct.new(colour: true, dry_run: false, autospec: nil)
|
15
|
+
@formatter = RainbowFormatter.new(formatter_options, @output)
|
16
|
+
@example = Spec::Example::ExampleProxy.new('should pass')
|
17
|
+
@formatter.instance_variable_set(:@example_group, OpenStruct.new(description: 'group'))
|
18
|
+
end
|
19
|
+
@formatter.start(2)
|
20
|
+
@formatter.example_started(@example)
|
21
|
+
end
|
22
|
+
|
23
|
+
shared_examples 'a test' do
|
24
|
+
it 'should call the increment method' do
|
25
|
+
expect(@formatter).to receive(:tick)
|
26
|
+
@formatter.example_passed(@example)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
describe 'passed, pending and failed' do
|
31
|
+
before do
|
32
|
+
allow(@formatter).to receive(:tick)
|
33
|
+
end
|
34
|
+
|
35
|
+
describe 'example_passed' do
|
36
|
+
it_behaves_like 'a test'
|
37
|
+
it 'should update the scoreboard' do
|
38
|
+
expect(@formatter.scoreboard.size).to eq(4)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
describe 'example_pending' do
|
43
|
+
it_behaves_like 'a test'
|
44
|
+
|
45
|
+
it 'should increment the pending count' do
|
46
|
+
expect do
|
47
|
+
@formatter.example_pending(@example)
|
48
|
+
end.to change(@formatter, :pending_count).by(1)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
describe 'example_failed' do
|
53
|
+
it_behaves_like 'a test'
|
54
|
+
|
55
|
+
it 'should increment the failure count' do
|
56
|
+
expect do
|
57
|
+
@formatter.example_failed(@example)
|
58
|
+
end.to change(@formatter, :failure_count).by(1)
|
59
|
+
end
|
60
|
+
|
61
|
+
it 'should return finished if the specs are finished' do
|
62
|
+
@formatter.example_failed(@example)
|
63
|
+
allow(@formatter).to receive(:finished?).and_return(true)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
describe 'tick' do
|
69
|
+
before do
|
70
|
+
allow(@formatter).to receive(:current).and_return(1)
|
71
|
+
allow(@formatter).to receive(:example_count).and_return(2)
|
72
|
+
@formatter.tick
|
73
|
+
end
|
74
|
+
|
75
|
+
it 'should increment the current' do
|
76
|
+
expect(@formatter.current).to eql(1)
|
77
|
+
end
|
78
|
+
|
79
|
+
it 'should store the marks in an array' do
|
80
|
+
expect(@formatter.example_results).to include('=')
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
describe 'rainbowify' do
|
85
|
+
it 'should increment the color index count' do
|
86
|
+
expect do
|
87
|
+
@formatter.rainbowify('=')
|
88
|
+
end.to change(@formatter, :color_index).by(1)
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
describe 'highlight' do
|
93
|
+
it 'should rainbowify passing examples' do
|
94
|
+
expect(@formatter.highlight('=')).to eq("\e[38;5;154m-\e[0m")
|
95
|
+
end
|
96
|
+
|
97
|
+
it 'should mark failing examples as red' do
|
98
|
+
expect(@formatter.highlight('*')).to eq("\e[31m*\e[0m")
|
99
|
+
end
|
100
|
+
|
101
|
+
it 'should mark pending examples as yellow' do
|
102
|
+
expect(@formatter.highlight('!')).to eq("\e[33m!\e[0m")
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
describe 'start' do
|
107
|
+
it 'should set the total amount of specs' do
|
108
|
+
expect(@formatter.example_count).to eq(2)
|
109
|
+
end
|
110
|
+
|
111
|
+
it 'should set the current to 0' do
|
112
|
+
expect(@formatter.current).to eq(0)
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
describe '#format_duration' do
|
117
|
+
it 'should return just seconds for sub 60 seconds' do
|
118
|
+
expect(@formatter.format_duration(5.3)).to eq('5.3 seconds')
|
119
|
+
end
|
120
|
+
|
121
|
+
it 'should remove that extra zero if it is not needed' do
|
122
|
+
expect(@formatter.format_duration(1.0)).to eq('1 second')
|
123
|
+
end
|
124
|
+
|
125
|
+
it 'should plurlaize seconds' do
|
126
|
+
expect(@formatter.format_duration(1.1)).to eq('1.1 seconds')
|
127
|
+
end
|
128
|
+
|
129
|
+
it 'add a minute if it is just over 60 seconds' do
|
130
|
+
expect(@formatter.format_duration(63.2543456456)).to eq('1 minute and 3.25 seconds')
|
131
|
+
end
|
132
|
+
|
133
|
+
it 'should pluralize minutes' do
|
134
|
+
expect(@formatter.format_duration(987.34)).to eq('16 minutes and 27.34 seconds')
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
describe 'example width' do
|
139
|
+
[15, 36, 60].each do |n|
|
140
|
+
context "for #{n} examples" do
|
141
|
+
before { @formatter.start(n) }
|
142
|
+
|
143
|
+
[0.25, 0.5, 0.75].each do |p|
|
144
|
+
i = (n * p).to_i
|
145
|
+
before { i.times { @formatter.tick } }
|
146
|
+
|
147
|
+
context "when in example #{i}" do
|
148
|
+
it 'should return 1 as the example width' do
|
149
|
+
expect(@formatter.example_width).to eq(1)
|
150
|
+
end
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end
|
155
|
+
end
|
156
|
+
end
|