Created
June 16, 2011 19:22
-
-
Save jonsmock/1030017 to your computer and use it in GitHub Desktop.
TDD-ed CSS comment weeder
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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