Fix parsing of `4.` in Expression

(cherry picked from commit ee9cea521d)
This commit is contained in:
Haoyu Qiu 2024-07-02 17:12:21 +08:00 committed by Rémi Verschelde
parent 88370e44d8
commit 1d790deedb
No known key found for this signature in database
GPG Key ID: C3336907360768E1
2 changed files with 56 additions and 7 deletions

View File

@ -30,12 +30,7 @@
#include "expression.h" #include "expression.h"
#include "core/io/marshalls.h"
#include "core/math/math_funcs.h"
#include "core/object/class_db.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) { Error Expression::_get_token(Token &r_token) {
while (true) { while (true) {
@ -392,7 +387,6 @@ Error Expression::_get_token(Token &r_token) {
if (is_digit(c)) { if (is_digit(c)) {
} else if (c == 'e') { } else if (c == 'e') {
reading = READING_EXP; reading = READING_EXP;
} else { } else {
reading = READING_DONE; reading = READING_DONE;
} }
@ -419,7 +413,9 @@ Error Expression::_get_token(Token &r_token) {
is_first_char = false; is_first_char = false;
} }
str_ofs--; if (c != 0) {
str_ofs--;
}
r_token.type = TK_CONSTANT; r_token.type = TK_CONSTANT;

View File

@ -122,6 +122,59 @@ TEST_CASE("[Expression] Floating-point arithmetic") {
"Float multiplication-addition-subtraction-division should return the expected result."); "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") { TEST_CASE("[Expression] Scientific notation") {
Expression expression; Expression expression;