|
|
|
@ -1,9 +1,15 @@ |
|
|
|
|
import hypothesis.strategies as st |
|
|
|
|
import random |
|
|
|
|
|
|
|
|
|
def generate_native_type(field): |
|
|
|
|
class FuzzyGenerator: |
|
|
|
|
def __init__(self, real_floats): |
|
|
|
|
self.real_floats=real_floats |
|
|
|
|
|
|
|
|
|
def generate_native_type(self, field): |
|
|
|
|
def floats(**kwargs): |
|
|
|
|
return st.floats(**kwargs, allow_nan=False, allow_infinity=False) |
|
|
|
|
allow_nan = not self.real_floats |
|
|
|
|
allow_infinity = not self.real_floats |
|
|
|
|
return st.floats(**kwargs, allow_nan=allow_nan, allow_infinity=allow_infinity) |
|
|
|
|
|
|
|
|
|
if field == 'bool': |
|
|
|
|
return st.booleans() |
|
|
|
@ -36,28 +42,28 @@ def generate_native_type(field): |
|
|
|
|
else: |
|
|
|
|
raise NotImplementedError(f'Invalid type : {field}') |
|
|
|
|
|
|
|
|
|
def generate_field(field): |
|
|
|
|
def generate_field(self, field): |
|
|
|
|
def rec(field_type): |
|
|
|
|
if field_type.which() == 'struct': |
|
|
|
|
return generate_struct(field.schema.elementType if base_type == 'list' else field.schema) |
|
|
|
|
return self.generate_struct(field.schema.elementType if base_type == 'list' else field.schema) |
|
|
|
|
elif field_type.which() == 'list': |
|
|
|
|
return st.lists(rec(field_type.list.elementType)) |
|
|
|
|
elif field_type.which() == 'enum': |
|
|
|
|
schema = field.schema.elementType if base_type == 'list' else field.schema |
|
|
|
|
return st.sampled_from(list(schema.enumerants.keys())) |
|
|
|
|
else: |
|
|
|
|
return generate_native_type(field_type.which()) |
|
|
|
|
return self.generate_native_type(field_type.which()) |
|
|
|
|
|
|
|
|
|
if 'slot' in field.proto.to_dict(): |
|
|
|
|
base_type = field.proto.slot.type.which() |
|
|
|
|
return rec(field.proto.slot.type) |
|
|
|
|
else: |
|
|
|
|
return generate_struct(field.schema) |
|
|
|
|
return self.generate_struct(field.schema) |
|
|
|
|
|
|
|
|
|
def generate_struct(schema): |
|
|
|
|
def generate_struct(self, schema): |
|
|
|
|
full_fill = list(schema.non_union_fields) if schema.non_union_fields else [] |
|
|
|
|
single_fill = [random.choice(schema.union_fields)] if schema.union_fields else [] |
|
|
|
|
return st.fixed_dictionaries(dict((field, generate_field(schema.fields[field])) for field in full_fill + single_fill)) |
|
|
|
|
return st.fixed_dictionaries(dict((field, self.generate_field(schema.fields[field])) for field in full_fill + single_fill)) |
|
|
|
|
|
|
|
|
|
def get_random_msg(struct): |
|
|
|
|
return generate_struct(struct.schema) |
|
|
|
|
def get_random_msg(struct, real_floats=False): |
|
|
|
|
return FuzzyGenerator(real_floats=real_floats).generate_struct(struct.schema) |
|
|
|
|