diff --git a/robotidy/transformers/NormalizeNewLines.py b/robotidy/transformers/NormalizeNewLines.py index 5c713c75..0c309727 100644 --- a/robotidy/transformers/NormalizeNewLines.py +++ b/robotidy/transformers/NormalizeNewLines.py @@ -3,7 +3,8 @@ from robot.api.parsing import ( ModelTransformer, - EmptyLine + EmptyLine, + Token ) @@ -41,7 +42,6 @@ def visit_Section(self, node): # noqa self.trim_trailing_empty_lines(node) empty_line = EmptyLine.from_params() if node is self.last_section: - node.body.append(empty_line) return self.generic_visit(node) node.body.extend([empty_line] * self.section_lines) return self.generic_visit(node) @@ -57,23 +57,31 @@ def visit_KeywordSection(self, node): # noqa def visit_TestCase(self, node): # noqa self.trim_leading_empty_lines(node) self.trim_trailing_empty_lines(node) - if node is self.last_test: - return node - if not self.templated: + if node is not self.last_test and not self.templated: node.body.extend([EmptyLine.from_params()] * self.test_case_lines) - return node + return self.generic_visit(node) def visit_Keyword(self, node): # noqa self.trim_leading_empty_lines(node) self.trim_trailing_empty_lines(node) - if node is self.last_keyword: - return node - node.body.extend([EmptyLine.from_params()] * self.keyword_lines) + if node is not self.last_keyword: + node.body.extend([EmptyLine.from_params()] * self.keyword_lines) + return self.generic_visit(node) + + def visit_Statement(self, node): # noqa + tokens = [] + for line in node.lines: + if line[-1].type == Token.EOL: + line[-1].value = '\n' # TODO: use global formatting in the future + tokens.extend(line) + node.tokens = tokens return node @staticmethod def trim_trailing_empty_lines(node): - while hasattr(node, 'body') and node.body and isinstance(node.body[-1], EmptyLine): + if not hasattr(node, 'body'): + return + while node.body and isinstance(node.body[-1], EmptyLine): node.body.pop() @staticmethod diff --git a/tests/atest/transformers/NormalizeNewLines/expected/test_case_last.robot b/tests/atest/transformers/NormalizeNewLines/expected/test_case_last.robot new file mode 100644 index 00000000..3d233c5a --- /dev/null +++ b/tests/atest/transformers/NormalizeNewLines/expected/test_case_last.robot @@ -0,0 +1,6 @@ +*** Test Cases *** +Values Are Equal Fails + Log 1111 + +Values Are Equal Fails + Log 1111 diff --git a/tests/atest/transformers/NormalizeNewLines/source/test_case_last_0_lines.robot b/tests/atest/transformers/NormalizeNewLines/source/test_case_last_0_lines.robot new file mode 100644 index 00000000..9d1a714c --- /dev/null +++ b/tests/atest/transformers/NormalizeNewLines/source/test_case_last_0_lines.robot @@ -0,0 +1,6 @@ +*** Test Cases *** +Values Are Equal Fails + Log 1111 + +Values Are Equal Fails + Log 1111 \ No newline at end of file diff --git a/tests/atest/transformers/NormalizeNewLines/source/test_case_last_1_lines.robot b/tests/atest/transformers/NormalizeNewLines/source/test_case_last_1_lines.robot new file mode 100644 index 00000000..3d233c5a --- /dev/null +++ b/tests/atest/transformers/NormalizeNewLines/source/test_case_last_1_lines.robot @@ -0,0 +1,6 @@ +*** Test Cases *** +Values Are Equal Fails + Log 1111 + +Values Are Equal Fails + Log 1111 diff --git a/tests/atest/transformers/test_transformers.py b/tests/atest/transformers/test_transformers.py index 1ef639f7..fe221312 100644 --- a/tests/atest/transformers/test_transformers.py +++ b/tests/atest/transformers/test_transformers.py @@ -257,6 +257,14 @@ def test_templated_tests_separated(self): config=':separate_templated_tests=True' ) + @pytest.mark.parametrize('lines_at_the_end', [0, 1]) + def test_test_case_last(self, lines_at_the_end): + run_tidy_and_compare( + self.TRANSFORMER_NAME, + sources=[f'test_case_last_{lines_at_the_end}_lines.robot'], + expected=['test_case_last.robot'] + ) + @patch('robotidy.app.Robotidy.save_model', new=save_tmp_model) class TestSplitTooLongLine: