This repository has been archived on 2025-03-22. You can view files and clone it, but cannot push or open issues or pull requests.
twine/test/test_placeholders.rb
2018-01-24 08:56:04 -06:00

125 lines
4.2 KiB
Ruby

require 'twine_test'
class PlaceholderTest < TwineTest
def assert_starts_with(prefix, value)
msg = message(nil) { "Expected #{mu_pp(value)} to start with #{mu_pp(prefix)}" }
assert value.start_with?(prefix), msg
end
def placeholder(type = nil)
# %[parameter][flags][width][.precision][length]type (see https://en.wikipedia.org/wiki/Printf_format_string#Format_placeholder_specification)
lucky = lambda { rand > 0.5 }
placeholder = '%'
placeholder += (rand * 20).to_i.to_s + '$' if lucky.call
placeholder += '-+0#'.chars.to_a.sample if lucky.call
placeholder += (0.upto(20).map(&:to_s) << "*").sample if lucky.call
placeholder += '.' + (0.upto(20).map(&:to_s) << "*").sample if lucky.call
placeholder += %w(h hh l ll L z j t).sample if lucky.call
placeholder += type || 'diufFeEgGxXocpaA'.chars.to_a.sample # this does not contain s or @ because strings are a special case
end
class ToAndroid < PlaceholderTest
def to_android(value)
Twine::Placeholders.convert_placeholders_from_twine_to_android(value)
end
def test_replaces_simple_string_placeholder
assert_equal "some '%s' value", to_android("some '%@' value")
end
def test_replaces_complicated_string_placeholder
placeholder = placeholder('@')
expected = placeholder.dup
expected[-1] = 's'
assert_equal "some #{expected} value", to_android("some #{placeholder} value")
end
def test_does_not_change_regular_at_signs
input = "some @ more @@ signs @"
assert_equal input, to_android(input)
end
def test_does_not_modify_single_percent_signs
assert_equal "some % value", to_android("some % value")
end
def test_does_not_modify_single_percent_signs_when_followed_by_space_and_format_letter
# Said differently: formartter parser should not recognize %a in "70% and"
assert_equal 'If 70% and 30% dog 80% end', to_android('If 70% and 30% dog 80% end')
end
def test_escapes_single_percent_signs_if_placeholder_present
assert_starts_with "some %% v", to_android("some % value #{placeholder}")
end
def test_does_not_modify_double_percent_signs
assert_equal "some %% value", to_android("some %% value")
end
def test_does_not_modify_double_percent_signs_if_placeholder_present
assert_starts_with "some %% v", to_android("some %% value #{placeholder}")
end
def test_does_not_modify_single_placeholder
input = "some #{placeholder} text"
assert_equal input, to_android(input)
end
def test_numbers_multiple_placeholders
assert_equal "first %1$d second %2$f", to_android("first %d second %f")
end
def test_does_not_modify_numbered_placeholders
input = "second %2$f first %1$d"
assert_equal input, to_android(input)
end
def test_raises_an_error_when_mixing_numbered_and_non_numbered_placeholders
assert_raises Twine::Error do
to_android("some %d second %2$f")
end
end
def test_complicated_float_placeholders
assert_equal "%1$.0f%2$s (apparent: %3$.0f)", to_android("%.0f%@ (apparent: %.0f)")
end
end
class FromAndroid < PlaceholderTest
def from_android(value)
Twine::Placeholders.convert_placeholders_from_android_to_twine(value)
end
def test_replaces_string_placeholder
assert_equal "some %@ value", from_android("some %s value")
end
end
class ToFlash < PlaceholderTest
def to_flash(value)
Twine::Placeholders.convert_placeholders_from_twine_to_flash(value)
end
def test_replaces_placeholder
assert_equal "some {0} text", to_flash("some #{placeholder} text")
end
def test_replaces_string_placeholder
assert_equal "some {0} text", to_flash("some #{placeholder('@')} text")
end
def test_numbers_placeholders
assert_equal "some {0} more {1} text {2}", to_flash("some #{placeholder('@')} more #{placeholder('@')} text #{placeholder('@')}")
end
end
class FromFlash < PlaceholderTest
def from_flash(value)
Twine::Placeholders.convert_placeholders_from_flash_to_twine(value)
end
def test_maps_all_placeholders_to_string
assert_equal "some %@ more %@ text %@", from_flash("some {0} more {1} text {2}")
end
end
end