Skip to content

Instantly share code, notes, and snippets.

@jonsmock
Created June 16, 2011 19:22
Show Gist options
  • Select an option

  • Save jonsmock/1030017 to your computer and use it in GitHub Desktop.

Select an option

Save jonsmock/1030017 to your computer and use it in GitHub Desktop.
TDD-ed CSS comment weeder
require 'test/unit'
class CommentWeeder
def initialize
reset
end
def process(char)
@trail += char
start_comment if @trail.end_with? '/*'
reset if @trail.end_with? '*/'
flush unless ignore?(char)
end
private
def start_comment
@comment = true
end
def reset
@comment = false
@trail = ""
end
def ignore?(char)
@comment || char == '/'
end
def flush
output = @trail
reset
output
end
end
class CommentWeederTests < Test::Unit::TestCase
def setup
@m = CommentWeeder.new
end
def test_returns_normal_char
assert_equal 'h', @m.process('h')
end
def test_returns_noncomment
assert_equal 'b', @m.process('b')
assert_equal 'y', @m.process('y')
assert_equal 'e', @m.process('e')
end
def test_returns_nil_on_slash
assert_equal nil, @m.process('/')
end
def test_returns_a_star_normally
assert_equal '*', @m.process('*')
end
def test_returns_nil_for_star_after_slash
assert_equal nil, @m.process('/')
assert_equal nil, @m.process('*')
end
def test_returns_last_two_for_nonstar_after_slash
assert_equal nil, @m.process('/')
assert_equal '/a', @m.process('a')
end
def test_returns_nil_for_comment_body
assert_equal nil, @m.process('/')
assert_equal nil, @m.process('*')
assert_equal nil, @m.process('h')
end
def test_continues_nil_for_second_comment_opener
assert_equal nil, @m.process('/')
assert_equal nil, @m.process('*')
assert_equal nil, @m.process('b')
assert_equal nil, @m.process('y')
assert_equal nil, @m.process('/')
assert_equal nil, @m.process('*')
assert_equal nil, @m.process('e')
end
def test_returns_nil_for_comment_body_with_second_star
assert_equal nil, @m.process('/')
assert_equal nil, @m.process('*')
assert_equal nil, @m.process('h')
assert_equal nil, @m.process('*')
end
def test_returns_nil_for_comment_body_with_closing_comment
assert_equal nil, @m.process('/')
assert_equal nil, @m.process('*')
assert_equal nil, @m.process('h')
assert_equal nil, @m.process('*')
assert_equal nil, @m.process('/')
end
def test_resumes_output_after_closing_comment
assert_equal nil, @m.process('/')
assert_equal nil, @m.process('*')
assert_equal nil, @m.process('h')
assert_equal nil, @m.process('*')
assert_equal nil, @m.process('/')
assert_equal 'i', @m.process('i')
end
def test_two_comments # t/*h*/i/*s*/z => tiz
assert_equal 't', @m.process('t')
assert_equal nil, @m.process('/')
assert_equal nil, @m.process('*')
assert_equal nil, @m.process('h')
assert_equal nil, @m.process('*')
assert_equal nil, @m.process('/')
assert_equal 'i', @m.process('i')
assert_equal nil, @m.process('/')
assert_equal nil, @m.process('*')
assert_equal nil, @m.process('s')
assert_equal nil, @m.process('*')
assert_equal nil, @m.process('/')
assert_equal 'z', @m.process('z')
end
# seems to work ... any edge cases? even if not valid css...
def test_weird_open_closer # /*no*/*yes
assert_equal nil, @m.process('/')
assert_equal nil, @m.process('*')
assert_equal nil, @m.process('n')
assert_equal nil, @m.process('o')
assert_equal nil, @m.process('*')
assert_equal nil, @m.process('/')
assert_equal '*', @m.process('*')
assert_equal 'y', @m.process('y')
assert_equal 'e', @m.process('e')
assert_equal 's', @m.process('s')
end
def test_lots_of_slashes
assert_equal nil, @m.process('/')
assert_equal nil, @m.process('/')
assert_equal nil, @m.process('/')
assert_equal '///h', @m.process('h')
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment