Browse Source

Fix parsing of `4.` in Expression

(cherry picked from commit ee9cea521d97088eb368cb1820db71100da9837b)
Haoyu Qiu 1 year ago
parent
commit
1d790deedb
2 changed files with 56 additions and 7 deletions
  1. 3 7
      core/math/expression.cpp
  2. 53 0
      tests/core/math/test_expression.h

+ 3 - 7
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;
 

+ 53 - 0
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;