diff options
Diffstat (limited to 'tests/test_matlab.py')
-rw-r--r-- | tests/test_matlab.py | 204 |
1 files changed, 204 insertions, 0 deletions
diff --git a/tests/test_matlab.py b/tests/test_matlab.py new file mode 100644 index 00000000..0ac1df95 --- /dev/null +++ b/tests/test_matlab.py @@ -0,0 +1,204 @@ +# -*- coding: utf-8 -*- +""" + MATLAB Tests + ~~~~~~~~~~~ + + :copyright: Copyright 2006-2020 by the Pygments team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + +import pytest + +from pygments.token import Token +from pygments.lexers import MatlabLexer + + +@pytest.fixture(scope='module') +def lexer(): + yield MatlabLexer() + + +def test_single_line(lexer): + """ + Test that a single line with strings, a method, and numbers is parsed correctly. + """ + fragment = "set('T',300,'P',101325);\n" + tokens = [ + (Token.Name, 'set'), + (Token.Punctuation, '('), + (Token.Literal.String, "'"), + (Token.Literal.String, "T'"), + (Token.Punctuation, ','), + (Token.Literal.Number.Integer, '300'), + (Token.Punctuation, ','), + (Token.Literal.String, "'"), + (Token.Literal.String, "P'"), + (Token.Punctuation, ','), + (Token.Literal.Number.Integer, '101325'), + (Token.Punctuation, ')'), + (Token.Punctuation, ';'), + (Token.Text, '\n'), + ] + assert list(lexer.get_tokens(fragment)) == tokens + + +def test_line_continuation(lexer): + """ + Test that line continuation by ellipses does not produce generic + output on the second line. + """ + fragment = "set('T',300,...\n'P',101325);\n" + tokens = [ + (Token.Name, 'set'), + (Token.Punctuation, '('), + (Token.Literal.String, "'"), + (Token.Literal.String, "T'"), + (Token.Punctuation, ','), + (Token.Literal.Number.Integer, '300'), + (Token.Punctuation, ','), + (Token.Keyword, '...'), + (Token.Text, '\n'), + (Token.Literal.String, "'"), + (Token.Literal.String, "P'"), + (Token.Punctuation, ','), + (Token.Literal.Number.Integer, '101325'), + (Token.Punctuation, ')'), + (Token.Punctuation, ';'), + (Token.Text, '\n'), + ] + assert list(lexer.get_tokens(fragment)) == tokens + + +def test_keywords_ended_by_newline(lexer): + """Test that keywords on their own line are marked as keywords.""" + fragment = "if x > 100\n disp('x > 100')\nelse\n disp('x < 100')\nend\n" + tokens = [ + (Token.Keyword, 'if'), + (Token.Text, ' '), + (Token.Name, 'x'), + (Token.Text, ' '), + (Token.Operator, '>'), + (Token.Text, ' '), + (Token.Literal.Number.Integer, '100'), + (Token.Text, '\n'), + (Token.Text, ' '), + (Token.Text, ' '), + (Token.Text, ' '), + (Token.Text, ' '), + (Token.Name.Builtin, 'disp'), + (Token.Punctuation, '('), + (Token.Literal.String, "'"), + (Token.Literal.String, "x > 100'"), + (Token.Punctuation, ')'), + (Token.Text, '\n'), + (Token.Keyword, 'else'), + (Token.Text, '\n'), + (Token.Text, ' '), + (Token.Text, ' '), + (Token.Text, ' '), + (Token.Text, ' '), + (Token.Name.Builtin, 'disp'), + (Token.Punctuation, '('), + (Token.Literal.String, "'"), + (Token.Literal.String, "x < 100'"), + (Token.Punctuation, ')'), + (Token.Text, '\n'), + (Token.Keyword, 'end'), + (Token.Text, '\n'), + ] + assert list(lexer.get_tokens(fragment)) == tokens + + +def test_comment_after_continuation(lexer): + """ + Test that text after the line continuation ellipses is marked as a comment. + """ + fragment = "set('T',300,... a comment\n'P',101325);\n" + tokens = [ + (Token.Name, 'set'), + (Token.Punctuation, '('), + (Token.Literal.String, "'"), + (Token.Literal.String, "T'"), + (Token.Punctuation, ','), + (Token.Literal.Number.Integer, '300'), + (Token.Punctuation, ','), + (Token.Keyword, '...'), + (Token.Comment, ' a comment'), + (Token.Text, '\n'), + (Token.Literal.String, "'"), + (Token.Literal.String, "P'"), + (Token.Punctuation, ','), + (Token.Literal.Number.Integer, '101325'), + (Token.Punctuation, ')'), + (Token.Punctuation, ';'), + (Token.Text, '\n'), + ] + assert list(lexer.get_tokens(fragment)) == tokens + + +def test_multiple_spaces_variable_assignment(lexer): + """ + Test that multiple spaces with an equal sign doesn't get formatted to a string. + """ + fragment = 'x = 100;\n' + tokens = [ + (Token.Name, 'x'), + (Token.Text, ' '), + (Token.Text, ' '), + (Token.Punctuation, '='), + (Token.Text, ' '), + (Token.Literal.Number.Integer, '100'), + (Token.Punctuation, ';'), + (Token.Text, '\n'), + ] + assert list(lexer.get_tokens(fragment)) == tokens + + +def test_operator_multiple_space(lexer): + """ + Test that multiple spaces with an operator doesn't get formatted to a string. + """ + fragment = 'x > 100;\n' + tokens = [ + (Token.Name, 'x'), + (Token.Text, ' '), + (Token.Text, ' '), + (Token.Operator, '>'), + (Token.Text, ' '), + (Token.Literal.Number.Integer, '100'), + (Token.Punctuation, ';'), + (Token.Text, '\n'), + ] + assert list(lexer.get_tokens(fragment)) == tokens + + +def test_one_space_assignment(lexer): + """Test that one space before an equal sign is formatted correctly.""" + fragment = 'x = 100;\n' + tokens = [ + (Token.Name, 'x'), + (Token.Text, ' '), + (Token.Punctuation, '='), + (Token.Text, ' '), + (Token.Literal.Number.Integer, '100'), + (Token.Punctuation, ';'), + (Token.Text, '\n'), + ] + assert list(lexer.get_tokens(fragment)) == tokens + + +def test_command_mode(lexer): + """ + MATLAB allows char function arguments to not be enclosed by parentheses + or contain quote characters, as long as they are space separated. Test + that one common such function is formatted appropriately. + """ + fragment = 'help sin\n' + tokens = [ + (Token.Name, 'help'), + (Token.Text, ' '), + (Token.Literal.String, 'sin'), + (Token.Punctuation, ''), + (Token.Text, '\n'), + ] + assert list(lexer.get_tokens(fragment)) == tokens |