From feffbfe374198bcee74fb0cedffa59ec7a7d5427 Mon Sep 17 00:00:00 2001 From: Alex <47497501+AlexDarigan@users.noreply.github.com> Date: Wed, 1 Sep 2021 11:57:02 +0100 Subject: [PATCH] Remove Everything Else --- .circleci/config.yml | 20 - .github/workflows/tests332.yml | 26 - .idea/.idea.WAT5/.idea/.name | 1 - .idea/.idea.WAT5/.idea/indexLayout.xml | 8 - .../.idea/projectSettingsUpdater.xml | 6 - .idea/.idea.WAT5/.idea/vcs.xml | 6 - .idea/.idea.WAT5/.idea/workspace.xml | 194 -------- Examples/doubles/calculator.gd | 11 - Examples/doubles/enemy.gd | 5 - Examples/doubles/hero.gd | 12 - Examples/doubles/my_class.gd | 15 - Examples/doubles/scenes/Main.tscn | 16 - Examples/doubles/scenes/grandchild_a.gd | 4 - Examples/doubles/scenes/main.gd | 2 - LICENSE | 21 - OldExamples/Bootstrap/Empty/placeholder.gd | 6 - OldExamples/Bootstrap/empty_test.gd | 1 - OldExamples/Bootstrap/failing_test.gd | 20 - .../Bootstrap/one_test_method_no_asserts.gd | 5 - OldExamples/Bootstrap/passing_test.gd | 20 - OldExamples/Control.gd | 8 - OldExamples/Control.tscn | 11 - OldExamples/Node.gd | 1 - OldExamples/Node.tscn | 6 - OldExamples/Node2D.tscn | 6 - OldExamples/Scene/A.gd | 5 - OldExamples/Scene/B.gd | 2 - OldExamples/Scene/C.gd | 4 - OldExamples/Scene/D.gd | 4 - OldExamples/Scene/Main.gd | 7 - OldExamples/Scene/Main.tscn | 23 - OldExamples/Scene/NoScriptScene.gd | 16 - OldExamples/Scene/NoScriptScene.tscn | 10 - OldExamples/Scripts/ABC.gd | 15 - OldExamples/Scripts/base_login.gd | 5 - OldExamples/Scripts/body.gd | 3 - OldExamples/Scripts/calculator.gd | 41 -- OldExamples/Scripts/library.gd | 19 - OldExamples/Scripts/login.gd | 16 - OldExamples/Scripts/new_script.gd | 6 - OldExamples/Scripts/user.gd | 6 - OldExamples/Test.tscn | 8 - OldExamples/Testx.gd | 4 - README.md | 210 -------- WAT5.csproj | 123 ----- WAT5.sln | 19 - changelist.md | 251 ---------- icon.svg | 72 --- icon.svg.import | 34 -- images/gui.png | Bin 46456 -> 0 bytes images/gui.png.import | 34 -- project.godot | 90 ---- tests/bootstrap/async/watcher.test.gd | 61 --- tests/bootstrap/async/yield.test.gd | 107 ----- .../integration/default_args.test.gd | 14 - tests/bootstrap/integration/double.test.gd | 180 ------- tests/bootstrap/integration/on_floor.test.gd | 32 -- .../bootstrap/integration/property_member.gd | 19 - tests/bootstrap/integration/resourcex.test.gd | 23 - .../integration/scene_director.test.gd | 46 -- .../integration/script_director.test.gd | 39 -- tests/bootstrap/metadata.json | 19 - tests/bootstrap/mono/AttributeTest.cs | 41 -- tests/bootstrap/mono/AttributeYieldTest.cs | 47 -- tests/bootstrap/mono/BasicCSharpTest.cs | 17 - tests/bootstrap/mono/BooleanTest.cs | 20 - tests/bootstrap/mono/ExceptionTests.cs | 44 -- tests/bootstrap/mono/IsInstanceTest.cs | 129 ----- tests/bootstrap/mono/IsNotInstanceTest.cs | 122 ----- tests/bootstrap/mono/MyTest.cs | 11 - tests/bootstrap/mono/NullChecksTest.cs | 19 - tests/bootstrap/mono/ObjectTest.cs | 132 ----- tests/bootstrap/mono/RangeTest.cs | 24 - tests/bootstrap/mono/RepeatTests.cs | 31 -- tests/bootstrap/mono/SimpleTest.cs | 11 - tests/bootstrap/mono/StringTest.cs | 57 --- tests/bootstrap/mono/UntilEvent.cs | 95 ---- tests/bootstrap/mono/WatcherTest.cs | 72 --- tests/bootstrap/mono/YieldTest.cs | 125 ----- tests/bootstrap/results.xml | 11 - tests/bootstrap/small/boolean.test.gd | 27 -- tests/bootstrap/unit/assert_that.test.gd | 12 - tests/bootstrap/unit/equality.test.gd | 39 -- tests/bootstrap/unit/file.test.gd | 19 - tests/bootstrap/unit/has.test.gd | 27 -- tests/bootstrap/unit/is_instance.test.gd | 202 -------- tests/bootstrap/unit/is_not_instance.test.gd | 134 ------ tests/bootstrap/unit/null.test.gd | 30 -- tests/bootstrap/unit/object.test.gd | 112 ----- tests/bootstrap/unit/parameters.test.gd | 25 - tests/bootstrap/unit/range.test.gd | 20 - tests/bootstrap/unit/string.test.gd | 52 -- tests/bootstrap/unit/supersimple.gd | 5 - tests/bootstrap/unit/testx.test.gd | 40 -- tests/examples/csharp/AwaitTest.cs | 96 ---- tests/examples/csharp/ExampleTest.cs | 81 ---- tests/examples/csharp/WatchSignalsTest.cs | 50 -- .../doubles/create_scene_director.test.gd | 20 - .../doubles/create_scene_doubles.test.gd | 21 - .../doubles/create_script_director.test.gd | 66 --- .../gdscript/doubles/create_script_doubles.gd | 18 - .../gdscript/doubles/use_method_director.gd | 125 ----- tests/examples/gdscript/example.test.gd | 59 --- tests/examples/gdscript/watch_signals.test.gd | 31 -- tests/examples/gdscript/yield.test.gd | 28 -- tests/metadata.json | 5 - tests/results.xml | 450 ------------------ 107 files changed, 4800 deletions(-) delete mode 100644 .circleci/config.yml delete mode 100644 .github/workflows/tests332.yml delete mode 100644 .idea/.idea.WAT5/.idea/.name delete mode 100644 .idea/.idea.WAT5/.idea/indexLayout.xml delete mode 100644 .idea/.idea.WAT5/.idea/projectSettingsUpdater.xml delete mode 100644 .idea/.idea.WAT5/.idea/vcs.xml delete mode 100644 .idea/.idea.WAT5/.idea/workspace.xml delete mode 100644 Examples/doubles/calculator.gd delete mode 100644 Examples/doubles/enemy.gd delete mode 100644 Examples/doubles/hero.gd delete mode 100644 Examples/doubles/my_class.gd delete mode 100644 Examples/doubles/scenes/Main.tscn delete mode 100644 Examples/doubles/scenes/grandchild_a.gd delete mode 100644 Examples/doubles/scenes/main.gd delete mode 100644 LICENSE delete mode 100644 OldExamples/Bootstrap/Empty/placeholder.gd delete mode 100644 OldExamples/Bootstrap/empty_test.gd delete mode 100644 OldExamples/Bootstrap/failing_test.gd delete mode 100644 OldExamples/Bootstrap/one_test_method_no_asserts.gd delete mode 100644 OldExamples/Bootstrap/passing_test.gd delete mode 100644 OldExamples/Control.gd delete mode 100644 OldExamples/Control.tscn delete mode 100644 OldExamples/Node.gd delete mode 100644 OldExamples/Node.tscn delete mode 100644 OldExamples/Node2D.tscn delete mode 100644 OldExamples/Scene/A.gd delete mode 100644 OldExamples/Scene/B.gd delete mode 100644 OldExamples/Scene/C.gd delete mode 100644 OldExamples/Scene/D.gd delete mode 100644 OldExamples/Scene/Main.gd delete mode 100644 OldExamples/Scene/Main.tscn delete mode 100644 OldExamples/Scene/NoScriptScene.gd delete mode 100644 OldExamples/Scene/NoScriptScene.tscn delete mode 100644 OldExamples/Scripts/ABC.gd delete mode 100644 OldExamples/Scripts/base_login.gd delete mode 100644 OldExamples/Scripts/body.gd delete mode 100644 OldExamples/Scripts/calculator.gd delete mode 100644 OldExamples/Scripts/library.gd delete mode 100644 OldExamples/Scripts/login.gd delete mode 100644 OldExamples/Scripts/new_script.gd delete mode 100644 OldExamples/Scripts/user.gd delete mode 100644 OldExamples/Test.tscn delete mode 100644 OldExamples/Testx.gd delete mode 100644 README.md delete mode 100644 WAT5.csproj delete mode 100644 WAT5.sln delete mode 100644 changelist.md delete mode 100644 icon.svg delete mode 100644 icon.svg.import delete mode 100644 images/gui.png delete mode 100644 images/gui.png.import delete mode 100644 project.godot delete mode 100644 tests/bootstrap/async/watcher.test.gd delete mode 100644 tests/bootstrap/async/yield.test.gd delete mode 100644 tests/bootstrap/integration/default_args.test.gd delete mode 100644 tests/bootstrap/integration/double.test.gd delete mode 100644 tests/bootstrap/integration/on_floor.test.gd delete mode 100644 tests/bootstrap/integration/property_member.gd delete mode 100644 tests/bootstrap/integration/resourcex.test.gd delete mode 100644 tests/bootstrap/integration/scene_director.test.gd delete mode 100644 tests/bootstrap/integration/script_director.test.gd delete mode 100644 tests/bootstrap/metadata.json delete mode 100644 tests/bootstrap/mono/AttributeTest.cs delete mode 100644 tests/bootstrap/mono/AttributeYieldTest.cs delete mode 100644 tests/bootstrap/mono/BasicCSharpTest.cs delete mode 100644 tests/bootstrap/mono/BooleanTest.cs delete mode 100644 tests/bootstrap/mono/ExceptionTests.cs delete mode 100644 tests/bootstrap/mono/IsInstanceTest.cs delete mode 100644 tests/bootstrap/mono/IsNotInstanceTest.cs delete mode 100644 tests/bootstrap/mono/MyTest.cs delete mode 100644 tests/bootstrap/mono/NullChecksTest.cs delete mode 100644 tests/bootstrap/mono/ObjectTest.cs delete mode 100644 tests/bootstrap/mono/RangeTest.cs delete mode 100644 tests/bootstrap/mono/RepeatTests.cs delete mode 100644 tests/bootstrap/mono/SimpleTest.cs delete mode 100644 tests/bootstrap/mono/StringTest.cs delete mode 100644 tests/bootstrap/mono/UntilEvent.cs delete mode 100644 tests/bootstrap/mono/WatcherTest.cs delete mode 100644 tests/bootstrap/mono/YieldTest.cs delete mode 100644 tests/bootstrap/results.xml delete mode 100644 tests/bootstrap/small/boolean.test.gd delete mode 100644 tests/bootstrap/unit/assert_that.test.gd delete mode 100644 tests/bootstrap/unit/equality.test.gd delete mode 100644 tests/bootstrap/unit/file.test.gd delete mode 100644 tests/bootstrap/unit/has.test.gd delete mode 100644 tests/bootstrap/unit/is_instance.test.gd delete mode 100644 tests/bootstrap/unit/is_not_instance.test.gd delete mode 100644 tests/bootstrap/unit/null.test.gd delete mode 100644 tests/bootstrap/unit/object.test.gd delete mode 100644 tests/bootstrap/unit/parameters.test.gd delete mode 100644 tests/bootstrap/unit/range.test.gd delete mode 100644 tests/bootstrap/unit/string.test.gd delete mode 100644 tests/bootstrap/unit/supersimple.gd delete mode 100644 tests/bootstrap/unit/testx.test.gd delete mode 100644 tests/examples/csharp/AwaitTest.cs delete mode 100644 tests/examples/csharp/ExampleTest.cs delete mode 100644 tests/examples/csharp/WatchSignalsTest.cs delete mode 100644 tests/examples/gdscript/doubles/create_scene_director.test.gd delete mode 100644 tests/examples/gdscript/doubles/create_scene_doubles.test.gd delete mode 100644 tests/examples/gdscript/doubles/create_script_director.test.gd delete mode 100644 tests/examples/gdscript/doubles/create_script_doubles.gd delete mode 100644 tests/examples/gdscript/doubles/use_method_director.gd delete mode 100644 tests/examples/gdscript/example.test.gd delete mode 100644 tests/examples/gdscript/watch_signals.test.gd delete mode 100644 tests/examples/gdscript/yield.test.gd delete mode 100644 tests/metadata.json delete mode 100644 tests/results.xml diff --git a/.circleci/config.yml b/.circleci/config.yml deleted file mode 100644 index 1ea98479..00000000 --- a/.circleci/config.yml +++ /dev/null @@ -1,20 +0,0 @@ -version: 2.1 - -jobs: - build: - docker: - - image: codedarigan/godot_headless_ci:latest - - steps: - - checkout - - run: - name: "Delete .import files" - command: rm addons/WAT/assets/*.import - - run: - name: "Run All Tests" - command: godot addons/WAT/cli.tscn -run_all - - store_test_results: - path: tests/ - - store_artifacts: - path: tests/ - diff --git a/.github/workflows/tests332.yml b/.github/workflows/tests332.yml deleted file mode 100644 index 961701b8..00000000 --- a/.github/workflows/tests332.yml +++ /dev/null @@ -1,26 +0,0 @@ -name: " Godot 3.3.2 " - -on: [push, pull_request] - -jobs: - Tests: - name: Run All Tests on 3.3.2 - runs-on: ubuntu-latest - container: barichello/godot-ci:mono-3.3.2 - steps: - - uses: actions/checkout@v2 - - name: Install Dependencies - run: | - nuget restore - mkdir -p .mono/assemblies/Debug - cp /usr/local/bin/GodotSharp/Api/Release/* .mono/assemblies/Debug - - name: Compile - run: msbuild - - name: Run - run: godot addons/WAT/cli.tscn run=all - - name: Upload Test Results - if: always() - uses: actions/upload-artifact@v2 - with: - name: Test Results - path: tests/results.xml \ No newline at end of file diff --git a/.idea/.idea.WAT5/.idea/.name b/.idea/.idea.WAT5/.idea/.name deleted file mode 100644 index 25f4daf9..00000000 --- a/.idea/.idea.WAT5/.idea/.name +++ /dev/null @@ -1 +0,0 @@ -WAT5 \ No newline at end of file diff --git a/.idea/.idea.WAT5/.idea/indexLayout.xml b/.idea/.idea.WAT5/.idea/indexLayout.xml deleted file mode 100644 index 7b08163c..00000000 --- a/.idea/.idea.WAT5/.idea/indexLayout.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/.idea.WAT5/.idea/projectSettingsUpdater.xml b/.idea/.idea.WAT5/.idea/projectSettingsUpdater.xml deleted file mode 100644 index 4bb9f4d2..00000000 --- a/.idea/.idea.WAT5/.idea/projectSettingsUpdater.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - \ No newline at end of file diff --git a/.idea/.idea.WAT5/.idea/vcs.xml b/.idea/.idea.WAT5/.idea/vcs.xml deleted file mode 100644 index 94a25f7f..00000000 --- a/.idea/.idea.WAT5/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/.idea.WAT5/.idea/workspace.xml b/.idea/.idea.WAT5/.idea/workspace.xml deleted file mode 100644 index c8cef8ec..00000000 --- a/.idea/.idea.WAT5/.idea/workspace.xml +++ /dev/null @@ -1,194 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1624725202685 - - - - - - - - - - - - - \ No newline at end of file diff --git a/Examples/doubles/calculator.gd b/Examples/doubles/calculator.gd deleted file mode 100644 index c768e8e3..00000000 --- a/Examples/doubles/calculator.gd +++ /dev/null @@ -1,11 +0,0 @@ -extends Reference -class_name MyCalculator - -func add(a, b) -> int: - return a + b - -func divide(a, b) -> float: - return a / b - -func get_approx_pi() -> float: - return 3.14 diff --git a/Examples/doubles/enemy.gd b/Examples/doubles/enemy.gd deleted file mode 100644 index d924ec36..00000000 --- a/Examples/doubles/enemy.gd +++ /dev/null @@ -1,5 +0,0 @@ -extends Reference -class_name Enemy - -func get_type() -> String: - return "[Enemy]" diff --git a/Examples/doubles/hero.gd b/Examples/doubles/hero.gd deleted file mode 100644 index 7f758912..00000000 --- a/Examples/doubles/hero.gd +++ /dev/null @@ -1,12 +0,0 @@ -extends Reference -class_name Hero - -var title: String -var faction: String -var health: int - -func _init(_title: String, _faction: String, _health: int) -> void: - title = _title - faction = _faction - health = _health - diff --git a/Examples/doubles/my_class.gd b/Examples/doubles/my_class.gd deleted file mode 100644 index 6cc8c9d2..00000000 --- a/Examples/doubles/my_class.gd +++ /dev/null @@ -1,15 +0,0 @@ -extends Reference -class_name MyClass - -func get_title(): - return "My Class" - -class InnerClass: - - func _init() -> void: - pass - - class InnerInnerClass: - - func _init() -> void: - pass diff --git a/Examples/doubles/scenes/Main.tscn b/Examples/doubles/scenes/Main.tscn deleted file mode 100644 index 60343e3c..00000000 --- a/Examples/doubles/scenes/Main.tscn +++ /dev/null @@ -1,16 +0,0 @@ -[gd_scene load_steps=3 format=2] - -[ext_resource path="res://examples/doubles/scenes/main.gd" type="Script" id=1] -[ext_resource path="res://examples/doubles/scenes/grandchild_a.gd" type="Script" id=2] - -[node name="Main" type="Node"] -script = ExtResource( 1 ) - -[node name="ChildA" type="Node" parent="."] - -[node name="GrandChildA" type="Node" parent="ChildA"] -script = ExtResource( 2 ) - -[node name="ChildB" type="Node" parent="."] - -[node name="GrandChildB" type="Node" parent="ChildB"] diff --git a/Examples/doubles/scenes/grandchild_a.gd b/Examples/doubles/scenes/grandchild_a.gd deleted file mode 100644 index 397b58c0..00000000 --- a/Examples/doubles/scenes/grandchild_a.gd +++ /dev/null @@ -1,4 +0,0 @@ -extends Node - -func get_title(): - return "Grandchild A" diff --git a/Examples/doubles/scenes/main.gd b/Examples/doubles/scenes/main.gd deleted file mode 100644 index 37ced72d..00000000 --- a/Examples/doubles/scenes/main.gd +++ /dev/null @@ -1,2 +0,0 @@ -extends Node -class_name MySceneRootClass diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 6fadac82..00000000 --- a/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2021 CodeDarigan - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/OldExamples/Bootstrap/Empty/placeholder.gd b/OldExamples/Bootstrap/Empty/placeholder.gd deleted file mode 100644 index 9c7a0d57..00000000 --- a/OldExamples/Bootstrap/Empty/placeholder.gd +++ /dev/null @@ -1,6 +0,0 @@ -extends Object - -# Placeholder Non-WATTest Script -# Exists for End-To-End Runner Tests -# The empty dir wasn't being committed -# so we added this file to it \ No newline at end of file diff --git a/OldExamples/Bootstrap/empty_test.gd b/OldExamples/Bootstrap/empty_test.gd deleted file mode 100644 index 8e615840..00000000 --- a/OldExamples/Bootstrap/empty_test.gd +++ /dev/null @@ -1 +0,0 @@ -extends WATTest diff --git a/OldExamples/Bootstrap/failing_test.gd b/OldExamples/Bootstrap/failing_test.gd deleted file mode 100644 index 0b4dbd91..00000000 --- a/OldExamples/Bootstrap/failing_test.gd +++ /dev/null @@ -1,20 +0,0 @@ -extends WATTest - -func title(): - return "TestCalculator" - -func test_add_two_plus_two_returns_four(): - describe("add 2 plus 2") - - # Arrange - var calculator = Calculator.new() - var expected: int = 10 - - # Act - var actual = calculator.add(2, 2) - - # Assert - asserts.is_equal(expected, actual, "returns four") - - # Cleanup - calculator.free() diff --git a/OldExamples/Bootstrap/one_test_method_no_asserts.gd b/OldExamples/Bootstrap/one_test_method_no_asserts.gd deleted file mode 100644 index 967dcdc8..00000000 --- a/OldExamples/Bootstrap/one_test_method_no_asserts.gd +++ /dev/null @@ -1,5 +0,0 @@ -extends WATTest - -func test_method(): - var placeholder = 0 - diff --git a/OldExamples/Bootstrap/passing_test.gd b/OldExamples/Bootstrap/passing_test.gd deleted file mode 100644 index 65d51371..00000000 --- a/OldExamples/Bootstrap/passing_test.gd +++ /dev/null @@ -1,20 +0,0 @@ -extends WATTest - -func title(): - return "TestCalculator" - -func test_add_two_plus_two_returns_four(): - describe("add 2 plus 2") - - # Arrange - var calculator = Calculator.new() - var expected: int = 4 - - # Act - var actual = calculator.add(2, 2) - - # Assert - asserts.is_equal(expected, actual, "returns four") - - # Cleanup - calculator.free() diff --git a/OldExamples/Control.gd b/OldExamples/Control.gd deleted file mode 100644 index 276798ff..00000000 --- a/OldExamples/Control.gd +++ /dev/null @@ -1,8 +0,0 @@ -extends Tree - - -# Declare member variables here. Examples: -# var a = 2 -# var b = "text" - - diff --git a/OldExamples/Control.tscn b/OldExamples/Control.tscn deleted file mode 100644 index 018f84d1..00000000 --- a/OldExamples/Control.tscn +++ /dev/null @@ -1,11 +0,0 @@ -[gd_scene load_steps=2 format=2] - -[ext_resource path="res://OldExamples/Control.gd" type="Script" id=1] - -[node name="Control" type="Tree"] -anchor_right = 1.0 -anchor_bottom = 1.0 -script = ExtResource( 1 ) -__meta__ = { -"_edit_use_anchors_": false -} diff --git a/OldExamples/Node.gd b/OldExamples/Node.gd deleted file mode 100644 index 61510e14..00000000 --- a/OldExamples/Node.gd +++ /dev/null @@ -1 +0,0 @@ -extends Node diff --git a/OldExamples/Node.tscn b/OldExamples/Node.tscn deleted file mode 100644 index f5714be6..00000000 --- a/OldExamples/Node.tscn +++ /dev/null @@ -1,6 +0,0 @@ -[gd_scene load_steps=2 format=2] - -[ext_resource path="res://OldExamples/Node.gd" type="Script" id=1] - -[node name="Node" type="Node"] -script = ExtResource( 1 ) diff --git a/OldExamples/Node2D.tscn b/OldExamples/Node2D.tscn deleted file mode 100644 index ac0afae8..00000000 --- a/OldExamples/Node2D.tscn +++ /dev/null @@ -1,6 +0,0 @@ -[gd_scene load_steps=2 format=2] - -[ext_resource path="res://OldExamples/Scene/NoScriptScene.tscn" type="PackedScene" id=1] - - -[node name="Node2D" instance=ExtResource( 1 )] diff --git a/OldExamples/Scene/A.gd b/OldExamples/Scene/A.gd deleted file mode 100644 index caf73402..00000000 --- a/OldExamples/Scene/A.gd +++ /dev/null @@ -1,5 +0,0 @@ -extends Node - - -func execute(): - return 5 \ No newline at end of file diff --git a/OldExamples/Scene/B.gd b/OldExamples/Scene/B.gd deleted file mode 100644 index 487b2843..00000000 --- a/OldExamples/Scene/B.gd +++ /dev/null @@ -1,2 +0,0 @@ -extends Node - diff --git a/OldExamples/Scene/C.gd b/OldExamples/Scene/C.gd deleted file mode 100644 index d621cde5..00000000 --- a/OldExamples/Scene/C.gd +++ /dev/null @@ -1,4 +0,0 @@ -extends Node - -func blow_up_stuff(): - print("stuff blow up") diff --git a/OldExamples/Scene/D.gd b/OldExamples/Scene/D.gd deleted file mode 100644 index d4db6603..00000000 --- a/OldExamples/Scene/D.gd +++ /dev/null @@ -1,4 +0,0 @@ -extends Node - -func wowsers(): - print('wowsers') diff --git a/OldExamples/Scene/Main.gd b/OldExamples/Scene/Main.gd deleted file mode 100644 index 27cf22b8..00000000 --- a/OldExamples/Scene/Main.gd +++ /dev/null @@ -1,7 +0,0 @@ -extends Node - -export var path: NodePath -onready var n = get_node(path) - -func test(): - return 20 diff --git a/OldExamples/Scene/Main.tscn b/OldExamples/Scene/Main.tscn deleted file mode 100644 index 7465b8d5..00000000 --- a/OldExamples/Scene/Main.tscn +++ /dev/null @@ -1,23 +0,0 @@ -[gd_scene load_steps=6 format=2] - -[ext_resource path="res://OldExamples/Scene/Main.gd" type="Script" id=1] -[ext_resource path="res://OldExamples/Scene/A.gd" type="Script" id=2] -[ext_resource path="res://OldExamples/Scene/B.gd" type="Script" id=3] -[ext_resource path="res://OldExamples/Scene/C.gd" type="Script" id=4] -[ext_resource path="res://OldExamples/Scene/D.gd" type="Script" id=5] - -[node name="Main" type="Node"] -script = ExtResource( 1 ) -path = NodePath("A") - -[node name="A" type="Node" parent="."] -script = ExtResource( 2 ) - -[node name="B" type="Node" parent="A"] -script = ExtResource( 3 ) - -[node name="C" type="Node" parent="."] -script = ExtResource( 4 ) - -[node name="D" type="Node" parent="C"] -script = ExtResource( 5 ) diff --git a/OldExamples/Scene/NoScriptScene.gd b/OldExamples/Scene/NoScriptScene.gd deleted file mode 100644 index d144d481..00000000 --- a/OldExamples/Scene/NoScriptScene.gd +++ /dev/null @@ -1,16 +0,0 @@ -extends Node2D - - -# Declare member variables here. Examples: -# var a = 2 -# var b = "text" - - -# Called when the node enters the scene tree for the first time. -func _ready(): - pass # Replace with function body. - - -# Called every frame. 'delta' is the elapsed time since the previous frame. -#func _process(delta): -# pass diff --git a/OldExamples/Scene/NoScriptScene.tscn b/OldExamples/Scene/NoScriptScene.tscn deleted file mode 100644 index 09db61aa..00000000 --- a/OldExamples/Scene/NoScriptScene.tscn +++ /dev/null @@ -1,10 +0,0 @@ -[gd_scene load_steps=2 format=2] - -[sub_resource type="CapsuleShape2D" id=1] - -[node name="Node2D" type="Node2D"] - -[node name="KinematicBody2D" type="KinematicBody2D" parent="."] - -[node name="CollisionShape2D" type="CollisionShape2D" parent="KinematicBody2D"] -shape = SubResource( 1 ) diff --git a/OldExamples/Scripts/ABC.gd b/OldExamples/Scripts/ABC.gd deleted file mode 100644 index b2d46911..00000000 --- a/OldExamples/Scripts/ABC.gd +++ /dev/null @@ -1,15 +0,0 @@ -extends Reference - - -func _init(b: B, c: C): - pass - -class B: - - func _init(c: C): - pass - -class C: - - func _init(a: int, b: String): - pass diff --git a/OldExamples/Scripts/base_login.gd b/OldExamples/Scripts/base_login.gd deleted file mode 100644 index 94e45c6a..00000000 --- a/OldExamples/Scripts/base_login.gd +++ /dev/null @@ -1,5 +0,0 @@ -extends Node -class_name BaseLogin - -func to_override(): - print("This should not appear twice") diff --git a/OldExamples/Scripts/body.gd b/OldExamples/Scripts/body.gd deleted file mode 100644 index c8a09559..00000000 --- a/OldExamples/Scripts/body.gd +++ /dev/null @@ -1,3 +0,0 @@ -extends KinematicBody2D - -const title = "BodyDouble" diff --git a/OldExamples/Scripts/calculator.gd b/OldExamples/Scripts/calculator.gd deleted file mode 100644 index 16ff7ef9..00000000 --- a/OldExamples/Scripts/calculator.gd +++ /dev/null @@ -1,41 +0,0 @@ -extends Node -class_name Calculator - -var _sum: int = 0 - -func add(a, b): - return a + b - -func subtract(a, b): - return a - b - -func multiply(a, b): - return a * b - -func divide(a, b): - return a / b - -func sum(list): - _sum = 0 - for number in list: - _sum += number - return _sum - -static func pi(): - return PI - -remote func math_fight(): - return null - -class Algebra: - - static func get_tau() -> float: - return TAU - - static func create_vector(): - return Vector2(10, 10) - - func scale(vector, scaler): - var x = vector.x * scaler - var y = vector.y * scaler - return Vector2(x, y) diff --git a/OldExamples/Scripts/library.gd b/OldExamples/Scripts/library.gd deleted file mode 100644 index 6bfba164..00000000 --- a/OldExamples/Scripts/library.gd +++ /dev/null @@ -1,19 +0,0 @@ -extends Reference - -class Book extends Reference: - const CLASS = "BOOK" - var _author - var _aut - - func _init(author: Author, genre: String, rating: int, aut: Script): - self._author = author - self._aut = aut - print_debug("aut is script: ", aut is Script) - print_debug("Author is Author: ", typeof(author)) - -class Author extends Reference: - const CLASS = "Author" - var _title - - func _init(name: String, age: int, location: String): - self._title = name diff --git a/OldExamples/Scripts/login.gd b/OldExamples/Scripts/login.gd deleted file mode 100644 index 9794d9c6..00000000 --- a/OldExamples/Scripts/login.gd +++ /dev/null @@ -1,16 +0,0 @@ -extends BaseLogin -class_name Login - -signal LOGGED_IN - -func register(username: String, password: String) -> bool: - # Return false if passed in censored words as username - # Returns false if some names passed in - return true - -func login(username: String, password: String) -> bool: - emit_signal("LOGGED_IN", username, password) - return true - -func to_override() -> void: - print("This should not appear twice") \ No newline at end of file diff --git a/OldExamples/Scripts/new_script.gd b/OldExamples/Scripts/new_script.gd deleted file mode 100644 index a0ac919c..00000000 --- a/OldExamples/Scripts/new_script.gd +++ /dev/null @@ -1,6 +0,0 @@ -extends Reference - -var filesystem - -func _init(filesystem): - self.filesystem = filesystem diff --git a/OldExamples/Scripts/user.gd b/OldExamples/Scripts/user.gd deleted file mode 100644 index 5b387304..00000000 --- a/OldExamples/Scripts/user.gd +++ /dev/null @@ -1,6 +0,0 @@ -extends Reference - -var username: String - -func _init(_username: String) -> void: - username = _username diff --git a/OldExamples/Test.tscn b/OldExamples/Test.tscn deleted file mode 100644 index ff9789e3..00000000 --- a/OldExamples/Test.tscn +++ /dev/null @@ -1,8 +0,0 @@ -[gd_scene load_steps=2 format=2] - -[ext_resource path="res://OldExamples/Testx.gd" type="Script" id=1] - - -[node name="Test" type="Node2D"] -script = ExtResource( 1 ) -age = 5 diff --git a/OldExamples/Testx.gd b/OldExamples/Testx.gd deleted file mode 100644 index 77c4b93c..00000000 --- a/OldExamples/Testx.gd +++ /dev/null @@ -1,4 +0,0 @@ -extends Node2D -#class_name MyClass - -export(int) var age = 1 diff --git a/README.md b/README.md deleted file mode 100644 index 374b12ef..00000000 --- a/README.md +++ /dev/null @@ -1,210 +0,0 @@ -# ![Icon](./icon.svg) WAT -![3.3.2](https://github.com/CodeDarigan/WAT-GDScript/workflows/%20%20Godot%203.3.2%20%20/badge.svg) - -[![ko-fi](https://www.ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/Q5Q51D9K5) - -1. [Install](#Install) -2. [Project Settings](#ProjectSettings) -3. [GUI](#GUI) -4. [CLI](#CLI) -5. [Example Tests](#Examples) - -## Install - - -0. It is advised to download WAT from the Godot Asset Library. -1. You may download WAT or WAT Mono from the release page. -2. Extract the downloaded zip file. -3. Add the addons folder from the extracted files to your Godot Project. -4. Enable the Plugin in Project -> Project Settings -> Plugin Tab -5. You should see a new "Tests" button in the bottom middle bar of the Godot Editor. - -## Project Settings - -Once you have enabled the WAT Plugin, you will be able to see the settings in -ProjectSettings -> General -> Wat (right at the bottom). If you don't see it, you may -need to close the project settings and then re-open. - -- *Test Directory* - - The test directory is where WAT will look for your tests. It defaults to your project's root - but it is suggested to use a dedicated tests folder. You can also use an absolute path external to your - project (like "C:/Users/YourName/YourProject/Tests"). - -- *Results Directory* - - The results directory is where WAT will store the results of your tests in JUnit Standard XML. It defaults to - your project's root but it is suggested to store it inside your tests folder. This is usefulfor those of you - who use Continous Integration (such as the github workflow action for WAT itself.) - -- *Metadata Directory* - - The metadata directory is where WAT will store metadata about your test scripts. Namely wheter they failed the last time and which tags they have been given. It defaults to your project's root but it is suggested to be stored in your - test directory. - -- *Tags* - - You can add string tags to your test so that you can run tests that are split across different folders in a group. You - define which tags can be added in this setting but you do the actual adding via the GUI. - -- *Window Size* - - Defines the window size when running Tests. - -- *Port* - - This port is the port used for debugging tests. It is unlikely you'll need to change this often. - -- *Display* - - This defines wheter the Test Panel is stored in the bottom window or one of the many docks around Godot's Editor. - -## Graphical User Interface - - -![Image](/images/gui.png) - - -### Top Left Menu ( Left To Right ) - -__Run All Tests__ - - Runs all tests directly in the Editor. WAT does not have access to the - debugger when run this way. - - Note: A Rebuild might be required by any User who is using WAT Mono. - -__Debug All Tests__ - - Runs all tests in the Scene. WAT does have access to the debugger when - run this way. - -__Select Tests__ - - Users may select to Run (in editor) or Debug (in scene): previously failed tests, a set of tagged tests, a Directory, Script or a Method. - - Note: Users may organize their tests into nested directories but this is only - for organizational purposes. WAT will *only* run the top-level tests of any directory. - - Note: To edit the tags of a script, navigate to the script and then to Edit Tags. Check which tags you want the script to have (or uncheck those which you - don't want it to have)/ - -__Filter Results__ - - Users can choose to collapse all results, expand all results or expand only failures (which will collapse all results but expand the failed methods). - -__Repeat X Times__ - - Users can choose to repeat a Test Run immediatly so many times. This can help - when testing erratic bugs where the problem only exists sometimes. Choose 0 - to run the tests once. - -__Run on X Thread(s)__ - - Users can set the count of threads to run their tests on (to the limit of their - processor core count - 1 for WAT itself otherwise it will stall). - - Use 1 thread to not run on any additional threads. - - Note: Do not use Repeats & Threads together. There is currently a bug. - -__Links__ - - A Set of links that may or may not be useful to you. - -### Bottom Left Labels ( Left to Right ) - -__Runs__ - - The number of times tests have been run since WAT was open. - -__Total Tests__ - - The number of total tests scripts ran in the previous Test Run. - -__Passed Tests__ - - The number of total test scripts that passed in the previous Test Run. - -__Failed Tests__ - - The number of total test scripts that failed in the previous Test Run. - -__Times__ - - The time the Test Run is taking (or has taken if finished). This updates - live. - - -## Command Line Interface - -You can run tests in your command line interface by navigating to your Project Directory and executing the command: *godot addons/cli.tscn [ARGUMENTS]* - -__Run All Tests__ - - godot addons/WAT/cli.tscn run=all - -__Run Directory__ - - // Where X is the path of the directory you want to run - godot addons/WAT/cli.tscn run=dir+X - -__Run Script__ - - // Where X is the absolute path of the script you want to run - godot addons/WAT/cli.tscn run=script+X - -__Run Method__ - - // Where X is the absolute path of the script where the method is contained - // and where Y is the name of the method - godot addons/WAT/cli.tscn run=method+X+Y - -__Run Failed__ - - godot addons/WAT/cli.tscn run=failed - -__Run Tagged__ - - // Where X is the name of the tag you want to run - godot addons/WAT/cli.tscn run=tag+X - -__Repeat Tests__ - - godot addons/WAT/cli.tscn run=all repeat=2 - OR - godot addons/WAT/cli.tscn run=all r=2 - - Note: Argument order does not matter so you can do this either - godot addons/WAT/cli.tscn r=2 run=all - -__Run on X Threads__ - - godot addons/WAT/cli.tscn run=all thread=3 - OR - godot addons/WAT/cli.tscn run=all t=3 - - Note: Argument order does not matter so you can do this either - godot addons/WAT/cli.tscn t=2 run=all - -## Examples - -- GDScript Examples - - [Basic Test](/tests/examples/gdscript/example.test.gd) - - [Yielding in Tests](/tests/examples/gdscript/yield.test.gd) - - [Watching Signals in Tests](/test/examples/gdscript/watch_signals.test.gd) - - [Test Doubles](/test/examples/gd/script/doubles) - - -- C# Examples - - [Basic Test](/tests/examples/csharp/ExampleTest.cs) - - [Awaiting in Tests](/test/examples/csharp/AwaitTest.cs) - - [Watching Signals in Tests](/test/examples/csharp/WatchingSignalsTest.cs) - - - - - - - - diff --git a/WAT5.csproj b/WAT5.csproj deleted file mode 100644 index 08bfe406..00000000 --- a/WAT5.csproj +++ /dev/null @@ -1,123 +0,0 @@ - - - net472 - 7 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/WAT5.sln b/WAT5.sln deleted file mode 100644 index 0918f8cb..00000000 --- a/WAT5.sln +++ /dev/null @@ -1,19 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2012 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WAT5", "WAT5.csproj", "{B55F6E5A-5EB7-49EC-AD95-87173756E436}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - ExportDebug|Any CPU = ExportDebug|Any CPU - ExportRelease|Any CPU = ExportRelease|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {B55F6E5A-5EB7-49EC-AD95-87173756E436}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B55F6E5A-5EB7-49EC-AD95-87173756E436}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B55F6E5A-5EB7-49EC-AD95-87173756E436}.ExportDebug|Any CPU.ActiveCfg = ExportDebug|Any CPU - {B55F6E5A-5EB7-49EC-AD95-87173756E436}.ExportDebug|Any CPU.Build.0 = ExportDebug|Any CPU - {B55F6E5A-5EB7-49EC-AD95-87173756E436}.ExportRelease|Any CPU.ActiveCfg = ExportRelease|Any CPU - {B55F6E5A-5EB7-49EC-AD95-87173756E436}.ExportRelease|Any CPU.Build.0 = ExportRelease|Any CPU - EndGlobalSection -EndGlobal diff --git a/changelist.md b/changelist.md deleted file mode 100644 index da05f9e7..00000000 --- a/changelist.md +++ /dev/null @@ -1,251 +0,0 @@ - -## FEATURE - -Add Continous Integration to Github Actions (badges included) - -## REFACTOR - -Replace RunInEditor Toggle with RunInDebug Button - -Disable RunInDebug in Standalone Builds - -Added UI Scaling including for HDPI Devices (Atlinx) - -WAT theme defaults to your editor theme (Atlinx) - -Optimized is_in_range (speed increased tenfold) (JaymanLink Here) - -## FIXES - -Fix Type - - GUI.gd is now gui.gd. This should prevent crashes on Linux. - -Fix Crash on No Test Directory found. - - If no directory is found in settings, we return an empty array to prevent crashing. - -Fix Assert.that bug - - Arguments were being formatted incorrectly. - -Fix Assert.has() bug - - This was a typo'ed call. Should work now. - -Fix Bad Launching in 3.24 - - The RUN_OPTION enum (inside the Engine) itself changes version sometimes.. - ..So an if statement was added to fix choose the correct run option. - -Fix Drop Down Bug -Fix Tag Editor -Fix Results showing properly in Tabs - - -# Check WAT5 Log too - -commit 2bea561c05cd75cfd905c0efd2af3bd2ad143e54 -Author: Alex -Date: Thu Jan 28 23:02:36 2021 +0000 - - Fix Junit NOW - -commit 53ac66f1f2890ccbb7e035f1d3a655ba9dd4713a -Author: Alex -Date: Thu Jan 28 23:00:39 2021 +0000 - - Fix JUnit XML Now - -commit 3d3c7fceac204170686cefeca3faeed10f6d928a -Author: Alex -Date: Sun Jan 24 20:08:12 2021 +0000 - - Add Run In Editor Toggle - - Editor Runs don't allow for debugging but are at least 2 seconds quicker - than game context runs. - - Note we have some issues with threaded tests terminating a bit too early - so we need to stop that. - -commit fb2ba589c472388acc41ba8e780359dd0ff41a4b -Author: Alex -Date: Sun Jan 24 19:01:32 2021 +0000 - - Add Multithreaded Runner - -commit f589f65773a1994973a8cc58b19f166f08e6508f -Author: Alex -Date: Tue Jan 5 22:13:19 2021 +0000 - - Can Now Export Tests - Check this - -commit ac6efee3615a6ed5cffd1748ab6af3182c0a59f0 -Author: Alex -Date: Tue Jan 5 13:04:37 2021 +0000 - - Remove Warning - -commit 4a946f0e7a0f93d9486556ebf8d37201b79a9f37 -Author: Alex -Date: Tue Jan 5 13:02:52 2021 +0000 - - ReAdd Single Threaded Tests - - Also added thread spinbox to UI and a max check for threads (if - people went over this, the main threaded ended up never returning) - -commit 5288fa348ebac41efa00730125ab4e1be560f754 -Author: Alex -Date: Mon Jan 4 23:11:15 2021 +0000 - - Run All working with threads (shaky) - -commit 8d825e6ef09f17224e3ce4b795da68ee149d0845 -Author: Alex -Date: Mon Jan 4 22:36:13 2021 +0000 - - Threaded Tests Working - -commit 533479926da69ddfb43a6bb4de06535e7187d128 -Author: Alex -Date: Mon Jan 4 22:21:20 2021 +0000 - - TestRunner runs Threaded Tests - -commit a7cea0824780bf01eacbbae6a1a747718fd73a2f -Author: Alex -Date: Mon Jan 4 21:47:40 2021 +0000 - - Add Yield Time to Metadata - -commit 8f27b06d579b2216b3dece7ff0036316a05e8244 -Author: Alex -Date: Mon Jan 4 18:32:53 2021 +0000 - - Add Disconnect FileManager (+ fix typo) - -commit 1e0fefa2dcf36df1ac24dbb0854c370493cd0382 -Author: Alex -Date: Mon Jan 4 18:29:06 2021 +0000 - - Connect FileManager via Plugin (No Implementation) - -commit 66f6765da3056b74d1a2f079735a3c2af8438dd7 -Author: AlexAndDraw -Date: Thu Dec 31 12:27:05 2020 +0000 - - Summary runs in real time - - Also remove debug prints - -commit aa0663ca3453c0f4599d6a6e0b3d049c3607ed3a -Author: AlexAndDraw -Date: Wed Dec 30 00:41:02 2020 +0000 - - Add Icons To TestSelector - -commit c3124a6ca262886f86b6cdfd89ca9cebac895165 -Author: AlexAndDraw -Date: Wed Dec 30 00:25:20 2020 +0000 - - Update Summary With Icons - -commit f91bd53816a2d14c8a4e8d403a2e5a399cea2f2a -Author: AlexAndDraw -Date: Wed Dec 30 00:12:18 2020 +0000 - - Update Theme To Match Editor Default - -commit ca9086b2f47078d25f7a76c63d077357b1964548 -Author: AlexAndDraw -Date: Mon Dec 28 16:08:01 2020 +0000 - - Streamline Tags - -commit 4f68a61d57211db76c51bf36660bf1baed3a2da6 -Author: AlexAndDraw -Date: Sun Dec 27 23:03:45 2020 +0000 - - Add Shortcut Operation - -commit 7405d81bb6dbc5ae75ef94c017c31b10f166eef9 -Author: AlexAndDraw -Date: Thu Dec 24 12:05:16 2020 +0000 - - Use Goto Function Via Signals - -commit 7b35dda6edd5211ee5eed43f62f3a6e40f5dc548 -Author: AlexAndDraw -Date: Thu Dec 24 11:49:15 2020 +0000 - - Add Editor Context Launcher - -commit b12de004b8f795f15fb58677239feb2320465ed2 -Author: AlexAndDraw -Date: Wed Dec 16 16:31:04 2020 +0000 - - ReAdd Ability To Run Within Editor - -commit 1cb67d09529a5804dbcba0b7cee28357e7e0f6e5 -Author: AlexAbdDraw -Date: Thu Dec 3 20:34:25 2020 +0000 - - Improve TestSelection - -commit d91afbff674e11a9dc892170a768f80712c88cf3 -Author: AlexAbdDraw -Date: Thu Dec 3 17:02:45 2020 +0000 - - Add Start Of Popup Selection - -commit 90b07c9fcecd0de2d7bcafad1211ccca709c9563 -Author: AlexAbdDraw -Date: Wed Dec 2 12:28:58 2020 +0000 - - -commit 456384ed539e350244b2d279ecc5da1e9f50664d -Author: AlexAbdDraw -Date: Fri Nov 27 22:52:52 2020 +0000 - - Make Use Of New Play_Custom_Scene Method - - With this change we've solidified a breaking change - -commit 24ec5ab1ce72ea97757cc8bdf914a85d67dd5930 -Author: AlexAbdDraw -Date: Wed Nov 25 16:18:06 2020 +0000 - - Change Bool To Correct Value - -commit d50e0fcc28d60231d203157beef0ce4dca39505c -Author: AlexAbdDraw -Date: Sun Nov 8 02:20:19 2020 +0000 - - Split Run/Create In Runner - -commit 888d082aefa7b1cbe9464a1a0a8b8479c6518914 -Author: AlexAbdDraw -Date: Sat Nov 7 11:09:01 2020 +0000 - - Remove Script Templates. - - Unnecessary and unhelpful. Usually just gets in the way. - -commit 2973cb04227887e13f4f47ca4b4a93dd246100cb -Author: AlexAbdDraw -Date: Sat Nov 7 11:08:01 2020 +0000 - - Add Window Sizing Operation - -commit 51c75eb5d7689eb3ac3b60a1da518ae426ce02cc -Author: Alex -Date: Tue Sep 8 11:01:07 2020 +0100 - - Add Ability To Run As Scene - - - -- Fix Double Scenes not handling Exported Nodepaths (commit 4760fb45ac923e33128319d26640016660caf1e3) -- Double Default Arguments of Base Classes (commit eb41c0133ba5f28de8985dad57af34dfe13fea54) diff --git a/icon.svg b/icon.svg deleted file mode 100644 index 15785a1f..00000000 --- a/icon.svg +++ /dev/null @@ -1,72 +0,0 @@ - - - - - - - - - - - - - - diff --git a/icon.svg.import b/icon.svg.import deleted file mode 100644 index b806afbd..00000000 --- a/icon.svg.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="StreamTexture" -path="res://.import/icon.svg-218a8f2b3041327d8a5756f3a245f83b.stex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://icon.svg" -dest_files=[ "res://.import/icon.svg-218a8f2b3041327d8a5756f3a245f83b.stex" ] - -[params] - -compress/mode=0 -compress/lossy_quality=0.7 -compress/hdr_mode=0 -compress/bptc_ldr=0 -compress/normal_map=0 -flags/repeat=0 -flags/filter=true -flags/mipmaps=false -flags/anisotropic=false -flags/srgb=2 -process/fix_alpha_border=true -process/premult_alpha=false -process/HDR_as_SRGB=false -process/invert_color=false -stream=false -size_limit=0 -detect_3d=true -svg/scale=1.0 diff --git a/images/gui.png b/images/gui.png deleted file mode 100644 index 76477dc59fd99566fb6ea765edb4f4a371cb70a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46456 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 void: - describe("When we watch and signal and emit it multiple times") - - add_user_signal("multiple") - watch(self, "multiple") - emit_signal("multiple") - emit_signal("multiple") - - var emit_count: int = 2 - asserts.signal_was_emitted_x_times(self, "multiple", emit_count, "Then we can track how many times we emitted it") - -### These tests aren't possible in their current form ### -### We have to update the watcher to allow them properly (if even possible) ### -# When we watch a signal from an object with bound arguments - # Then we recorded the bound arguments -# When we watch a signal from an object with both bound and unbound arguments - # Then we recorded all of those arguments diff --git a/tests/bootstrap/async/yield.test.gd b/tests/bootstrap/async/yield.test.gd deleted file mode 100644 index 92742f59..00000000 --- a/tests/bootstrap/async/yield.test.gd +++ /dev/null @@ -1,107 +0,0 @@ -extends WAT.Test - -const Yielder: Script = preload("res://addons/WAT/test/yielder.gd") -var a; var b; var c; var d; var e; var f; -## warning-ignore:unused_signal -# warning-ignore:unused_signal -signal abc # (its used by call_defferred) - -func title() -> String: - return "Given a Yield" - -func start(): - yield(until_timeout(0.1), YIELD) - a = true - yield(until_timeout(0.1), YIELD) - b = true - -func pre(): - yield(until_timeout(0.1), YIELD) - c = true - yield(until_timeout(0.1), YIELD) - d = true - yield(until_timeout(0.1), YIELD) - -func test_When_we_yield_in_start(): - describe("When we yield in start twice") - asserts.is_true(a, "Then we set var a to true") - asserts.is_true(b, "Then we set var b to true") - -func test_When_we_yield_in_pre(): - describe("When we yield in pre thrice") - asserts.is_true(c, "Then we set var c to true") - asserts.is_true(d, "Then we set var d to true") - -func test_When_we_yield_in_execute(): - describe("When we yield twice in execute") - yield(until_timeout(0.1), YIELD) - e = true - yield(until_timeout(0.1), YIELD) - f = true - asserts.is_true(e, "Then we set var e to true") - asserts.is_true(f, "Then we set var f to true") - - -func test_When_we_yield_we_get_the_return_value() -> void: - describe("When yield(self.yield_value()) returns") - -# warning-ignore:function_may_yield - var args: Array = yield(until_signal(yield_value(), "completed", 0.5), YIELD) - - asserts.is_Array(args, "Then we get an array") - asserts.is_equal(args.size(), 6, "Of size 6") - asserts.is_equal(args[0], 100, "Where element 0 is 100") - -func yield_value() -> int: - yield(get_tree().create_timer(0.1), "timeout") - return 100 - -func test_Yielder_is_not_active_when_asserting(): - describe("When asserting against a test") - yield(until_timeout(0.1), YIELD) - asserts.is_true(not _yielder.is_active(), "Then yielder is not active") - -func test_When_a_signal_being_yielded_on_is_emitted_the_yielder_is_stopped(): - describe("When a signal being yielded on is emitted") - call_deferred("emit_signal", "abc") - yield(until_signal(self, "abc", 0.3), YIELD) - asserts.is_true(_yielder.is_stopped(), "Then the yielder is stopped") - -func test_When_yielder_is_finished_signals_are_disconnected(): - describe("When it is finished") - - yield(until_signal(self, "abc", 0.1), YIELD) - asserts.is_true(not is_connected("abc", _yielder, "_on_resume"), "Then the signal-signal is disconnected") -# -func test_When_we_call_until_timeout() -> void: - describe("When we call until_timeout (with 1.0)") - var yielder = Yielder.new() - add_child(yielder) - yielder.until_timeout(1.0) - asserts.is_true(not yielder.is_stopped(), "Then yielder is not stopped") - remove_child(yielder) - yielder.free() -# -func test_When_we_call_until_signal() -> void: - describe("When we call until signal") - var yielder = Yielder.new() - add_child(yielder) - yielder.until_signal(1.0, self, "abc") - asserts.is_true(not yielder.paused, "Then the yielder is unpaused") - asserts.is_true(yielder.is_connected("timeout", yielder, "_on_resume"), "Then the timeout signal of the yielder is connected") - asserts.is_true(is_connected("abc", yielder, "_on_resume"), "Then our signal is connected to the yielder") - remove_child(yielder) - yielder.free() - -func test_When_the_yielder_times_out() -> void: - describe("When the yielder times out on until_timeout(0.1)") - yield(until_timeout(0.1), YIELD) - asserts.is_true(_yielder.is_stopped(), "Then the yielder is stopped") - -func test_When_the_yielder_hears_our_signal() -> void: - describe("When the yielder heres our signal") - - call_deferred("emit_signal", "abc") - yield(until_signal(self, "abc", 0.1), YIELD) - asserts.is_true(_yielder.is_stopped(), "Then the yielder is stopped") - asserts.is_true(not is_connected("abc", _yielder, "_on_resume"), "Then our signal to the yielder is disconnected") diff --git a/tests/bootstrap/integration/default_args.test.gd b/tests/bootstrap/integration/default_args.test.gd deleted file mode 100644 index 30f24006..00000000 --- a/tests/bootstrap/integration/default_args.test.gd +++ /dev/null @@ -1,14 +0,0 @@ -extends WAT.Test - -### BEGIN ### -# Testing that we take default args into account when doubling scripts -### END ### - -func test_default_arguments_of_interpolate_property(): - - var tween_director = direct.script("Tween") - var _interpolate_method = tween_director.method("interpolate_property") - var _double = tween_director.double() - asserts.is_true(true, - "If this method can be reached then we have doubled a script with default argument(s) properly!") - diff --git a/tests/bootstrap/integration/double.test.gd b/tests/bootstrap/integration/double.test.gd deleted file mode 100644 index a24ee2c8..00000000 --- a/tests/bootstrap/integration/double.test.gd +++ /dev/null @@ -1,180 +0,0 @@ -extends WAT.Test - -var director - -func title(): - # Script Directors are responsible for setting up Test Double Scripts - return "Given a Test Double" - -func pre(): - director = direct.script("res://OldExamples/Scripts/calculator.gd") - -func post(): - director = null - -func test_When_we_call_an_add_method_that_we_have_not_directed(): - describe("When we call an add(x, y) method that we haven't directed") - - asserts.is_equal(4, director.double().add(2, 2), "Then we get the correct result") - -func test_When_we_call_a_method_that_we_have_dummied(): - describe("When we call a method that we have dummied") - - director.method("add").dummy() - - asserts.is_null(director.double().add(2, 2), "Then we get null") - -func test_When_we_call_a_method_that_we_have_stubbed_to_return_true(): - describe("When we call a method that we have stubbed to return true") - - director.method("add").stub(true) - - asserts.is_true(director.double().add(2, 2), "Then it returns true") - -func test_When_we_call_a_method_that_we_have_stubbed_to_return_a_node(): - describe("When we call a method that we have stubbed to return a node") - - var node: Node = Node.new() - director.method("add").stub(node) - - asserts.is_equal(node, director.double().add(2, 2), "Then it returns that same node") - node.free() - -func test_When_we_call_a_method_that_we_are_spying_on(): - # Add a not-called version? - describe("When we call a method that we are spying on") - - director.method("add").spy() - director.double().add(2, 2) - - asserts.was_called(director, "add", "Then we can see that it was called at least once") - -func test_When_we_pass_arguments_to_a_method_call_that_we_are_spying_on(): - describe("When we pass arguments to a method call that we are spying on") - - director.method("add").spy() - director.double().add(10, 10) - - asserts.was_called_with_arguments(director, "add", [10, 10], "Then we can see that it was called with those arguments") - -func test_When_we_call_a_method_that_was_stubbed_to_return_different_values_based_on_argument_patterns(): - describe("When we call a method that was stubbed to return different values based on argument patterns") - - director.method("add").stub(100).stub(1000, [1, 1]) - var double = director.double() - - asserts.is_equal(100, double.add(2, 2), "Then it returns the default stubbed value when the arguments don't match any pattern") - asserts.is_equal(1000, double.add(1, 1), "Then it returns the the corresponding value to the pattern the arguments matched") - -func test_When_we_call_a_method_that_was_stubbed_with_an_argument_pattern_that_includes_a_non_primitive_object(): - describe("When we call a method that was stubbed with an argument pattern that includes a non-primitive object") - - var non_primitive_object: Node = Node.new() - director.method("add").stub(9999, [0, non_primitive_object]) - - asserts.is_equal(9999, director.double().add(0, non_primitive_object), "Then it returns the corresponding value when the pattern matches") - non_primitive_object.free() - -func test_When_we_call_a_method_that_was_stubbed_with_a_partial_argument_pattern(): - describe("When we call a method that was stubbed with a partial (ie using any()) argument pattern") - - director.method("add").stub(9999, [10, any()]) - - asserts.is_equal(9999, director.double().add(10, 42), "Then it returns the corresponding value when the partial pattern matches") - -func test_When_we_call_a_method_that_we_stubbed_to_call_its_super_implementation_by_default(): - describe("When we call a method that we stubbed to call its super implementation by default") - - director.method("add").call_super() - director.method("add").stub(9999, [10, 10]) - var double = director.double() - - asserts.is_equal(4, double.add(2, 2), "Then it calls its super implementation by default") - asserts.is_equal(9999, double.add(10, 10), \ - "Then it does not call its super implementation when arguments patterns match a different return value") - -func test_When_we_add_a_doubled_inner_class_to_it(): - describe("When we add an doubled inner class to it") - - var inner = direct.script("res://OldExamples/Scripts/calculator.gd") - director.add_inner_class(inner, "Algebra") - - asserts.is_equal(TAU, director.double().Algebra.get_tau(), "Then we can call the static methods of that inner double") - -# TODO -func test_When_we_stub_a_method_of_a_double_inner_class(): - describe("When we stub a method of a doubled inner class") - - director = direct.script("res://OldExamples/Scripts/calculator.gd", "Algebra") - director.method("scale").dummy() - - asserts.is_null(director.double().scale(0, 0), "Then we get the stubbed value back") - -func test_When_we_double_an_inner_class() -> void: - describe("When we double an inner class") - - var inner = direct.script("res://OldExamples/Scripts/calculator.gd", "Algebra") - var double = inner.double() - asserts.is_Vector2(double.scale(Vector2(1, 1), 1), "Then we can call methods on it") - -func test_When_we_stubbed_a_keyword_method_by_passing_in_the_correct_keyword(): - describe("When we stubbed a keyworded method by passing in the correct keyword") - - director.method("pi", director.STATIC).stub(true, []) - - asserts.is_equal(director.double().pi(), true, "Then we can call it") - -func test_When_we_pass_in_deps_on_double() -> void: - describe("When we pass in dependecies on double") - - director = direct.script("res://OldExamples/Scripts/user.gd") - var double = director.double(["Jackie"]) - - asserts.is_equal(double.username, "Jackie", "Then we can double the object successfully") - -func test_When_we_pass_in_deps_on_direct() -> void: - describe("When we pass in dependecies on direct") - - director = direct.script("res://OldExamples/Scripts/user.gd", "", ["Jackie"]) - var double = director.double() - - asserts.is_equal(double.username, "Jackie", "Then we can double the object successfully") - -func test_When_we_pass_a_funcref_as_a_subcall(): - describe("When we pass a funcref as a subcall") - - director = direct.script(load("res://OldExamples/Scripts/calculator.gd")) - var callable: FuncRef = funcref(self, "set_sum") - director.method("add").subcall(callable) - var double = director.double() - double.add(10, 5) - asserts.is_equal(double._sum, 99, "Then it affects the state of the double") - -func test_When_we_pass_a_funcref_as_a_subcall_that_returns_a_value(): - describe("When we pass a funcref as a subcall that returns") - - director = direct.script(load("res://OldExamples/Scripts/calculator.gd")) - var callable: FuncRef = funcref(self, "set_sum") - var returns_value: bool = true - director.method("add").subcall(callable, returns_value) - asserts.is_equal(director.double().add(10, 5), 99, "Then it returns a value") - -func test_When_we_pass_an_object_with_callfunc_method_as_a_subcall(): - describe("When we pass an Object with a call_func function") - - director = direct.script(load("res://OldExamples/Scripts/calculator.gd")) - var callable: Object = Callable.new() - var returns_value: bool = true - director.method("add").subcall(callable, returns_value) - asserts.is_equal([10, 5], director.double().add(10, 5), "Then it returns a value") - -class Callable: - var arguments: Array = [] - - func call_func(_object: Object, args: Array): - arguments = args - return args - -func set_sum(object, _args: Array = []) -> int: - object._sum = 99 - return object._sum diff --git a/tests/bootstrap/integration/on_floor.test.gd b/tests/bootstrap/integration/on_floor.test.gd deleted file mode 100644 index cc5c16f6..00000000 --- a/tests/bootstrap/integration/on_floor.test.gd +++ /dev/null @@ -1,32 +0,0 @@ -extends WAT.Test - -func title() -> String: - return "Given is_on_floor" - -func test_stubbing_is_on_floor_method_from_user_defined_class() -> void: - describe("From a user-defined script") - - var bodydirector = direct.script("res://OldExamples/Scripts/body.gd") - bodydirector.method("is_on_floor").stub(true) - var bodydouble = bodydirector.double() - - asserts.is_true(bodydouble.is_on_floor(), "Then it can be stubbed") - -func test_stubbing_is_on_floor_method_from_builtin_class2() -> void: - describe("From a built-in KinematicBody2D2") - - var bodydirector = direct.script("KinematicBody2D") - bodydirector.method("is_on_floor").stub(true) - var bodydouble = bodydirector.double() - - asserts.is_true(bodydouble.is_on_floor(), "Then it can be stubbed") - -func test_stubbing_is_on_floor_as_child_node_with_no_script() -> void: - describe("From a child node of a scene without scripts") - - var bodydirector = direct.scene("res://OldExamples/Scene/NoScriptScene.tscn") - bodydirector.get_node("KinematicBody2D").method("is_on_floor").stub(true) - var bodydouble = bodydirector.double() - - asserts.is_true(bodydouble.get_node("KinematicBody2D").is_on_floor(), \ - "Then it can be stubbed") diff --git a/tests/bootstrap/integration/property_member.gd b/tests/bootstrap/integration/property_member.gd deleted file mode 100644 index 8f7310e0..00000000 --- a/tests/bootstrap/integration/property_member.gd +++ /dev/null @@ -1,19 +0,0 @@ -# Test -extends WAT.Test - -func title() -> String: - return "Property Member Test" - -func test_double_scene_exported_values_StringPath() -> void: - describe("When we double a scene via path with exported values") - var director = direct.scene("res://OldExamples/Test.tscn") - var double = director.double() - asserts.is_equal(double.age, 5, "Then their value is equal to the exported value") - -func test_double_scene_exported_values_PackedScene() -> void: - describe("When we double a scene via PackedScene with exported values") - var scene: PackedScene = preload("res://OldExamples/Test.tscn") - var director = direct.scene(scene) - var double = director.double() - asserts.is_equal(double.age, 5, "Then their value is equal to the exported value") - diff --git a/tests/bootstrap/integration/resourcex.test.gd b/tests/bootstrap/integration/resourcex.test.gd deleted file mode 100644 index 372c40c7..00000000 --- a/tests/bootstrap/integration/resourcex.test.gd +++ /dev/null @@ -1,23 +0,0 @@ -extends WAT.Test - -# Load Resource -# It Has Tags -# Save Resource elsewhere -# Remove original resource -# Is the new path updated? - -# We likely only need to update the files when they're moved (and only because -# ..they store important tag metadata). All other elements can just force an update.. -# ..with that said we only need to flag the update, we don't need to change anything.. -# ..until we open the menu for the time since the update -# so fileremoved, foldermoved, folderremoved, resourcesaved we just flag -# ..whereas with file moved, we update - -func test_deleted_resource_has_no_res_path() -> void: - var resource: Resource = Resource.new() - var _err: int = ResourceSaver.save("res://test.tres", resource) - yield(get_tree(), "idle_frame") - var source: String = "res://test.tres" - var _errx: int = Directory.new().remove(source) - asserts.is_equal(resource.resource_path, "", - "A deleted resource has no resource_path") diff --git a/tests/bootstrap/integration/scene_director.test.gd b/tests/bootstrap/integration/scene_director.test.gd deleted file mode 100644 index b4b38aa4..00000000 --- a/tests/bootstrap/integration/scene_director.test.gd +++ /dev/null @@ -1,46 +0,0 @@ -extends WAT.Test - -const x = preload("res://OldExamples/Control.tscn") -var director - -func title(): - return "Given a Scene Director" - -func pre(): - director = direct.scene("res://OldExamples/Scene/Main.tscn") - var _d = direct.scene(x) - -func test_When_we_create_two_of_it_for_the_same_scene(): - describe("When we create two of it for the same scene") - - var director_b = direct.scene("res://OldExamples/Scene/Main.tscn") - - asserts.is_not_equal(director.nodes, director_b.nodes, "Then they do not share resources") - -func test_When_we_call_a_method_from_the_root_node_that_we_stubbed(): - describe("When we call a method from the root node that we stubbed") - - director.get_node(".").method("test").stub(9999) - var double = director.double() - asserts.is_equal(9999, double.get_node(".").test(), "Then we get the stubbed return value") -# -func test_When_we_call_a_method_from_a_child_node_that_we_stubbed(): - describe("When we call a method from a child node that we stubbed") - - director.get_node("A").method("execute").stub(999) - - asserts.is_equal(999, director.double().get_node("A").execute(), "Then we get the stubbed return value") - -func test_When_we_call_a_method_from_a_grandchild_node_that_we_stubbed(): - describe("When we call a method from a grandchild node that we stubbed") - - director.get_node("C/D").method("wowsers").stub(99) - - asserts.is_equal(99, director.double().get_node("C/D").wowsers(), "Then we get the stubbed return value") - -func test_When_we_add_it_to_the_tree_it_runs(): - describe("When we add it to the tree it runs") - - var double = director.double() - asserts.is_equal(double.path, @"A", "We have the correct NodePath Set") - add_child(double) diff --git a/tests/bootstrap/integration/script_director.test.gd b/tests/bootstrap/integration/script_director.test.gd deleted file mode 100644 index 7d7b90b4..00000000 --- a/tests/bootstrap/integration/script_director.test.gd +++ /dev/null @@ -1,39 +0,0 @@ -extends WAT.Test - -var director - -func title(): - return "Given a Script Director" - -func pre(): - director = direct.script("res://OldExamples/Scripts/calculator.gd") - -func test_When_we_create_two_of_it_for_the_same_script(): - describe("When we create two of it for the same script") - - var director_b = direct.script("res://OldExamples/Scripts/calculator.gd") - - asserts.is_not_equal(director.base_methods, director_b.base_methods, "Then they do not share resources") - -func test_When_we_call_double_a_second_time_on(): - describe("When we call the double the second time") - - var silence_error: bool = false - var double = director.double() - var double_again = director.double([], silence_error) - asserts.is_equal(double, double_again, "Then we get the same double back") - -func test_from_name() -> void: - var d = direct.script(MyClass) - var dbl = d.double() - asserts.is_class_instance(dbl, MyClass) - -func test_When_we_double_an_inner_class(): - describe("When we double an inner class") - - var Algebra = load("res://OldExamples/Scripts/calculator.gd").Algebra - director = direct.script("res://OldExamples/Scripts/calculator.gd", "Algebra") - - asserts.is_class_instance(director.double(), Algebra, "Then we get that inner class back") - - diff --git a/tests/bootstrap/metadata.json b/tests/bootstrap/metadata.json deleted file mode 100644 index 19545c6b..00000000 --- a/tests/bootstrap/metadata.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "Async": [ - "res://tests/small/boolean.test.gd", - "res://tests/async/watcher.test.gd" - ], - "Fast": [ - "res://tests/async/watcher.test.gd" - ], - "Linux": [ - "res://tests/async/watcher.test.gd" - ], - "Windows": [ - "res://tests/small/boolean.test.gd", - "res://tests/mono/BasicCSharpTest.cs" - ], - "failed": [ - - ] -} \ No newline at end of file diff --git a/tests/bootstrap/mono/AttributeTest.cs b/tests/bootstrap/mono/AttributeTest.cs deleted file mode 100644 index 96ecd720..00000000 --- a/tests/bootstrap/mono/AttributeTest.cs +++ /dev/null @@ -1,41 +0,0 @@ -using System; -using Godot; - -[Start(nameof(StartX))] -[Pre(nameof(PreX))] -[Post(nameof(Post))] -[End(nameof(End))] -public class AttributeTest : WAT.Test -{ - private bool _calledStart = false; - private bool _calledPre = false; - public void StartX() - { - Console.WriteLine("Calling Start X in Non Yield"); - _calledStart = true; - } - - public void PreX() - { - Console.WriteLine("Calling Pre Y"); - _calledPre = true; - } - - [Test] - public void SimpleTest() - { - Assert.IsTrue(_calledStart, "Start was called"); - Assert.IsTrue(_calledPre, "Pre was called"); - } - - public void Post() - { - Console.WriteLine("Post Called"); - } - - public void End() - { - Console.WriteLine("End Called"); - } - -} diff --git a/tests/bootstrap/mono/AttributeYieldTest.cs b/tests/bootstrap/mono/AttributeYieldTest.cs deleted file mode 100644 index 5d06b621..00000000 --- a/tests/bootstrap/mono/AttributeYieldTest.cs +++ /dev/null @@ -1,47 +0,0 @@ -using System; -using System.Threading.Tasks; - -[Start(nameof(StartX))] -[Pre(nameof(PreX))] -[Post(nameof(Post))] -[End(nameof(End))] -public class AttributeYieldTest : WAT.Test -{ - private bool _calledStart = false; - private bool _calledPre = false; - public async Task StartX() - { - Console.WriteLine("Yolo!"); - await UntilTimeout(0.2); - Console.WriteLine("Calling Start X in Yield Test"); - _calledStart = true; - } - - public async Task PreX() - { - await UntilTimeout(0.2); - Console.WriteLine("Calling Pre Y in Yield Test"); - _calledPre = true; - } - - [Test] - public async Task SimpleTest() - { - await UntilTimeout(0.2); - Assert.IsTrue(_calledStart, "Start was called in Yield Test"); - Assert.IsTrue(_calledPre, "Pre was called in Yield Test"); - } - - public async Task Post() - { - await UntilTimeout(0.2); - Console.WriteLine("Post Called in Yield Test"); - } - - public async Task End() - { - await UntilTimeout(0.2); - Console.WriteLine("End Called in Yield Test"); - } - -} diff --git a/tests/bootstrap/mono/BasicCSharpTest.cs b/tests/bootstrap/mono/BasicCSharpTest.cs deleted file mode 100644 index a517ae17..00000000 --- a/tests/bootstrap/mono/BasicCSharpTest.cs +++ /dev/null @@ -1,17 +0,0 @@ -using Godot; -using System; - -public class BasicCSharpTest : WAT.Test -{ - [Test] - public void CSharpTestsWorking() - { - Assert.IsTrue(true); - } - - [Test] - public void CSXharpTestsWorking() - { - Assert.IsTrue(true); - } -} diff --git a/tests/bootstrap/mono/BooleanTest.cs b/tests/bootstrap/mono/BooleanTest.cs deleted file mode 100644 index 83fdb952..00000000 --- a/tests/bootstrap/mono/BooleanTest.cs +++ /dev/null @@ -1,20 +0,0 @@ - using Godot; -using System; - - [Title("Given A Boolean Assertion")] -public class BooleanTest : WAT.Test -{ - [Test] - public void TrueIsTrue() - { - Describe("A Tautology"); - Assert.IsTrue(true, "True is True"); - } - - [Test] - public void FalseIsFalse() - { - Assert.IsFalse(false, "False is False"); - } - -} diff --git a/tests/bootstrap/mono/ExceptionTests.cs b/tests/bootstrap/mono/ExceptionTests.cs deleted file mode 100644 index 7ca21f39..00000000 --- a/tests/bootstrap/mono/ExceptionTests.cs +++ /dev/null @@ -1,44 +0,0 @@ -using System; -using System.IO; - -namespace WAT -{ - public class ExceptionTests: WAT.Test - { - [Test] - public void AnExceptionWasThrown() - { - void Function() => throw new NullReferenceException("Null Message"); - Assert.Throws(Function, "Threw an exception"); - } - - [Test] - public void AnExceptionWasNotThrown() - { - void Function() {} - Assert.DoesNotThrow(Function, "Did not throw a exception"); - } - - [Test] - public void AnExceptionOfNullReferenceWasThrown() - { - void Function() { throw new NullReferenceException("Null Message"); } - Assert.Throws(Function, "Threw a null reference exception"); - } - - [Test] - public void AnExceptionOfNullReferenceWasNotThrown() - { - void Function() { throw new FileNotFoundException("Null Message"); } - Assert.DoesNotThrow(Function, "Did not throw a null reference"); - } - - [Test] - public void AnExceptionOfTypeWasNotThrown() - { - void Function() { } - Assert.DoesNotThrow(Function, "Did not throw a an exception of any type"); - } - - } -} \ No newline at end of file diff --git a/tests/bootstrap/mono/IsInstanceTest.cs b/tests/bootstrap/mono/IsInstanceTest.cs deleted file mode 100644 index da0bab5d..00000000 --- a/tests/bootstrap/mono/IsInstanceTest.cs +++ /dev/null @@ -1,129 +0,0 @@ -using Godot; -using System; -using Godot.Collections; -using Array = System.Array; - -[Title("Is Instance ( class / type ) Assertions")] -public class IsInstanceTest : WAT.Test -{ - [Test] - public void IsAABB() - { - Assert.IsType(new AABB()); - } - - [Test] - public void IsArray() - { - Godot.Collections.Array array = new Godot.Collections.Array(); - Assert.IsType(array); - } - - [Test] - public void IsBasis() - { - Assert.IsType(new Basis()); - } - - [Test] - public void IsBool() - { - Assert.IsType(true); - } - - [Test] - public void IsColor() - { - Assert.IsType(new Color()); - } - - [Test] - public void IsDictionary() - { - Godot.Collections.Dictionary dictionary = new Godot.Collections.Dictionary(); - Assert.IsType(dictionary); - } - - [Test] - public void IsFloat() - { - Assert.IsType(3.0F); - } - - [Test] - public void IsInt() - { - Assert.IsType(1); - } - - [Test] - public void IsNodePath() - { - NodePath nodepath = new NodePath(); - Assert.IsType(nodepath); - } - - [Test] - public void IsObject() - { - Node N = new Node(); - Assert.IsType(N); - N.Free(); - } - - [Test] - public void IsPlane() - { - Plane Plain = new Plane(); - Assert.IsType(Plain); - } - - [Test] - public void IsQuat() - { - Assert.IsType(new Quat()); - } - - [Test] - public void IsRect2() - { - Assert.IsType(new Rect2()); - } - - [Test] - public void IsRid() - { - Assert.IsType(new RID(this)); - } - - [Test] - public void IsString() - { - Assert.IsType("strs"); - } - - - [Test] - public void IsTransform() - { - Assert.IsType(new Transform()); - } - - [Test] - public void IsTransform2D() - { - Assert.IsType(new Transform2D()); - } - - [Test] - public void IsVector2() - { - Assert.IsType(new Vector2()); - } - - [Test] - public void IsVector3() - { - Assert.IsType(new Vector3()); - } -} diff --git a/tests/bootstrap/mono/IsNotInstanceTest.cs b/tests/bootstrap/mono/IsNotInstanceTest.cs deleted file mode 100644 index d94efeef..00000000 --- a/tests/bootstrap/mono/IsNotInstanceTest.cs +++ /dev/null @@ -1,122 +0,0 @@ -using Godot; -using System; -using Godot.Collections; -using Array = System.Array; - -[Title("IsNotInstanceTest")] -public class IsNotInstanceTest : WAT.Test -{ - [Test] - public void IsNotAABB() - { - Assert.IsNotType(null); - } - - [Test] - public void IsNotArray() - { - Assert.IsNotType(null); - } - - [Test] - public void IsNotBasis() - { - Assert.IsNotType(null); - } - - [Test] - public void IsNotBool() - { - Assert.IsNotType(null); - } - - [Test] - public void IsNotColor() - { - Assert.IsNotType(null); - } - - [Test] - public void IsNotDictionary() - { - Assert.IsNotType(null); - } - - [Test] - public void IsNotFloat() - { - Assert.IsNotType(null); - } - - [Test] - public void IsNotInt() - { - Assert.IsNotType(null); - } - - [Test] - public void IsNotNodePath() - { - Assert.IsNotType(null); - } - - [Test] - public void IsNotObject() - { - Assert.IsNotType(null); - } - - [Test] - public void IsNotPlane() - { - Assert.IsNotType(null); - } - - [Test] - public void IsNotQuat() - { - Assert.IsNotType(null); - } - - [Test] - public void IsNotRect2() - { - Assert.IsNotType(null); - } - - [Test] - public void IsNotRID() - { - Assert.IsNotType(null); - } - - [Test] - public void IsNotString() - { - Assert.IsNotType(null); - } - - [Test] - public void IsNotTransform() - { - Assert.IsNotType(null); - } - - [Test] - public void IsNotTransform2D() - { - Assert.IsNotType(null); - } - - [Test] - public void IsNotVector2() - { - Assert.IsNotType(null); - } - - [Test] - public void IsNotVector3() - { - Assert.IsNotType(null); - } -} diff --git a/tests/bootstrap/mono/MyTest.cs b/tests/bootstrap/mono/MyTest.cs deleted file mode 100644 index 671032e2..00000000 --- a/tests/bootstrap/mono/MyTest.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Godot; -using System; - -public class MyTest : WAT.Test -{ - [Test] - public void AutoPass() - { - Assert.AutoPass("Auto Pass C#"); - } -} diff --git a/tests/bootstrap/mono/NullChecksTest.cs b/tests/bootstrap/mono/NullChecksTest.cs deleted file mode 100644 index ea1fe813..00000000 --- a/tests/bootstrap/mono/NullChecksTest.cs +++ /dev/null @@ -1,19 +0,0 @@ -using Godot; - -public class NullChecksTest: WAT.Test -{ - [Test] - public void NullChecks() - { - Node node = new Node(); - Assert.IsNotNull(node); - node.Free(); - } - - [Test] - public void NullChecks2() - { - Assert.IsNull(null); - } - -} diff --git a/tests/bootstrap/mono/ObjectTest.cs b/tests/bootstrap/mono/ObjectTest.cs deleted file mode 100644 index a53672f1..00000000 --- a/tests/bootstrap/mono/ObjectTest.cs +++ /dev/null @@ -1,132 +0,0 @@ -using Godot; -using System; - -[Title("Object Assertions")] -public class ObjectTest : WAT.Test -{ - - [Test] - public void WhenCallingIsValidInstance() - { - Describe("When calling IsInstanceValid(node)"); - - Node node = new Node(); - Assert.IsValidInstance(node, "Then it passes"); - node.Free(); - } - - [Test] - public void WhenCallingIsNotValidInstance() - { - Describe("When calling IsInstanceValid(freed node)"); - - Node node = new Node(); - node.Free(); - Assert.IsNotValidInstance(node, "Then it passes"); - } - - [Test] - public void WhenCallingHasMetaAfterAddingMetadata() - { - SetMeta("Dummy", 1); - Assert.ObjectHasMeta(this, "Dummy", "Then it passes"); - RemoveMeta("Dummy"); - } - - [Test] - public void WhenCallingDoesNotHaveMeta() - { - Assert.ObjectDoesNotHaveMeta(this, "bad_meta", "Then it passes"); - } - - [Test] - public void WhenCallingDoesNotHaveMetalRealKeyButNullValue() - { - SetMeta("Confusing", null); - Assert.ObjectDoesNotHaveMeta(this, "Confusing", "Then it passes"); - } - - [Test] - public void WhenCallingHasMethodTitle() - { - Assert.ObjectHasMethod(this, "Title", "Then it passes"); - } - - [Test] - public void WhenCallingDoesNotHaveMethodFalseMethod() - { - Assert.ObjectDoesNotHaveMethod(this, "FalseMethod", "Then it passes"); - } - - [Test] - public void WhenCallingHasUserSignalAfterAddingASignal() - { - AddUserSignal("DummySignal"); - Assert.ObjectHasUserSignal(this, "DummySignal", "Then it passes"); - } - - [Test] - public void WhenCallingDoesNotHaveUserSignal() - { - Assert.ObjectDoesNotHaveUserSignal(this, "FalseSignal", "Then it passes"); - } - - [Signal] - delegate void BuiltinDummy(); - - [Test] - public void WhenCallingDoesNotHaveUserSignalWithClassSignalConstant() - { - Assert.ObjectDoesNotHaveUserSignal(this, "BuiltinDummy", "Then it passes"); - } - - [Test] - public void WhenCallingObjectIsQueuedForDeletionAfterCallingQueueFree() - { - Node N = new Node(); - N.QueueFree(); - Assert.ObjectIsQueuedForDeletion(N, "Then it passes"); - } - - [Test] - public void WhenCallingObjectIsNotQueuedForDeletionAfterNotCallingQueueFree() - { - Node N = new Node(); - Assert.ObjectIsNotQueuedForDeletion(N, "Then it passes"); - N.Free(); - } - - [Test] - public void WhenCallingObjIsConnectedWithARealConnection() - { - Connect("BuiltinDummy", this, "GetTitle"); - Assert.ObjectIsConnected(this, "BuiltinDummy", this, "GetTitle", "Then it passes"); - Disconnect("BuiltinDummy", this, "GetTitle"); - } - - [Test] - public void WhenCallingObjIsNotConnectedWithAnInvalidConnection() - { - Assert.ObjectIsNotConnected(this, "BuiltinDummy", this, "GetTitle", "Then it passes"); - } - - [Test] - public void TestIsBlockingSignals() - { - Node N = new Node(); - N.SetBlockSignals(true); - Assert.ObjectIsBlockingSignals(N, "Then it passes"); - N.Free(); - } - - [Test] - public void IsNotBlockingSignals() - { - Node N = new Node(); - N.SetBlockSignals(false); - Assert.ObjectIsNotBlockingSignals(N, "Then it passes"); - N.Free(); - } - -} - diff --git a/tests/bootstrap/mono/RangeTest.cs b/tests/bootstrap/mono/RangeTest.cs deleted file mode 100644 index c3c01576..00000000 --- a/tests/bootstrap/mono/RangeTest.cs +++ /dev/null @@ -1,24 +0,0 @@ -using Godot; -using System; - -[Title("Range Assertions")] -public class RangeTest : WAT.Test -{ - [Test] - public void WhenCallingIsInRange() - { - const int val = 0; - const int low = 0; - const int high = 10; - Assert.IsInRange(val, low, high, "Then it passes"); - } - - [Test] - public void WhenCallingIsNotInRange() - { - const int val = 10; - const int low = 0; - const int high = 10; - Assert.IsNotInRange(val, low, high, "Then it passes"); - } -} diff --git a/tests/bootstrap/mono/RepeatTests.cs b/tests/bootstrap/mono/RepeatTests.cs deleted file mode 100644 index f72d2259..00000000 --- a/tests/bootstrap/mono/RepeatTests.cs +++ /dev/null @@ -1,31 +0,0 @@ - -using Godot.Collections; - -public class RepeatTests: WAT.Test -{ - [Test] - public void SimpleTest() - { - Assert.IsTrue(true, "Single Test Ran"); - } - [Test(4, 4, 8)] - [Test(5, 5, 10)] - public void AdditionTest(int addend, int augend, int sum) - { - Assert.IsEqual(addend + augend, sum, $"{addend} + {augend} is equal to {sum}"); - } - - // If your method takes parameters, you need to pass the same count of objects here - // If your method takes any amount of arguments, you must pass them in as an array - // If your method takes one single string argument, you will need to make the object array explicit - // If your method takes a description and arguments, then args must be explicit - // If your method takes or starts with a non-string argument, it is considered to be a method argument first - [Test("This is a description", new object[2]{null, null})] - [Test("This is not a description", "That was not a description")] - [Test(args: new object[] {"This single args is not a description", "This other arg is not a description"})] - public void StringAttributeTest(string a = null, object b = null) - { - Assert.IsTrue(true); - } - -} diff --git a/tests/bootstrap/mono/SimpleTest.cs b/tests/bootstrap/mono/SimpleTest.cs deleted file mode 100644 index 1367c329..00000000 --- a/tests/bootstrap/mono/SimpleTest.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Godot; -using System; - -public class SimpleTest: WAT.Test -{ - [Test] - public void IsTrue() - { - Assert.IsTrue(true, "true is true"); - } -} diff --git a/tests/bootstrap/mono/StringTest.cs b/tests/bootstrap/mono/StringTest.cs deleted file mode 100644 index 2fb1487b..00000000 --- a/tests/bootstrap/mono/StringTest.cs +++ /dev/null @@ -1,57 +0,0 @@ -using Godot; -using System; - -[Title("Given A String Assertion")] -public class StringTest : WAT.Test -{ - - [Test] - public void WhenCallingStringBeginWith() - { - const string prefix = "lorem"; - const string str = "lorem impsum"; - - Assert.StringBeginsWith(prefix, str, "Then it passes"); - } - - [Test] - public void WhenCallingStringDoesNotBeginWith() - { - const string prefix = "bleh lorem"; - const string str = "impsum"; - - Assert.StringDoesNotBeginWith(prefix, str, "Then it passes"); - } - - [Test] - public void WhenCallingStringContains() - { - const string contents = "em im"; - const string str = "lorem impsum"; - Assert.StringContains(contents, str, "Then it passes"); - } - - [Test] - public void WhenCallingStringDoesNotContain() - { - const string contents = "beem im"; - const string str = "impsum"; - Assert.StringDoesNotContain(contents, str, "Then it passes"); - } - - [Test] - public void WhenCallingStringEndsWith() - { - const string postfix = "impsum"; - const string str = "lorem impsum"; - Assert.StringEndsWith(postfix, str, "Then it passes"); - } - - [Test] - public void WhenCallingStringDoesNotEndWith() - { - const string postfix = "lorem"; - const string str = "impsum"; - Assert.StringDoesNotEndWith(postfix, str, "Then it passes"); - } -} diff --git a/tests/bootstrap/mono/UntilEvent.cs b/tests/bootstrap/mono/UntilEvent.cs deleted file mode 100644 index d3834d4f..00000000 --- a/tests/bootstrap/mono/UntilEvent.cs +++ /dev/null @@ -1,95 +0,0 @@ -using System; -using System.Threading.Tasks; - -namespace WAT -{ - public class UntilEvent: WAT.Test - { - // This should really work with any delegate that matches method(sender), method(sender, args) or method(sender, customargs) - public event EventHandler Event; - public event EventHandler EventWithArguments; - public event EventHandler EventWithCustomArguments; - - [Test()] - public async Task EventReached() - { - Watch(this, "EventRaised"); - CallDeferred("InvokeEvent"); - TestEventData eventData = await UntilEvent(this, nameof(Event), 10.0); - Assert.IsEqual(eventData.Sender, this, "This test invoked Event"); - Assert.SignalWasEmitted(this, "EventRaised", "EventRaised Emitted"); - UnWatch(this, "EventRaised"); - } - - [Test()] - public async Task EventTimedOut() - { - Watch(this, "EventRaised"); - TestEventData eventData = await UntilEvent(this, nameof(Event), 0.5); - Assert.IsTrue(eventData.Sender is null, "Event data has no sender (because it was never invoked)"); - Assert.SignalWasNotEmitted(this, "EventRaised", "EventRaised was not Emitted"); - UnWatch(this, "EventRaised"); - } - - [Test()] - public async Task EventWithArgsReached() - { - Watch(this, "EventRaised"); - CallDeferred("InvokeEventWithEventArgs"); - TestEventData eventData = await UntilEvent(this, nameof(EventWithArguments), 10.0); - Assert.IsEqual(eventData.Sender, this, "This test invoked EventWithEventArgs"); - Assert.SignalWasEmitted(this, "EventRaised", "EventRaised Emitted"); - UnWatch(this, "EventRaised"); - } - - [Test()] - public async Task EventWithArgsTimedOut() - { - Watch(this, "EventRaised"); - TestEventData eventData = await UntilEvent(this, nameof(EventWithArguments), 0.5); - Assert.IsTrue(eventData.Sender is null, "Event data has no sender (because it was never invoked)"); - Assert.SignalWasNotEmitted(this, "EventRaised", "EventRaised was not Emitted"); - UnWatch(this, "EventRaised"); - } - - [Test()] - public async Task EventWithCustomArgsReached() - { - Watch(this, "EventRaised"); - CallDeferred("InvokeEventWithCustomArgs", 10, "hello", true); - TestEventData eventData = await UntilEvent(this, nameof(EventWithCustomArguments), 10.0); - Assert.IsEqual(eventData.Sender, this, "This test invoked EventWithEventArgs"); - Assert.SignalWasEmitted(this, "EventRaised", "EventRaised Emitted"); - Assert.IsType(eventData.Arguments, "Args are Custom Event Args"); - UnWatch(this, "EventRaised"); - } - - [Test()] - public async Task EventWithCustomArgsTimedOut() - { - Watch(this, "EventRaised"); - TestEventData eventData = await UntilEvent(this, nameof(EventWithCustomArguments), 0.5); - Assert.IsTrue(eventData.Sender is null, "Event data has no sender (because it was never invoked)"); - Assert.SignalWasNotEmitted(this, "EventRaised", "EventRaised Was Not Emitted"); - UnWatch(this, "EventRaised"); - } - - private void InvokeEvent() { Event?.Invoke(this, null); } - private void InvokeEventWithEventArgs() { EventWithArguments?.Invoke(this, new EventArgs()); } - private void InvokeEventWithCustomArgs(int a, string b, bool c) { EventWithCustomArguments?.Invoke(this, new CustomEventArgs(a, b, c)); } - } - - public class CustomEventArgs: EventArgs - { - public int A { get; } - public string B { get; } - public bool C { get; } - - public CustomEventArgs(int a, string b, bool c) - { - A = a; - B = b; - C = c; - } - } -} diff --git a/tests/bootstrap/mono/WatcherTest.cs b/tests/bootstrap/mono/WatcherTest.cs deleted file mode 100644 index b1bc253f..00000000 --- a/tests/bootstrap/mono/WatcherTest.cs +++ /dev/null @@ -1,72 +0,0 @@ -using Godot; -using System; -using GDArray = Godot.Collections.Array; - -// BEGIN NOTE - UNWATCHING -// To avoid argument-based conflicts when you emit the same signal with different argument counts -// you should use unwatch(emitter, signal) in your post methods (or after asserts in your test method) -// you may even want to use it inbetween asserts if necessary when testing a signal multiple times -// END NOTE - -// BEGIN NOTE - BOUNDED VARIABLES -// We currently cannot track bound arguments. -// END NOTE -[Title("Given A Signal Watcher")] -[Start(nameof(Start))] -[Pre(nameof(Pre))] -[Post(nameof(Post))] -public class WatcherTest : WAT.Test -{ - public void Start() - { - // There is no RemoveUserSignal Method apparently. - AddUserSignal("Example"); - } - - public void Pre() - { - Watch(this, "Example"); - } - - public void Post() - { - UnWatch(this, "Example"); - } - - [Test] - public void WhenWeWatchASignalFromAnObjectWithNoBoundVariables() - { - EmitSignal("Example", 1, 20, 5); - GDArray args = new GDArray {1, 20, 5}; - Assert.SignalWasEmittedWithArguments(this, "Example", args, - "Then it captures any arguments that where passed when the signal was emitted"); - } - - [Test("When we watch and emit a signal xxx")] - public void WhenWeWatchAndEmitASignal(string description) - { - Describe(description); - EmitSignal("Example"); - Assert.SignalWasEmitted(this, "Example", "Then it captures the emitted signal"); - - } - - [Test("When we watch and do not emit a signal xxxx")] - public void WhenWeWatchAndDoNotEmitASignal(string description) - { - Describe(description); - Assert.SignalWasNotEmitted(this, "Example", "Then it does not capture the non-emitted signal"); - } - - [Test] - public void WhenWeWatchASignalAndEmitItMultipleTimes() - { - AddUserSignal("Multiple"); - Watch(this, "Multiple"); - EmitSignal("Multiple"); - EmitSignal("Multiple"); - const int emitCount = 2; - Assert.SignalWasEmittedXTimes(this, "Multiple", emitCount, - "Then we can track how many times we emitted it"); - } -} diff --git a/tests/bootstrap/mono/YieldTest.cs b/tests/bootstrap/mono/YieldTest.cs deleted file mode 100644 index d9478dc8..00000000 --- a/tests/bootstrap/mono/YieldTest.cs +++ /dev/null @@ -1,125 +0,0 @@ -using Godot; -using System; -using System.Threading.Tasks; -using GodotArray = Godot.Collections.Array; -[Title( "Given a Yield")] -[Start(nameof(Start))] -[Pre(nameof(Pre))] -public class YieldTest : WAT.Test -{ - private static readonly GDScript LocalYielder = GD.Load("res://addons/WAT/test/yielder.gd"); - private bool a; - private bool b; - private bool c; - private bool d; - private bool e; - private bool f; - - [Signal] - public delegate void abc(); - - public async Task Start() - { - await UntilTimeout(3); - a = true; - await UntilTimeout(3); - b = true; - } - - public async Task Pre() - { - await UntilTimeout(0.1); - c = true; - await UntilTimeout(0.1); - d = true; - await UntilTimeout(0.1); - } - - [Test] - public void WhenWeYieldInStart() - { - Assert.IsTrue(a, "Then we set var a to true"); - Assert.IsTrue(b, "Then we set var b to true"); - } - - [Test] - public void WhenWeYieldInPre() - { - Assert.IsTrue(c, "Then we set var c to true"); - Assert.IsTrue(d, "Then we set var d to true"); - } - - [Test] - public async Task WhenWeYieldInExecute() - { - await UntilTimeout(0.1); - e = true; - await UntilTimeout(0.1); - f = true; - Assert.IsTrue(e, "Then we set var e to true"); - Assert.IsTrue(f, "Then we set var f to true"); - } - - [Test] - public async Task YielderIsNotActiveDuringAssertions() - { - await UntilTimeout(0.1); - Assert.IsTrue(! (bool) Yielder.Call("is_active")); - } - - [Test] - public async Task WhenASignalBeingYieldedOnIsEmittedTheYielderIsStopped() - { - CallDeferred("emit_signal", nameof(abc)); - await UntilSignal(this, nameof(abc), 0.3); - Assert.IsTrue( (bool) Yielder.Call("is_stopped"), "Then the yielder is stopped"); - } - - [Test] - public async Task WhenTheYielderIsFinishedSignalsAreDisconnected() - { - await UntilSignal(this, nameof(abc), 0.1); - Assert.IsTrue(!IsConnected(nameof(abc), Yielder, "_on_resume"), "Then the signal is disconnected"); - } - - [Test] - public void WhenWeCallUntilTimeout() - { - Timer yielder = (Timer) LocalYielder.New(); - AddChild(yielder); - yielder.Call("until_timeout", 1.0); - Assert.IsFalse((bool) yielder.Call("is_stopped"), "Then the yielder is not stopped"); - RemoveChild(yielder); - yielder.Free(); - } - - [Test] - public void WhenWeCallUntilSignal() - { - Timer yielder = (Timer) LocalYielder.New(); - AddChild(yielder); - yielder.Call("until_signal", 1.0, this, nameof(abc)); - Assert.IsFalse((bool) Yielder.Get("paused"), "Then the yielder is unpaused"); - Assert.IsTrue(IsConnected(nameof(abc), yielder, "_on_resume"), "Then our signal is connected to the yielder"); - RemoveChild(yielder); - yielder.Free(); - } - - [Test] - public async Task WhenTheYielderTimesOut() - { - await UntilTimeout(0.1); - Assert.IsTrue((bool) Yielder.Call("is_stopped"), "Then the yielder is stopped"); - } - - [Test] - public async Task WhenTheYielderHearsOurSignal() - { - CallDeferred("emit_signal", nameof(abc)); - await UntilSignal(this, nameof(abc), 0.1); - GD.Print(10); - Assert.IsTrue((bool) Yielder.Call("is_stopped"), "Then the yielder is stopped"); - Assert.IsTrue(!IsConnected(nameof(abc), Yielder, "_on_resume"), "Then our signal to the yielder is disconnected"); - GD.Print(11); - } -} diff --git a/tests/bootstrap/results.xml b/tests/bootstrap/results.xml deleted file mode 100644 index ad68ec9f..00000000 --- a/tests/bootstrap/results.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/tests/bootstrap/small/boolean.test.gd b/tests/bootstrap/small/boolean.test.gd deleted file mode 100644 index a08fc318..00000000 --- a/tests/bootstrap/small/boolean.test.gd +++ /dev/null @@ -1,27 +0,0 @@ -extends WAT.Test -#extends "res://addons/WAT/test/test.gd" - -func title(): - return "Given a Boolean Assertion" - -func test_when_calling_asserts_is_true(): - describe("When calling asserts.is_true(true)") - - asserts.is_true(true, "Then it passes") - -func test_when_calling_asserts_is_false(): - describe("When calling asserts.is_false(false)") - - asserts.is_false(false, "Then it passes") - - -### Only used sometimes -#func test_when_calling_asserts_is_true_after_10s(): -# describe("When a test runs for 10 seconds and then calls asserts.is_true(true)") -# -# OS.delay_msec(10000) -# asserts.is_true(true, "Then it passes") - -## Only used sometimes -#func test_intentional_failure(): -# asserts.is_false(true) diff --git a/tests/bootstrap/unit/assert_that.test.gd b/tests/bootstrap/unit/assert_that.test.gd deleted file mode 100644 index 1dbcd105..00000000 --- a/tests/bootstrap/unit/assert_that.test.gd +++ /dev/null @@ -1,12 +0,0 @@ -extends WAT.Test - -func test_assert_that(): - asserts.that(Obj.new(), "getValue", [], "Obj get value", "got true", "got false") - -func test_auto_pass(): - asserts.auto_pass("Auto Passing") - -class Obj: - - func getValue(): - return true diff --git a/tests/bootstrap/unit/equality.test.gd b/tests/bootstrap/unit/equality.test.gd deleted file mode 100644 index 5209109b..00000000 --- a/tests/bootstrap/unit/equality.test.gd +++ /dev/null @@ -1,39 +0,0 @@ -extends WAT.Test - -func title(): - return "Given an Equality Assertion" - -func test_when_calling_is_equal(): - describe("When calling asserts.is_equal(1, 1)") - - asserts.is_equal(1, 1, "Then it passes") - -func test_when_calling_is_greater_than(): - describe("When calling asserts.is_greater_than(2, 1)") - - asserts.is_greater_than(2, 1, "Then it passes") - -func test_when_calling_is_less_than(): - describe("When calling asserts.is_less_than(2, 1)") - - asserts.is_less_than(1, 2, "Then it passes") - -func test_when_calling_is_equal_or_greater_than(): - describe("When calling asserts.is_equal_or_greater_than(2, 1)") - - asserts.is_equal_or_greater_than(2, 1, "Then it passes") - -func test_when_calling_is_equal_or_greater_than_with_equal_values(): - describe("When calling asserts.is_equal_or_greater_than(1, 1)") - - asserts.is_equal_or_greater_than(1, 1, "Then it passes") - -func test_when_calling_is_equal_or_less_than_with_equal_values(): - describe("When calling asserts.is_equal_or_less_than(1, 1)") - - asserts.is_equal_or_less_than(1, 1, "Then it passes!") - -func test_when_calling_is_not_equal(): - describe("When callign asserts.is_not_equal(5, 6)") - - asserts.is_not_equal(5, 6, "Then it passes") diff --git a/tests/bootstrap/unit/file.test.gd b/tests/bootstrap/unit/file.test.gd deleted file mode 100644 index 24050b23..00000000 --- a/tests/bootstrap/unit/file.test.gd +++ /dev/null @@ -1,19 +0,0 @@ -extends WAT.Test - -func title() -> String: - return "Given A File Assertion" - -func test_when_calling_file_exists_when_file_is_self() -> void: - describe("When calling asserts.file_exists when the file is this suite") - - asserts.file_exists(get_script().resource_path, "Then it passes") - -func test_when_calling_file_does_not_exist_when_there_is_no_file() -> void: - describe("When calling asserts.file_does_not_exist when there is no file") - - asserts.file_does_not_exist("res://somefile.gd", "Then it passes") - -func test_when_calling_file_does_not_exist_when_path_is_empty() -> void: - describe("When calling asserts file does not exist when path is empty") - - asserts.file_does_not_exist("", "Then it passes") diff --git a/tests/bootstrap/unit/has.test.gd b/tests/bootstrap/unit/has.test.gd deleted file mode 100644 index 6caff81f..00000000 --- a/tests/bootstrap/unit/has.test.gd +++ /dev/null @@ -1,27 +0,0 @@ -extends WAT.Test - -# Collections need better assertions -func test_dict_has_key() -> void: - var d: Dictionary = {0: 10} - - asserts.has(0, d, "{0: 10} has key 0"); - -func test_array_has_value() -> void: - var a: Array = [0, 1, 2] - - asserts.has(2, a, "[0, 1, 2] has value 2"); - -func test_dict_does_not_have_value() -> void: - var d: Dictionary = {0: 10} - - asserts.does_not_have(5, d, "{0: 10} does not have value 5"); - -func test_dict_does_not_have_key() -> void: - var d: Dictionary = {0: 10} - - asserts.does_not_have(10, d, "{1: 10} does not have has key 1"); - -func test_array_does_not_have_value() -> void: - var a: Array = [0, 1, 2] - - asserts.does_not_have(4, a, "[0, 1, 2] does not have value 2"); diff --git a/tests/bootstrap/unit/is_instance.test.gd b/tests/bootstrap/unit/is_instance.test.gd deleted file mode 100644 index 77770d64..00000000 --- a/tests/bootstrap/unit/is_instance.test.gd +++ /dev/null @@ -1,202 +0,0 @@ -extends WAT.Test - -func title(): - return "Given an Is Instance of class/type Assertion" - -func test_when_calling_is_AABB(): - describe("When calling asserts.is_AABB(aabb: AABB)") - - var aabb: AABB = AABB() - asserts.is_not_null(aabb, "AABB is not null") - asserts.is_AABB(aabb, "Then it passes") - -func test_when_calling_is_Array(): - describe("When calling asserts.is_Array(array: Array)") - - var array: Array = [] - - asserts.is_not_null(array, "array is not null") - asserts.is_Array(array, "Then it passes") - -func test_when_calling_is_Basis(): - describe("When calling asserts.is_basis(basis: Basis") - - var basis: Basis = Basis() - - asserts.is_not_null(basis, "basis is not null") - asserts.is_Basis(basis, "Then it passes") - -func test_when_calling_is_bool(): - describe("When calling asserts.is_bool(true)") - - asserts.is_bool(true, "Then it passes") - -func test_when_calling_is_Color(): - describe("When calling asserts.is_color(color: Color)") - - var color: Color = Color() - - asserts.is_not_null(color, "color is not null") - asserts.is_Color(color, "Then it passes") - -func test_when_calling_is_Dictionary(): - describe("When calling asserts.is_Dictionary({})") - - asserts.is_Dictionary({}, "Then it passes") - -func test_when_calling_is_float(): - describe("When calling asserts.is_float(1.0)") - - asserts.is_float(1.0, "Then it passes") - -func test_when_calling_is_int(): - describe("When callign asserts.is_int(1)") - - asserts.is_int(1, "Then it passes") - -func test_when_calling_is_NodePath(): - describe("When calling asserts.is_NodePath(@'Parent/Child')") - - var nodepath: NodePath = @"." - - asserts.is_not_null(nodepath, "@'Parent/Child' is not null") - asserts.is_NodePath(nodepath, "Then it passes") - - -func test_when_calling_is_object(): - describe("When calling is asserts.object(node: Node)") - - var node: Node = Node.new() - - asserts.is_not_null(node, "node is not null") - asserts.is_Object(node, "An instance of node is an Object") - - node.free() - -func test_when_calling_is_Plane(): - describe("When calling asserts.is_Plane(plane: Plane())") - - var plane: Plane = Plane() - - asserts.is_not_null(plane, "plane is not null") - asserts.is_Plane(plane, "then it passes") - -func test_when_calling_is_PoolByteArray(): - describe("When calling asserts.is_PoolByteArray(bytes: PoolByteArray)") - - var bytes: PoolByteArray = PoolByteArray() - - asserts.is_not_null(bytes, "bytes is not null") - asserts.is_PoolByteArray(bytes, "Then it passes") - -func test_when_calling_is_PoolColorArray(): - describe("When calling asserts.is_PoolColorArray(colors: PoolColorArray)") - - var colors: PoolColorArray = PoolColorArray() - - asserts.is_not_null(colors, "colors is not null") - asserts.is_PoolColorArray(colors, "Then it passes") - -func test_when_calling_is_PoolIntArray(): - describe("When calling asserts.is_PoolIntArray(ints: PoolIntArray)") - - var ints: PoolIntArray = PoolIntArray() - - asserts.is_not_null(ints, "ints is not null") - asserts.is_PoolIntArray(ints, "Then it passes") - -func test_when_calling_is_PoolRealArray(): - describe("When calling is asserts.is_PoolRealArray(reals: PoolRealArray)") - - var reals: PoolRealArray = PoolRealArray() - - asserts.is_not_null(reals, "reals is not null") - asserts.is_PoolRealArray(reals, "Then it passes") - -func test_when_calling_is_PoolStringArray(): - describe("When calling is asserts.is_PoolStringArray(strs: PoolStringArray)") - - var strs: PoolStringArray = PoolStringArray() - - asserts.is_not_null(strs, "strs is not null") - asserts.is_PoolStringArray(strs, "Then it passes") - -func test_when_calling_is_PoolVector2Array(): - describe("When calling is asserts.is_PoolVector2Array(vec2s: PoolVector2Array)") - - var vec2s: PoolVector2Array = PoolVector2Array() - - asserts.is_not_null(vec2s, "vec2s is not null") - asserts.is_PoolVector2Array(vec2s, "Then it passes") - -func test_when_calling_is_PoolVector3Array(): - describe("When calling is asserts.is_PoolVector3Array(vec3s: PoolVector3Array)") - - var vec3s: PoolVector3Array = PoolVector3Array() - - asserts.is_not_null(vec3s, "vec3s is not null") - asserts.is_PoolVector3Array(vec3s, "Then it passes") - -func test_when_calling_is_Quat(): - describe("When calling asserts.is_Quat(quat: Quat)") - - var quat: Quat = Quat() - - asserts.is_not_null(quat, "quat is not null") - asserts.is_Quat(quat, "Then it passes") - -func test_when_calling_is_Rect2(): - describe("When calling asserts.is_Rect2(rect2: Rect2)") - - var rect2: Rect2 = Rect2() - - asserts.is_not_null(rect2, "rect2 is not null") - asserts.is_Rect2(rect2, "Then it passes") - -func test_when_calling_is_RID(): - describe("When calling asserts.is_RID(rid: RID)") - - var rid: RID = RID() - - asserts.is_not_null(rid, "rid is not null") - asserts.is_RID(rid, "Then it passes") - -func test_when_calling_is_string(): - describe("When calling asserts.is_string(strs: String)") - - var strs: String = String() - - asserts.is_not_null(strs, "strs is not null") - asserts.is_String(strs, "Then it passes") - -func test_when_calling_is_Transform(): - describe("When calling asserts.is_Transform(transform: Transform)") - - var transform: Transform = Transform() - - asserts.is_not_null(transform, "transform is not null") - asserts.is_Transform(transform, "Then it passes") - -func test_when_calling_is_Transform2D(): - describe("When calling asserts.is_Transform(transform2D: Transform2D)") - - var transform2D: Transform2D = Transform2D() - - asserts.is_not_null(transform2D, "transform2D is not null") - asserts.is_Transform2D(transform2D, "Then it passes") - -func test_when_calling_is_Vector2(): - describe("When calling asserts.is_Vector2(vec2)") - - var vec2: Vector2 = Vector2() - - asserts.is_not_null(vec2, "vec2 is not null") - asserts.is_Vector2(vec2, "Then it passes") - -func test_when_calling_is_Vector3(): - describe("When calling asserts.is_Vector3(vec3: Vector3") - - var vec3: Vector3 = Vector3() - - asserts.is_not_null(vec3, "vec3 is not null") - asserts.is_Vector3(vec3, "Then it passes") diff --git a/tests/bootstrap/unit/is_not_instance.test.gd b/tests/bootstrap/unit/is_not_instance.test.gd deleted file mode 100644 index 99828a73..00000000 --- a/tests/bootstrap/unit/is_not_instance.test.gd +++ /dev/null @@ -1,134 +0,0 @@ -extends WAT.Test - -func title(): - return "Given an Is Not Instance of class/type Assertion" - -func test_when_calling_is_not_AABB(): - describe("when calling asserts.is_not_AABB(null)") - - asserts.is_not_AABB(null, "Then it passes") - -func test_when_calling_is_not_Array(): - describe("when calling asserts.is_not_Array(null)") - - asserts.is_not_Array(null, "Then it passes") - -func test_when_calling_is_not_Basis(): - describe("when calling asserts.is_not_Basis(null)") - - asserts.is_not_Basis(null, "Then it passes") - -func test_when_calling_is_not_bool(): - describe("when calling asserts.is_not_bool(null)") - - asserts.is_not_bool(null, "Then it passes") - -func test_when_calling_is_not_Color(): - describe("when calling asserts.is_not_Color(null)") - - asserts.is_not_Color(null, "Then it passes") - -func test_when_calling_is_not_Dictionary(): - describe("when calling asserts.is_not_Dictionary(null)") - - asserts.is_not_Dictionary(null, "Then it passes") - -func test_when_calling_is_not_float(): - describe("when calling asserts.is_not_float(null)") - - asserts.is_not_float(null, "Then it passes") - -func test_when_calling_is_not_int(): - describe("when calling asserts.is_not_int(null)") - - asserts.is_not_int(null, "Then it passes") - -func test_when_calling_is_not_NodePath(): - describe("when calling asserts.is_not_NodePath(null)") - - asserts.is_not_NodePath(null, "Then it passes") - -func test_when_calling_is_not_Object(): - describe("when calling asserts.is_not_Object(null)") - - asserts.is_not_Object(null, "Then it passes") - -func test_when_calling_is_not_Plane(): - describe("when calling asserts.is_not_Plane(null)") - - asserts.is_not_Plane(null, "Then it passes") - -func test_when_calling_is_not_PoolByteArray(): - describe("when calling asserts.is_not_PoolByteArray(null)") - - asserts.is_not_PoolByteArray(null, "Then it passes") - -func test_when_calling_is_not_PoolColorArray(): - describe("when calling asserts.is_not_PoolColorArray(null)") - - asserts.is_not_PoolColorArray(null, "Then it passes") - -func test_when_calling_is_not_PoolIntArray(): - describe("when calling asserts.is_not_PoolIntArray(null)") - - asserts.is_not_PoolIntArray(null, "Then it passes") - -func test_when_calling_is_not_PoolRealArray(): - describe("when calling asserts.is_not_PoolRealArray(null)") - - asserts.is_not_PoolRealArray(null, "Then it passes") - -func test_when_calling_is_not_PoolStringArray(): - describe("when calling asserts.is_not_PoolStringArray(null)") - - asserts.is_not_PoolStringArray(null, "Then it passes") - -func test_when_calling_is_not_PoolVector2Array(): - describe("when calling asserts.is_not_PoolVector2Array(null)") - - asserts.is_not_PoolVector2Array(null, "Then it passes") - -func test_when_calling_is_not_PoolVector3Array(): - describe("when calling asserts.is_not_PoolVector3Array(null)") - - asserts.is_not_PoolVector3Array(null, "Then it passes") - -func test_when_calling_is_not_Quat(): - describe("when calling asserts.is_not_Quat(null)") - - asserts.is_not_Quat(null, "Then it passes") - -func test_when_calling_is_not_Rect2(): - describe("when calling asserts.is_not_Rect2(null)") - - asserts.is_not_Rect2(null, "Then it passes") - -func test_when_calling_is_not_RID(): - describe("when calling asserts.is_not_RID(null)") - - asserts.is_not_RID(null, "Then it passes") - -func test_when_calling_is_not_String(): - describe("when calling asserts.is_not_String(null)") - - asserts.is_not_String(null, "Then it passes") - -func test_when_calling_is_not_Transform(): - describe("when calling asserts.is_not_Transform(null)") - - asserts.is_not_Transform(null, "Then it passes") - -func test_when_calling_is_not_Transform2D(): - describe("when calling asserts.is_not_Transform2D(null)") - - asserts.is_not_Transform2D(null, "Then it passes") - -func test_when_calling_is_not_Vector2(): - describe("when calling asserts.is_not_Vector2(null)") - - asserts.is_not_Vector2(null, "Then it passes") - -func test_when_calling_is_not_Vector3(): - describe("when calling asserts.is_not_Vector3(null)") - - asserts.is_not_Vector3(null, "Then it passes") diff --git a/tests/bootstrap/unit/null.test.gd b/tests/bootstrap/unit/null.test.gd deleted file mode 100644 index 5a9767ad..00000000 --- a/tests/bootstrap/unit/null.test.gd +++ /dev/null @@ -1,30 +0,0 @@ -extends WAT.Test - -func title() -> String: - return "Given a Null Assertion" - -func test_when_calling_null_is_null() -> void: - describe("When calling asserts.is_null(null)") - - asserts.is_null(null, "Then it passes") - -func test_when_calling_node_is_not_null() -> void: - describe("When calling Node is not null") - - var node = Node.new() - asserts.is_not_null(node, "Then it passes") - node.free() - -func test_when_calling_is_not_valid_instance() -> void: - describe("When calling asserts.is_not_valid_instance(freed node)") - - var n = Node.new() - n.free() - asserts.is_not_valid_instance(n, "Then it passes") - -func test_when_calling_is_valid_instance() -> void: - describe("When calling is_instance_valid(node)") - - var node = Node.new() - asserts.is_valid_instance(node, "Then it passes") - node.free() diff --git a/tests/bootstrap/unit/object.test.gd b/tests/bootstrap/unit/object.test.gd deleted file mode 100644 index 8a3944b9..00000000 --- a/tests/bootstrap/unit/object.test.gd +++ /dev/null @@ -1,112 +0,0 @@ -extends WAT.Test - -func title() -> String: - return "Given an Object Assertion" - -func test_when_calling_freed_object_is_freed() -> void: - describe("When calling asserts.is_freed(freed_object") - - var node = Node.new() - node.free() - asserts.is_freed(node, "Then it passes") - -func test_when_calling_unfreed_object_is_not_freed() -> void: - describe("When calling asserts.is_not_freed(unfreed_object)") - - var node = Node.new() - asserts.is_not_freed(node, "Then it passes") - node.free() - -func test_when_calling_has_meta_after_adding_metadata() -> void: - describe("When calling asserts.object_has_meta() after adding metadata") - - set_meta("dummy", 1) - asserts.object_has_meta(self, "dummy", "Then it passes") - asserts.that(self, "has_meta", ["dummy"], "Then it passes", "%s has meta: %s", "%s does not have meta %s") - remove_meta("dummy") - -func test_when_calling_does_not_have_meta() -> void: - describe("When calling asserts.object_does_not_have_meta()") - - asserts.object_does_not_have_meta(self, "bad_meta", "Then it passes") - -func test_when_calling_does_not_have_meta_real_key_null_value_pair() -> void: - describe("When calling asserts.object_has_meta with real key but null val") - - set_meta("confusing", null) - asserts.object_does_not_have_meta(self, "confusing", "Then it passes") - -func test_when_calling_has_method_title() -> void: - describe("When calling has_method('title')") - - asserts.object_has_method(self, "title", "Then it passes") - -func when_calling_does_not_have_method() -> void: - describe("When calling does_not_have_method('false_method')") - - asserts.object_does_not_have_method(self, "false_method", "Then it passes") - -func test_when_calling_has_user_signal_after_adding_a_signal() -> void: - describe("When calling obj_has_user_signal after adding a signal") - - add_user_signal("dummy_signal") - asserts.object_has_user_signal(self, "dummy_signal", "Then it passes") - -func test_when_calling_does_not_have_user_signal() -> void: - describe("When calling obj_does_not_have_user_signal with fake signal") - - asserts.object_does_not_have_user_signal(self, "false_signal", - "Then it passes") - -# warning-ignore:unused_signal -signal builtin_dummy -func test_when_calling_does_not_have_user_signal_with_class_signal_constant() -> void: - describe("When calling does not have user signal with class signal") - - asserts.object_does_not_have_user_signal(self, "builtin_dummy", - "Then it passes") - -### WARNING: This causes a memory leak -func test_when_calling_obj_is_queued_for_deletion_after_calling_queue_free() -> void: - describe("When calling asserts.object_is_queued for deletion after calling queue_free") - - var node: Node = Node.new() - node.queue_free() - asserts.object_is_queued_for_deletion(node, "Then it passes") - -func test_when_calling_obj_is_not_for_queued_deletion_after_not_calling_queue_free() -> void: - describe("When calling asserts.object_is_not_for_queued_deletion after not calling queue free()") - - var node: Node = Node.new() - asserts.object_is_not_queued_for_deletion(node, "Then it passes") - node.free() - -func test_when_calling_obj_is_connected_with_a_real_connection() -> void: - describe("When calling asserts object is connected with a valid connection") - -# warning-ignore:return_value_discarded - connect("builtin_dummy", self, "title") - asserts.object_is_connected(self, "builtin_dummy", self, "title", "Then it passes") - disconnect("builtin_dummy", self, "title") - -func test_when_calling_obj_is_not_connected_with_an_invalid_connection() -> void: - describe("When calling asserts object is not connected with an invalid connection") - - asserts.object_is_not_connected(self, "builtin_dummy", self, "title", "Then it passes") - -func test_is_blocking_signals() -> void: - describe("When calling is blocking signals while blocking signals") - - var node = Node.new() - node.set_block_signals(true) - asserts.object_is_blocking_signals(node, "Then it passes") - node.free() - -func test_is_not_blocking_signals() -> void: - describe("When calling is not blocking signals while not blocking signals") - - var node = Node.new() - node.set_block_signals(false) - asserts.object_is_not_blocking_signals(node, "Then it passes") - node.free() - diff --git a/tests/bootstrap/unit/parameters.test.gd b/tests/bootstrap/unit/parameters.test.gd deleted file mode 100644 index e2003936..00000000 --- a/tests/bootstrap/unit/parameters.test.gd +++ /dev/null @@ -1,25 +0,0 @@ -extends WAT.Test - -func title(): - return "Given the Addition Operator" - -func test_add(): - parameters([["addend", "augend", "result"], [2, 2, 4], [5, 3, 8], [7, 6, 13]]) - describe("When we add %s to %s we get %s" % [p.addend as String, p.augend as String, p.result as String]) - var expected = p.result - var actual = calculator.add(p.addend, p.augend) - asserts.is_equal(actual, expected) - -func test_subtract(): - parameters([["addend", "augend", "result"], [2, 2, 0], [5, 3, 2], [7, 6, 1]]) - describe("When we subtract %s from %s we get %s" % [p.addend as String, p.augend as String, p.result as String]) - var expected = p.result - var actual = calculator.sub(p["addend"], p.augend) - asserts.is_equal(actual, expected) - -class calculator: - static func add(a, b): - return a + b; - - static func sub(a, b): - return a - b; diff --git a/tests/bootstrap/unit/range.test.gd b/tests/bootstrap/unit/range.test.gd deleted file mode 100644 index 1ae27279..00000000 --- a/tests/bootstrap/unit/range.test.gd +++ /dev/null @@ -1,20 +0,0 @@ -extends WAT.Test - -func title() -> String: - return "Given A Range Assertion" - -func test_when_calling_is_in_range() -> void: - describe("When calling is (0) in range(0, 10)") - - var value = 0 - var low = 0 - var high = 10 - asserts.is_in_range(value, low, high, "Then it passes") - -func test_when_calling_is_not_in_range() -> void: - describe("When calling is (10) not in range (in range(0, 10)") - - var value = 10 - var low = 0 - var high = 10 - asserts.is_not_in_range(value, low, high, "Then it passes") diff --git a/tests/bootstrap/unit/string.test.gd b/tests/bootstrap/unit/string.test.gd deleted file mode 100644 index 726c2496..00000000 --- a/tests/bootstrap/unit/string.test.gd +++ /dev/null @@ -1,52 +0,0 @@ -extends WAT.Test - -func title(): - return "Given a String Assertion" - -func test_when_calling_string_begins_with(): - describe("When calling asserts.string_begins_with('lorem', 'lorem impsum')") - - var prefix: String = "lorem" - var string: String = "lorem impsum" - - asserts.string_begins_with(prefix, string, "Then it passes") - -func test_when_calling_string_does_not_begin_with(): - describe("When calling asserts.string_does_not_begin_with('lorem', 'impsum')") - - var prefix: String = "bleh lorem" - var string: String = "impsum" - - asserts.string_does_not_begin_with(prefix, string, "Then it passes") - -func test_when_calling_string_contains(): - describe("When calling asserts.string_contains('em im', 'lorem impsum')") - - var contents: String = "em im" - var string: String = "lorem impsum" - - asserts.string_contains(contents, string, "Then it passes") - -func test_when_calling_string_does_not_contain(): - describe("When calling asserts.string_does_not_contain('em im', 'impsum')") - - var contents: String = "beem im" - var string: String = "impsum" - - asserts.string_does_not_contain(contents, string, "Then it passes") - -func test_when_calling_string_ends_with(): - describe("When calling asserts.string_ends_with('impsum', 'lorem impsum')") - - var postfix: String = "impsum" - var string: String = "lorem impsum" - - asserts.string_ends_with(postfix, string, "Then it passes") - -func test_when_calling_string_does_not_end_with(): - describe("When calling asserts.string_does_not_end_with('lorem', 'impsum')") - - var postfix: String = "lorem" - var string: String = "impsum" - - asserts.string_does_not_end_with(postfix, string, "Then it passes") diff --git a/tests/bootstrap/unit/supersimple.gd b/tests/bootstrap/unit/supersimple.gd deleted file mode 100644 index 6baf2b08..00000000 --- a/tests/bootstrap/unit/supersimple.gd +++ /dev/null @@ -1,5 +0,0 @@ -extends WAT.Test - - -func test_simple(): - asserts.is_false(false) diff --git a/tests/bootstrap/unit/testx.test.gd b/tests/bootstrap/unit/testx.test.gd deleted file mode 100644 index 863ff52e..00000000 --- a/tests/bootstrap/unit/testx.test.gd +++ /dev/null @@ -1,40 +0,0 @@ -extends WAT.Test - -func title() -> String: - return "Given a Test Script" - -func test_we_can_omit_describe() -> void: - # We don't use describe here because it should be optional - - asserts.is_true(true, "if the test didn't break this works") - -func test_when_we_omit_context_we_can_see_expected_and_got_under_method(): - - asserts.is_true(true) - asserts.is_equal(2, 2) - -func test_we_can_record_properties() -> void: - describe("When we record properties") - - var recordee = Recordee.new() - var recorder = record(recordee, ["age", "wisdom"]) - recorder.start() - add_child(recordee) - simulate(self, 10, 0.1) - recorder.stop() - - var age: Array = recorder.get_property_timeline("age") - var wisdom: Array = recorder.get_property_timeline("wisdom") - asserts.is_greater_than(age.size(), 1, "We get an array of multiple values back") - asserts.is_not_equal(age[0], age.back(), "With different values") - asserts.is_greater_than(wisdom.size(), 1, "And we can track multiple properties") - recordee.free() - -class Recordee extends Node: - var age = 0 - var wisdom = 100 - - func _process(_delta: float) -> void: - age += 1 - if wisdom > 0: - wisdom -= 1 diff --git a/tests/examples/csharp/AwaitTest.cs b/tests/examples/csharp/AwaitTest.cs deleted file mode 100644 index a0620cef..00000000 --- a/tests/examples/csharp/AwaitTest.cs +++ /dev/null @@ -1,96 +0,0 @@ -using Godot; -using System; -using System.Threading.Tasks; - -public class AwaitTest : WAT.Test -{ - [Signal] public delegate void MySignal(); - - public event EventHandler MyEvent; - public event EventHandler MyEventWithArgs; - - // In Addition to the Tests below, Developers may also await.. - // ..any method that is targeted by the the [Start], [Pre].. - // ..[Post], [End] attributes provided they change the.. - // ..targeted method's signature to async task. - - [Test] - public async Task AwaitUntilTimeout() - { - // Developers may await in tests for a set of amount of.. - // ..time by changing the Test Method signature to.. - // ..async Task while calling await UntilTimeout. - await UntilTimeout(0.2f); - Assert.AutoPass("Await Until Timeout"); - } - - [Test] - public async Task AwaitUntilSignal() - { - // Developers may await in tests for a signal by.. - // ..changing the Test Method signature to async task.. - // ..and awaiting UntilSignal passing in the emitter.. - // ..object, the string signal and the time limit. - CallDeferred("emit_signal", nameof(MySignal)); - await UntilSignal(this, nameof(MySignal), 0.2f); - Assert.AutoPass("Await Until Signal"); - } - - [Test] - public async Task AwaitUntilEvent() - { - // Developers may await in tests for an Event with no EventArgs.. - // ..by changing the Test Method signature to async task and.. - // ..awaiting UntilEvent passing in the Event sender, the event.. - // ..handle and a time limit. - // Note: Currently WAT only handles Event handles that take the.. - // ..the sender and an optional EventArg object. - CallDeferred(nameof(InvokeEventWithNoArgs)); - await UntilEvent(this, nameof(MyEvent), 0.2f); - Assert.AutoPass("Await Until Event"); - } - - [Test] - public async Task AwaitUntilEventWithArgs() - { - // Developers may await in tests for an Event with EventArgs.. - // ..by changing the Test Method signature to async task and.. - // ..awaiting UntilEvent passing in the Event sender, the event.. - // ..handle and a time limit. - // Note: Currently WAT only handles Event handles that take the.. - // ..the sender and an optional EventArg Object. - CallDeferred(nameof(InvokeEventWithEventArgs), "Hello", "Alex"); - - // Developers may investigate TestEventData object returned by UntilEvent.. - // ..which containers the property Sender and the property Arguments which.. - // ..stores the EventArg object that may have been sent. - TestEventData data = - await UntilEvent(this, nameof(MyEventWithArgs), 0.2f); - GreetingArgs args = (GreetingArgs) data.Arguments; - Assert.IsEqual(args.Greeting, "Hello"); - Assert.IsEqual(args.Name, "Alex"); - } - - private void InvokeEventWithNoArgs() - { - MyEvent?.Invoke(this, null); - } - - private void InvokeEventWithEventArgs(string greeting, string name) - { - MyEventWithArgs?.Invoke(this, new GreetingArgs(greeting, name)); - } - - public class GreetingArgs : EventArgs - { - public string Greeting { get; set; } - public string Name { get; set; } - - public GreetingArgs(string greeting, string name) - { - Greeting = greeting; - Name = name; - } - - } -} diff --git a/tests/examples/csharp/ExampleTest.cs b/tests/examples/csharp/ExampleTest.cs deleted file mode 100644 index bc8aa8ff..00000000 --- a/tests/examples/csharp/ExampleTest.cs +++ /dev/null @@ -1,81 +0,0 @@ -using System; - -namespace Tests.Examples.CSharp -{ - // Developers may use the [Title] attribute on a Test which will then use.. - // ..string as the name of the Test in the Results View - [Title("My Example Test")] - - // See target methods for more information - [Start(nameof(RunBeforeTestClass))] - [Pre(nameof(RunBeforeTestMethod))] - [Post(nameof(RunAfterTestMethod))] - [End(nameof(RunAfterTestClass))] - - // All Tests in WAT must derive from WAT.Test and be stored in the.. - // ..user-defined Test Directory. It extends from Godot's Node Class.. - // ..and is added to the SceneTree when being executed (therefore if.. - // ..Developers require any of their Units under test to be in the - // ..SceneTree, they can add those Units as children to the current Test). - public class ExampleTest : WAT.Test - { - // Any Method in a Test Class decorated with the [Test] attribute.. - // ..will be run by the WAT Test Runner. - [Test] - public void MySimpleTest() - { - // Developers may use the Describe method passing in a string.. - // ..description that will have the method show up as that string.. - // ..instead of the method name in the results view. - Describe("This Is My Simple Test"); - - // Assertions may be called through the Asserts property of.. - // ..WAT.Test. Any test method with a failing assertion (or no.. - // ..assertions at all) will show up as a failed test in the.. - // ..results view. - - // All Assertions have an optional string context as their.. - // ..last argument which will have the assertion show up.. - // ..with that as its description in the results view. - Assert.IsTrue(true, "Optional Context Argument"); - } - - // Developers can perform the same test method with different.. - // ..arguments by passing those arguments into the constructor.. - // ..of the Test attribute and then defining the same number.. - // ..of parameters in the Test Method itself. - [Test(2, 2, 4)] - [Test(4, 4, 8)] - [Test(6, 6, 12)] - public void MyParameterizedTest(int a, int b, int expected) - { - int sum = a + b; - string context = a + " + " + b + " = " + expected; - Assert.IsEqual(expected, sum, context); - } - - public void RunBeforeTestClass() - { - Console.WriteLine("Developers may target a method with the" + - "[Start] attribute to execute code before any test method is run"); - } - - public void RunBeforeTestMethod() - { - Console.WriteLine("Developers may target a method with the" + - "[Pre] attribute to execute code before each test method is run"); - } - - public void RunAfterTestMethod() - { - Console.WriteLine("Developers may target a method with the" + - "[Post] attribute to execute code after each test method is run"); - } - - public void RunAfterTestClass() - { - Console.WriteLine("Developers may target a method with the" + - "[End] attribute to execute after all tests method have run"); - } - } -} diff --git a/tests/examples/csharp/WatchSignalsTest.cs b/tests/examples/csharp/WatchSignalsTest.cs deleted file mode 100644 index 98a01363..00000000 --- a/tests/examples/csharp/WatchSignalsTest.cs +++ /dev/null @@ -1,50 +0,0 @@ -using Godot; -using Array = Godot.Collections.Array; - -// Developers can call Watch(emitter, signal) to check if a signal.. -// ..was emitted, not emitted, emitted so many times or was emitted.. -// ..a particular set of arguments. - -public class WatchSignalsTest : WAT.Test -{ - [Signal] - public delegate void MySignal(); - - [Test] - public void SignalWasEmitted() - { - Watch(this, nameof(MySignal)); - EmitSignal(nameof(MySignal)); - Assert.SignalWasEmitted(this, nameof(MySignal)); - UnWatch(this, nameof(MySignal)); - } - - [Test] - public void SignalWasNotEmitted() - { - Watch(this, nameof(MySignal)); - Assert.SignalWasNotEmitted(this, nameof(MySignal)); - UnWatch(this, nameof(MySignal)); - } - - [Test] - public void SignalWasEmittedXTimes() - { - Watch(this, nameof(MySignal)); - EmitSignal(nameof(MySignal)); - EmitSignal(nameof(MySignal)); - Assert.SignalWasEmittedXTimes(this, nameof(MySignal), 2); - UnWatch(this, nameof(MySignal)); - } - - [Test] - public void SignalWasEmittedWithArguments() - { - Watch(this, nameof(MySignal)); - EmitSignal(nameof(MySignal), "Hello", "World"); - Assert.SignalWasEmittedWithArguments(this, nameof(MySignal), new Array {"Hello", "World"}); - UnWatch(this, nameof(MySignal)); - } - - -} diff --git a/tests/examples/gdscript/doubles/create_scene_director.test.gd b/tests/examples/gdscript/doubles/create_scene_director.test.gd deleted file mode 100644 index ffe27e17..00000000 --- a/tests/examples/gdscript/doubles/create_scene_director.test.gd +++ /dev/null @@ -1,20 +0,0 @@ -extends WAT.Test - -# Developers may create a Scene Director from the string path of the Scene.. -# ..and then call .double() on it to create a Scene Test Double, this will -# ..double every node in the Scene as well. Developers may only call double -# ..once, any successive calls will fail. -func test_create_a_test_scene_director_from_string_path() -> void: - var scene = direct.scene("res://examples/doubles/scenes/Main.tscn") - var double = scene.double() - asserts.is_class_instance(double, MySceneRootClass) - -# Developers may create a Scene Director from a packed sceneand then call.. -# ..double() on it to create a Scene Test Double, this will double every.. -# ..node in the Scene as well. Developers may only call double once.. -# ..any successive calls will fail. -func test_create_a_test_scene_director_from_packed_scene() -> void: - var packed_scene = load("res://examples/doubles/scenes/Main.tscn") - var scene = direct.scene(packed_scene) - var double = scene.double() - asserts.is_class_instance(double, MySceneRootClass) diff --git a/tests/examples/gdscript/doubles/create_scene_doubles.test.gd b/tests/examples/gdscript/doubles/create_scene_doubles.test.gd deleted file mode 100644 index 243916cb..00000000 --- a/tests/examples/gdscript/doubles/create_scene_doubles.test.gd +++ /dev/null @@ -1,21 +0,0 @@ -extends WAT.Test - -# Developers may call .double() on a Scene Director to double every node in.. -# ..the Scene. Developers may only call double() once, any successive calls.. -# ..will fail. Scene Doubles use their base implementation unless any of.. -# ..their children were instructed otherwise. -func test_create_test_double_scene_instance(): - var scene = direct.scene("res://examples/doubles/scenes/Main.tscn") - var double = scene.double() - asserts.is_class_instance(double, MySceneRootClass) - -# Developers can use .get_node(nodepath: String) on a Scene Director to get.. -# ..the Script Director for the corresponding node in the Scene and instruct.. -# ..it how to act as a Test Double. -func test_can_stub_methods_of_scene_double_children(): - var scene = direct.scene("res://examples/doubles/scenes/Main.tscn") - var nodepath = "ChildA/GrandChildA" - var grandchild_a = scene.get_node(nodepath) - grandchild_a.method("get_title").stub("Stub") - var double = scene.double() - asserts.is_equal(double.get_node(nodepath).get_title(), "Stub") diff --git a/tests/examples/gdscript/doubles/create_script_director.test.gd b/tests/examples/gdscript/doubles/create_script_director.test.gd deleted file mode 100644 index d29625c0..00000000 --- a/tests/examples/gdscript/doubles/create_script_director.test.gd +++ /dev/null @@ -1,66 +0,0 @@ -extends WAT.Test - -# Script Directors are used to instruct how a Test Double should operate. - -# Developers can create a Script Director from a String Path. -func test_create_a_test_script_director_from_string_path() -> void: - var class_path: String = "res://examples/doubles/my_class.gd" - var director = direct.script(class_path) - var double = director.double() - asserts.is_class_instance(double, load(class_path)) - -# Developers can create a Script Director from a preloaded class.. -# ..(which is just a GDScript class). -func test_create_a_test_script_director_from_loaded_class() -> void: - var class_script: GDScript = load("res://examples/doubles/my_class.gd") - var director = direct.script(class_script) - var double = director.double() - asserts.is_class_instance(double, class_script) - -# Developers can create a Script Director from a user-defined class name, -# Note: This won't work with builtin Godot Types. -func test_create_a_test_script_director_from_user_defined_class_name() -> void: - var director = direct.script(MyClass) - var double = director.double() - asserts.is_class_instance(double, MyClass) - -# Developers can create a Script Director from a builtin class name by.. -# ..passing in name of that class as a String. -func test_create_a_test_script_director_from_builtin_class_name() -> void: - var director = direct.script("KinematicBody2D") - var double = director.double() - asserts.is_equal(double.get_class(), "KinematicBody2D") - -# Developers can create a Script Director from an inner class by passing in.. -# ..the containing script as the first argument and then the name of the.. -# ..inner class as a string as the second argument. -func test_create_a_test_script_director_from_an_inner_class() -> void: - var inner_class: GDScript = load("res://examples/doubles/my_class.gd").InnerClass - var director = direct.script("res://examples/doubles/my_class.gd", "InnerClass") - var double = director.double() - asserts.is_class_instance(double, inner_class) - -# Developers can create a Script Director from a nested inner class by passing.. -# ..in the containing script as the first argument and then the name of the.. -# ..inner class as a period seperated string as the second argument. -func test_create_a_test_script_director_from_a_nested_inner_class() -> void: - var outer = load("res://examples/doubles/my_class.gd") - var nested: GDScript = outer.InnerClass.InnerInnerClass - var director = direct.script(outer, "InnerClass.InnerInnerClass") - var double = director.double() - asserts.is_class_instance(double, nested) - -# Developers can create a Script Director with constructor dependecies by.. -# ..passing in the required arguments as an array as the third argument.. -# ..(if no inner class is required, then developer must pass in an.. -# ..empty string as the second argument) -func test_create_a_test_script_director_with_constructor_dependecies() -> void: - var hero: GDScript = load("res://examples/doubles/hero.gd") - var constructor_arguments = ["Alex", "Technomancer", 120] - var no_inner_class = "" - var director = direct.script(hero, no_inner_class, constructor_arguments) - var double = director.double() - asserts.is_class_instance(double, hero) - asserts.is_equal(double.title, "Alex") - asserts.is_equal(double.faction, "Technomancer") - asserts.is_equal(double.health, 120) diff --git a/tests/examples/gdscript/doubles/create_script_doubles.gd b/tests/examples/gdscript/doubles/create_script_doubles.gd deleted file mode 100644 index b4e99436..00000000 --- a/tests/examples/gdscript/doubles/create_script_doubles.gd +++ /dev/null @@ -1,18 +0,0 @@ -extends WAT.Test - -# Developers can create a Test Double by calling .double() on a.. -# ..Script Director. Developers can only call double() once.. -# ..succesive calls will fail -func test_doubled_object_is_instance_of_base_class() -> void: - var director = direct.script(MyClass) - var double = director.double() - asserts.is_class_instance(double, MyClass) - -# Tests Doubles use their base implementation unless Developers instruct.. -# ..them to do otherwise via Method Directors. -func test_stubbed_method_returns_stubbed_value() -> void: - var director = direct.script(MyClass) - var method_director = director.method("get_title") - method_director.stub("Stubbed Return") - var double = director.double() - asserts.is_equal(double.get_title(), "Stubbed Return") diff --git a/tests/examples/gdscript/doubles/use_method_director.gd b/tests/examples/gdscript/doubles/use_method_director.gd deleted file mode 100644 index 22ab4e98..00000000 --- a/tests/examples/gdscript/doubles/use_method_director.gd +++ /dev/null @@ -1,125 +0,0 @@ -extends WAT.Test - -# Developers can create a Method Director to instruct.. -# ..how a particular method of a test double should act. -# If a Method Director is not created for a method.. -# ..it retains the default implementation. If a Method -# If a Method Director is created but not manipulated.., -# ..it returns null by default. -func test_doubled_methods_return_null_by_default() -> void: - var director = direct.script(MyCalculator) - var _method = director.method("get_approx_pi") - var double = director.double() - asserts.is_null(double.get_approx_pi()) - -# Developers can instruct a method to return a different value.. -# ..when called by using the .stub(return_value) method below. -func test_stub_methods_with_return_value() -> void: - var director = direct.script(MyCalculator) - var get_approx_pi = director.method("get_approx_pi") - get_approx_pi.stub(100) - var double = director.double() - asserts.is_equal(double.get_approx_pi(), 100) - -# Developers can instruct a method to return different values based on -# which arguments are passed otherwise the method returns its default value. -func test_stub_methods_with_return_value_based_on_param_values() -> void: - var director = direct.script(MyCalculator) - var add = director.method("add") - add.stub(1, [2, 2]) - var double = director.double() - asserts.is_equal(double.add(2, 2), 1) - -# Developers can instruct a method to return different values based on.. -# ..which arguments are passed otherwise the method returns its default.. -# ..value but in this example any() is being used to say "this argument can.. -# ..match any value" whereas the second argument must match 0 -func test_stub_methods_with_return_value_based_on_partial_param_values() -> void: - var director = direct.script(MyCalculator) - var add = director.method("divide") - add.stub(1, [any(), 0]) - var double = director.double() - asserts.is_equal(double.divide(52, 0), 1) - -# Developers can use asserts.was_called(director, method_name).. -# ..to check if a method was called on a test double. -func test_doubled_methods_was_called() -> void: - var director = direct.script(MyCalculator) - var _get_approx_pi = director.method("get_approx_pi") - var double = director.double() - double.get_approx_pi() - asserts.was_called(director, "get_approx_pi") - -# Developers can use asserts.was_not_called(director, method_name).. -# ..to check if a method was not called on a test doubled. -func test_doubled_method_was_not_called() -> void: - var director = direct.script(MyCalculator) - var _get_approx_pi = director.method("get_approx_pi") - var _double = director.double() - asserts.was_not_called(director, "get_approx_pi") - -# Developers can use asserts.was_called_with_arguments(director, method, args).. -# ..to check if a method was called on a test double with a certain set of.. -# ..args (which will fail if it was not called or called with the wrong args). -func test_doubled_methods_was_called_with_arguments() -> void: - var director = direct.script(MyCalculator) - var _add = director.method("add") - var double = director.double() - double.add(2, 8) - asserts.was_called_with_arguments(director, "add", [2, 8]) - -# Developers can use asserts.was_called_with_arguments(director, method, args).. -# ..to check if a method was called on a test double with a certain set of.. -# ..args (which will fail if it was not called or called with the wrong args).. -# ..but in this example any() is being used to say that any argument will match -# ..that value but the second argument must always be 8. -func test_doubled_methods_was_called_with_partial_argument() -> void: - var director = direct.script(MyCalculator) - var _add = director.method("add") - var double = director.double() - double.add(2, 8) - asserts.was_called_with_arguments(director, "add", [any(), 8]) - -# Developers can use .call_super() to call the base implementation of a Method.. -# ..that is currently being directed as the default call instead of returning.. -# ..null. (Note: Test Doubles are actually classes that *inherit* the script.. -# ..being doubled, therefore call_super() refers to implementation within that.. -# ..base script, not the implementation in that base script's parent). -func test_doubled_methods_call_implementation_instead_of_null() -> void: - var director = direct.script(Enemy) - director.method("get_type").call_super() - var double = director.double() - asserts.is_equal(double.get_type(), "[Enemy]") - -# Developers can pass in a function (via funcref) that takes an Object and an.. -# ..array of arguments. The test doubled method will then call that function.. -# ..passing in itself, and the set of arguments passed to the calling function. -func test_subcall_via_funcref() -> void: - var director = direct.script(MyCalculator) - director.method("add").subcall(funcref(self, "double_add")) - var double = director.double() - asserts.is_equal(double.add(2, 2), 8) - -# Developers can pass an object that has a call_func method that takes an.. -# ..Object and an array of arguments. The test doubled method will then call.. -# ..that function passing in itself, and the set of arguments passed to the.. -# ..calling function. This is useful if you need to store some resulting state. -func test_subcall_via_object() -> void: - var myCallable = MyCallable.new() - var director = direct.script(MyCalculator) - director.method("add").subcall(myCallable) - var double = director.double() - var return_value = double.add(2, 2) - asserts.is_equal(myCallable.arguments[0], 2) - asserts.is_equal(myCallable.arguments[1], 2) - asserts.is_equal(return_value, 4) - -class MyCallable: - var arguments = [] - - func call_func(_obj: Object, args: Array): - arguments = args - return args[0] + args[1] - -func double_add(_obj: Object, args: Array): - return (args[0] + args[1]) * 2 diff --git a/tests/examples/gdscript/example.test.gd b/tests/examples/gdscript/example.test.gd deleted file mode 100644 index 7099d58f..00000000 --- a/tests/examples/gdscript/example.test.gd +++ /dev/null @@ -1,59 +0,0 @@ -extends WAT.Test - -# All Tests in WAT must derive from WAT.Test and be stored in the user-defined.. -# ..Test Directory. It extends from Godot's Node Class and is added to the.. -# ..SceneTree when being executed (therefore if Developers require any of.. -# ..their Units under test to be in the SceneTree, they can add those Units.. -# ..as children to the current Test Node). - -# Developers may override the base title() function to return a string.. -# ..which will then be used as the name of the Test in the results view. -func title() -> String: - return "My Example Test" - -# Any method in a Test that starts with the word test is a Test method. -func test_simple_example() -> void: - - # Developers may use the describe method passing in a string description.. - # ..that will have the method show up as that string instead of the method.. - # ..name in the results view. - describe("My Example Test Method") - - # Assertions may be called through the asserts property of WAT.Test. - # Any test method with a failing assertion (or no assertions at all).. - # ..will show up as a failed test in the results display. - - # All Assertions have an optional string context as their last argument.. - # ..which will have the assertion show up with that as its description.. - # ..in the results view. - asserts.is_true(true, "optional context") - -func test_parameterized_example() -> void: - # Developers can use the parameters function to run a parameterized tests. - # parameters takes a 2D array, the first array is the key name used to.. - # ..access the values, and each array after that is the set of values for.. - # ..that instance of the test - parameters([["addend", "augend", "result"], - [2, 2, 4], [4, 4, 8], [5, 5, 10]]) - - # The values that were passed in can be accessed via their respective keys.. - # ..in the p dictionary of WAT.Test - var actual = p["addend"] + p["augend"] - asserts.is_equal(p["result"], actual, - "%s + %s = %s" % [p["addend"], p["augend"], p["result"]]) - -func start() -> void: - print("Developers may override the start method to execute code" + - "before any test method is run in the Test.") - -func pre() -> void: - print("Developers may override the pre method to execute code" + - "before each test method is run in the Test.") - -func post() -> void: - print("Developers may override the post method to execute code" + - "after each test method is run in the Test.") - -func end() -> void: - print("Developers may override the end method to execute code" + - "after all test methods have been run in the Test.") diff --git a/tests/examples/gdscript/watch_signals.test.gd b/tests/examples/gdscript/watch_signals.test.gd deleted file mode 100644 index d1539e98..00000000 --- a/tests/examples/gdscript/watch_signals.test.gd +++ /dev/null @@ -1,31 +0,0 @@ -extends WAT.Test - -# Developers can call watch(emitter, signal) to check if a signal was.. -# ..emitted, not emitter, emitted so many times or was emitted with a.. -# ..a particular set of arguments. - -signal my_signal -func test_signal_was_emitted() -> void: - watch(self, "my_signal") - emit_signal("my_signal") - asserts.signal_was_emitted(self, "my_signal") - unwatch(self, "my_signal") - -func test_signal_was_not_emitted() -> void: - watch(self, "my_signal") - asserts.signal_was_not_emitted(self, "my_signal") - unwatch(self, "my_signal") - -func test_signal_was_emitted_x_times() -> void: - watch(self, "my_signal") - emit_signal("my_signal") - emit_signal("my_signal") - asserts.signal_was_emitted_x_times(self, "my_signal", 2) - unwatch(self, "my_signal") - -func test_signal_was_emitted_with_arguments() -> void: - watch(self, "my_signal") - emit_signal("my_signal", "Hello", "World") - asserts.signal_was_emitted_with_arguments(self, "my_signal", - ["Hello", "World"]) - unwatch(self, "my_signal") diff --git a/tests/examples/gdscript/yield.test.gd b/tests/examples/gdscript/yield.test.gd deleted file mode 100644 index 508b724f..00000000 --- a/tests/examples/gdscript/yield.test.gd +++ /dev/null @@ -1,28 +0,0 @@ -extends WAT.Test - -# Developers may also use the code below in any of the start/pre/post/end.. -# ..methods if necessary. - -func test_yield_until_timeout() -> void: - # Developers can yield for a time limit by calling yield with the.. - # ..until_timeout function that takes the time limit and waits for the.. - # ..returned yielder object to emit the built-in YIELD signal. - yield(until_timeout(0.2), YIELD) - asserts.auto_pass("Yielding On Timeout") - -# warning-ignore:unused_signal -signal my_signal -func test_yield_until_signal() -> void: - watch(self, "my_signal") - call_deferred("emit_signal", "my_signal") - - # Developers can yield on a custom signal by passing in the.. - # ..emitter object, the string signal of the emitter object and.. - # ..a float time limit and waits for the returned yielder object to.. - # ..emit the built-in YIELD Signal (which will be emitted either when.. - # ..the emitter emits the signal or the time limit has run out). - - yield(until_signal(self, "my_signal", 0.2), YIELD) - asserts.auto_pass("Yielding on Signal") - asserts.signal_was_emitted(self, "my_signal") - unwatch(self, "my_signal") diff --git a/tests/metadata.json b/tests/metadata.json deleted file mode 100644 index e6d867a5..00000000 --- a/tests/metadata.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "failed": [ - - ] -} \ No newline at end of file diff --git a/tests/results.xml b/tests/results.xml deleted file mode 100644 index 7e3c55a1..00000000 --- a/tests/results.xml +++ /dev/null @@ -1,450 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file