diff options
author | Haoyu Qiu <timothyqiu32@gmail.com> | 2024-07-02 17:12:21 +0800 |
---|---|---|
committer | Haoyu Qiu <timothyqiu32@gmail.com> | 2024-07-02 20:53:52 +0800 |
commit | ee9cea521d97088eb368cb1820db71100da9837b (patch) | |
tree | 9b414e7a852c583bd3a563d46a02dcd6278c4b90 | |
parent | 9db1a963beae8056cbd30d692d4160d09c10b2dc (diff) | |
download | redot-engine-ee9cea521d97088eb368cb1820db71100da9837b.tar.gz |
Fix parsing of `4.` in Expression
-rw-r--r-- | core/math/expression.cpp | 10 | ||||
-rw-r--r-- | tests/core/math/test_expression.h | 53 |
2 files changed, 56 insertions, 7 deletions
diff --git a/core/math/expression.cpp b/core/math/expression.cpp index 636c2c16bf..0692ece1e6 100644 --- a/core/math/expression.cpp +++ b/core/math/expression.cpp @@ -30,12 +30,7 @@ #include "expression.h" -#include "core/io/marshalls.h" -#include "core/math/math_funcs.h" #include "core/object/class_db.h" -#include "core/object/ref_counted.h" -#include "core/os/os.h" -#include "core/variant/variant_parser.h" Error Expression::_get_token(Token &r_token) { while (true) { @@ -392,7 +387,6 @@ Error Expression::_get_token(Token &r_token) { if (is_digit(c)) { } else if (c == 'e') { reading = READING_EXP; - } else { reading = READING_DONE; } @@ -419,7 +413,9 @@ Error Expression::_get_token(Token &r_token) { is_first_char = false; } - str_ofs--; + if (c != 0) { + str_ofs--; + } r_token.type = TK_CONSTANT; diff --git a/tests/core/math/test_expression.h b/tests/core/math/test_expression.h index 512d7932f9..c3e4280491 100644 --- a/tests/core/math/test_expression.h +++ b/tests/core/math/test_expression.h @@ -122,6 +122,59 @@ TEST_CASE("[Expression] Floating-point arithmetic") { "Float multiplication-addition-subtraction-division should return the expected result."); } +TEST_CASE("[Expression] Floating-point notation") { + Expression expression; + + CHECK_MESSAGE( + expression.parse("2.") == OK, + "The expression should parse successfully."); + CHECK_MESSAGE( + double(expression.execute()) == doctest::Approx(2.0), + "The expression should return the expected result."); + + CHECK_MESSAGE( + expression.parse("(2.)") == OK, + "The expression should parse successfully."); + CHECK_MESSAGE( + double(expression.execute()) == doctest::Approx(2.0), + "The expression should return the expected result."); + + CHECK_MESSAGE( + expression.parse(".3") == OK, + "The expression should parse successfully."); + CHECK_MESSAGE( + double(expression.execute()) == doctest::Approx(0.3), + "The expression should return the expected result."); + + CHECK_MESSAGE( + expression.parse("2.+5.") == OK, + "The expression should parse successfully."); + CHECK_MESSAGE( + double(expression.execute()) == doctest::Approx(7.0), + "The expression should return the expected result."); + + CHECK_MESSAGE( + expression.parse(".3-.8") == OK, + "The expression should parse successfully."); + CHECK_MESSAGE( + double(expression.execute()) == doctest::Approx(-0.5), + "The expression should return the expected result."); + + CHECK_MESSAGE( + expression.parse("2.+.2") == OK, + "The expression should parse successfully."); + CHECK_MESSAGE( + double(expression.execute()) == doctest::Approx(2.2), + "The expression should return the expected result."); + + CHECK_MESSAGE( + expression.parse(".0*0.") == OK, + "The expression should parse successfully."); + CHECK_MESSAGE( + double(expression.execute()) == doctest::Approx(0.0), + "The expression should return the expected result."); +} + TEST_CASE("[Expression] Scientific notation") { Expression expression; |