summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/core/io/test_file_access.h2
-rw-r--r--tests/core/math/test_aabb.h21
-rw-r--r--tests/core/math/test_math.cpp2
-rw-r--r--tests/core/string/test_string.h26
-rw-r--r--tests/core/templates/test_oa_hash_map.cpp5
-rw-r--r--tests/core/templates/test_vector.h44
-rw-r--r--tests/core/variant/test_array.h31
-rw-r--r--tests/scene/test_code_edit.h78
-rw-r--r--tests/scene/test_curve.h26
-rw-r--r--tests/scene/test_gui.cpp2
-rw-r--r--tests/servers/test_shader_lang.cpp9
11 files changed, 192 insertions, 54 deletions
diff --git a/tests/core/io/test_file_access.h b/tests/core/io/test_file_access.h
index 4ffc57afe4..f566899c9b 100644
--- a/tests/core/io/test_file_access.h
+++ b/tests/core/io/test_file_access.h
@@ -53,7 +53,7 @@ TEST_CASE("[FileAccess] CSV read") {
REQUIRE(row2.size() == 3);
CHECK(row2[0] == "GOOD_EVENING");
CHECK(row2[1] == "Good Evening");
- CHECK(row2[2] == ""); // Use case: not yet translated!
+ CHECK(row2[2].is_empty()); // Use case: not yet translated!
// https://github.com/godotengine/godot/issues/44269
CHECK_MESSAGE(row2[2] != "\"", "Should not parse empty string as a single double quote.");
diff --git a/tests/core/math/test_aabb.h b/tests/core/math/test_aabb.h
index b838bed171..f5076ce1ed 100644
--- a/tests/core/math/test_aabb.h
+++ b/tests/core/math/test_aabb.h
@@ -349,14 +349,27 @@ TEST_CASE("[AABB] Has point") {
aabb.has_point(Vector3(2, 3, 0)),
"has_point() with contained point should return the expected value.");
CHECK_MESSAGE(
+ !aabb.has_point(Vector3(-20, 0, 0)),
+ "has_point() with non-contained point should return the expected value.");
+
+ CHECK_MESSAGE(
aabb.has_point(Vector3(-1.5, 3, 0)),
- "has_point() with contained point on negative edge should return the expected value.");
+ "has_point() with positive size should include point on near face (X axis).");
CHECK_MESSAGE(
aabb.has_point(Vector3(2.5, 3, 0)),
- "has_point() with contained point on positive edge should return the expected value.");
+ "has_point() with positive size should include point on far face (X axis).");
CHECK_MESSAGE(
- !aabb.has_point(Vector3(-20, 0, 0)),
- "has_point() with non-contained point should return the expected value.");
+ aabb.has_point(Vector3(0, 2, 0)),
+ "has_point() with positive size should include point on near face (Y axis).");
+ CHECK_MESSAGE(
+ aabb.has_point(Vector3(0, 7, 0)),
+ "has_point() with positive size should include point on far face (Y axis).");
+ CHECK_MESSAGE(
+ aabb.has_point(Vector3(0, 3, -2.5)),
+ "has_point() with positive size should include point on near face (Z axis).");
+ CHECK_MESSAGE(
+ aabb.has_point(Vector3(0, 3, 3.5)),
+ "has_point() with positive size should include point on far face (Z axis).");
}
TEST_CASE("[AABB] Expanding") {
diff --git a/tests/core/math/test_math.cpp b/tests/core/math/test_math.cpp
index 6ec9bc2473..97e6055130 100644
--- a/tests/core/math/test_math.cpp
+++ b/tests/core/math/test_math.cpp
@@ -312,7 +312,7 @@ public:
}
}
- if (name != String()) {
+ if (!name.is_empty()) {
namespace_stack[at_level] = name;
}
diff --git a/tests/core/string/test_string.h b/tests/core/string/test_string.h
index 00a9a8779a..eef1cac894 100644
--- a/tests/core/string/test_string.h
+++ b/tests/core/string/test_string.h
@@ -157,10 +157,10 @@ TEST_CASE("[String] Invalid UTF8") {
String s;
bool err = s.parse_utf8((const char *)u8str);
CHECK(err);
- CHECK(s == String());
+ CHECK(s.is_empty());
CharString cs = (const char *)u8str;
- CHECK(String::utf8(cs) == String());
+ CHECK(String::utf8(cs).is_empty());
ERR_PRINT_ON
}
@@ -170,10 +170,10 @@ TEST_CASE("[String] Invalid UTF16") {
String s;
bool err = s.parse_utf16(u16str);
CHECK(err);
- CHECK(s == String());
+ CHECK(s.is_empty());
Char16String cs = u16str;
- CHECK(String::utf16(cs) == String());
+ CHECK(String::utf16(cs).is_empty());
ERR_PRINT_ON
}
@@ -1439,6 +1439,24 @@ TEST_CASE("[String] Variant ptr indexed set") {
CHECK_EQ(s, String("azcd"));
}
+
+TEST_CASE("[Stress][String] Empty via ' == String()'") {
+ for (int i = 0; i < 100000; ++i) {
+ String str = "Hello World!";
+ if (str.is_empty()) {
+ continue;
+ }
+ }
+}
+
+TEST_CASE("[Stress][String] Empty via `is_empty()`") {
+ for (int i = 0; i < 100000; ++i) {
+ String str = "Hello World!";
+ if (str.is_empty()) {
+ continue;
+ }
+ }
+}
} // namespace TestString
#endif // TEST_STRING_H
diff --git a/tests/core/templates/test_oa_hash_map.cpp b/tests/core/templates/test_oa_hash_map.cpp
index 904c01642d..f7b2b7cdb0 100644
--- a/tests/core/templates/test_oa_hash_map.cpp
+++ b/tests/core/templates/test_oa_hash_map.cpp
@@ -55,7 +55,10 @@ struct CountedItem {
count++;
}
- CountedItem &operator=(const CountedItem &p_other) = default;
+ void operator=(const CountedItem &p_other) {
+ id = p_other.id;
+ count++;
+ }
~CountedItem() {
CRASH_COND(destroyed);
diff --git a/tests/core/templates/test_vector.h b/tests/core/templates/test_vector.h
index 658ca5adf1..6ea865dacc 100644
--- a/tests/core/templates/test_vector.h
+++ b/tests/core/templates/test_vector.h
@@ -238,7 +238,7 @@ TEST_CASE("[Vector] To byte array") {
CHECK(byte_array[15] == 59);
}
-TEST_CASE("[Vector] Subarray") {
+TEST_CASE("[Vector] Slice") {
Vector<int> vector;
vector.push_back(0);
vector.push_back(1);
@@ -246,27 +246,27 @@ TEST_CASE("[Vector] Subarray") {
vector.push_back(3);
vector.push_back(4);
- Vector<int> subarray1 = vector.subarray(1, 2);
- CHECK(subarray1.size() == 2);
- CHECK(subarray1[0] == 1);
- CHECK(subarray1[1] == 2);
-
- Vector<int> subarray2 = vector.subarray(1, -1);
- CHECK(subarray2.size() == 4);
- CHECK(subarray2[0] == 1);
- CHECK(subarray2[1] == 2);
- CHECK(subarray2[2] == 3);
- CHECK(subarray2[3] == 4);
-
- Vector<int> subarray3 = vector.subarray(-2, -1);
- CHECK(subarray3.size() == 2);
- CHECK(subarray3[0] == 3);
- CHECK(subarray3[1] == 4);
-
- Vector<int> subarray4 = vector.subarray(-3, 3);
- CHECK(subarray4.size() == 2);
- CHECK(subarray4[0] == 2);
- CHECK(subarray4[1] == 3);
+ Vector<int> slice1 = vector.slice(1, 3);
+ CHECK(slice1.size() == 2);
+ CHECK(slice1[0] == 1);
+ CHECK(slice1[1] == 2);
+
+ Vector<int> slice2 = vector.slice(1, -1);
+ CHECK(slice2.size() == 4);
+ CHECK(slice2[0] == 1);
+ CHECK(slice2[1] == 2);
+ CHECK(slice2[2] == 3);
+ CHECK(slice2[3] == 4);
+
+ Vector<int> slice3 = vector.slice(3, -1);
+ CHECK(slice3.size() == 2);
+ CHECK(slice3[0] == 3);
+ CHECK(slice3[1] == 4);
+
+ Vector<int> slice4 = vector.slice(2, -2);
+ CHECK(slice4.size() == 2);
+ CHECK(slice4[0] == 2);
+ CHECK(slice4[1] == 3);
}
TEST_CASE("[Vector] Find, has") {
diff --git a/tests/core/variant/test_array.h b/tests/core/variant/test_array.h
index e2e84f2962..d02b3d0e39 100644
--- a/tests/core/variant/test_array.h
+++ b/tests/core/variant/test_array.h
@@ -246,6 +246,37 @@ TEST_CASE("[Array] max() and min()") {
CHECK(min == 2);
}
+TEST_CASE("[Array] slice()") {
+ Array array;
+ array.push_back(0);
+ array.push_back(1);
+ array.push_back(2);
+ array.push_back(3);
+ array.push_back(4);
+
+ Array slice1 = array.slice(1, 3);
+ CHECK(slice1.size() == 2);
+ CHECK(slice1[0] == Variant(1));
+ CHECK(slice1[1] == Variant(2));
+
+ Array slice2 = array.slice(1, -1);
+ CHECK(slice2.size() == 4);
+ CHECK(slice2[0] == Variant(1));
+ CHECK(slice2[1] == Variant(2));
+ CHECK(slice2[2] == Variant(3));
+ CHECK(slice2[3] == Variant(4));
+
+ Array slice3 = array.slice(3, -1);
+ CHECK(slice3.size() == 2);
+ CHECK(slice3[0] == Variant(3));
+ CHECK(slice3[1] == Variant(4));
+
+ Array slice4 = array.slice(2, -2);
+ CHECK(slice4.size() == 2);
+ CHECK(slice4[0] == Variant(2));
+ CHECK(slice4[1] == Variant(3));
+}
+
TEST_CASE("[Array] Duplicate array") {
// a = [1, [2, 2], {3: 3}]
Array a = build_array(1, build_array(2, 2), build_dictionary(3, 3));
diff --git a/tests/scene/test_code_edit.h b/tests/scene/test_code_edit.h
index a95dd02ba5..4b5a049a07 100644
--- a/tests/scene/test_code_edit.h
+++ b/tests/scene/test_code_edit.h
@@ -2332,6 +2332,20 @@ TEST_CASE("[SceneTree][CodeEdit] folding") {
CHECK_FALSE(code_edit->is_line_folded(2));
CHECK(code_edit->get_next_visible_line_offset_from(1, 1) == 2);
+ // Indent with blank lines.
+ code_edit->set_text("line1\n\tline2\n\n\nline3");
+ CHECK(code_edit->can_fold_line(0));
+ for (int i = 1; i < 2; i++) {
+ CHECK_FALSE(code_edit->can_fold_line(i));
+ code_edit->fold_line(i);
+ CHECK_FALSE(code_edit->is_line_folded(i));
+ }
+ code_edit->fold_line(0);
+ CHECK(code_edit->is_line_folded(0));
+ CHECK_FALSE(code_edit->is_line_folded(1));
+ CHECK_FALSE(code_edit->is_line_folded(2));
+ CHECK(code_edit->get_next_visible_line_offset_from(1, 1) == 2);
+
// Nested indents.
code_edit->set_text("line1\n\tline2\n\t\tline3\nline4");
CHECK(code_edit->can_fold_line(0));
@@ -2408,7 +2422,7 @@ TEST_CASE("[SceneTree][CodeEdit] folding") {
for (int i = 1; i < code_edit->get_line_count(); i++) {
CHECK_FALSE(code_edit->is_line_folded(i));
}
- CHECK(code_edit->get_next_visible_line_offset_from(1, 1) == 6);
+ CHECK(code_edit->get_next_visible_line_offset_from(1, 1) == 5);
// End of file.
code_edit->set_text("line1\n\tline2");
@@ -2490,7 +2504,7 @@ TEST_CASE("[SceneTree][CodeEdit] folding") {
// Multiline blocks.
code_edit->add_comment_delimiter("&", "&", false);
- code_edit->set_text("&line1\n\tline2&");
+ code_edit->set_text("&line1\n\tline2&\nline3");
CHECK(code_edit->can_fold_line(0));
CHECK_FALSE(code_edit->can_fold_line(1));
code_edit->fold_line(1);
@@ -2498,7 +2512,17 @@ TEST_CASE("[SceneTree][CodeEdit] folding") {
code_edit->fold_line(0);
CHECK(code_edit->is_line_folded(0));
CHECK_FALSE(code_edit->is_line_folded(1));
- CHECK(code_edit->get_next_visible_line_offset_from(1, 1) == 1);
+ CHECK(code_edit->get_next_visible_line_offset_from(1, 1) == 2);
+
+ // Multiline comment before last line.
+ code_edit->set_text("&line1\nline2&\ntest");
+ CHECK(code_edit->can_fold_line(0));
+ CHECK_FALSE(code_edit->can_fold_line(2));
+ code_edit->fold_line(1);
+ CHECK_FALSE(code_edit->is_line_folded(1));
+ code_edit->fold_line(0);
+ CHECK(code_edit->is_line_folded(0));
+ CHECK(code_edit->get_next_visible_line_offset_from(1, 1) == 2);
// Has to be full line.
code_edit->set_text("test &line1\n\tline2&");
@@ -2554,7 +2578,7 @@ TEST_CASE("[SceneTree][CodeEdit] folding") {
CHECK_FALSE(code_edit->is_line_folded(1));
CHECK(code_edit->get_next_visible_line_offset_from(1, 1) == 1);
- // Non-indented comments/ strings.
+ // Non-indented comments/strings.
// Single line
code_edit->set_text("test\n\tline1\n#line1\n#line2\n\ttest");
CHECK(code_edit->can_fold_line(0));
@@ -2576,6 +2600,50 @@ TEST_CASE("[SceneTree][CodeEdit] folding") {
CHECK_FALSE(code_edit->is_line_folded(1));
CHECK(code_edit->get_next_visible_line_offset_from(1, 1) == 4);
+ // Indent level 0->1, comment after lines
+ code_edit->set_text("line1\n\tline2\n#test");
+ CHECK(code_edit->can_fold_line(0));
+ CHECK_FALSE(code_edit->can_fold_line(1));
+ code_edit->fold_line(1);
+ CHECK_FALSE(code_edit->is_line_folded(1));
+ code_edit->fold_line(0);
+ CHECK(code_edit->is_line_folded(0));
+ CHECK_FALSE(code_edit->is_line_folded(1));
+ CHECK(code_edit->get_next_visible_line_offset_from(1, 1) == 2);
+
+ // Indent level 0->1, comment between lines
+ code_edit->set_text("line1\n#test\n\tline2\nline3");
+ CHECK(code_edit->can_fold_line(0));
+ CHECK_FALSE(code_edit->can_fold_line(2));
+ code_edit->fold_line(2);
+ CHECK_FALSE(code_edit->is_line_folded(2));
+ code_edit->fold_line(0);
+ CHECK(code_edit->is_line_folded(0));
+ CHECK_FALSE(code_edit->is_line_folded(2));
+ CHECK(code_edit->get_next_visible_line_offset_from(1, 1) == 3);
+
+ // Indent level 1->2, comment after lines
+ code_edit->set_text("\tline1\n\t\tline2\n#test");
+ CHECK(code_edit->can_fold_line(0));
+ CHECK_FALSE(code_edit->can_fold_line(1));
+ code_edit->fold_line(1);
+ CHECK_FALSE(code_edit->is_line_folded(1));
+ code_edit->fold_line(0);
+ CHECK(code_edit->is_line_folded(0));
+ CHECK_FALSE(code_edit->is_line_folded(1));
+ CHECK(code_edit->get_next_visible_line_offset_from(1, 1) == 2);
+
+ // Indent level 1->2, comment between lines
+ code_edit->set_text("\tline1\n#test\n\t\tline2\nline3");
+ CHECK(code_edit->can_fold_line(0));
+ CHECK_FALSE(code_edit->can_fold_line(2));
+ code_edit->fold_line(2);
+ CHECK_FALSE(code_edit->is_line_folded(2));
+ code_edit->fold_line(0);
+ CHECK(code_edit->is_line_folded(0));
+ CHECK_FALSE(code_edit->is_line_folded(2));
+ CHECK(code_edit->get_next_visible_line_offset_from(1, 1) == 3);
+
// Multiline
code_edit->set_text("test\n\tline1\n&line1\nline2&\n\ttest");
CHECK(code_edit->can_fold_line(0));
@@ -3167,7 +3235,7 @@ TEST_CASE("[SceneTree][CodeEdit] Backspace delete") {
code_edit->insert_text_at_caret("line 1\nline 2\nline 3");
code_edit->select_all();
code_edit->backspace();
- CHECK(code_edit->get_text() == "");
+ CHECK(code_edit->get_text().is_empty());
/* Backspace at the beginning without selection has no effect. */
code_edit->set_text("");
diff --git a/tests/scene/test_curve.h b/tests/scene/test_curve.h
index 60eafad460..4ee1a1c15c 100644
--- a/tests/scene/test_curve.h
+++ b/tests/scene/test_curve.h
@@ -219,35 +219,33 @@ TEST_CASE("[Curve] Custom curve with linear tangents") {
TEST_CASE("[Curve2D] Linear sampling should return exact value") {
Ref<Curve2D> curve = memnew(Curve2D);
- int len = 2048;
+ real_t len = 2048.0;
curve->add_point(Vector2(0, 0));
- curve->add_point(Vector2((float)len, 0));
+ curve->add_point(Vector2(len, 0));
- float baked_length = curve->get_baked_length();
- CHECK((float)len == baked_length);
+ real_t baked_length = curve->get_baked_length();
+ CHECK(len == baked_length);
for (int i = 0; i < len; i++) {
- float expected = (float)i;
- Vector2 pos = curve->interpolate_baked(expected);
- CHECK_MESSAGE(pos.x == expected, "interpolate_baked should return exact value");
+ Vector2 pos = curve->interpolate_baked(i);
+ CHECK_MESSAGE(pos.x == i, "interpolate_baked should return exact value");
}
}
TEST_CASE("[Curve3D] Linear sampling should return exact value") {
Ref<Curve3D> curve = memnew(Curve3D);
- int len = 2048;
+ real_t len = 2048.0;
curve->add_point(Vector3(0, 0, 0));
- curve->add_point(Vector3((float)len, 0, 0));
+ curve->add_point(Vector3(len, 0, 0));
- float baked_length = curve->get_baked_length();
- CHECK((float)len == baked_length);
+ real_t baked_length = curve->get_baked_length();
+ CHECK(len == baked_length);
for (int i = 0; i < len; i++) {
- float expected = (float)i;
- Vector3 pos = curve->interpolate_baked(expected);
- CHECK_MESSAGE(pos.x == expected, "interpolate_baked should return exact value");
+ Vector3 pos = curve->interpolate_baked(i);
+ CHECK_MESSAGE(pos.x == i, "interpolate_baked should return exact value");
}
}
diff --git a/tests/scene/test_gui.cpp b/tests/scene/test_gui.cpp
index 5bd9390cb7..086943838c 100644
--- a/tests/scene/test_gui.cpp
+++ b/tests/scene/test_gui.cpp
@@ -69,7 +69,7 @@ public:
label->set_position(Point2(80, 90));
label->set_size(Point2(170, 80));
- label->set_align(Label::ALIGN_FILL);
+ label->set_horizontal_alignment(HORIZONTAL_ALIGNMENT_FILL);
label->set_text("There was once upon a time a beautiful unicorn that loved to play with little girls...");
frame->add_child(label);
diff --git a/tests/servers/test_shader_lang.cpp b/tests/servers/test_shader_lang.cpp
index 0591bf6adf..1f8f395e64 100644
--- a/tests/servers/test_shader_lang.cpp
+++ b/tests/servers/test_shader_lang.cpp
@@ -261,6 +261,8 @@ static String dump_node_code(SL::Node *p_node, int p_level) {
}
code += ")";
break;
+ case SL::OP_EMPTY:
+ break;
default: {
code = "(" + dump_node_code(onode->arguments[0], p_level) + _opstr(onode->op) + dump_node_code(onode->arguments[1], p_level) + ")";
break;
@@ -344,7 +346,12 @@ MainLoop *test() {
Set<String> types;
types.insert("spatial");
- Error err = sl.compile(code, dt, rm, ShaderLanguage::VaryingFunctionNames(), types, nullptr);
+ ShaderLanguage::ShaderCompileInfo info;
+ info.functions = dt;
+ info.render_modes = rm;
+ info.shader_types = types;
+
+ Error err = sl.compile(code, info);
if (err) {
print_line("Error at line: " + rtos(sl.get_error_line()) + ": " + sl.get_error_text());