Evidently, a lot of changes / pull requests were made to the koans directory and not to the src directory. Perhaps we should remove the koans directory entirely from the repo.
196 lines
4.9 KiB
Ruby
196 lines
4.9 KiB
Ruby
require File.expand_path(File.dirname(__FILE__) + '/edgecase')
|
|
|
|
class AboutStrings < EdgeCase::Koan
|
|
def test_double_quoted_strings_are_strings
|
|
string = "Hello, World"
|
|
assert_equal __, string.is_a?(String)
|
|
end
|
|
|
|
def test_single_quoted_strings_are_also_strings
|
|
string = 'Goodbye, World'
|
|
assert_equal __, string.is_a?(String)
|
|
end
|
|
|
|
def test_use_single_quotes_to_create_string_with_double_quotes
|
|
string = 'He said, "Go Away."'
|
|
assert_equal __, string
|
|
end
|
|
|
|
def test_use_double_quotes_to_create_strings_with_single_quotes
|
|
string = "Don't"
|
|
assert_equal __, string
|
|
end
|
|
|
|
def test_use_backslash_for_those_hard_cases
|
|
a = "He said, \"Don't\""
|
|
b = 'He said, "Don\'t"'
|
|
assert_equal __, 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 __, a == b
|
|
assert_equal __, 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 __, long_string.length
|
|
assert_equal __, long_string.lines.count
|
|
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 __, long_string.length
|
|
assert_equal __, long_string.lines.count
|
|
end
|
|
|
|
def test_plus_will_concatenate_two_strings
|
|
string = "Hello, " + "World"
|
|
assert_equal __, string
|
|
end
|
|
|
|
def test_plus_concatenation_will_leave_the_original_strings_unmodified
|
|
hi = "Hello, "
|
|
there = "World"
|
|
string = hi + there
|
|
assert_equal __, hi
|
|
assert_equal __, there
|
|
end
|
|
|
|
def test_plus_equals_will_concatenate_to_the_end_of_a_string
|
|
hi = "Hello, "
|
|
there = "World"
|
|
hi += there
|
|
assert_equal __, 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 __, original_string
|
|
end
|
|
|
|
def test_the_shovel_operator_will_also_append_content_to_a_string
|
|
hi = "Hello, "
|
|
there = "World"
|
|
hi << there
|
|
assert_equal __, hi
|
|
assert_equal __, there
|
|
end
|
|
|
|
def test_the_shovel_operator_modifies_the_original_string
|
|
original_string = "Hello, "
|
|
hi = original_string
|
|
there = "World"
|
|
hi << there
|
|
assert_equal __, 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 __, string.size
|
|
end
|
|
|
|
def test_single_quoted_string_do_not_interpret_escape_characters
|
|
string = '\n'
|
|
assert_equal __, string.size
|
|
end
|
|
|
|
def test_single_quotes_sometimes_interpret_escape_characters
|
|
string = '\\\''
|
|
assert_equal __, string.size
|
|
assert_equal __, string
|
|
end
|
|
|
|
def test_double_quoted_strings_interpolate_variables
|
|
value = 123
|
|
string = "The value is #{value}"
|
|
assert_equal __, string
|
|
end
|
|
|
|
def test_single_quoted_strings_do_not_interpolate
|
|
value = 123
|
|
string = 'The value is #{value}'
|
|
assert_equal __, string
|
|
end
|
|
|
|
def test_any_ruby_expression_may_be_interpolated
|
|
string = "The square root of 5 is #{Math.sqrt(5)}"
|
|
assert_equal __, string
|
|
end
|
|
|
|
def test_you_can_get_a_substring_from_a_string
|
|
string = "Bacon, lettuce and tomato"
|
|
assert_equal __, string[7,3]
|
|
assert_equal __, string[7..9]
|
|
end
|
|
|
|
def test_you_can_get_a_single_character_from_a_string
|
|
string = "Bacon, lettuce and tomato"
|
|
assert_equal __, string[1]
|
|
|
|
# Surprised?
|
|
end
|
|
|
|
in_ruby_version("1.8") do
|
|
def test_in_ruby_1_8_single_characters_are_represented_by_integers
|
|
assert_equal __, ?a
|
|
assert_equal __, ?a == 97
|
|
|
|
assert_equal __, ?b == (?a + 1)
|
|
end
|
|
end
|
|
|
|
in_ruby_version("1.9") do
|
|
def test_in_ruby_1_9_single_characters_are_represented_by_strings
|
|
assert_equal __, ?a
|
|
assert_equal __, ?a == 97
|
|
end
|
|
end
|
|
|
|
def test_strings_can_be_split
|
|
string = "Sausage Egg Cheese"
|
|
words = string.split
|
|
assert_equal [__, __, __], words
|
|
end
|
|
|
|
def test_strings_can_be_split_with_different_patterns
|
|
string = "the:rain:in:spain"
|
|
words = string.split(/:/)
|
|
assert_equal [__, __, __, __], 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 __, words.join(" ")
|
|
end
|
|
|
|
def test_strings_are_unique_objects
|
|
a = "a string"
|
|
b = "a string"
|
|
|
|
assert_equal __, a == b
|
|
assert_equal __, a.object_id == b.object_id
|
|
end
|
|
end
|