# Path: string_utils/manipulation.py
# def roman_encode(input_number: Union[str, int]) -> str:
#     """
#     Convert the given number/string into a roman number.
# 
#     The passed input must represents a positive integer in the range 1-3999 (inclusive).
# 
#     Why this limit? You may be wondering:
# 
#     1. zero is forbidden since there is no related representation in roman numbers
#     2. the upper bound 3999 is due to the limitation in the ascii charset\
#     (the higher quantity sign displayable in ascii is "M" which is equal to 1000, therefore based on\
#     roman numbers rules we can use 3 times M to reach 3000 but we can't go any further in thousands without\
#     special "boxed chars").
# 
#     *Examples:*
# 
#     >>> roman_encode(37) # returns 'XXXVIII'
#     >>> roman_encode('2020') # returns 'MMXX'
# 
#     :param input_number: An integer or a string to be converted.
#     :type input_number: Union[str, int]
#     :return: Roman number string.
#     """
#     return __RomanNumbers.encode(input_number)


from unittest import TestCase
from string_utils.manipulation import roman_encode
        self.assertEqual(roman_encode('15'), 'XV')
        self.assertEqual(roman_encode('9'), 'IX')
        self.assertEqual(roman_encode('30'), 'XXX')

    def test_units_are_encoded_as_expected(self):
        self.assertEqual(roman_encode(1), 'I')
        self.assertEqual(roman_encode(2), 'II')
        self.assertEqual(roman_encode(3), 'III')
        self.assertEqual(roman_encode(4), 'IV')
        self.assertEqual(roman_encode(5), 'V')
        self.assertEqual(roman_encode(6), 'VI')
        self.assertEqual(roman_encode(7), 'VII')
        self.assertEqual(roman_encode(8), 'VIII')
        self.assertEqual(roman_encode(9), 'IX')

    def test_tens_are_encoded_as_expected(self):
        self.assertEqual(roman_encode(10), 'X')
        self.assertEqual(roman_encode(20), 'XX')
        self.assertEqual(roman_encode(30), 'XXX')
        self.assertEqual(roman_encode(40), 'XL')
        self.assertEqual(roman_encode(50), 'L')
        self.assertEqual(roman_encode(60), 'LX')
        self.assertEqual(roman_encode(70), 'LXX')
        self.assertEqual(roman_encode(80), 'LXXX')
        self.assertEqual(roman_encode(90), 'XC')

    def test_tens_and_units_are_encoded_as_expected(self):
        # 1x
        self.assertEqual(roman_encode(11), 'XI')
        self.assertEqual(roman_encode(12), 'XII')

# Path: string_utils/manipulation.py
# def roman_encode(input_number: Union[str, int]) -> str:
#     """
#     Convert the given number/string into a roman number.
# 
#     The passed input must represents a positive integer in the range 1-3999 (inclusive).
# 
#     Why this limit? You may be wondering:
# 
#     1. zero is forbidden since there is no related representation in roman numbers
#     2. the upper bound 3999 is due to the limitation in the ascii charset\
#     (the higher quantity sign displayable in ascii is "M" which is equal to 1000, therefore based on\
#     roman numbers rules we can use 3 times M to reach 3000 but we can't go any further in thousands without\
#     special "boxed chars").
# 
#     *Examples:*
# 
#     >>> roman_encode(37) # returns 'XXXVIII'
#     >>> roman_encode('2020') # returns 'MMXX'
# 
#     :param input_number: An integer or a string to be converted.
#     :type input_number: Union[str, int]
#     :return: Roman number string.
#     """
#     return __RomanNumbers.encode(input_number)


# Path: tests/test_roman_encode.py
from unittest import TestCase
from string_utils.manipulation import roman_encode

        self.assertEqual(roman_encode('15'), 'XV')
        self.assertEqual(roman_encode('9'), 'IX')
        self.assertEqual(roman_encode('30'), 'XXX')

    def test_units_are_encoded_as_expected(self):
        self.assertEqual(roman_encode(1), 'I')
        self.assertEqual(roman_encode(2), 'II')
        self.assertEqual(roman_encode(3), 'III')
        self.assertEqual(roman_encode(4), 'IV')
        self.assertEqual(roman_encode(5), 'V')
        self.assertEqual(roman_encode(6), 'VI')
        self.assertEqual(roman_encode(7), 'VII')
        self.assertEqual(roman_encode(8), 'VIII')
        self.assertEqual(roman_encode(9), 'IX')

    def test_tens_are_encoded_as_expected(self):
        self.assertEqual(roman_encode(10), 'X')
        self.assertEqual(roman_encode(20), 'XX')
        self.assertEqual(roman_encode(30), 'XXX')
        self.assertEqual(roman_encode(40), 'XL')
        self.assertEqual(roman_encode(50), 'L')
        self.assertEqual(roman_encode(60), 'LX')
        self.assertEqual(roman_encode(70), 'LXX')
        self.assertEqual(roman_encode(80), 'LXXX')
        self.assertEqual(roman_encode(90), 'XC')

    def test_tens_and_units_are_encoded_as_expected(self):
        # 1x
        self.assertEqual(roman_encode(11), 'XI')
        self.assertEqual(roman_encode(12), 'XII')

        self.assertEqual(roman_encode(13), 'XIII')