run-gut-tests-action/test_proj/addons/gut/strutils.gd
2020-07-25 17:09:22 -04:00

121 lines
4.0 KiB
GDScript

var _utils = load('res://addons/gut/utils.gd').get_instance()
# Hash containing all the built in types in Godot. This provides an English
# name for the types that corosponds with the type constants defined in the
# engine.
var types = {}
func _init_types_dictionary():
types[TYPE_NIL] = 'TYPE_NIL'
types[TYPE_BOOL] = 'Bool'
types[TYPE_INT] = 'Int'
types[TYPE_REAL] = 'Float/Real'
types[TYPE_STRING] = 'String'
types[TYPE_VECTOR2] = 'Vector2'
types[TYPE_RECT2] = 'Rect2'
types[TYPE_VECTOR3] = 'Vector3'
#types[8] = 'Matrix32'
types[TYPE_PLANE] = 'Plane'
types[TYPE_QUAT] = 'QUAT'
types[TYPE_AABB] = 'AABB'
#types[12] = 'Matrix3'
types[TYPE_TRANSFORM] = 'Transform'
types[TYPE_COLOR] = 'Color'
#types[15] = 'Image'
types[TYPE_NODE_PATH] = 'Node Path'
types[TYPE_RID] = 'RID'
types[TYPE_OBJECT] = 'TYPE_OBJECT'
#types[19] = 'TYPE_INPUT_EVENT'
types[TYPE_DICTIONARY] = 'Dictionary'
types[TYPE_ARRAY] = 'Array'
types[TYPE_RAW_ARRAY] = 'TYPE_RAW_ARRAY'
types[TYPE_INT_ARRAY] = 'TYPE_INT_ARRAY'
types[TYPE_REAL_ARRAY] = 'TYPE_REAL_ARRAY'
types[TYPE_STRING_ARRAY] = 'TYPE_STRING_ARRAY'
types[TYPE_VECTOR2_ARRAY] = 'TYPE_VECTOR2_ARRAY'
types[TYPE_VECTOR3_ARRAY] = 'TYPE_VECTOR3_ARRAY'
types[TYPE_COLOR_ARRAY] = 'TYPE_COLOR_ARRAY'
types[TYPE_MAX] = 'TYPE_MAX'
# Types to not be formatted when using _str
var _str_ignore_types = [
TYPE_INT, TYPE_REAL, TYPE_STRING,
TYPE_NIL, TYPE_BOOL
]
func _init():
_init_types_dictionary()
# ------------------------------------------------------------------------------
# ------------------------------------------------------------------------------
func _get_filename(path):
return path.split('/')[-1]
# ------------------------------------------------------------------------------
# Gets the filename of an object passed in. This does not return the
# full path to the object, just the filename.
# ------------------------------------------------------------------------------
func _get_obj_filename(thing):
var filename = null
if(thing == null or
!is_instance_valid(thing) or
str(thing) == '[Object:null]' or
typeof(thing) != TYPE_OBJECT or
thing.has_method('__gut_instance_from_id')):
return
if(thing.get_script() == null):
if(thing is PackedScene):
filename = _get_filename(thing.resource_path)
else:
# If it isn't a packed scene and it doesn't have a script then
# we do nothing. This just read better.
pass
elif(!_utils.is_native_class(thing)):
var dict = inst2dict(thing)
filename = _get_filename(dict['@path'])
if(dict['@subpath'] != ''):
filename += str('/', dict['@subpath'])
return filename
# ------------------------------------------------------------------------------
# Better object/thing to string conversion. Includes extra details about
# whatever is passed in when it can/should.
# ------------------------------------------------------------------------------
func type2str(thing):
var filename = _get_obj_filename(thing)
var str_thing = str(thing)
if(thing == null):
# According to str there is a difference between null and an Object
# that is somehow null. To avoid getting '[Object:null]' as output
# always set it to str(null) instead of str(thing). A null object
# will pass typeof(thing) == TYPE_OBJECT check so this has to be
# before that.
str_thing = str(null)
elif(typeof(thing) in _str_ignore_types):
# do nothing b/c we already have str(thing) in
# to_return. I think this just reads a little
# better this way.
pass
elif(typeof(thing) == TYPE_OBJECT):
if(_utils.is_native_class(thing)):
str_thing = _utils.get_native_class_name(thing)
elif(_utils.is_double(thing)):
var double_path = _get_filename(thing.__gut_metadata_.path)
if(thing.__gut_metadata_.subpath != ''):
double_path += str('/', thing.__gut_metadata_.subpath)
str_thing += '(double of ' + double_path + ')'
filename = null
elif(types.has(typeof(thing))):
if(!str_thing.begins_with('(')):
str_thing = '(' + str_thing + ')'
str_thing = str(types[typeof(thing)], str_thing)
if(filename != null):
str_thing += str('(', filename, ')')
return str_thing