diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index faa48b7ee9fbb0a376a4b24abfcfddc86b77c05e..7860581790956ec50dead3d0db7f07dce9828302 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -4,7 +4,6 @@ stages: - dependencies - lint - test - - deploy download_dependencies: stage: dependencies @@ -23,12 +22,19 @@ pylint: - download_dependencies needs: - download_dependencies - before_script: + script: - source .venv/bin/activate - pip install pylint - script: - pylint calculator --fail-on=error # À toi de nous rajouter un petit job pour faire des tests unitaires pytest: - ## Bon courage + stage: test + dependencies: + - download_dependencies + needs: + - download_dependencies + script: + - source .venv/bin/activate + - pip install pytest + - pytest calculator diff --git a/calculator/calculator.py b/calculator/calculator.py index fd7087805b8c84cf2bf236b2467b40b7067dfe47..baf84493f6cfd896b58041a5f63bd4b41adae52f 100644 --- a/calculator/calculator.py +++ b/calculator/calculator.py @@ -52,9 +52,9 @@ class Calculator: for i, token in enumerate(tokens): if isinstance(token, Operator): ##################################################################### - ### ATTENTION: Est-ce que c'est vraiment un < (non c'est un <=) ? ### + ### ATTENTION: Est-ce que c'est vraiment un < ? (non c'est un <=) ### ##################################################################### - if operator is None or token.precedence < operator.precedence: + if operator is None or token.precedence <= operator.precedence: operator = token operator_index = i @@ -66,4 +66,5 @@ class Calculator: return OperatorExpression(operator, self.parse(left), self.parse(right)) def __call__(self, expression: str) -> Term: + # return 5 return self.parse(self.tokenize(expression))() diff --git a/calculator/operators.py b/calculator/operators.py index 5a48950224b9194e4e5f42e3f1dca4a71c6bf132..db668177580d1ca6edd8c70e1be5241876a273f3 100644 --- a/calculator/operators.py +++ b/calculator/operators.py @@ -21,6 +21,6 @@ class Operator: STANDARD_OPERATORS = { '+': Operator('+', 1, lambda a, b: a + b), '-': Operator('-', 1, lambda a, b: a - b), - '*': Operator('×', 2, lambda a, b: a * b), - '/': Operator('/', 2, lambda a, b: a % b), + '*': Operator('*', 2, lambda a, b: a * b), + '/': Operator('/', 2, lambda a, b: a / b), } diff --git a/calculator/test_calculator.py b/calculator/test_calculator.py index 03a63c3e5153f50bc4238e13d9cde8681cb4bd68..dabf40791abf07ac3e8ddafeb59499bb3ecb7813 100644 --- a/calculator/test_calculator.py +++ b/calculator/test_calculator.py @@ -25,7 +25,12 @@ def test_tokenizer(setup): Test the tokenizer. """ plus, minus, times, divide, calc = setup - # À toi de tester la fonction tokenize de Calculator. + assert calc.tokenize("1 + 2") == [1, plus, 2] + assert calc.tokenize("1 + 2 * 3") == [1, plus, 2, times, 3] + assert calc.tokenize( + "1 + 2 * 3 / 4") == [1, plus, 2, times, 3, divide, 4] + assert calc.tokenize( + "1 + 2 * 3 / 4 - 5") == [1, plus, 2, times, 3, divide, 4, minus, 5] def test_parser(setup): @@ -33,12 +38,21 @@ def test_parser(setup): Test the parser. """ plus, minus, times, divide, calc = setup - # À toi de tester la fonction parse de Calculator. + assert repr(calc.parse([1, plus, 2])) == '(1 + 2)' + assert repr(calc.parse([1, plus, 2, times, 3]) + ) == '(1 + (2 * 3))' + assert repr(calc.parse( + [1, plus, 2, times, 3, divide, 4])) == '(1 + ((2 * 3) / 4))' + assert repr(calc.parse([1, plus, 2, times, 3, divide, + 4, minus, 5])) == '((1 + ((2 * 3) / 4)) - 5)' def test_evaluation(setup): """ Test the evaluation. """ - plus, minus, times, divide, calc = setup - # À toi de tester la fonction __call__ de Calculator. + _, _, _, _, calc = setup + assert calc("1 + 2") == 3 + assert calc("1 + 2 * 3") == 7 + assert calc("1 + 2 * 3 / 4") == 2.5 + assert calc("1 + 2 * 3 / 4 - 5") == -2.5