require File.expand_path(File.dirname(__FILE__) + '/neo') class AboutStrings < Neo::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 assert_equal __, 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 __, long_string.length assert_equal __, long_string.lines.count assert_equal __, long_string[0,1] 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_older_ruby_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", "2") do def test_in_modern_ruby_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