feat: use pytest for testing (#6)
* feat: use pytest for testing * fix: improve wording Co-authored-by: Nicholas Carrigan (he/him) <nhcarrigan@gmail.com> * feat: add tests with two problems Co-authored-by: Nicholas Carrigan (he/him) <nhcarrigan@gmail.com>
This commit is contained in:
		
							parent
							
								
									96469913d0
								
							
						
					
					
						commit
						c4921d2d7b
					
				@ -38,7 +38,7 @@ Output:
 | 
			
		||||
 | 
			
		||||
### Rules
 | 
			
		||||
 | 
			
		||||
The function will return the correct conversion if the supplied problems are properly formatted, otherwise, it will **return** a **string** that describes an error that is meaningful to the user.  
 | 
			
		||||
The function will return the correct conversion if the supplied problems are properly formatted, otherwise, it will **return** a **string** that describes an error that is meaningful to the user.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
* Situations that will return an error:
 | 
			
		||||
@ -60,9 +60,9 @@ The function will return the correct conversion if the supplied problems are pro
 | 
			
		||||
 | 
			
		||||
Write your code in `arithmetic_arranger.py`. For development, you can use `main.py` to test your `arithmetic_arranger()` function. Click the "run" button and `main.py` will run.
 | 
			
		||||
 | 
			
		||||
### Testing 
 | 
			
		||||
### Testing
 | 
			
		||||
 | 
			
		||||
The unit tests for this project are in `test_module.py`. We imported the tests from `test_module.py` to `main.py` for your convenience. The tests will run automatically whenever you hit the "run" button.
 | 
			
		||||
The unit tests for this project are in `test_module.py`. We are running the tests from `test_module.py` in `main.py` for your convenience. The tests will run automatically whenever you hit the "run" button. Alternatively you may run the tests by inputting `pytest` in the console.
 | 
			
		||||
 | 
			
		||||
### Submitting
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										5
									
								
								main.py
									
									
									
									
									
								
							
							
						
						
									
										5
									
								
								main.py
									
									
									
									
									
								
							@ -1,10 +1,11 @@
 | 
			
		||||
# This entrypoint file to be used in development. Start by reading README.md
 | 
			
		||||
from pytest import main
 | 
			
		||||
 | 
			
		||||
from arithmetic_arranger import arithmetic_arranger
 | 
			
		||||
from unittest import main
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
print(arithmetic_arranger(["32 + 698", "3801 - 2", "45 + 43", "123 + 49"]))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# Run unit tests automatically
 | 
			
		||||
main(module='test_module', exit=False)
 | 
			
		||||
main()
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										15
									
								
								pyproject.toml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								pyproject.toml
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,15 @@
 | 
			
		||||
[tool.poetry]
 | 
			
		||||
name = "fcc-arithmetic-formatter"
 | 
			
		||||
version = "0.1.0"
 | 
			
		||||
description = ""
 | 
			
		||||
authors = ["Your Name <you@example.com>"]
 | 
			
		||||
 | 
			
		||||
[tool.poetry.dependencies]
 | 
			
		||||
python = "^3.8"
 | 
			
		||||
pytest = "^6.2.4"
 | 
			
		||||
 | 
			
		||||
[tool.poetry.dev-dependencies]
 | 
			
		||||
 | 
			
		||||
[build-system]
 | 
			
		||||
requires = ["poetry-core>=1.0.0"]
 | 
			
		||||
build-backend = "poetry.core.masonry.api"
 | 
			
		||||
							
								
								
									
										112
									
								
								test_module.py
									
									
									
									
									
								
							
							
						
						
									
										112
									
								
								test_module.py
									
									
									
									
									
								
							@ -1,43 +1,77 @@
 | 
			
		||||
import unittest
 | 
			
		||||
import pytest
 | 
			
		||||
 | 
			
		||||
from arithmetic_arranger import arithmetic_arranger
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# the test case
 | 
			
		||||
class UnitTests(unittest.TestCase):
 | 
			
		||||
    def test_arrangement(self):
 | 
			
		||||
        actual = arithmetic_arranger(["3 + 855", "3801 - 2", "45 + 43", "123 + 49"])
 | 
			
		||||
        expected = "    3      3801      45      123\n+ 855    -    2    + 43    +  49\n-----    ------    ----    -----"
 | 
			
		||||
        self.assertEqual(actual, expected, 'Expected different output when calling "arithmetic_arranger()" with ["3 + 855", "3801 - 2", "45 + 43", "123 + 49"]')
 | 
			
		||||
 | 
			
		||||
        actual = arithmetic_arranger(["11 + 4", "3801 - 2999", "1 + 2", "123 + 49", "1 - 9380"])
 | 
			
		||||
        expected = "  11      3801      1      123         1\n+  4    - 2999    + 2    +  49    - 9380\n----    ------    ---    -----    ------"
 | 
			
		||||
        self.assertEqual(actual, expected, 'Expected different output when calling "arithmetic_arranger()" with ["11 + 4", "3801 - 2999", "1 + 2", "123 + 49", "1 - 9380"]')
 | 
			
		||||
 | 
			
		||||
    def test_too_many_problems(self):
 | 
			
		||||
        actual = arithmetic_arranger(["44 + 815", "909 - 2", "45 + 43", "123 + 49", "888 + 40", "653 + 87"])
 | 
			
		||||
        expected = "Error: Too many problems."
 | 
			
		||||
        self.assertEqual(actual, expected, 'Expected calling "arithmetic_arranger()" with more than five problems to return "Error: Too many problems."')
 | 
			
		||||
 | 
			
		||||
    def test_incorrect_operator(self):
 | 
			
		||||
        actual = arithmetic_arranger(["3 / 855", "3801 - 2", "45 + 43", "123 + 49"])
 | 
			
		||||
        expected = "Error: Operator must be '+' or '-'."
 | 
			
		||||
        self.assertEqual(actual, expected, '''Expected calling "arithmetic_arranger()" with a problem that uses the "/" operator to return "Error: Operator must be '+' or '-'."''')
 | 
			
		||||
        
 | 
			
		||||
    def test_too_many_digits(self):
 | 
			
		||||
        actual = arithmetic_arranger(["24 + 85215", "3801 - 2", "45 + 43", "123 + 49"])
 | 
			
		||||
        expected = "Error: Numbers cannot be more than four digits."
 | 
			
		||||
        self.assertEqual(actual, expected, 'Expected calling "arithmetic_arranger()" with a problem that has a number over 4 digits long to return "Error: Numbers cannot be more than four digits."')
 | 
			
		||||
 | 
			
		||||
    def test_only_digits(self):
 | 
			
		||||
        actual = arithmetic_arranger(["98 + 3g5", "3801 - 2", "45 + 43", "123 + 49"])
 | 
			
		||||
        expected = "Error: Numbers must only contain digits."
 | 
			
		||||
        self.assertEqual(actual, expected, 'Expected calling "arithmetic_arranger()" with a problem that contains a letter character in the number to return "Error: Numbers must only contain digits."')
 | 
			
		||||
 | 
			
		||||
    def test_solutions(self):
 | 
			
		||||
        actual = arithmetic_arranger(["32 - 698", "1 - 3801", "45 + 43", "123 + 49"], True)
 | 
			
		||||
        expected = "   32         1      45      123\n- 698    - 3801    + 43    +  49\n-----    ------    ----    -----\n -666     -3800      88      172"
 | 
			
		||||
        self.assertEqual(actual, expected, 'Expected solutions to be correctly displayed in output when calling "arithmetic_arranger()" with arithmetic problems and a second argument of `True`.')
 | 
			
		||||
test_cases = [
 | 
			
		||||
    pytest.param(
 | 
			
		||||
        [['3801 - 2', '123 + 49']],
 | 
			
		||||
        '  3801      123\n'
 | 
			
		||||
        '-    2    +  49\n'
 | 
			
		||||
        '------    -----',
 | 
			
		||||
        'Expected different output when calling "arithmetic_arranger()" with ["3801 - 2", "123 + 49"]',
 | 
			
		||||
        id='test_two_problems_arrangement1'),
 | 
			
		||||
    pytest.param(
 | 
			
		||||
        [['1 + 2', '1 - 9380']],
 | 
			
		||||
        '  1         1\n'
 | 
			
		||||
        '+ 2    - 9380\n'
 | 
			
		||||
        '---    ------',
 | 
			
		||||
        'Expected different output when calling "arithmetic_arranger()" with ["1 + 2", "1 - 9380"]',
 | 
			
		||||
        id='test_two_problems_arrangement2'),
 | 
			
		||||
    pytest.param(
 | 
			
		||||
        [['3 + 855', '3801 - 2', '45 + 43', '123 + 49']],
 | 
			
		||||
        '    3      3801      45      123\n'
 | 
			
		||||
        '+ 855    -    2    + 43    +  49\n'
 | 
			
		||||
        '-----    ------    ----    -----',
 | 
			
		||||
        'Expected different output when calling "arithmetic_arranger()" with ["3 + 855", "3801 - 2", "45 + 43", "123 + 49"]',
 | 
			
		||||
        id='test_four_problems_arrangement'),
 | 
			
		||||
    pytest.param(
 | 
			
		||||
        [['11 + 4', '3801 - 2999', '1 + 2', '123 + 49', '1 - 9380']],
 | 
			
		||||
        '  11      3801      1      123         1\n'
 | 
			
		||||
        '+  4    - 2999    + 2    +  49    - 9380\n'
 | 
			
		||||
        '----    ------    ---    -----    ------',
 | 
			
		||||
        'Expected different output when calling "arithmetic_arranger()" with ["11 + 4", "3801 - 2999", "1 + 2", "123 + 49", "1 - 9380"]',
 | 
			
		||||
        id='test_five_problems_arrangement'),
 | 
			
		||||
    pytest.param(
 | 
			
		||||
        [['44 + 815', '909 - 2', '45 + 43', '123 + 49',
 | 
			
		||||
          '888 + 40', '653 + 87']],
 | 
			
		||||
        'Error: Too many problems.',
 | 
			
		||||
        'Expected calling "arithmetic_arranger()" with more than five problems to return "Error: Too many problems."',
 | 
			
		||||
        id='test_too_many_problems'),
 | 
			
		||||
    pytest.param(
 | 
			
		||||
        [['3 / 855', '3801 - 2', '45 + 43', '123 + 49']],
 | 
			
		||||
        "Error: Operator must be '+' or '-'.",
 | 
			
		||||
        '''Expected calling "arithmetic_arranger()" with a problem that uses the "/" operator to return "Error: Operator must be '+' or '-'."''',
 | 
			
		||||
        id='test_incorrect_operator'),
 | 
			
		||||
    pytest.param(
 | 
			
		||||
        [['24 + 85215', '3801 - 2', '45 + 43', '123 + 49']],
 | 
			
		||||
        'Error: Numbers cannot be more than four digits.',
 | 
			
		||||
        'Expected calling "arithmetic_arranger()" with a problem that has a number over 4 digits long to return "Error: Numbers cannot be more than four digits."',
 | 
			
		||||
        id='test_too_many_digits'),
 | 
			
		||||
    pytest.param(
 | 
			
		||||
        [['98 + 3g5', '3801 - 2', '45 + 43', '123 + 49']],
 | 
			
		||||
        'Error: Numbers must only contain digits.',
 | 
			
		||||
        'Expected calling "arithmetic_arranger()" with a problem that contains a letter character in the number to return "Error: Numbers must only contain digits."',
 | 
			
		||||
        id='test_only_digits'),
 | 
			
		||||
    pytest.param(
 | 
			
		||||
        [['3 + 855', '988 + 40'], True],
 | 
			
		||||
        '    3      988\n'
 | 
			
		||||
        '+ 855    +  40\n'
 | 
			
		||||
        '-----    -----\n'
 | 
			
		||||
        '  858     1028',
 | 
			
		||||
        'Expected solutions to be correctly displayed in output when calling "arithmetic_arranger()" with ["3 + 855", "988 + 40"] and a second argument of `True`.',
 | 
			
		||||
        id='test_two_problems_with_solutions'),
 | 
			
		||||
    pytest.param(
 | 
			
		||||
        [['32 - 698', '1 - 3801', '45 + 43', '123 + 49', '988 + 40'], True],
 | 
			
		||||
        '   32         1      45      123      988\n'
 | 
			
		||||
        '- 698    - 3801    + 43    +  49    +  40\n'
 | 
			
		||||
        '-----    ------    ----    -----    -----\n'
 | 
			
		||||
        ' -666     -3800      88      172     1028',
 | 
			
		||||
        'Expected solutions to be correctly displayed in output when calling "arithmetic_arranger()" with five arithmetic problems and a second argument of `True`.',
 | 
			
		||||
        id='test_five_problems_with_solutions'),
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
if __name__ == "__main__":
 | 
			
		||||
    unittest.main()
 | 
			
		||||
@pytest.mark.parametrize('arguments,expected_output,fail_message', test_cases)
 | 
			
		||||
def test_template(arguments, expected_output, fail_message):
 | 
			
		||||
    actual = arithmetic_arranger(*arguments)
 | 
			
		||||
    assert actual == expected_output, fail_message
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user