Skip to content

Commit

Permalink
+ Refactored and extended minitest/pride to do full 256 color support…
Browse files Browse the repository at this point in the history
…. (lolcat)

[git-p4: depot-paths = "//src/minitest/dev/": change = 6553]
  • Loading branch information
zenspider committed Aug 18, 2011
1 parent f1fe96c commit ddf2ae4
Showing 1 changed file with 64 additions and 5 deletions.
69 changes: 64 additions & 5 deletions lib/minitest/pride.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,31 +4,90 @@
# Show your testing pride!

class PrideIO
ESC = "\e["
NND = "#{ESC}0m"

attr_reader :io

def initialize io
@io = io
# stolen from /System/Library/Perl/5.10.0/Term/ANSIColor.pm
@colors = (31..36).to_a
# also reference http://en.wikipedia.org/wiki/ANSI_escape_code
@colors ||= (31..36).to_a
@size = @colors.size
@index = 0
# io.sync = true
end

def print o
case o
when "." then
io.print "\e[#{@colors[@index % @size]}m*\e[0m"
@index += 1
io.print pride o
when "E", "F" then
io.print "\e[41m\e[37m#{o}\e[0m"
io.print "#{ESC}41m#{ESC}37m#{o}#{NND}"
else
io.print o
end
end

def puts(*o)
o.map! { |s|
s.sub(/Finished tests/) {
@index = 0
'Fabulous tests'.split(//).map { |c|
pride(c)
}.join
}
}

super
end

def pride string
string = "*" if string == "."
c = @colors[@index % @size]
@index += 1
"#{ESC}#{c}m#{string}#{NND}"
end

def method_missing msg, *args
io.send(msg, *args)
end
end

MiniTest::Unit.output = PrideIO.new(MiniTest::Unit.output)
class PrideLOL < PrideIO # inspired by lolcat, but massively cleaned up
PI_3 = Math::PI / 3

def initialize io
# walk red, green, and blue around a circle separated by equal thirds.
#
# To visualize, type this into wolfram-alpha:
#
# plot (3*sin(x)+3), (3*sin(x+2*pi/3)+3), (3*sin(x+4*pi/3)+3)

# 6 has wide pretty gradients. 3 == lolcat, about half the width
@colors = (0...(6 * 7)).map { |n|
n *= 1.0 / 6
r = (3 * Math.sin(n ) + 3).to_i
g = (3 * Math.sin(n + 2 * PI_3) + 3).to_i
b = (3 * Math.sin(n + 4 * PI_3) + 3).to_i

# Then we take rgb and encode them in a single number using base 6.
# For some mysterious reason, we add 16... to clear the bottom 4 bits?
# Yes... they're ugly.

36 * r + 6 * g + b + 16
}

super
end

def pride string
c = @colors[@index % @size]
@index += 1
"#{ESC}38;5;#{c}m#{string}#{NND}"
end
end

klass = ENV['TERM'] =~ /^xterm(-256color)?$/ ? PrideLOL : PrideIO
MiniTest::Unit.output = klass.new(MiniTest::Unit.output)

1 comment on commit ddf2ae4

@AndrewVos
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Very cool!

Please sign in to comment.