From 5f77f38573a8127e50946169e01b5ee09cfc1c96 Mon Sep 17 00:00:00 2001 From: George Marques Date: Wed, 7 Apr 2021 10:12:51 -0300 Subject: Add runner for GDScript testing This is meant for testing the GDScript implementation, not for testing user scripts nor testing the engine using scripts. Tests consists in a GDScript file and a .out file with the expected output. The .out file format is: expected status (based on the enum GDScriptTest::TestStatus) on the first line, followed by either an error message or the resulting output. Warnings are added after the first line, before the output (or compiler errors) if the parser pass without any error. The test script must have a function called `test()` which takes no argument. Such function will be called by the test runner. The test should not have any dependency unless it's part of the test too. Global classes (using `class_name`) are registered before the runner starts, so those should work if needed. Use the command `godot --gdscript-generate-tests godot-source/modules/gdscript/tests/scripts` to update the .out files with the current output (make sure the output are the expected values before committing). The tests themselves are part of the doctest suite so those can be executed with `godot --test`. Co-authored-by: Andrii Doroshenko (Xrayez) --- modules/gdscript/tests/scripts/.gitignore | 2 ++ .../gdscript/tests/scripts/parser-errors/missing-argument.gd | 6 ++++++ .../tests/scripts/parser-errors/missing-argument.out | 2 ++ .../scripts/parser-errors/missing-closing-expr-paren.gd | 2 ++ .../scripts/parser-errors/missing-closing-expr-paren.out | 2 ++ .../gdscript/tests/scripts/parser-errors/missing-colon.gd | 3 +++ .../gdscript/tests/scripts/parser-errors/missing-colon.out | 2 ++ .../tests/scripts/parser-errors/missing-paren-after-args.gd | 6 ++++++ .../tests/scripts/parser-errors/missing-paren-after-args.out | 2 ++ .../tests/scripts/parser-errors/mixing-tabs-spaces.gd | 3 +++ .../tests/scripts/parser-errors/mixing-tabs-spaces.out | 2 ++ .../tests/scripts/parser-errors/nothing-after-dollar.gd | 3 +++ .../tests/scripts/parser-errors/nothing-after-dollar.out | 2 ++ .../scripts/parser-errors/wrong-value-after-dollar-slash.gd | 3 +++ .../scripts/parser-errors/wrong-value-after-dollar-slash.out | 2 ++ .../tests/scripts/parser-errors/wrong-value-after-dollar.gd | 3 +++ .../tests/scripts/parser-errors/wrong-value-after-dollar.out | 2 ++ .../scripts/parser-features/semicolon-as-end-statement.gd | 2 ++ .../scripts/parser-features/semicolon-as-end-statement.out | 3 +++ .../parser-features/trailing-comma-in-function-args.gd | 7 +++++++ .../parser-features/trailing-comma-in-function-args.out | 2 ++ .../tests/scripts/parser-features/variable-declaration.gd | 12 ++++++++++++ .../tests/scripts/parser-features/variable-declaration.out | 7 +++++++ .../tests/scripts/parser-warnings/unused-variable.gd | 2 ++ .../tests/scripts/parser-warnings/unused-variable.out | 5 +++++ modules/gdscript/tests/scripts/project.godot | 10 ++++++++++ 26 files changed, 97 insertions(+) create mode 100644 modules/gdscript/tests/scripts/.gitignore create mode 100644 modules/gdscript/tests/scripts/parser-errors/missing-argument.gd create mode 100644 modules/gdscript/tests/scripts/parser-errors/missing-argument.out create mode 100644 modules/gdscript/tests/scripts/parser-errors/missing-closing-expr-paren.gd create mode 100644 modules/gdscript/tests/scripts/parser-errors/missing-closing-expr-paren.out create mode 100644 modules/gdscript/tests/scripts/parser-errors/missing-colon.gd create mode 100644 modules/gdscript/tests/scripts/parser-errors/missing-colon.out create mode 100644 modules/gdscript/tests/scripts/parser-errors/missing-paren-after-args.gd create mode 100644 modules/gdscript/tests/scripts/parser-errors/missing-paren-after-args.out create mode 100644 modules/gdscript/tests/scripts/parser-errors/mixing-tabs-spaces.gd create mode 100644 modules/gdscript/tests/scripts/parser-errors/mixing-tabs-spaces.out create mode 100644 modules/gdscript/tests/scripts/parser-errors/nothing-after-dollar.gd create mode 100644 modules/gdscript/tests/scripts/parser-errors/nothing-after-dollar.out create mode 100644 modules/gdscript/tests/scripts/parser-errors/wrong-value-after-dollar-slash.gd create mode 100644 modules/gdscript/tests/scripts/parser-errors/wrong-value-after-dollar-slash.out create mode 100644 modules/gdscript/tests/scripts/parser-errors/wrong-value-after-dollar.gd create mode 100644 modules/gdscript/tests/scripts/parser-errors/wrong-value-after-dollar.out create mode 100644 modules/gdscript/tests/scripts/parser-features/semicolon-as-end-statement.gd create mode 100644 modules/gdscript/tests/scripts/parser-features/semicolon-as-end-statement.out create mode 100644 modules/gdscript/tests/scripts/parser-features/trailing-comma-in-function-args.gd create mode 100644 modules/gdscript/tests/scripts/parser-features/trailing-comma-in-function-args.out create mode 100644 modules/gdscript/tests/scripts/parser-features/variable-declaration.gd create mode 100644 modules/gdscript/tests/scripts/parser-features/variable-declaration.out create mode 100644 modules/gdscript/tests/scripts/parser-warnings/unused-variable.gd create mode 100644 modules/gdscript/tests/scripts/parser-warnings/unused-variable.out create mode 100644 modules/gdscript/tests/scripts/project.godot (limited to 'modules/gdscript/tests/scripts') diff --git a/modules/gdscript/tests/scripts/.gitignore b/modules/gdscript/tests/scripts/.gitignore new file mode 100644 index 0000000000..94c5b1bf6b --- /dev/null +++ b/modules/gdscript/tests/scripts/.gitignore @@ -0,0 +1,2 @@ +# Ignore metadata if someone open this on Godot. +/.godot diff --git a/modules/gdscript/tests/scripts/parser-errors/missing-argument.gd b/modules/gdscript/tests/scripts/parser-errors/missing-argument.gd new file mode 100644 index 0000000000..c56ad94095 --- /dev/null +++ b/modules/gdscript/tests/scripts/parser-errors/missing-argument.gd @@ -0,0 +1,6 @@ +func args(a, b): + print(a) + print(b) + +func test(): + args(1,) diff --git a/modules/gdscript/tests/scripts/parser-errors/missing-argument.out b/modules/gdscript/tests/scripts/parser-errors/missing-argument.out new file mode 100644 index 0000000000..fc2a891109 --- /dev/null +++ b/modules/gdscript/tests/scripts/parser-errors/missing-argument.out @@ -0,0 +1,2 @@ +GDTEST_ANALYZER_ERROR +Too few arguments for "args()" call. Expected at least 2 but received 1. diff --git a/modules/gdscript/tests/scripts/parser-errors/missing-closing-expr-paren.gd b/modules/gdscript/tests/scripts/parser-errors/missing-closing-expr-paren.gd new file mode 100644 index 0000000000..a1077e1985 --- /dev/null +++ b/modules/gdscript/tests/scripts/parser-errors/missing-closing-expr-paren.gd @@ -0,0 +1,2 @@ +func test(): + var a = ("missing paren ->" diff --git a/modules/gdscript/tests/scripts/parser-errors/missing-closing-expr-paren.out b/modules/gdscript/tests/scripts/parser-errors/missing-closing-expr-paren.out new file mode 100644 index 0000000000..7326afa33d --- /dev/null +++ b/modules/gdscript/tests/scripts/parser-errors/missing-closing-expr-paren.out @@ -0,0 +1,2 @@ +GDTEST_PARSER_ERROR +Expected closing ")" after grouping expression. diff --git a/modules/gdscript/tests/scripts/parser-errors/missing-colon.gd b/modules/gdscript/tests/scripts/parser-errors/missing-colon.gd new file mode 100644 index 0000000000..62cb633e9e --- /dev/null +++ b/modules/gdscript/tests/scripts/parser-errors/missing-colon.gd @@ -0,0 +1,3 @@ +func test(): + if true # Missing colon here. + print("true") diff --git a/modules/gdscript/tests/scripts/parser-errors/missing-colon.out b/modules/gdscript/tests/scripts/parser-errors/missing-colon.out new file mode 100644 index 0000000000..687b963bc8 --- /dev/null +++ b/modules/gdscript/tests/scripts/parser-errors/missing-colon.out @@ -0,0 +1,2 @@ +GDTEST_PARSER_ERROR +Expected ":" after "if" condition. diff --git a/modules/gdscript/tests/scripts/parser-errors/missing-paren-after-args.gd b/modules/gdscript/tests/scripts/parser-errors/missing-paren-after-args.gd new file mode 100644 index 0000000000..116b0151da --- /dev/null +++ b/modules/gdscript/tests/scripts/parser-errors/missing-paren-after-args.gd @@ -0,0 +1,6 @@ +func args(a, b): + print(a) + print(b) + +func test(): + args(1,2 diff --git a/modules/gdscript/tests/scripts/parser-errors/missing-paren-after-args.out b/modules/gdscript/tests/scripts/parser-errors/missing-paren-after-args.out new file mode 100644 index 0000000000..34ea7ac323 --- /dev/null +++ b/modules/gdscript/tests/scripts/parser-errors/missing-paren-after-args.out @@ -0,0 +1,2 @@ +GDTEST_PARSER_ERROR +Expected closing ")" after call arguments. diff --git a/modules/gdscript/tests/scripts/parser-errors/mixing-tabs-spaces.gd b/modules/gdscript/tests/scripts/parser-errors/mixing-tabs-spaces.gd new file mode 100644 index 0000000000..9ad77f1432 --- /dev/null +++ b/modules/gdscript/tests/scripts/parser-errors/mixing-tabs-spaces.gd @@ -0,0 +1,3 @@ +func test(): + print("Using spaces") + print("Using tabs") diff --git a/modules/gdscript/tests/scripts/parser-errors/mixing-tabs-spaces.out b/modules/gdscript/tests/scripts/parser-errors/mixing-tabs-spaces.out new file mode 100644 index 0000000000..6390de9788 --- /dev/null +++ b/modules/gdscript/tests/scripts/parser-errors/mixing-tabs-spaces.out @@ -0,0 +1,2 @@ +GDTEST_PARSER_ERROR +Used "\t" for indentation instead " " as used before in the file. diff --git a/modules/gdscript/tests/scripts/parser-errors/nothing-after-dollar.gd b/modules/gdscript/tests/scripts/parser-errors/nothing-after-dollar.gd new file mode 100644 index 0000000000..3875ce3936 --- /dev/null +++ b/modules/gdscript/tests/scripts/parser-errors/nothing-after-dollar.gd @@ -0,0 +1,3 @@ +extends Node +func test(): + var a = $ # Expected some node path. diff --git a/modules/gdscript/tests/scripts/parser-errors/nothing-after-dollar.out b/modules/gdscript/tests/scripts/parser-errors/nothing-after-dollar.out new file mode 100644 index 0000000000..b3dc181a22 --- /dev/null +++ b/modules/gdscript/tests/scripts/parser-errors/nothing-after-dollar.out @@ -0,0 +1,2 @@ +GDTEST_PARSER_ERROR +Expect node path as string or identifier after "$". diff --git a/modules/gdscript/tests/scripts/parser-errors/wrong-value-after-dollar-slash.gd b/modules/gdscript/tests/scripts/parser-errors/wrong-value-after-dollar-slash.gd new file mode 100644 index 0000000000..1836d42226 --- /dev/null +++ b/modules/gdscript/tests/scripts/parser-errors/wrong-value-after-dollar-slash.gd @@ -0,0 +1,3 @@ +extends Node +func test(): + $MyNode/23 # Can't use number here. diff --git a/modules/gdscript/tests/scripts/parser-errors/wrong-value-after-dollar-slash.out b/modules/gdscript/tests/scripts/parser-errors/wrong-value-after-dollar-slash.out new file mode 100644 index 0000000000..dcb4ccecb0 --- /dev/null +++ b/modules/gdscript/tests/scripts/parser-errors/wrong-value-after-dollar-slash.out @@ -0,0 +1,2 @@ +GDTEST_PARSER_ERROR +Expect node path after "/". diff --git a/modules/gdscript/tests/scripts/parser-errors/wrong-value-after-dollar.gd b/modules/gdscript/tests/scripts/parser-errors/wrong-value-after-dollar.gd new file mode 100644 index 0000000000..6fd2692d47 --- /dev/null +++ b/modules/gdscript/tests/scripts/parser-errors/wrong-value-after-dollar.gd @@ -0,0 +1,3 @@ +extends Node +func test(): + $23 # Can't use number here. diff --git a/modules/gdscript/tests/scripts/parser-errors/wrong-value-after-dollar.out b/modules/gdscript/tests/scripts/parser-errors/wrong-value-after-dollar.out new file mode 100644 index 0000000000..b3dc181a22 --- /dev/null +++ b/modules/gdscript/tests/scripts/parser-errors/wrong-value-after-dollar.out @@ -0,0 +1,2 @@ +GDTEST_PARSER_ERROR +Expect node path as string or identifier after "$". diff --git a/modules/gdscript/tests/scripts/parser-features/semicolon-as-end-statement.gd b/modules/gdscript/tests/scripts/parser-features/semicolon-as-end-statement.gd new file mode 100644 index 0000000000..08f2eedb2d --- /dev/null +++ b/modules/gdscript/tests/scripts/parser-features/semicolon-as-end-statement.gd @@ -0,0 +1,2 @@ +func test(): + print("A"); print("B") diff --git a/modules/gdscript/tests/scripts/parser-features/semicolon-as-end-statement.out b/modules/gdscript/tests/scripts/parser-features/semicolon-as-end-statement.out new file mode 100644 index 0000000000..fc03f3efe8 --- /dev/null +++ b/modules/gdscript/tests/scripts/parser-features/semicolon-as-end-statement.out @@ -0,0 +1,3 @@ +GDTEST_OK +A +B diff --git a/modules/gdscript/tests/scripts/parser-features/trailing-comma-in-function-args.gd b/modules/gdscript/tests/scripts/parser-features/trailing-comma-in-function-args.gd new file mode 100644 index 0000000000..6097b11b10 --- /dev/null +++ b/modules/gdscript/tests/scripts/parser-features/trailing-comma-in-function-args.gd @@ -0,0 +1,7 @@ +# See https://github.com/godotengine/godot/issues/41066. + +func f(p, ): ## <-- no errors + print(p) + +func test(): + f(0, ) ## <-- no error diff --git a/modules/gdscript/tests/scripts/parser-features/trailing-comma-in-function-args.out b/modules/gdscript/tests/scripts/parser-features/trailing-comma-in-function-args.out new file mode 100644 index 0000000000..94e2ec2af8 --- /dev/null +++ b/modules/gdscript/tests/scripts/parser-features/trailing-comma-in-function-args.out @@ -0,0 +1,2 @@ +GDTEST_OK +0 diff --git a/modules/gdscript/tests/scripts/parser-features/variable-declaration.gd b/modules/gdscript/tests/scripts/parser-features/variable-declaration.gd new file mode 100644 index 0000000000..3b48f10ca7 --- /dev/null +++ b/modules/gdscript/tests/scripts/parser-features/variable-declaration.gd @@ -0,0 +1,12 @@ +var a # No init. +var b = 42 # Init. + +func test(): + var c # No init, local. + var d = 23 # Init, local. + + a = 1 + c = 2 + + prints(a, b, c, d) + print("OK") diff --git a/modules/gdscript/tests/scripts/parser-features/variable-declaration.out b/modules/gdscript/tests/scripts/parser-features/variable-declaration.out new file mode 100644 index 0000000000..2e0a63c024 --- /dev/null +++ b/modules/gdscript/tests/scripts/parser-features/variable-declaration.out @@ -0,0 +1,7 @@ +GDTEST_OK +>> WARNING +>> Line: 5 +>> UNASSIGNED_VARIABLE +>> The variable 'c' was used but never assigned a value. +1 42 2 23 +OK diff --git a/modules/gdscript/tests/scripts/parser-warnings/unused-variable.gd b/modules/gdscript/tests/scripts/parser-warnings/unused-variable.gd new file mode 100644 index 0000000000..68e3bd424f --- /dev/null +++ b/modules/gdscript/tests/scripts/parser-warnings/unused-variable.gd @@ -0,0 +1,2 @@ +func test(): + var unused = "not used" diff --git a/modules/gdscript/tests/scripts/parser-warnings/unused-variable.out b/modules/gdscript/tests/scripts/parser-warnings/unused-variable.out new file mode 100644 index 0000000000..270e0e69c0 --- /dev/null +++ b/modules/gdscript/tests/scripts/parser-warnings/unused-variable.out @@ -0,0 +1,5 @@ +GDTEST_OK +>> WARNING +>> Line: 2 +>> UNUSED_VARIABLE +>> The local variable 'unused' is declared but never used in the block. If this is intended, prefix it with an underscore: '_unused' diff --git a/modules/gdscript/tests/scripts/project.godot b/modules/gdscript/tests/scripts/project.godot new file mode 100644 index 0000000000..25b49c0abd --- /dev/null +++ b/modules/gdscript/tests/scripts/project.godot @@ -0,0 +1,10 @@ +; This is not an actual project. +; This config only exists to properly set up the test environment. +; It also helps for opening Godot to edit the scripts, but please don't +; let the editor changes be saved. + +config_version=4 + +[application] + +config/name="GDScript Integration Test Suite" -- cgit v1.2.3