Files
ruby_koans/src/about_strings.rb
2013-07-10 17:40:36 -04:00

198 lines
5.4 KiB
Ruby

require File.expand_path(File.dirname(__FILE__) + '/neo')
class AboutStrings < Neo::Koan
def test_double_quoted_strings_are_strings
string = "Hello, World"
assert_equal __(true), string.is_a?(String)
end
def test_single_quoted_strings_are_also_strings
string = 'Goodbye, World'
assert_equal __(true), string.is_a?(String)
end
def test_use_single_quotes_to_create_string_with_double_quotes
string = 'He said, "Go Away."'
assert_equal __('He said, "Go Away."'), string
end
def test_use_double_quotes_to_create_strings_with_single_quotes
string = "Don't"
assert_equal __("Don't"), string
end
def test_use_backslash_for_those_hard_cases
a = "He said, \"Don't\""
b = 'He said, "Don\'t"'
assert_equal __(true), a == b
end
def test_use_flexible_quoting_to_handle_really_hard_cases
a = %(flexible quotes can handle both ' and " characters)
b = %!flexible quotes can handle both ' and " characters!
c = %{flexible quotes can handle both ' and " characters}
assert_equal __(true), a == b
assert_equal __(true), a == c
end
def test_flexible_quotes_can_handle_multiple_lines
long_string = %{
It was the best of times,
It was the worst of times.
}
assert_equal __(54), long_string.length
assert_equal __(3), long_string.lines.count
assert_equal __("\n"), long_string[0,1]
end
def test_here_documents_can_also_handle_multiple_lines
long_string = <<EOS
It was the best of times,
It was the worst of times.
EOS
assert_equal __(53), long_string.length
assert_equal __(2), long_string.lines.count
assert_equal __("I"), long_string[0,1]
end
def test_plus_will_concatenate_two_strings
string = "Hello, " + "World"
assert_equal __("Hello, World"), string
end
def test_plus_concatenation_will_leave_the_original_strings_unmodified
hi = "Hello, "
there = "World"
string = hi + there
assert_equal __("Hello, "), hi
assert_equal __("World"), there
end
def test_plus_equals_will_concatenate_to_the_end_of_a_string
hi = "Hello, "
there = "World"
hi += there
assert_equal __("Hello, World"), hi
end
def test_plus_equals_also_will_leave_the_original_string_unmodified
original_string = "Hello, "
hi = original_string
there = "World"
hi += there
assert_equal __("Hello, "), original_string
end
def test_the_shovel_operator_will_also_append_content_to_a_string
hi = "Hello, "
there = "World"
hi << there
assert_equal __("Hello, World"), hi
assert_equal __("World"), there
end
def test_the_shovel_operator_modifies_the_original_string
original_string = "Hello, "
hi = original_string
there = "World"
hi << there
assert_equal __("Hello, World"), original_string
# THINK ABOUT IT:
#
# Ruby programmers tend to favor the shovel operator (<<) over the
# plus equals operator (+=) when building up strings. Why?
end
def test_double_quoted_string_interpret_escape_characters
string = "\n"
assert_equal __(1), string.size
end
def test_single_quoted_string_do_not_interpret_escape_characters
string = '\n'
assert_equal __(2), string.size
end
def test_single_quotes_sometimes_interpret_escape_characters
string = '\\\''
assert_equal __(2), string.size
assert_equal __("\\'"), string
end
def test_double_quoted_strings_interpolate_variables
value = 123
string = "The value is #{value}"
assert_equal __("The value is 123"), string
end
def test_single_quoted_strings_do_not_interpolate
value = 123
string = 'The value is #{value}'
assert_equal __('The value is #{value}'), string
end
def test_any_ruby_expression_may_be_interpolated
string = "The square root of 5 is #{Math.sqrt(5)}"
assert_equal __("The square root of 5 is 2.23606797749979"), string
end
def test_you_can_get_a_substring_from_a_string
string = "Bacon, lettuce and tomato"
assert_equal __("let"), string[7,3]
assert_equal __("let"), string[7..9]
end
def test_you_can_get_a_single_character_from_a_string
string = "Bacon, lettuce and tomato"
assert_equal __(97, 'a'), string[1]
# Surprised?
end
in_ruby_version("1.8") do
def test_in_older_ruby_single_characters_are_represented_by_integers
assert_equal __(97, 'a'), ?a
assert_equal __(true, false), ?a == 97
assert_equal __(true), ?b == (?a + 1)
end
end
in_ruby_version("1.9", "2") do
def test_in_modern_ruby_single_characters_are_represented_by_strings
assert_equal __('a'), ?a
assert_equal __(false), ?a == 97
end
end
def test_strings_can_be_split
string = "Sausage Egg Cheese"
words = string.split
assert_equal [__("Sausage"), __("Egg"), __("Cheese")], words
end
def test_strings_can_be_split_with_different_patterns
string = "the:rain:in:spain"
words = string.split(/:/)
assert_equal [__("the"), __("rain"), __("in"), __("spain")], words
# NOTE: Patterns are formed from Regular Expressions. Ruby has a
# very powerful Regular Expression library. We will become
# enlightened about them soon.
end
def test_strings_can_be_joined
words = ["Now", "is", "the", "time"]
assert_equal __("Now is the time"), words.join(" ")
end
def test_strings_are_unique_objects
a = "a string"
b = "a string"
assert_equal __(true), a == b
assert_equal __(false), a.object_id == b.object_id
end
end