summaryrefslogtreecommitdiff
path: root/addons/gdUnit4/src/asserts/GdUnitVectorAssertImpl.gd
diff options
context:
space:
mode:
Diffstat (limited to 'addons/gdUnit4/src/asserts/GdUnitVectorAssertImpl.gd')
-rw-r--r--addons/gdUnit4/src/asserts/GdUnitVectorAssertImpl.gd187
1 files changed, 187 insertions, 0 deletions
diff --git a/addons/gdUnit4/src/asserts/GdUnitVectorAssertImpl.gd b/addons/gdUnit4/src/asserts/GdUnitVectorAssertImpl.gd
new file mode 100644
index 0000000..fbc031a
--- /dev/null
+++ b/addons/gdUnit4/src/asserts/GdUnitVectorAssertImpl.gd
@@ -0,0 +1,187 @@
+extends GdUnitVectorAssert
+
+var _base: GdUnitAssertImpl
+var _current_type: int
+var _type_check: bool
+
+func _init(current: Variant, type_check := true) -> void:
+ _type_check = type_check
+ _base = GdUnitAssertImpl.new(current)
+ # save the actual assert instance on the current thread context
+ GdUnitThreadManager.get_current_context().set_assert(self)
+ if not _validate_value_type(current):
+ @warning_ignore("return_value_discarded")
+ report_error("GdUnitVectorAssert error, the type <%s> is not supported." % GdObjects.typeof_as_string(current))
+ _current_type = typeof(current)
+
+
+func _notification(event :int) -> void:
+ if event == NOTIFICATION_PREDELETE:
+ if _base != null:
+ _base.notification(event)
+ _base = null
+
+
+func _validate_value_type(value :Variant) -> bool:
+ return (
+ value == null
+ or typeof(value) in [
+ TYPE_VECTOR2,
+ TYPE_VECTOR2I,
+ TYPE_VECTOR3,
+ TYPE_VECTOR3I,
+ TYPE_VECTOR4,
+ TYPE_VECTOR4I
+ ]
+ )
+
+
+func _validate_is_vector_type(value :Variant) -> bool:
+ var type := typeof(value)
+ if type == _current_type or _current_type == TYPE_NIL:
+ return true
+ @warning_ignore("return_value_discarded")
+ report_error(GdAssertMessages.error_is_wrong_type(_current_type, type))
+ return false
+
+
+func current_value() -> Variant:
+ return _base.current_value()
+
+
+func report_success() -> GdUnitVectorAssert:
+ @warning_ignore("return_value_discarded")
+ _base.report_success()
+ return self
+
+
+func report_error(error :String) -> GdUnitVectorAssert:
+ @warning_ignore("return_value_discarded")
+ _base.report_error(error)
+ return self
+
+
+func failure_message() -> String:
+ return _base.failure_message()
+
+
+func override_failure_message(message: String) -> GdUnitVectorAssert:
+ @warning_ignore("return_value_discarded")
+ _base.override_failure_message(message)
+ return self
+
+
+func append_failure_message(message :String) -> GdUnitVectorAssert:
+ @warning_ignore("return_value_discarded")
+ _base.append_failure_message(message)
+ return self
+
+
+func is_null() -> GdUnitVectorAssert:
+ @warning_ignore("return_value_discarded")
+ _base.is_null()
+ return self
+
+
+func is_not_null() -> GdUnitVectorAssert:
+ @warning_ignore("return_value_discarded")
+ _base.is_not_null()
+ return self
+
+
+func is_equal(expected: Variant) -> GdUnitVectorAssert:
+ if _type_check and not _validate_is_vector_type(expected):
+ return self
+ @warning_ignore("return_value_discarded")
+ _base.is_equal(expected)
+ return self
+
+
+func is_not_equal(expected: Variant) -> GdUnitVectorAssert:
+ if _type_check and not _validate_is_vector_type(expected):
+ return self
+ @warning_ignore("return_value_discarded")
+ _base.is_not_equal(expected)
+ return self
+
+
+@warning_ignore("shadowed_global_identifier")
+func is_equal_approx(expected :Variant, approx :Variant) -> GdUnitVectorAssert:
+ if not _validate_is_vector_type(expected) or not _validate_is_vector_type(approx):
+ return self
+ var current :Variant = current_value()
+ var from :Variant = expected - approx
+ var to :Variant = expected + approx
+ if current == null or (not _is_equal_approx(current, from, to)):
+ return report_error(GdAssertMessages.error_is_value(Comparator.BETWEEN_EQUAL, current, from, to))
+ return report_success()
+
+
+func _is_equal_approx(current :Variant, from :Variant, to :Variant) -> bool:
+ match typeof(current):
+ TYPE_VECTOR2, TYPE_VECTOR2I:
+ return ((current.x >= from.x and current.y >= from.y)
+ and (current.x <= to.x and current.y <= to.y))
+ TYPE_VECTOR3, TYPE_VECTOR3I:
+ return ((current.x >= from.x and current.y >= from.y and current.z >= from.z)
+ and (current.x <= to.x and current.y <= to.y and current.z <= to.z))
+ TYPE_VECTOR4, TYPE_VECTOR4I:
+ return ((current.x >= from.x and current.y >= from.y and current.z >= from.z and current.w >= from.w)
+ and (current.x <= to.x and current.y <= to.y and current.z <= to.z and current.w <= to.w))
+ _:
+ push_error("Missing implementation '_is_equal_approx' for vector type %s" % typeof(current))
+ return false
+
+
+func is_less(expected :Variant) -> GdUnitVectorAssert:
+ if not _validate_is_vector_type(expected):
+ return self
+ var current :Variant = current_value()
+ if current == null or current >= expected:
+ return report_error(GdAssertMessages.error_is_value(Comparator.LESS_THAN, current, expected))
+ return report_success()
+
+
+func is_less_equal(expected :Variant) -> GdUnitVectorAssert:
+ if not _validate_is_vector_type(expected):
+ return self
+ var current :Variant = current_value()
+ if current == null or current > expected:
+ return report_error(GdAssertMessages.error_is_value(Comparator.LESS_EQUAL, current, expected))
+ return report_success()
+
+
+func is_greater(expected :Variant) -> GdUnitVectorAssert:
+ if not _validate_is_vector_type(expected):
+ return self
+ var current :Variant = current_value()
+ if current == null or current <= expected:
+ return report_error(GdAssertMessages.error_is_value(Comparator.GREATER_THAN, current, expected))
+ return report_success()
+
+
+func is_greater_equal(expected :Variant) -> GdUnitVectorAssert:
+ if not _validate_is_vector_type(expected):
+ return self
+ var current :Variant = current_value()
+ if current == null or current < expected:
+ return report_error(GdAssertMessages.error_is_value(Comparator.GREATER_EQUAL, current, expected))
+ return report_success()
+
+
+func is_between(from :Variant, to :Variant) -> GdUnitVectorAssert:
+ if not _validate_is_vector_type(from) or not _validate_is_vector_type(to):
+ return self
+ var current :Variant = current_value()
+ if current == null or not (current >= from and current <= to):
+ return report_error(GdAssertMessages.error_is_value(Comparator.BETWEEN_EQUAL, current, from, to))
+ return report_success()
+
+
+func is_not_between(from :Variant, to :Variant) -> GdUnitVectorAssert:
+ if not _validate_is_vector_type(from) or not _validate_is_vector_type(to):
+ return self
+ var current :Variant = current_value()
+ if (current != null and current >= from and current <= to):
+ return report_error(GdAssertMessages.error_is_value(Comparator.NOT_BETWEEN_EQUAL, current, from, to))
+ return report_success()