mirror of
https://github.com/edgecase/ruby_koans.git
synced 2026-04-15 07:23:19 -04:00
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.
101 lines
2.5 KiB
Ruby
101 lines
2.5 KiB
Ruby
require File.expand_path(File.dirname(__FILE__) + '/edgecase')
|
|
|
|
class AboutSymbols < EdgeCase::Koan
|
|
def test_symbols_are_symbols
|
|
symbol = :ruby
|
|
assert_equal __, symbol.is_a?(Symbol)
|
|
end
|
|
|
|
def test_symbols_can_be_compared
|
|
symbol1 = :a_symbol
|
|
symbol2 = :a_symbol
|
|
symbol3 = :something_else
|
|
|
|
assert_equal __, symbol1 == symbol2
|
|
assert_equal __, symbol1 == symbol3
|
|
end
|
|
|
|
def test_identical_symbols_are_a_single_internal_object
|
|
symbol1 = :a_symbol
|
|
symbol2 = :a_symbol
|
|
|
|
assert_equal __, symbol1 == symbol2
|
|
assert_equal __, symbol1.object_id == symbol2.object_id
|
|
end
|
|
|
|
def test_method_names_become_symbols
|
|
symbols_as_strings = Symbol.all_symbols.map { |x| x.to_s }
|
|
assert_equal __, symbols_as_strings.include?("test_method_names_become_symbols")
|
|
end
|
|
|
|
# THINK ABOUT IT:
|
|
#
|
|
# Why do we convert the list of symbols to strings and then compare
|
|
# against the string value rather than against symbols?
|
|
|
|
in_ruby_version("mri") do
|
|
RubyConstant = "What is the sound of one hand clapping?"
|
|
def test_constants_become_symbols
|
|
all_symbols = Symbol.all_symbols
|
|
|
|
assert_equal __, all_symbols.include?(__)
|
|
end
|
|
end
|
|
|
|
def test_symbols_can_be_made_from_strings
|
|
string = "catsAndDogs"
|
|
assert_equal __, string.to_sym
|
|
end
|
|
|
|
def test_symbols_with_spaces_can_be_built
|
|
symbol = :"cats and dogs"
|
|
|
|
assert_equal symbol, __.to_sym
|
|
end
|
|
|
|
def test_symbols_with_interpolation_can_be_built
|
|
value = "and"
|
|
symbol = :"cats #{value} dogs"
|
|
|
|
assert_equal symbol, __.to_sym
|
|
end
|
|
|
|
def test_to_s_is_called_on_interpolated_symbols
|
|
symbol = :cats
|
|
string = "It is raining #{symbol} and dogs."
|
|
|
|
assert_equal __, string
|
|
end
|
|
|
|
def test_symbols_are_not_strings
|
|
symbol = :ruby
|
|
assert_equal __, symbol.is_a?(String)
|
|
assert_equal __, symbol.eql?("ruby")
|
|
end
|
|
|
|
def test_symbols_do_not_have_string_methods
|
|
symbol = :not_a_string
|
|
assert_equal __, symbol.respond_to?(:each_char)
|
|
assert_equal __, symbol.respond_to?(:reverse)
|
|
end
|
|
|
|
# It's important to realize that symbols are not "immutable
|
|
# strings", though they are immutable. None of the
|
|
# interesting string operations are available on symbols.
|
|
|
|
def test_symbols_cannot_be_concatenated
|
|
# Exceptions will be pondered further down the path
|
|
assert_raise(___) do
|
|
:cats + :dogs
|
|
end
|
|
end
|
|
|
|
def test_symbols_can_be_dynamically_created
|
|
assert_equal __, ("cats" + "dogs").to_sym
|
|
end
|
|
|
|
# THINK ABOUT IT:
|
|
#
|
|
# Why is it not a good idea to dynamically create a lot of symbols?
|
|
end
|