diff --git a/spec/std/char/reader_spec.cr b/spec/std/char/reader_spec.cr index 0d34beac6d45..4d9ec1924f4f 100644 --- a/spec/std/char/reader_spec.cr +++ b/spec/std/char/reader_spec.cr @@ -70,20 +70,31 @@ describe "Char::Reader" do reader.current_char.ord.should eq(225) end - it "is an Enumerable(Char)" do - reader = Char::Reader.new("abc") - sum = 0 - reader.each do |char| - sum += char.ord - end.should be_nil - sum.should eq(294) - end + describe "#each" do + it "yields chars" do + reader = Char::Reader.new("abc") + chars = [] of Char + reader.each do |char| + chars << char + end.should be_nil + chars.should eq ['a', 'b', 'c'] + end - it "is an Enumerable(Char) but doesn't yield if empty" do - reader = Char::Reader.new("") - reader.each do |char| - fail "reader each shouldn't yield on empty string" - end.should be_nil + it "does not yield if empty" do + reader = Char::Reader.new("") + reader.each do |char| + fail "reader each shouldn't yield on empty string" + end.should be_nil + end + + it "checks bounds after block" do + string = "f" + reader = Char::Reader.new(string) + reader.each do |c| + c.should eq 'f' + reader.next_char + end + end end it "starts at end" do diff --git a/src/char/reader.cr b/src/char/reader.cr index 6213883cdc3a..ae1a20258db4 100644 --- a/src/char/reader.cr +++ b/src/char/reader.cr @@ -177,8 +177,9 @@ struct Char # C # ``` def each(&) : Nil - while has_next? + while @pos < @string.bytesize yield current_char + @pos += @current_char_width decode_current_char end