{"id":14961393,"url":"https://github.com/godotengine/regression-test-project","last_synced_at":"2025-07-16T16:40:29.098Z","repository":{"id":39756924,"uuid":"285237084","full_name":"godotengine/regression-test-project","owner":"godotengine","description":"Godot engine regression test project","archived":false,"fork":false,"pushed_at":"2024-11-06T11:51:55.000Z","size":986,"stargazers_count":19,"open_issues_count":3,"forks_count":21,"subscribers_count":5,"default_branch":"3.x","last_synced_at":"2025-01-29T10:42:07.806Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"GDScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/godotengine.png","metadata":{"funding":{"patreon":"godotengine","custom":"https://godotengine.org/donate"},"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2020-08-05T09:07:51.000Z","updated_at":"2025-01-12T22:56:27.000Z","dependencies_parsed_at":"2024-01-07T09:34:24.230Z","dependency_job_id":null,"html_url":"https://github.com/godotengine/regression-test-project","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/godotengine%2Fregression-test-project","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/godotengine%2Fregression-test-project/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/godotengine%2Fregression-test-project/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/godotengine%2Fregression-test-project/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/godotengine","download_url":"https://codeload.github.com/godotengine/regression-test-project/tar.gz/refs/heads/3.x","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":237092263,"owners_count":19254181,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-09-24T13:24:59.475Z","updated_at":"2025-02-04T09:30:59.134Z","avatar_url":"https://github.com/godotengine.png","language":"GDScript","funding_links":["https://patreon.com/godotengine","https://godotengine.org/donate"],"categories":[],"sub_categories":[],"readme":"# Godot regression test project\nThis repository contains project which is used to find regressions in Godot.\n\nIt aims to check as much as possible functions and states, be easy in maintain and provide quite reproducible results.\n\n## Basic Informations\nThis project contains a few different scenes and `Start.tscn`(default one) which opens every other scene. \n\nList of this scenes are available in `Autoload.gd` file.\n\n![B](https://user-images.githubusercontent.com/41945903/104442905-060e7c00-5596-11eb-9000-f9bb338ece79.png)\n\nIt is possible manually set how long project need to be executed from command line, just by adding at the end number of seconds - `godot 40`.\n\nAt first `all_in_one` scenes opens, execute `_ready` function and exit. \n\nThe available time(default 25s) is divided equally between each scene in `alone_steps`.\n\nThen, one by one, each scene is created and after a certain amount of time it is deleted and another scene from the `alone_steps` takes its place.\n\nThis project is running in CI with a version of Godot compiled with Address and Undefined sanitizers(`scons use_asan=yes use_ubsan=yes`) so without these options it won't always be possible to detect the bug or get so detailed backtrace.\n\n## Searching for a malfunctioning scene\n### Logs\nWhen searching through the logs for the error you may come across something like this\n```\nChanged scene to res://Rendering/Lights2D/Lights2D.tscn\nTest is running now 35 seconds\nTest is running now 40 seconds\nChanged scene to res://Rendering/Lights3D/Lights3D.tscn\n##### CRASH #####\nGodot crashed with signal ...\n```\nThis log indicates 2 potentially broken scenes\n- `Lights3D.tscn` - crash occured because scene started work\n- `Lights2D.tscn` - crash occured because scene was removed\n### Autoload\nYou can freely comment out selected lines in `alone_steps` or `all_in_one` to choose which scenes will run `Start.tscn`.  \nYou can also use `time_to_show` variable to set time how long the project will run.  \n\n![Autoloads](https://user-images.githubusercontent.com/41945903/115044743-16582f00-9ed6-11eb-889f-4f07ad6c7d13.png)\n\n### File System\nThe last way is to manually run each scene from the file system to find the one malfunctioning.\n\n![File](https://user-images.githubusercontent.com/41945903/115044733-13f5d500-9ed6-11eb-9364-43a1a142a6f1.png)\n\n## \"Safe\" fuzzer\nA scene that will probably give people a hard time quite often is `FunctionExecutor.tscn`.  \nThis is a fuzzer, but with removed ability to use random argument values (the arguments are identical every time it is run).  \nWhen the engine crashes, in logs usually will be something like this:\n```\n#################### LineEdit ####################\n\nLineEdit._text_changed --- executing with 0 parameters []\nGDSCRIPT CODE:     LineEdit.new()._text_changed()\n\nLineEdit._toggle_draw_caret --- executing with 0 parameters []\nGDSCRIPT CODE:     LineEdit.new()._toggle_draw_caret()\n\nLineEdit.set_align --- executing with 1 parameters [100]\nGDSCRIPT CODE:     LineEdit.new().set_align(100)\nERROR: set_align: Index (int)p_align = 100 is out of bounds (4 = 4).\n   At: scene/gui/line_edit.cpp:592.\nscene/resources/line_edit.cpp:186:2: runtime error: member access within null pointer of type 'struct LineEdit'\nhandle_crash: Program crashed with signal 11\nDumping the backtrace. Please include this when reporting the bug on godotengine/godot/issues\n[1] bin/godot.linuxbsd.tools.64s() [0x1e697d8] (/home/runner/work/godot/godot/platform/linuxbsd/crash_handler_linuxbsd.cpp:54)\n[2] /lib/x86_64-linux-gnu/libc.so.6(+0x46210) [0x7fd1ca5b0210] (??:0)\n```\nThere are some interesting things to discuss here.  \nThis line shows what class we are testing now\n```\n#################### LineEdit ####################\n```\nwhich method\n```\nLineEdit.set_align\n```\nand which parameters\n```\n--- executing with 1 parameters [100]\n```\nNext you can see GDScript command which is executed and you can copy it and test manually in Godot\n```\nGDSCRIPT CODE:     LineEdit.new()._toggle_draw_caret()\n```\nThen you can see errors caused by invalid arguments, which you can ignore if they don't cause other crashes/leaks etc.\n```\nERROR: set_align: Index (int)p_align = 100 is out of bounds (4 = 4).\n   At: scene/gui/line_edit.cpp:592.\n```\nAt the end we can see Godot's crash log with additional information that tried to use null pointer incorrectly:\n```\nscene/resources/skeleton_modification_2d_physicalbones.cpp:186:2: runtime error: member access within null pointer of type 'struct SkeletonModificationStack2D'\nhandle_crash: Program crashed with signal 11\nDumping the backtrace. Please include this when reporting the bug on godotengine/godot/issues\n[1] bin/godot.linuxbsd.tools.64s() [0x1e697d8] (/home/runner/work/godot/godot/platform/linuxbsd/crash_handler_linuxbsd.cpp:54)\n[2] /lib/x86_64-linux-gnu/libc.so.6(+0x46210) [0x7fd1ca5b0210] (??:0)\n```\nIn most situations, the latest executed function/created object is responsible for crash\n```\nLineEdit.set_align --- executing with 1 parameters [100]\nGDSCRIPT CODE:     LineEdit.new().set_align(100)\n```\nSo we can just take GDScript code from above, copy it into Godot and test project, which should crash engine\n```\nLineEdit.new().set_align(100)\n```\n\n## Nodes\nScene simply adds and removes at once all available nodes.   \nIt is used to catch early very obvious and easy to reproduce bugs.\n\n## ReparentingDeleting\nThis is more advanced variation of Nodes scene.  \nIn random order adds, remove and move in scene tree nodes. It may not sound spectacular, but it sometimes allows you to find bugs that are hard to detect.\n\n## CreatingAllThings\nThis scene creates, prints and removes object.  \nCan be used to quicly check if classes don't crash when executing simple commands on them.  \n\n## Others\nScenes like `Physics2D.tscn` or `Lights3D.tscn` are normal scenes with specific types of nodes. They are only used to manually check visual differences between different Godot versions.\n\n![Physics](https://user-images.githubusercontent.com/41945903/115050994-9da8a100-9edc-11eb-99f6-9375ef917be1.png)\n\n## Epilepsy Warning\nDue using by project a lot of functions from each type of Node, screen may flicker, images and objects may change randomly color and size which may lead some users to health problems.\n\n## Problems with project\nThe project should not cause too many problems in CI when adding and removing features in Godot, since it don't uses too much functions but for example removing a base type e.g. `TYPE_INT` or changes in GDScript(e.g. changing `instance` to `instantiate`) can mess it up.\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgodotengine%2Fregression-test-project","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgodotengine%2Fregression-test-project","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgodotengine%2Fregression-test-project/lists"}