Path: blob/master/tests/core/config/test_project_settings.cpp
45997 views
/**************************************************************************/1/* test_project_settings.cpp */2/**************************************************************************/3/* This file is part of: */4/* GODOT ENGINE */5/* https://godotengine.org */6/**************************************************************************/7/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */8/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */9/* */10/* Permission is hereby granted, free of charge, to any person obtaining */11/* a copy of this software and associated documentation files (the */12/* "Software"), to deal in the Software without restriction, including */13/* without limitation the rights to use, copy, modify, merge, publish, */14/* distribute, sublicense, and/or sell copies of the Software, and to */15/* permit persons to whom the Software is furnished to do so, subject to */16/* the following conditions: */17/* */18/* The above copyright notice and this permission notice shall be */19/* included in all copies or substantial portions of the Software. */20/* */21/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */22/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */23/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */24/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */25/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */26/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */27/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */28/**************************************************************************/2930#include "tests/test_macros.h"3132TEST_FORCE_LINK(test_project_settings)3334#include "core/config/project_settings.h"35#include "core/io/dir_access.h"36#include "core/object/message_queue.h"37#include "core/variant/variant.h"38#include "tests/signal_watcher.h"39#include "tests/test_utils.h"4041namespace TestProjectSettings {4243TEST_CASE("[ProjectSettings] Get existing setting") {44CHECK(ProjectSettings::get_singleton()->has_setting("application/run/main_scene"));4546Variant variant = ProjectSettings::get_singleton()->get_setting("application/run/main_scene");47CHECK_EQ(variant.get_type(), Variant::STRING);4849String name = variant;50CHECK_EQ(name, String());51}5253TEST_CASE("[ProjectSettings] Default value is ignored if setting exists") {54CHECK(ProjectSettings::get_singleton()->has_setting("application/run/main_scene"));5556Variant variant = ProjectSettings::get_singleton()->get_setting("application/run/main_scene", "SomeDefaultValue");57CHECK_EQ(variant.get_type(), Variant::STRING);5859String name = variant;60CHECK_EQ(name, String());61}6263TEST_CASE("[ProjectSettings] Non existing setting is null") {64CHECK_FALSE(ProjectSettings::get_singleton()->has_setting("not_existing_setting"));6566Variant variant = ProjectSettings::get_singleton()->get_setting("not_existing_setting");67CHECK_EQ(variant.get_type(), Variant::NIL);68}6970TEST_CASE("[ProjectSettings] Non existing setting should return default value") {71CHECK_FALSE(ProjectSettings::get_singleton()->has_setting("not_existing_setting"));7273Variant variant = ProjectSettings::get_singleton()->get_setting("not_existing_setting");74CHECK_EQ(variant.get_type(), Variant::NIL);7576variant = ProjectSettings::get_singleton()->get_setting("not_existing_setting", "my_nice_default_value");77CHECK_EQ(variant.get_type(), Variant::STRING);7879String name = variant;80CHECK_EQ(name, "my_nice_default_value");8182CHECK_FALSE(ProjectSettings::get_singleton()->has_setting("not_existing_setting"));83}8485TEST_CASE("[ProjectSettings] Set value should be returned when retrieved") {86CHECK_FALSE(ProjectSettings::get_singleton()->has_setting("my_custom_setting"));8788Variant variant = ProjectSettings::get_singleton()->get_setting("my_custom_setting");89CHECK_EQ(variant.get_type(), Variant::NIL);9091ProjectSettings::get_singleton()->set_setting("my_custom_setting", true);92CHECK(ProjectSettings::get_singleton()->has_setting("my_custom_setting"));9394variant = ProjectSettings::get_singleton()->get_setting("my_custom_setting");95CHECK_EQ(variant.get_type(), Variant::BOOL);9697bool value = variant;98CHECK_EQ(true, value);99100CHECK(ProjectSettings::get_singleton()->has_setting("my_custom_setting"));101}102103TEST_CASE("[ProjectSettings] localize_path") {104String old_resource_path = TestProjectSettingsInternalsAccessor::resource_path();105TestProjectSettingsInternalsAccessor::resource_path() = DirAccess::create(DirAccess::ACCESS_FILESYSTEM)->get_current_dir();106String root_path = ProjectSettings::get_singleton()->get_resource_path();107#ifdef WINDOWS_ENABLED108String root_path_win = ProjectSettings::get_singleton()->get_resource_path().replace_char('/', '\\');109#endif110111CHECK_EQ(ProjectSettings::get_singleton()->localize_path("filename"), "res://filename");112CHECK_EQ(ProjectSettings::get_singleton()->localize_path("path/filename"), "res://path/filename");113CHECK_EQ(ProjectSettings::get_singleton()->localize_path("path/something/../filename"), "res://path/filename");114CHECK_EQ(ProjectSettings::get_singleton()->localize_path("path/./filename"), "res://path/filename");115#ifdef WINDOWS_ENABLED116CHECK_EQ(ProjectSettings::get_singleton()->localize_path("path\\filename"), "res://path/filename");117CHECK_EQ(ProjectSettings::get_singleton()->localize_path("path\\something\\..\\filename"), "res://path/filename");118CHECK_EQ(ProjectSettings::get_singleton()->localize_path("path\\.\\filename"), "res://path/filename");119#endif120121CHECK_EQ(ProjectSettings::get_singleton()->localize_path("../filename"), "../filename");122CHECK_EQ(ProjectSettings::get_singleton()->localize_path("../path/filename"), "../path/filename");123CHECK_EQ(ProjectSettings::get_singleton()->localize_path("..\\path\\filename"), "../path/filename");124125CHECK_EQ(ProjectSettings::get_singleton()->localize_path("/testroot/filename"), "/testroot/filename");126CHECK_EQ(ProjectSettings::get_singleton()->localize_path("/testroot/path/filename"), "/testroot/path/filename");127CHECK_EQ(ProjectSettings::get_singleton()->localize_path("/testroot/path/something/../filename"), "/testroot/path/filename");128CHECK_EQ(ProjectSettings::get_singleton()->localize_path("/testroot/path/./filename"), "/testroot/path/filename");129#ifdef WINDOWS_ENABLED130CHECK_EQ(ProjectSettings::get_singleton()->localize_path("C:/testroot/filename"), "C:/testroot/filename");131CHECK_EQ(ProjectSettings::get_singleton()->localize_path("C:/testroot/path/filename"), "C:/testroot/path/filename");132CHECK_EQ(ProjectSettings::get_singleton()->localize_path("C:/testroot/path/something/../filename"), "C:/testroot/path/filename");133CHECK_EQ(ProjectSettings::get_singleton()->localize_path("C:/testroot/path/./filename"), "C:/testroot/path/filename");134CHECK_EQ(ProjectSettings::get_singleton()->localize_path("C:\\testroot\\filename"), "C:/testroot/filename");135CHECK_EQ(ProjectSettings::get_singleton()->localize_path("C:\\testroot\\path\\filename"), "C:/testroot/path/filename");136CHECK_EQ(ProjectSettings::get_singleton()->localize_path("C:\\testroot\\path\\something\\..\\filename"), "C:/testroot/path/filename");137CHECK_EQ(ProjectSettings::get_singleton()->localize_path("C:\\testroot\\path\\.\\filename"), "C:/testroot/path/filename");138#endif139140CHECK_EQ(ProjectSettings::get_singleton()->localize_path(root_path + "/filename"), "res://filename");141CHECK_EQ(ProjectSettings::get_singleton()->localize_path(root_path + "/path/filename"), "res://path/filename");142CHECK_EQ(ProjectSettings::get_singleton()->localize_path(root_path + "/path/something/../filename"), "res://path/filename");143CHECK_EQ(ProjectSettings::get_singleton()->localize_path(root_path + "/path/./filename"), "res://path/filename");144#ifdef WINDOWS_ENABLED145CHECK_EQ(ProjectSettings::get_singleton()->localize_path(root_path_win + "\\filename"), "res://filename");146CHECK_EQ(ProjectSettings::get_singleton()->localize_path(root_path_win + "\\path\\filename"), "res://path/filename");147CHECK_EQ(ProjectSettings::get_singleton()->localize_path(root_path_win + "\\path\\something\\..\\filename"), "res://path/filename");148CHECK_EQ(ProjectSettings::get_singleton()->localize_path(root_path_win + "\\path\\.\\filename"), "res://path/filename");149#endif150151TestProjectSettingsInternalsAccessor::resource_path() = old_resource_path;152}153154TEST_CASE("[SceneTree][ProjectSettings] settings_changed signal") {155SIGNAL_WATCH(ProjectSettings::get_singleton(), SNAME("settings_changed"));156157ProjectSettings::get_singleton()->set_setting("test_signal_setting", "test_value");158MessageQueue::get_singleton()->flush();159160SIGNAL_CHECK("settings_changed", { {} });161162SIGNAL_UNWATCH(ProjectSettings::get_singleton(), SNAME("settings_changed"));163}164165TEST_CASE("[ProjectSettings] get_changed_settings basic functionality") {166String setting_name = "test_changed_setting";167ProjectSettings::get_singleton()->set_setting(setting_name, "test_value");168169PackedStringArray changes = ProjectSettings::get_singleton()->get_changed_settings();170CHECK(changes.has(setting_name));171}172173TEST_CASE("[ProjectSettings] get_changed_settings multiple settings") {174ProjectSettings::get_singleton()->set_setting("test_setting_1", "value1");175ProjectSettings::get_singleton()->set_setting("test_setting_2", "value2");176ProjectSettings::get_singleton()->set_setting("another_group/setting", "value3");177178PackedStringArray changes = ProjectSettings::get_singleton()->get_changed_settings();179CHECK(changes.has("test_setting_1"));180CHECK(changes.has("test_setting_2"));181CHECK(changes.has("another_group/setting"));182}183184TEST_CASE("[ProjectSettings] check_changed_settings_in_group") {185ProjectSettings::get_singleton()->set_setting("group1/setting1", "value1");186ProjectSettings::get_singleton()->set_setting("group1/setting2", "value2");187ProjectSettings::get_singleton()->set_setting("group2/setting1", "value3");188ProjectSettings::get_singleton()->set_setting("other_setting", "value4");189190CHECK(ProjectSettings::get_singleton()->check_changed_settings_in_group("group1/"));191CHECK(ProjectSettings::get_singleton()->check_changed_settings_in_group("group2/"));192CHECK_FALSE(ProjectSettings::get_singleton()->check_changed_settings_in_group("nonexistent/"));193194CHECK(ProjectSettings::get_singleton()->check_changed_settings_in_group("group1"));195CHECK(ProjectSettings::get_singleton()->check_changed_settings_in_group("other_setting"));196}197198TEST_CASE("[SceneTree][ProjectSettings] Changes cleared after settings_changed signal") {199SIGNAL_WATCH(ProjectSettings::get_singleton(), SNAME("settings_changed"));200201ProjectSettings::get_singleton()->set_setting("signal_clear_test", "value");202203PackedStringArray changes_before = ProjectSettings::get_singleton()->get_changed_settings();204CHECK(changes_before.has("signal_clear_test"));205206MessageQueue::get_singleton()->flush();207208SIGNAL_CHECK("settings_changed", { {} });209210PackedStringArray changes_after = ProjectSettings::get_singleton()->get_changed_settings();211CHECK_FALSE(changes_after.has("signal_clear_test"));212213SIGNAL_UNWATCH(ProjectSettings::get_singleton(), SNAME("settings_changed"));214}215216TEST_CASE("[ProjectSettings] No tracking when setting same value") {217String setting_name = "same_value_test";218String test_value = "same_value";219220ProjectSettings::get_singleton()->set_setting(setting_name, test_value);221int count_before = ProjectSettings::get_singleton()->get_changed_settings().size();222223// Setting the same value should not be tracked due to early return.224ProjectSettings::get_singleton()->set_setting(setting_name, test_value);225int count_after = ProjectSettings::get_singleton()->get_changed_settings().size();226227CHECK_EQ(count_before, count_after);228}229230} // namespace TestProjectSettings231232233