Repository: ladybug-tools/honeybee-vtk (language: python)

Issue:
Rename cli options
Rename diplay-mode-model to model-display-mode and display-grid-mode to grid-display-mode. This issue is raised [here](https://3.basecamp.com/4298486/buckets/20055059/messages/3897727371).


Discussion / hints:

Fix patch:
diff --git a/honeybee_vtk/_helper.py b/honeybee_vtk/_helper.py
index 7b450770..ba4788ea 100644
--- a/honeybee_vtk/_helper.py
+++ b/honeybee_vtk/_helper.py
@@ -3,24 +3,29 @@
 from typing import Any, Union, List, Tuple
 
 
-def _validate_input(val: Union[List, Tuple], val_type: Any, max_val: int = None) -> bool:
+def _validate_input(val: Union[List, Tuple], val_type: List[Any], max_val: int = None,
+                    num_val: int = None) -> bool:
     """Validate if all values in the provided input are selected object type and
     less than a specific maximum value.
 
     Args:
         val: A list or a tuple
-        val_type: Object type that you'd want as values in input. Examples are
-            int or float.
+        val_type: A list of Object types that you'd want as values in input. Examples are
+            int or float. If the values have to be either integer or floats, mention
+            both in the list.
         max_val: A number either integer or float. The values in the input shall be
             less than this number.
+        num_val: The number of items there should in in val.
 
     Returns:
         A boolean value if True.
     """
-    if not max_val:
-        return all(list(map(lambda v: isinstance(v, val_type), val)))
+    if num_val:
+        assert len(val) == num_val, f'Length of val must be {num_val}'
+    if max_val:
+        return all(list(map(lambda v: isinstance(v, tuple(val_type)) and v < max_val, val)))
     else:
-        return all(list(map(lambda v: isinstance(v, val_type) and v < max_val, val)))
+        return all(list(map(lambda v: isinstance(v, tuple(val_type)), val)))
 
 
 def get_min_max(val: List[List]) -> Tuple[float, float]:
diff --git a/honeybee_vtk/actor.py b/honeybee_vtk/actor.py
index d569e07f..7d13e8ec 100644
--- a/honeybee_vtk/actor.py
+++ b/honeybee_vtk/actor.py
@@ -65,7 +65,7 @@ def get_monochrome(self, monochrome_color: Tuple[float, float, float]) -> None:
             monochrome_color: A color that you'd like to paint actors with. Color here
                 is a tuple of three decimal values representing R,G, and B.
         """
-        if _validate_input(monochrome_color, float, max_val=1.0):
+        if _validate_input(monochrome_color, [float], max_val=1.0):
             self._monochrome_color = monochrome_color
         else:
             raise ValueError(
@@ -95,9 +95,10 @@ def to_vtk(self) -> vtk.vtkActor:
             mapper.SetScalarModeToUsePointData()
             mapper.SetScalarVisibility(True)
 
-            range_min, range_max = field_info.legend_parameter.range
+            range_min, range_max = field_info.range
             mapper.SetScalarRange(range_min, range_max)
             mapper.SetLookupTable(field_info.legend_parameter.get_lookuptable())
+            mapper.SetScalarRange(field_info.legend_parameter.range)
             mapper.Update()
 
         actor = vtk.vtkActor()
diff --git a/honeybee_vtk/camera.py b/honeybee_vtk/camera.py
index f7601c73..7f5cb2a8 100644
--- a/honeybee_vtk/camera.py
+++ b/honeybee_vtk/camera.py
@@ -140,8 +140,8 @@ def aerial_cameras(cls: Camera, bounds: List[Point3D], centroid) -> List[Camera]
         farthest_distance = sorted(distances, reverse=True)
         camera_distance = farthest_distance[0]
 
-        # generate four points at 45 degrees and -45 degrees on left and right side of
-        # the centroid
+        # generate total four points at 45 degrees and -45 degrees on left and right
+        # side of the centroid
         pt0 = Point3D(
             centroid_moved.x + math.cos(math.radians(45))*camera_distance,
             centroid_moved.y + math.sin(math.radians(45))*camera_distance,
diff --git a/honeybee_vtk/cli/export.py b/honeybee_vtk/cli/export.py
index d2c8bde3..e218c037 100644
--- a/honeybee_vtk/cli/export.py
+++ b/honeybee_vtk/cli/export.py
@@ -50,7 +50,7 @@ def export():
     help='Set background color for images', show_default=True
 )
 @click.option(
-    '--display-mode-model', '-dmm',
+    '--model-display-mode', '-mdm',
     type=click.Choice(['shaded', 'surface', 'surfacewithedges', 'wireframe', 'points'],
                       case_sensitive=False),
     default='shaded', help='Set display mode for the model.', show_default=True
@@ -62,7 +62,7 @@ def export():
     show_default=True,
 )
 @click.option(
-    '--display-mode-grid', '-dmg',
+    '--grid-display-mode', '-gdm',
     type=click.Choice(['shaded', 'surface', 'surfacewithedges',
                        'wireframe', 'points'], case_sensitive=False),
     default='shaded', help='Set display mode for the Sensorgrids.', show_default=True
@@ -79,7 +79,7 @@ def export():
 )
 def export(
         hbjson_file, name, folder, image_type, image_width, image_height,
-        background_color, display_mode_model, grid_options, display_mode_grid, view,
+        background_color, model_display_mode, grid_options, grid_display_mode, view,
         config):
     """Export images from radiance views in a HBJSON file.
 
@@ -117,27 +117,27 @@ def export(
         model = Model.from_hbjson(hbjson=hbjson_file, load_grids=grid_options)
 
         # Set model's display mode
-        if display_mode_model == 'shaded':
+        if model_display_mode == 'shaded':
             model.update_display_mode(DisplayMode.Shaded)
-        elif display_mode_model == 'surface':
+        elif model_display_mode == 'surface':
             model.update_display_mode(DisplayMode.Surface)
-        elif display_mode_model == 'surfacewithedges':
+        elif model_display_mode == 'surfacewithedges':
             model.update_display_mode(DisplayMode.SurfaceWithEdges)
-        elif display_mode_model == 'wireframe':
+        elif model_display_mode == 'wireframe':
             model.update_display_mode(DisplayMode.Wireframe)
-        elif display_mode_model == 'points':
+        elif model_display_mode == 'points':
             model.update_display_mode(DisplayMode.Points)
 
         # Set model's grid's display mode
-        if display_mode_grid == 'shaded':
+        if grid_display_mode == 'shaded':
             model.sensor_grids.display_mode = DisplayMode.Shaded
-        elif display_mode_model == 'surface':
+        elif model_display_mode == 'surface':
             model.sensor_grids.display_mode = DisplayMode.Surface
-        elif display_mode_model == 'surfacewithedges':
+        elif model_display_mode == 'surfacewithedges':
             model.sensor_grids.display_mode = DisplayMode.SurfaceWithEdges
-        elif display_mode_model == 'wireframe':
+        elif model_display_mode == 'wireframe':
             model.sensor_grids.display_mode = DisplayMode.Wireframe
-        elif display_mode_model == 'points':
+        elif model_display_mode == 'points':
             model.sensor_grids.display_mode = DisplayMode.Points
 
         actors = Actor.from_model(model)
diff --git a/honeybee_vtk/config.py b/honeybee_vtk/config.py
index b3e2fffa..930cf894 100644
--- a/honeybee_vtk/config.py
+++ b/honeybee_vtk/config.py
@@ -5,165 +5,173 @@
 import pathlib
 import warnings
 
-from typing import List, Optional
-from pydantic import BaseModel, validator, Field
-
-from .types import model_dataset_names
-from .legend_parameter import Colors, Font, LabelFormat, Orientation
+from typing import List, Union
+from pydantic import BaseModel, validator, Field, constr, conint
+from pydantic.types import confloat, conlist
+from .types import DataSetNames
+from .legend_parameter import ColorSets, Text, DecimalCount, Orientation
 from .model import Model
 from ._helper import get_line_count, get_min_max
 from .vtkjs.schema import DisplayMode
 from .scene import Scene
 
 
-class FontConfig(BaseModel):
-    """Config for the fonts to be used in a legend."""
+class Autocalculate(BaseModel):
+
+    type: constr(regex='^Autocalculate$') = 'Autocalculate'
+
 
-    color: List[int] = Field(
+class TextConfig(BaseModel):
+    """Config for the text to be used in a legend.
+
+    This object applies to text for legend title and legend labels as well.
+    """
+
+    class Config:
+        validate_all = True
+        validate_assignment = True
+
+    color: List[conint(ge=0, le=255)] = Field(
         [0, 0, 0],
         description='An array of three integer values representing R, G, and B values'
-        ' for the color of fonts.'
+        ' for the color of text. Values from 0 to 255 are accepted.'
     )
 
-    size: int = Field(
+    size: conint(ge=0) = Field(
         30,
-        description='Size of fonts in points.'
+        description='Text size in points.'
     )
 
     bold: bool = Field(
         False,
-        description='Bool value to indicate whether to make the fonts bold or not.'
+        description='Boolean value to indicate whether to make the text bold or not.'
     )
 
 
 class LegendConfig(BaseModel):
     """Config for the legend to be created from a dataset."""
+    class Config:
+        validate_all = True
+        validate_assignment = True
+
+    color_set: ColorSets = Field(
+        ColorSets.ecotect,
+        description='Color set to be used on data and legend. Currently, this field'
+        ' only uses Ladybug color sets. Defaults to using ecotect colorset.'
+    )
 
-    colors: str = Field(
-        'ecotect',
-        description='Color scheme for the legend.'
+    min: Union[Autocalculate, float] = Field(
+        Autocalculate(),
+        description='Minimum value for the legend. Also known as the lower end of the'
+        ' legend. If min and max values are not specified, autocalculated min and max'
+        ' values will be used from data.'
     )
 
-    range: List[int] = Field(
-        [0, 100],
-        description='A list of minimum and maximum values for the legend.'
+    max: Union[Autocalculate, float] = Field(
+        Autocalculate(),
+        description='Maximum value for the legend. Also known as the higher end of the'
+        ' legend. If min and max values are not specified, autocalculated min and max'
+        ' values will be used from data.'
     )
 
-    show_legend: bool = Field(
+    hide_legend: bool = Field(
         False,
         description='A bool value to indicate whether to show legend in the exported'
         ' images or not.'
     )
 
-    orientation: str = Field(
-        'horizontal',
-        description='Choose between horizontal and vertical orientation.'
-    )
-
-    position: List[float] = Field(
-        [0.5, 0.1],
-        description='A tuple of two decimal values. The values represent the percentage'
-        ' of viewport width and the percentage of viewport height.'
+    orientation: Orientation = Field(
+        Orientation.horizontal,
+        description='Choose between horizontal and vertical orientation of legend.'
     )
 
-    width: float = Field(
+    width: confloat(ge=0.05, le=0.95) = Field(
         0.45,
-        description=' A decimal number representing the percentage of viewport width'
+        description=' A decimal number representing the fraction of viewport width'
         ' that will be used to define the width of the legend.'
     )
 
-    height: float = Field(
+    height: confloat(ge=0.05, le=0.95) = Field(
         0.05,
-        description='A decimal number representing the percentage of viewport height'
+        description='A decimal number representing the fraction of viewport height'
         'that will be used to define the height of the legend.'
     )
 
-    number_of_colors: int = Field(
-        None,
-        description='An integer representing the number of colors in a legend.'
+    position: conlist(confloat(ge=0.05, le=0.95), min_items=2, max_items=2) = Field(
+        [0.5, 0.1],
+        description='A tuple of two decimal values. The values represent the fraction'
+        ' of viewport width and the fraction of viewport height.'
     )
 
-    number_of_labels: int = Field(
-        None,
-        description='An integer representing the number of text labels on a legend.'
+    color_count: Union[Autocalculate, int] = Field(
+        Autocalculate(),
+        description='An integer representing the number of colors in a legend. If not'
+        ' specified, it defaults to the number of colors in a Ladybug color set.'
     )
 
-    label_format: str = Field(
-        'integer',
-        description='Format of legend labels.'
+    label_count: Union[Autocalculate, int] = Field(
+        Autocalculate(),
+        description='An integer representing the number of text labels on a legend.'
+        ' Label count will have to be less than or equal to color count. It defaults'
+        ' to vtk scalarbar default setting.'
     )
 
-    label_position: int = Field(
-        0,
-        description='0 or 1 to decide whether the legend title and the legend labels'
-        ' will precede the legend or not.'
+    decimal_count: DecimalCount = Field(
+        DecimalCount.default,
+        description='Controlling the number of decimals on each label of the legend.'
+        'Accepted values are "default", "integer", "decimal_two", and "decimal_three".'
+        'Defaults to VTKs default settings.'
     )
 
-    label_fonts: FontConfig = Field(
-        FontConfig(),
-        description='Font parameters for the fonts to be used for the labels on the'
-        ' legend.'
+    preceding_labels: bool = Field(
+        False,
+        description='Boolean value to decide whether the legend title and the'
+        ' legend labels will precede the legend or not.'
     )
 
-    title_fonts: FontConfig = Field(
-        FontConfig(bold=True),
-        description='Font parameters for the fonts to be used in the title of the'
-        ' legend.'
+    label_parameters: TextConfig = Field(
+        TextConfig(),
+        description='Text parameters for the labels on the legend.'
     )
 
-    @validator('colors')
-    def validate_colors(cls, v: str) -> str:
-        colors = dir(Colors)[4:]
-        if v.lower() in colors:
-            return v
-        else:
-            raise ValueError(
-                f'Colors must be a string from {tuple(colors)}. Instead got'
-                f' {v}.'
-            )
-
-    @validator('orientation')
-    def validate_orientation(cls, v: str) -> str:
-        orientations = ('horizontal', 'vertical')
-        if v.lower() in orientations:
-            return v
-        else:
-            raise ValueError(
-                f'Orientation must be from {orientations}. Instead got {v}.'
-            )
-
-    @validator('label_format')
-    def validate_label_format(cls, v: str) -> str:
-        label_formats = dir(LabelFormat)[4:]
-        if v in label_formats:
-            return v
-        else:
-            raise ValueError(
-                f'Label format must be from {label_formats}. Instead got {v}.'
-            )
+    title_parameters: TextConfig = Field(
+        TextConfig(bold=True),
+        description='Text parameters for the title of the legend.'
+    )
 
 
 class DataConfig(BaseModel):
-    """Config for each dataset you'd like to load on a honeybee-vtk model."""
+    """Config for simulation results you'd like to load on a honeybee-vtk model."""
 
-    name: str = Field(
-        description='Name to be given to data. Example, "Daylight-Factor".'
+    class Config:
+        validate_all = True
+        validate_assignment = True
+
+    identifier: str = Field(
+        description='identifier to be given to data. Example, "Daylight-Factor".'
+        ' This identifier needs to be unique in each of the DataConfig objects'
+        ' one introduces using a config file. Having multiple DataConfig objects with'
+        ' same modifier will raise an error.'
     )
 
-    object_type: str = Field(
+    object_type: DataSetNames = Field(
         description='The name of the model object on which you would like to map this'
         ' data.'
     )
 
-    file_paths: List[str] = Field(
-        description='List of paths to the file or files that you are trying to use as'
-        ' data.'
+    unit: str = Field(
+        description=' The unit of the data being loaded.'
     )
 
-    color_by: bool = Field(
+    path: str = Field(
+        description='Valid path to the folder with result files and the json file that'
+        ' catalogues the results.'
+    )
+
+    hide: bool = Field(
         False,
-        description='Bool value to indicate if this data should be used to color the'
-        ' object type in the model.'
+        description='Boolean value to indicate if this data should be visible in the'
+        ' exported images or not.'
     )
 
     legend_parameters: LegendConfig = Field(
@@ -171,34 +179,43 @@ class DataConfig(BaseModel):
         description='Legend parameters to create legend out of the this dataset.'
     )
 
-    @validator('object_type')
-    def validate_object(cls, v: str) -> str:
-        if v in model_dataset_names:
+    @validator('path')
+    def validate_folder_path(cls, v: str) -> str:
+        if pathlib.Path(v).is_dir():
             return v
         else:
             raise ValueError(
-                f'Object name should be from these {model_dataset_names}.'
-                f' Instead got {v}.'
+                'Not a valid folder path.'
             )
 
-    @validator('file_paths')
-    def validate_paths(cls, v: List[str]) -> List[str]:
-        if all([pathlib.Path(path).is_file() for path in v]):
-            return v
-        else:
-            paths = tuple([path for path in v if not pathlib.Path(path).is_file()])
+    @validator('legend_parameters')
+    def check_pos_against_width_height(cls, v: LegendConfig, values) -> LegendConfig:
+        id = values['identifier']
+        if v.width >= 0.5 and v.position[0] >= 0.5 and v.width > v.position[0]:
             raise ValueError(
-                f'Following file paths are not valid {paths}.'
+                f'Width of legend {id}, {v.width}'
+                f' cannot be greater than the position of legend in X direction'
+                f' {v.position[0]}.'
+                ' Either update the position in X direction or update the'
+                ' width of the legend.'
             )
+        if v.height >= 0.5 and v.position[1] >= 0.5 and v.height > v.position[1]:
+            raise ValueError(
+                f'Height of legend {id}, {v.height}'
+                f' cannot be greater than the position of legend in Y direction'
+                f' {v.position[1]}.'
+                ' Either update the position in Y direction or update the'
+                ' height of the legend.'
+            )
+        return v
 
 
 def _validate_data(data: DataConfig, model: Model) -> bool:
-    """Cross check data with model.
+    """Match result data with the sensor grids in the model.
 
-    For grids, it will be checked if the number of data files and the names of the
-    data files match with the grid identifiers. For other than grid objects, it will
-    be checked that only one data file is provided and the length of the data file
-    matches the length of Polydata in the model. This is a helper method to the
+    It will be checked if the number of data files and the names of the
+    data files match with the grid identifiers. This function does not support validating
+    result data for other than sensor grids as of now. This is a helper method to the
     public load_config method.
 
     Args:
@@ -208,87 +225,56 @@ def _validate_data(data: DataConfig, model: Model) -> bool:
     Returns:
         A boolean value.
     """
-    # if file_paths is empty
-    if not data.file_paths:
-        raise ValueError(
-            f'For object with name {data.name} There are not file paths'
-            ' provided to load data from.'
-        )
-
-    # if object name is "grid" check that the name of files match the grid names
-    if data.object_type == model_dataset_names[-1]:
-
-        # make sure grids are loaded on the model if grid data is to be mounted
-        assert len(model.sensor_grids.data) > 0, 'Sensor grids are not loaded on'\
-            ' this model. Reload them using grid options.'
-
-        grid_names = [grid.identifier for grid in model.sensor_grids.data]
-        file_names = [pathlib.Path(path).stem for path in data.file_paths]
-        names_in_grids = all([name in grid_names for name in file_names])
-
-        # the number of data files must not exceed the number of grids
-        if len(file_names) > len(grid_names):
-            raise ValueError(
-                f'There are only {len(grid_names)} grids in the model and the'
-                f' identifiers of those grids are {tuple(grid_names)}.'
-            )
-
-        # TODO: remove this check in the next iteration
-        # make sure there's one file for each grid in the model
-        if not names_in_grids:
-            raise ValueError(
-                'Make sure the file names match the grid identifiers. The'
-                f' identifiers of the grids in the model are {tuple(grid_names)}.'
-            )
-
-        # make sure length of each file matches the number of sensors in grid
-        file_lengths = [get_line_count(file_path) for file_path in data.file_paths]
+    grids_info_json = pathlib.Path(data.path).joinpath('grids_info.json')
+
+    with open(grids_info_json) as fh:
+        grids_info = json.load(fh)
+
+    assert len(model.sensor_grids.data) > 0, 'Sensor grids are not loaded on'\
+        ' this model. Reload them using grid options.'
+    # TODO: Make sure to remove this limitation. A user should not have to always
+    # TODO: load all the grids
+    assert len(model.sensor_grids.data) == len(grids_info), 'The number of result'\
+        f' files {len(grids_info)} does for {data.identifier} does not match'\
+        f' the number of sensor grids in the model {len(model.sensor_grids.data)}.'
+
+    grids_model_identifiers = [grid.identifier for grid in model.sensor_grids.data]
+    grids_info_identifiers = [grid['full_id'] for grid in grids_info]
+    assert grids_model_identifiers == grids_info_identifiers, 'The identifiers of'\
+        ' the sensor grids in the model do not match the identifiers of the grids'\
+        f' in the grids_info.json for {data.identifier}.'
+
+    # make sure length of each file matches the number of sensors in grid
+    file_lengths = [grid['count'] for grid in grids_info]
+
+    # check if the grid data is meshes or points
+    # if grid is sensors
+    if model.sensor_grids.data[0].GetNumberOfCells() == 1 and \
+            model.sensor_grids.data[0].GetNumberOfPoints() == file_lengths[0]:
+        num_sensors = [polydata.GetNumberOfPoints()
+                       for polydata in model.sensor_grids.data]
+    # if grid is meshes
+    else:
         num_sensors = [polydata.GetNumberOfCells()
                        for polydata in model.sensor_grids.data]
 
-        if file_lengths != num_sensors:
-            path_matches = {
-                data.file_paths[i]: file_lengths[i] == num_sensors[i] for i in
-                range(len(data.file_paths))
-            }
-            paths_to_report = [
-                path for path in path_matches if path_matches[path] is False]
-            raise ValueError(
-                'File lengths must match grid sizes. Lengths of'
-                f' following files do not match grid size {tuple(paths_to_report)}.')
-
-        return True
-
-    # if object_name is other than grid check that length of data matches the length
-    # of data in the model for that object.
-    elif data.object_type in model_dataset_names[:-1]:
-
-        # only one file is accepted
-        if len(data.file_paths) > 1:
-            raise ValueError(
-                'Only one file path needs to be provided in order to load data on'
-                f' {data.object_type}. Multiple files are provided in the config'
-                ' file.'
-            )
-
-        # match length of file with the number of faces in the model
-        if get_line_count(data.file_paths[0]) != len(
-                model.get_modeldataset_from_string(data.object_type).data):
-            raise ValueError(
-                'The length of data in the file does not match the number of'
-                f' {data.object_type} objects in the model.'
-            )
-        return True
-
-    else:
+    if file_lengths != num_sensors:
+        length_matching = {
+            grids_info_identifiers[i]: file_lengths[i] == num_sensors[i] for i in
+            range(len(grids_model_identifiers))
+        }
+        names_to_report = [
+            id for id in length_matching if length_matching[id] is False]
         raise ValueError(
-            ' object_name must be from one of these'
-            f' {model_dataset_names}. Instead got {data.object_type}.'
-        )
+            'File lengths of result files must match the number of sensors on grids.'
+            ' Lengths of files with following names do not match'
+            f' {tuple(names_to_report)}.')
+
+    return True
 
 
 def _load_data(data: DataConfig, model: Model) -> None:
-    """Load validate data on a honeybee-vtk model.
+    """Load validated data on a honeybee-vtk model.
 
     This is a helper method to the public load_config method.
 
@@ -296,26 +282,22 @@ def _load_data(data: DataConfig, model: Model) -> None:
         data: A DataConfig object.
         model: A honeybee-vtk model.
     """
-    # if data is for a ModelDataSet grid
-    if data.object_type == model_dataset_names[-1]:
-
-        result = []
-        for file_path in data.file_paths:
-            res_file = pathlib.Path(file_path)
-            grid_res = [float(v)
-                        for v in res_file.read_text().splitlines()]
-            result.append(grid_res)
-
-    # if data is for a ModelDataSet other than grid
-    elif data.object_type in model_dataset_names[:-1]:
-        res_file = pathlib.Path(data.file_paths[0])
-        result = [[float(v)] for v in res_file.read_text().splitlines()]
-
-    ds = model.get_modeldataset_from_string(data.object_type)
+    # file paths to the result files
+    file_paths = [result for result in pathlib.Path(
+        data.path).iterdir() if result.suffix != '.json']
+
+    result = []
+    for file_path in file_paths:
+        res_file = pathlib.Path(file_path)
+        grid_res = [float(v)
+                    for v in res_file.read_text().splitlines()]
+        result.append(grid_res)
+
+    ds = model.get_modeldataset(data.object_type)
     ds.add_data_fields(
-        result, name=data.name, data_range=get_min_max(result))
-    if data.color_by:
-        ds.color_by = data.name
+        result, name=data.identifier)
+    if not data.hide:
+        ds.color_by = data.identifier
     ds.display_mode = DisplayMode.SurfaceWithEdges
 
 
@@ -327,45 +309,62 @@ def _load_legend_parameters(data: DataConfig, model: Model, scene: Scene) -> Non
         model: A honeybee-vtk model object.
         scene: A honeyebee-vtk scene object.
     """
-    if data.legend_parameters and data.color_by:
+    if data.legend_parameters and not data.hide:
 
         legend_params = data.legend_parameters
-        legend = scene.legend_parameter(data.name)
+        legend = scene.legend_parameter(data.identifier)
 
-        if legend_params.colors:
-            legend.colors = Colors[legend_params.colors]
+        legend.colors = legend_params.color_set
+        legend.unit = data.unit
 
-        legend.range = legend_params.range
-        legend.show_legend = legend_params.show_legend
+        if isinstance(legend_params.min, Autocalculate):
+            legend.min = None
+        else:
+            legend.min = legend_params.min
 
-        if legend_params.orientation:
-            legend.orientation = Orientation[legend_params.orientation]
+        if isinstance(legend_params.max, Autocalculate):
+            legend.max = None
+        else:
+            legend.max = legend_params.max
 
+        if not legend.min and not legend.max:
+            warnings.warn(
+                f'For legend{data.object_type.value.capitalize()}, since min and max'
+                ' values are not provided, those values will be auto calculated based'
+                ' on data.'
+            )
+
+        legend.hide_legend = legend_params.hide_legend
+        legend.orientation = legend_params.orientation
         legend.position = legend_params.position
         legend.width = legend_params.width
         legend.height = legend_params.height
-        legend.number_of_colors = legend_params.number_of_colors
 
-        legend.number_of_labels = legend_params.number_of_labels
-        if legend_params.label_format:
-            legend.label_format = LabelFormat[legend_params.label_format]
+        if isinstance(legend_params.color_count, int):
+            legend.color_count = legend_params.color_count
+        else:
+            legend.color_count = None
+
+        if isinstance(legend_params.label_count, int):
+            legend.label_count = legend_params.label_count
+        else:
+            legend.label_count = None
 
-        legend.label_position = legend_params.label_position
+        legend.decimal_count = legend_params.decimal_count
+        legend.preceding_labels = legend_params.preceding_labels
 
-        if legend_params.label_fonts:
-            label_fonts = legend_params.label_fonts
-            legend.label_font = Font(
-                label_fonts.color, label_fonts.size, label_fonts.bold)
+        label_params = legend_params.label_parameters
+        legend.label_parameters = Text(
+            label_params.color, label_params.size, label_params.bold)
 
-        if legend_params.title_fonts:
-            title_fonts = legend_params.title_fonts
-            legend.title_font = Font(
-                title_fonts.color, title_fonts.size, title_fonts.bold)
+        title_params = legend_params.title_parameters
+        legend.title_parameters = Text(
+            title_params.color, title_params.size, title_params.bold)
 
-    elif data.legend_parameters and not data.color_by:
+    elif data.legend_parameters and data.hide:
         warnings.warn(
-            f'Since {data.object_type} is not going to be colored by {data.name},'
-            ' legend parameters will be ignored.'
+            f'Since {data.object_type.value.capitalize()} is not going to be'
+            f' colored by {data.identifier}, legend parameters will be ignored.'
         )
 
 
@@ -377,7 +376,6 @@ def load_config(json_path: str, model: Model, scene: Scene) -> None:
         model: A honeybee-vtk model object.
         scene: A honeybee-vtk scene object.
     """
-    # Check if json is valid
     try:
         with open(json_path) as fh:
             config = json.load(fh)
diff --git a/honeybee_vtk/legend_parameter.py b/honeybee_vtk/legend_parameter.py
index 6f9efc33..0185942e 100644
--- a/honeybee_vtk/legend_parameter.py
+++ b/honeybee_vtk/legend_parameter.py
@@ -1,21 +1,23 @@
 """Vtk legend parameters."""
 
+from _pytest.python_api import raises
 import vtk
-from ladybug.color import Colorset
-from enum import Enum
-from typing import Tuple
+from ladybug.color import Colorset, Color
+from enum import Enum, auto
+from typing import Tuple, Union
 from ._helper import _validate_input
 
 
-class LabelFormat (Enum):
-    """Setting the type of the Label on a Legend.
+class DecimalCount (Enum):
+    """Controlling the number of decimals on each label of the legend."""
+    decimal_two = 'decimal_two'
+    decimal_three = 'decimal_three'
+    default = 'default'
+    integer = 'integer'
 
-    Types refers to two point decimal numbers, three point decimal numbers, and integers.
-    """
-    decimal_two = '%#6.2f'
-    decimal_three = '%-#6.3f'
-    default = '%-#6.3g'
-    integer = '%4.3g'
+
+decimal_count = {'decimal_two': '%#6.2f', 'decimal_three': '%-#6.3f',
+                 'default': '%-#6.3g', 'integer': '%4.3g'}
 
 
 class Orientation(Enum):
@@ -24,39 +26,70 @@ class Orientation(Enum):
     horizontal = 'horizontal'
 
 
-class Colors(Enum):
+class ColorSets(Enum):
     """Colors for a legend."""
-    annual_comfort = Colorset.annual_comfort()
-    benefit = Colorset.benefit()
-    benefit_harm = Colorset.benefit_harm()
-    black_to_white = Colorset.black_to_white()
-    blue_green_red = Colorset.blue_green_red()
-    cloud_cover = Colorset.cloud_cover()
-    cold_sensation = Colorset.cold_sensation()
-    ecotect = Colorset.ecotect()
-    energy_balance = Colorset.energy_balance()
-    energy_balance_storage = Colorset.energy_balance_storage()
-    glare_study = Colorset.glare_study()
-    harm = Colorset.harm()
-    heat_sensation = Colorset.heat_sensation()
-    multi_colored = Colorset.multi_colored()
-    multicolored_2 = Colorset.multicolored_2()
-    multicolored_3 = Colorset.multicolored_3()
-    nuanced = Colorset.nuanced()
-    openstudio_palette = Colorset.openstudio_palette()
-    original = Colorset.original()
-    peak_load_balance = Colorset.peak_load_balance()
-    shade_benefit = Colorset.shade_benefit()
-    shade_benefit_harm = Colorset.shade_benefit_harm()
-    shade_harm = Colorset.shade_harm()
-    shadow_study = Colorset.shadow_study()
-    therm = Colorset.therm()
-    thermal_comfort = Colorset.thermal_comfort()
-    view_study = Colorset.view_study()
-
-
-class Font:
-    """Fonts for the legend.
+    annual_comfort = 'annual_comfort'
+    benefit = 'benefit'
+    benefit_harm = 'benefit_harm'
+    black_to_white = 'black_to_white'
+    blue_green_red = 'blue_green_red'
+    cloud_cover = 'cloud_cover'
+    cold_sensation = 'cloud_sensation'
+    ecotect = 'ecotect'
+    energy_balance = 'energy_balance'
+    energy_balance_storage = 'energy_balance_storag'
+    glare_study = 'glare_study'
+    harm = 'harm'
+    heat_sensation = 'heat_sensation'
+    multi_colored = 'multi_colored'
+    multicolored_2 = 'multicolored_2'
+    multicolored_3 = 'multicolored_3'
+    nuanced = 'nuanced'
+    openstudio_palette = 'openstudio_palette'
+    original = 'original'
+    peak_load_balance = 'peak_load_balance'
+    shade_benefit = 'shade_benefit'
+    shade_benefit_harm = 'shade_benefit_harm'
+    shade_harm = 'shade_harm'
+    shadow_study = 'shadow_study'
+    therm = 'therm'
+    thermal_comfort = 'thermal_comfort'
+    view_study = 'view_study'
+
+
+color_set = {
+    'annual_comfort': Colorset.annual_comfort(),
+    'benefit': Colorset.benefit(),
+    'benefit_harm': Colorset.benefit_harm(),
+    'black_to_white': Colorset.black_to_white(),
+    'blue_green_red': Colorset.blue_green_red(),
+    'cloud_cover': Colorset.cloud_cover(),
+    'cold_sensation': Colorset.cold_sensation(),
+    'ecotect': Colorset.ecotect(),
+    'energy_balance': Colorset.energy_balance(),
+    'energy_balance_storage': Colorset.energy_balance_storage(),
+    'glare_study': Colorset.glare_study(),
+    'harm': Colorset.harm(),
+    'heat_sensation': Colorset.heat_sensation(),
+    'multi_colored': Colorset.multi_colored(),
+    'multicolored_2': Colorset.multicolored_2(),
+    'multicolored_3': Colorset.multicolored_3(),
+    'nuanced': Colorset.nuanced(),
+    'openstudio_palette': Colorset.openstudio_palette(),
+    'original': Colorset.original(),
+    'peak_load_balance': Colorset.peak_load_balance(),
+    'shade_benefit': Colorset.shade_benefit(),
+    'shade_benefit_harm': Colorset.shade_benefit_harm(),
+    'shade_harm': Colorset.shade_harm(),
+    'shadow_study': Colorset.shadow_study(),
+    'therm': Colorset.therm(),
+    'thermal_comfort': Colorset.thermal_comfort(),
+    'view_study': Colorset.view_study()
+}
+
+
+class Text:
+    """Text parameters for the legend.
 
         Args:
             color: A tuple of three integer values for R, G, and B. Defaults (0, 0, 0).
@@ -82,9 +115,9 @@ def color(self) -> Tuple[float, float, float]:
     def color(self, val) -> None:
         if not val:
             self._color = (0, 0, 0)
-        elif isinstance(val, (tuple, list)) and _validate_input(val, int, 256) \
+        elif isinstance(val, (tuple, list)) and _validate_input(val, [int], 256) \
                 and len(val) == 3:
-            self._color = (val[0] / 255, val[1] / 255, val[1] / 255)
+            self._color = (val[0] / 255, val[1] / 255, val[2] / 255)
         else:
             raise ValueError(
                 'Color accepts a tuple of a list of three integers for R, G, and B'
@@ -149,70 +182,86 @@ class LegendParameter:
         Args:
             name: A text string representing the name of the legend object and the
                 title of the legend. Default to "Legend".
+            unit: A text string representing the unit of the data that the legend
+                represents. Examples are 'celsius', 'kwn/m2', etc.
             colors: A Colors object. Defaults to Ecotect colorset.
-            range: A tuple of integers representing the minimum and maximum values of a
-                legend. Defaults to (0, 100).
-            show_legend: A boolean to set the visibility of a legend in Scene.
+            hide_legend: A boolean to set the visibility of a legend in Scene.
                 Defaults to False.
             orientation: An Orientation object that sets the orientation of the legend in
                 the scene. Defaults to horizontal orientation.
-            position: A tuple of two decimal values. The values represent the percentage
-                of viewport width and the percentage of viewport height. These
-                percentages in decimal numbers will define the location of the start
+            position: A tuple of two decimal values. The values represent the fraction
+                of viewport width and the fraction of viewport height. These
+                fractions in decimal numbers will define the location of the start
                 point of the legend. For example, a value of (0.0, 0.5) will place the
                 start point of the legend at the left most side of the viewport and at
-                the 50% height of the viewport. Default to (0.5, 0.1).
-            width: A decimal number representing the percentage of viewport width that
+                the 50% height of the viewport. Defaults to (0.5, 0.1).
+            width: A decimal number representing the fraction of viewport width that
                 will be used to define the width of the legend. A value of 0.45 will
                 make the width of legend equal to the 45% width of the viewport.
                 Defaults to 0.45.
-            height: A decimal number representing the percentage of viewport height that
+            height: A decimal number representing the fraction of viewport height that
                 will be used to define the height of the legend. A value of 0.05 will
                 make the height of legend equal to the 5% height of the viewport.
                 Defaults to 0.05.
-            number_of_colors: An integer representing the number of colors in a legend.
+            color_count: An integer representing the number of colors in a legend.
+                Defaults to None which will use all the colors in the colors property.
+            label_count: An integer representing the number of text labels on a
+                legend. Default to None which will use vtk legend's default setting.
+            decimal_count: A DecimalCount object that specifies the number of decimals
+                on each label of the legend. Defaults to the type of data. For data
+                with integer values this will default to integer. Similarly, for data
+                with decimal values, this will default to decimal point numbers. 
+            preceding_labels: A boolean value to indicate whether the title and the
+                labels should precede the legend or not. Defaults to False.
+            label_parameters: A Text object. Defaults to size 30 black text.
+            title_parameters: A Text object. Defaults to size 50 black bold text.
+            min: A number that will be set as the lower bound of the legend.
+                Defaults to None.
+            min: A number that will be set as the upper bound of the legend.
                 Defaults to None.
-            number_of_labels: An integer representing the number of text labels on a
-                legend. Default to None.
-            label_format: A LabelFormat object. Defaults to integer format.
-            label_position: 0 or 1. The value of 0 would mean that the labels and the
-                title would not precede the legend. The value of 1 would mean that the
-                labels and the title would precede the legend. Defaults to 0.
-            label_font: A Font object. Defaults to size 30 black fonts.
-            title_font: A font object. Defaults to size 50 black bold fonts.
+            auto_range: A tuple of minimum and maximum values for legend. This is 
+                auto set when Data is loaded on a model. Use min and max arguments to
+                customize this auto calculated range.
         """
 
     def __init__(
             self,
             name: str = 'Legend',
-            colors: Colors = Colors.ecotect,
-            range: Tuple[int, int] = (0, 100),
-            show_legend: bool = False,
+            unit: str = '',
+            colors: ColorSets = ColorSets.ecotect,
+            hide_legend: bool = False,
             orientation: Orientation = Orientation.horizontal,
             position: Tuple[float, float] = (0.5, 0.1),
             width: float = 0.45,
             height: float = 0.05,
-            number_of_colors: int = None,
-            number_of_labels: int = None,
-            label_format: LabelFormat = LabelFormat.integer,
-            label_position: int = 0,
-            label_font: Font = Font(color=(0, 0, 0), size=30),
-            title_font: Font = Font(color=(0, 0, 0), size=50, bold=True)) -> None:
+            color_count: int = None,
+            label_count: int = None,
+            decimal_count: DecimalCount = DecimalCount.default,
+            preceding_labels: bool = False,
+            label_parameters: Text = Text(color=(0, 0, 0), size=30),
+            title_parameters: Text = Text(color=(0, 0, 0), size=50, bold=True),
+            min: Union[float, int] = None,
+            max: Union[float, int] = None,
+            auto_range: Tuple[float, float] = None) -> None:
 
         self.name = name
+        self.unit = unit
         self.colors = colors
-        self.range = range
-        self.show_legend = show_legend
+        self.hide_legend = hide_legend
         self.orientation = orientation
         self.position = position
         self.width = width
         self.height = height
-        self.number_of_colors = number_of_colors
-        self.number_of_labels = number_of_labels
-        self.label_format = label_format
-        self.label_position = label_position
-        self.label_font = label_font
-        self.title_font = title_font
+        self.color_count = color_count
+        self.label_count = label_count
+        self.decimal_count = decimal_count
+        self.preceding_labels = preceding_labels
+        self.label_parameters = label_parameters
+        self.title_parameters = title_parameters
+        self.min = min
+        self.max = max
+        self.auto_range = auto_range
+        self._range = None
 
     @property
     def name(self) -> str:
@@ -231,49 +280,48 @@ def name(self, val) -> None:
             )
 
     @property
-    def colors(self) -> Colors:
-        """Colors to be used in the legend."""
-        return self._colors
+    def unit(self) -> str:
+        """Unit for the data that the legend represents."""
+        return self._unit
 
-    @colors.setter
-    def colors(self, val) -> None:
+    @unit.setter
+    def unit(self, val) -> None:
         if not val:
-            self._colors = Colors.ecotect
-        elif isinstance(val, Colors):
-            self._colors = val
+            self._unit = ''
+        elif isinstance(val, str):
+            self._unit = val
         else:
             raise ValueError(
-                f'A Colors object expected. Instead got {val}.'
+                f'Unit only accepts text. Instead got {type(val).__name__}.'
             )
 
     @property
-    def range(self) -> Tuple[float, float]:
-        """A tuple with min and max values in the legend."""
-        return self._range
+    def colors(self) -> ColorSets:
+        """Colors to be used in the legend."""
+        return self._colors
 
-    @range.setter
-    def range(self, val) -> None:
+    @colors.setter
+    def colors(self, val) -> None:
         if not val:
-            self._range = (0, 100)
-        elif isinstance(val, (tuple, list)) and len(val) == 2:
-            self._range = val
+            self._colors = ColorSets.ecotect
+        elif isinstance(val, ColorSets):
+            self._colors = val
         else:
             raise ValueError(
-                'Range takes a tuple or a list of integers.'
-                f' Instead got {type(val).__name__}.'
+                f'A ColorSet objects expected. Instead got {val}.'
             )
 
     @property
-    def show_legend(self) -> bool:
+    def hide_legend(self) -> bool:
         """Visibility of legend in the scene."""
-        return self._show_legend
+        return self._hide_legend
 
-    @show_legend.setter
-    def show_legend(self, val) -> None:
+    @hide_legend.setter
+    def hide_legend(self, val) -> None:
         if not val:
-            self._show_legend = False
+            self._hide_legend = False
         elif isinstance(val, bool):
-            self._show_legend = val
+            self._hide_legend = val
         else:
             raise ValueError(
                 'Only a True or False value is accepted.'
@@ -304,7 +352,7 @@ def position(self) -> Tuple[float, float]:
     def position(self, val) -> None:
         if not val:
             self._position = (0.5, 0.1)
-        elif isinstance(val, (tuple, list)) and _validate_input(val, float, 0.96) \
+        elif isinstance(val, (tuple, list)) and _validate_input(val, [float], 0.96) \
                 and len(val) == 2:
             self._position = val
         else:
@@ -315,7 +363,7 @@ def position(self, val) -> None:
 
     @property
     def width(self) -> float:
-        """Width of the legend as a percentage of viewport width."""
+        """Width of the legend as a fraction of viewport width."""
         return self._width
 
     @width.setter
@@ -331,7 +379,7 @@ def width(self, val) -> None:
 
     @property
     def height(self) -> float:
-        """height of the legend as a percentage of viewport height."""
+        """height of the legend as a fraction of viewport height."""
         return self._height
 
     @height.setter
@@ -346,119 +394,209 @@ def height(self, val) -> None:
             )
 
     @property
-    def number_of_colors(self) -> int:
+    def color_count(self) -> int:
         """Number of colors in the legend."""
-        return self._number_of_colors
+        return self._color_count
 
-    @number_of_colors.setter
-    def number_of_colors(self, val) -> None:
+    @color_count.setter
+    def color_count(self, val) -> None:
         if not val:
-            self._number_of_colors = None
+            self._color_count = None
         elif isinstance(val, int) and 0 <= val <= len(self.colors.value):
-            self._number_of_colors = val
+            self._color_count = val
         else:
             raise ValueError(
-                'Number of colors must be an integer less than or equal to the number of'
-                f'colors in the colors property. instead got {val}.'
+                'Color count must be a number less than or equal to the number of'
+                f' colors in the colors property, which is {len(self.colors.value)}.'
+                f' Instead got {val}.'
             )
 
     @property
-    def number_of_labels(self) -> int:
+    def label_count(self) -> int:
         """Number of text labels in the legend."""
-        return self._number_of_labels
+        return self._label_count
 
-    @number_of_labels.setter
-    def number_of_labels(self, val) -> None:
+    @label_count.setter
+    def label_count(self, val) -> None:
         if not val:
-            self._number_of_labels = None
-        elif isinstance(val, int) and 0 <= val <= len(self.colors.value):
-            self._number_of_labels = val
-        else:
-            raise ValueError(
-                'Number of labels must be an integer less than or equal to the number of'
-                f'colors in the colors property. instead got {val}.'
-            )
+            self._label_count = None
+        elif not self._color_count:
+            if isinstance(val, int) and 0 <= val <= len(self.colors.value):
+                self._label_count = val
+            else:
+                raise ValueError(
+                    'Label count must be a number less than or equal to the number of'
+                    f' colors {len(self.colors.value)}. Instead got {val}.'
+                )
+        elif self._color_count:
+            if isinstance(val, int) and 0 <= val <= self._color_count:
+                self._label_count = val
+            else:
+                raise ValueError(
+                    'Label count must be a number less than or equal to'
+                    f' color count, which is {self._color_count}. Instead got {val}.'
+                )
 
     @property
-    def label_format(self) -> LabelFormat:
+    def decimal_count(self) -> DecimalCount:
         """The format of legend labels."""
-        return self._label_format
+        return self._decimal_count
 
-    @label_format.setter
-    def label_format(self, val) -> None:
+    @decimal_count.setter
+    def decimal_count(self, val) -> None:
         if not val:
-            self._label_format = LabelFormat.integer
-        elif isinstance(val, LabelFormat):
-            self._label_format = val
+            self._decimal_count = DecimalCount.default
+        elif isinstance(val, DecimalCount):
+            self._decimal_count = val
         else:
             raise ValueError(
-                f'A LabelFormat object expected. Instead got {type(val).__name__}'
+                f'A DecimalCount object expected. Instead got {type(val).__name__}'
             )
 
     @property
-    def label_position(self) -> int:
-        """The position of labels and the legend title on a legend.
+    def preceding_labels(self) -> int:
+        """Boolean to indicate whether the title and the labels should precede the legend
+        or not."""
+        return self._preceding_labels
 
-        The value of 0 would mean that the labels and the title would not preced the
-        legend. The value of 1 would mean that the labels and the title would precede
-        the legend.
-        """
-        return self._label_position
-
-    @label_position.setter
-    def label_position(self, val):
+    @preceding_labels.setter
+    def preceding_labels(self, val):
         if not val:
-            self._label_position = 0
-        elif isinstance(val, int) and val in [0, 1]:
-            self._label_position = val
+            self._preceding_labels = False
+        elif isinstance(val, bool):
+            self._preceding_labels = val
         else:
             raise ValueError(
-                f'Label position only accepts 0 or 1 as a value. Instead got {val}.'
+                f'Label position only accepts boolean values. Instead got {val}.'
             )
 
     @property
-    def label_font(self) -> Font:
+    def label_parameters(self) -> Text:
         """Font for the legend labels."""
-        return self._label_font
+        return self._label_parameters
 
-    @label_font.setter
-    def label_font(self, val) -> None:
+    @label_parameters.setter
+    def label_parameters(self, val) -> None:
         if not val:
-            self._label_font = Font(color=(0, 0, 0), size=30)
-        elif isinstance(val, Font):
-            self._label_font = val
+            self._label_parameters = Text(color=(0, 0, 0), size=30)
+        elif isinstance(val, Text):
+            self._label_parameters = val
         else:
             raise ValueError(
                 f'Label font expects a Font object. Instead got {type(val).__name__}.'
             )
 
     @property
-    def title_font(self) -> Font:
+    def title_parameters(self) -> Text:
         """Font for the legend title."""
-        return self._title_font
+        return self._title_parameters
 
-    @title_font.setter
-    def title_font(self, val) -> None:
+    @title_parameters.setter
+    def title_parameters(self, val) -> None:
         if not val:
-            self._title_font = Font(color=(0, 0, 0), size=30, bold=True)
-        elif isinstance(val, Font):
-            self._title_font = val
+            self._title_parameters = Text(color=(0, 0, 0), size=30, bold=True)
+        elif isinstance(val, Text):
+            self._title_parameters = val
         else:
             raise ValueError(
                 f'Title font expects a Font object. Instead got {type(val).__name__}.'
             )
 
+    @property
+    def min(self):
+        return self._min
+
+    @min.setter
+    def min(self, val):
+        if not val:
+            self._min = None
+        elif isinstance(val, (int, float)):
+            self._min = val
+        else:
+            raise ValueError(
+                f'Min must be a number. Instead got {val}.'
+            )
+
+    @property
+    def max(self):
+        return self._max
+
+    @max.setter
+    def max(self, val):
+        if not val:
+            self._max = None
+        elif isinstance(val, (int, float)):
+            self._max = val
+        else:
+            raise ValueError(
+                f'Max must be a number. Instead got {val}.'
+            )
+
+    @property
+    def auto_range(self) -> Tuple[float, float]:
+        """A tuple with min and max values in the legend."""
+        return self._auto_range
+
+    @auto_range.setter
+    def auto_range(self, val) -> None:
+        if not val:
+            self._auto_range = None
+        elif isinstance(val, (tuple, list)) and _validate_input(
+                val, [float, int], num_val=2):
+            self._auto_range = val
+        else:
+            raise ValueError(
+                'Range takes a tuple or a list of integers.'
+                f' Instead got {val}.'
+            )
+
+    @property
+    def range(self):
+        if not self._min and not self._max:
+            return self._auto_range
+
+        elif self._min and not self._max:
+            if self._min < self._auto_range[1]:
+                return (self._min, self._auto_range[1])
+            else:
+                raise ValueError(
+                    f'In {self._name},'
+                    f' min value {self._min} must be less than auto-calculated'
+                    f' max value {self._auto_range[1]}. Either update min value or'
+                    ' provide a max value.'
+                )
+
+        elif not self._min and self._max:
+            if self._max > self._auto_range[0]:
+                return (self._auto_range[0], self._max)
+            else:
+                raise ValueError(
+                    f'In {self._name},'
+                    f' max value {self._max} must be greater than auto-calculated'
+                    f' max value {self._auto_range[1]}. Either update max value or'
+                    ' provide a min value.'
+                )
+
+        elif self._min and self._max:
+            if self._min < self._max:
+                return (self._min, self._max)
+            else:
+                raise ValueError(
+                    f'In {self._name},'
+                    f' make sure max value {self._max} is greater than the min'
+                    f' value {self._min}.'
+                )
+
     def get_lookuptable(self) -> vtk.vtkLookupTable:
         """Get a vtk lookuptable."""
-        minimum, maximum = self._range
-        color_values = self._colors.value
+        minimum, maximum = self.range
+        color_values = color_set[self._colors.value]
         lut = vtk.vtkLookupTable()
         lut.SetRange(minimum, maximum)
         lut.SetRampToLinear()
         lut.SetValueRange(minimum, maximum)
         lut.SetHueRange(0, 0)
         lut.SetSaturationRange(0, 0)
-
         lut.SetNumberOfTableValues(len(color_values))
         for count, color in enumerate(color_values):
             lut.SetTableValue(
@@ -475,7 +613,12 @@ def get_scalarbar(self) -> vtk.vtkScalarBarActor:
 
         scalar_bar = vtk.vtkScalarBarActor()
         scalar_bar.SetLookupTable(color_range)
-        scalar_bar.SetTitle(self._name)
+
+        if self._unit:
+            scalar_bar.SetTitle(f'{self._name} [{self._unit}]')
+        else:
+            scalar_bar.SetTitle(self._name)
+
         scalar_bar.SetPosition(self._position)
         scalar_bar.SetWidth(self._width)
         scalar_bar.SetHeight(self._height)
@@ -487,37 +630,41 @@ def get_scalarbar(self) -> vtk.vtkScalarBarActor:
         else:
             scalar_bar.SetOrientationToVertical()
 
-        if self._number_of_colors:
-            scalar_bar.SetMaximumNumberOfColors(self._number_of_colors)
-        if self._number_of_labels:
-            scalar_bar.SetNumberOfLabels(self._number_of_labels)
+        if self._color_count:
+            scalar_bar.SetMaximumNumberOfColors(self._color_count)
+        if self._label_count:
+            scalar_bar.SetNumberOfLabels(self._label_count)
 
         # setting the type of labels. Such as integers, decimals, etc.
-        scalar_bar.SetLabelFormat(self._label_format.value)
+        scalar_bar.SetLabelFormat(decimal_count[self._decimal_count.value])
 
         # Setting whether the labels and title should precede the legend
-        scalar_bar.SetTextPosition(self._label_position)
+        scalar_bar.SetTextPosition(self._preceding_labels)
 
-        scalar_bar.SetLabelTextProperty(self._label_font.to_vtk())
-        scalar_bar.SetTitleTextProperty(self._title_font.to_vtk())
+        scalar_bar.SetLabelTextProperty(self._label_parameters.to_vtk())
+        scalar_bar.SetTitleTextProperty(self._title_parameters.to_vtk())
 
         return scalar_bar
 
     def __repr__(self) -> Tuple[str]:
         return (
             f'Legend name: {self._name} |'
-            f' Legend visibility: {self._show_legend} |'
+            f' Legend title: {self._unit} |'
+            f' Legend visibility: {self._hide_legend} |'
             f' Legend color scheme: {self._colors.name} |'
-            f' Legend range: {self._range} |'
-            f' Legend visibility: {self._show_legend} |'
+            f' Legend visibility: {self._hide_legend} |'
             f' Legend orientation: {self._orientation} |'
             f' Legend position: {self._position} |'
             f' Legend width: {self._width} |'
             f' Legend height: {self._height} |'
-            f' Number of colors in legend: {self._number_of_colors} |'
-            f' Number of lables in legend: {self._number_of_labels} |'
-            f' Type of label: {self._label_format} |'
-            f' Position of label: {self._label_position} |'
-            f' Font of label: {self._label_font} |'
-            f' Font of title: {self._title_font}'
+            f' Number of colors in legend: {self._color_count} |'
+            f' Number of lables in legend: {self._label_count} |'
+            f' Type of label: {self._decimal_count} |'
+            f' Position of label: {self._preceding_labels} |'
+            f' Font of label: {self._label_parameters} |'
+            f' Font of title: {self._title_parameters} |'
+            f' Legend auto-range: {self._auto_range} |'
+            f' Legend min: {self._min} |'
+            f' Legend max: {self._max} |'
+            f' Legend range: {self.range} |'
         )
diff --git a/honeybee_vtk/model.py b/honeybee_vtk/model.py
index 9ade2f7f..ac92ce62 100644
--- a/honeybee_vtk/model.py
+++ b/honeybee_vtk/model.py
@@ -19,7 +19,7 @@
     convert_sensor_grid
 from .vtkjs.schema import IndexJSON, DisplayMode, SensorGridOptions
 from .vtkjs.helper import convert_directory_to_zip_file, add_data_to_viewer
-from .types import model_dataset_names
+from .types import DataSetNames
 
 
 _COLORSET = {
@@ -156,22 +156,17 @@ def cameras(self):
         """List of Camera objects attached to this Model object."""
         return self._cameras
 
-    def get_modeldataset_from_string(self, text: str) -> ModelDataSet:
-        """Get a ModelDataSet object from a model using a text string.
+    def get_modeldataset(self, dataset: DataSetNames) -> ModelDataSet:
+        """Get a ModelDataSet object from a model.
 
         Args:
-            text: A text string such as "walls", "shades"
+            dataset: A DataSetNames object.
 
         Returns:
             A ModelDataSet object.
         """
-        if text not in model_dataset_names:
-            raise ValueError(
-                f'Text must be one of the {model_dataset_names}.'
-                f' Instead got {text}.'
-            )
         ds = {ds.name.lower(): ds for ds in self}
-        return ds[text]
+        return ds[dataset.value]
 
     def __iter__(self):
         """This dunder method makes this class an iterator object.
diff --git a/honeybee_vtk/scene.py b/honeybee_vtk/scene.py
index 45178c8a..385cfb21 100644
--- a/honeybee_vtk/scene.py
+++ b/honeybee_vtk/scene.py
@@ -47,7 +47,7 @@ def background_color(self, val: Tuple[int, int, int]) -> None:
         if not val:
             colors = vtk.vtkNamedColors()
             self._background_color = colors.GetColor3d("SlateGray")
-        elif _validate_input(val, int):
+        elif _validate_input(val, [int]):
             self._background_color = val
         else:
             raise ValueError(
@@ -90,8 +90,8 @@ def legend_parameter(self, name: str) -> LegendParameter:
         """
         if name not in self.legend_parameters.keys():
             raise ValueError(
-                'No legend parameter found by that name in this scene. The names of the'
-                ' legend parameters in this scene are'
+                'No legend parameter found by that name in this scene. Make sure cameras'
+                ' and actors a added to the scene. Legends in the scene are'
                 f' {tuple(self.legend_parameters.keys())}.'
             )
         return self.legend_parameters[name]
@@ -102,7 +102,7 @@ def add_cameras(self, val: Union[Camera, List[Camera]]) -> None:
         Args:
             val: Either a list of Camera objects or a single Camera object.
         """
-        if isinstance(val, list) and _validate_input(val, Camera):
+        if isinstance(val, list) and _validate_input(val, [Camera]):
             self._cameras.extend(val)
         elif isinstance(val, Camera):
             self._cameras.append(val)
@@ -118,7 +118,7 @@ def add_actors(self, val: Union[Actor, List[Actor]]) -> None:
         Args:
             val: Either a list of Actors objects or a single Actor object.
         """
-        if isinstance(val, list) and _validate_input(val, Actor):
+        if isinstance(val, list) and _validate_input(val, [Actor]):
             for v in val:
                 self._actors[v.name] = v
         elif isinstance(val, Actor):
@@ -161,7 +161,7 @@ def update_scene(self) -> None:
             if self.legend_parameters:
                 visible_legend_params = [
                     legend_param for legend_param in self.legend_parameters.values()
-                    if legend_param.show_legend]
+                    if legend_param.hide_legend]
             else:
                 visible_legend_params = []
 
diff --git a/honeybee_vtk/types.py b/honeybee_vtk/types.py
index 53484484..fd85ddd6 100644
--- a/honeybee_vtk/types.py
+++ b/honeybee_vtk/types.py
@@ -15,12 +15,20 @@
 from enum import Enum
 from typing import Dict, Union, List, Tuple
 from ladybug.color import Color
-from .legend_parameter import LegendParameter, Colors
+from .legend_parameter import LegendParameter, ColorSets
 from .vtkjs.schema import DataSetProperty, DataSet, DisplayMode, DataSetMapper
 
 
-model_dataset_names = ('wall', 'aperture', 'shade', 'door', 'floor', 'roofceiling',
-                       'airboundary', 'grid')
+class DataSetNames(Enum):
+    """Valid ModelDataset names."""
+    wall = 'wall'
+    aperture = 'aperture'
+    shade = 'shade'
+    door = 'door'
+    floor = 'floor'
+    roofceiling = 'roofceiling'
+    airboundary = 'airboundary'
+    grid = 'grid'
 
 
 class VTKWriters(Enum):
@@ -49,7 +57,9 @@ class DataFieldInfo:
 
     Args:
         name: A string representing the name of for data.
-        range: A tuple of min, max values. Defaults to (0, 100).
+        range: A tuple of min, max values as either integers or floats.
+            Defaults to None which will create a range of minimum and maximum
+            values in the data.
         colors: A Colors object that defines colors for the legend.
             Defaults to Ecotect colorset.
         per_face : A Boolean to indicate if the data is per face or per point. In
@@ -57,19 +67,29 @@ class DataFieldInfo:
             are provided per face.
     """
 
-    def __init__(self, name: str = 'default', range: Tuple[int, int] = (0, 100),
-                 colors: Colors = Colors.ecotect, per_face: bool = True
+    def __init__(self, name: str = 'default', range: Tuple[float, float] = None,
+                 colors: ColorSets = ColorSets.ecotect, per_face: bool = True
                  ) -> None:
-
         self.name = name
+        self._range = range
         self.per_face = per_face
-        self._legend_param = LegendParameter(name=name, colors=colors, range=range)
+        self._legend_param = LegendParameter(name=name, colors=colors, auto_range=range)
 
     @property
     def legend_parameter(self) -> LegendParameter:
         """Legend associated with the DataFieldInfo object."""
         return self._legend_param
 
+    @property
+    def range(self) -> Tuple[float, float]:
+        """Range is a tuple of minimum and maximum values.
+
+        If these minimum and maximum values are not provided, they are calculated
+        automatically. In such a case, the minimum and maximum values in the data are
+        used.
+        """
+        return self._range
+
 
 class PolyData(vtk.vtkPolyData):
     """A thin wrapper around vtk.vtkPolyData.
@@ -150,7 +170,7 @@ def add_data(self, data: List, name, *, cell=True, colors=None,
         if not data_range:
             data_range = tuple(values.GetRange())
         if not colors:
-            colors = Colors.ecotect
+            colors = ColorSets.ecotect
 
         self._fields[name] = DataFieldInfo(name, data_range, colors, cell)
 
@@ -310,7 +330,7 @@ def add_data_fields(
 
         assert len(self.data) == len(data), \
             f'Length of input data {len(data)} does not match the length of'\
-            f' polydata in this dataset {len(self.data)}.'
+            f' {name} in this dataset {len(self.data)}.'
 
         for count, d in enumerate(data):
             self.data[count].add_data(


Test patch:
diff --git a/tests/assets/config/color_by.json b/tests/assets/config/color_by.json
deleted file mode 100644
index d17603af..00000000
--- a/tests/assets/config/color_by.json
+++ /dev/null
@@ -1,20 +0,0 @@
-
-{ 
-
-    "grid": {
-            "name": "Daylight-Factor",
-            "object_type": "grid",
-            "file_paths": ["./tests/assets/df_results/TestRoom_1.res",
-            "./tests/assets/df_results/TestRoom_2.res"],
-            "legend_parameters": {
-                "orientation": "vertical"
-            }
-    },
-    "radiation":{
-        "name": "Radiation",
-        "object_type": "shade",
-        "file_paths": ["./tests/assets/radiation_results/radiation.csv"]
-    }
-
-}
-
diff --git a/tests/assets/config/identifier_mismatch.json b/tests/assets/config/identifier_mismatch.json
new file mode 100644
index 00000000..7461fea5
--- /dev/null
+++ b/tests/assets/config/identifier_mismatch.json
@@ -0,0 +1,11 @@
+
+{ 
+
+    "grid": {
+            "identifier": "Daylight-Factor",
+            "object_type": "grid",
+            "unit" : "Percentage",
+            "path": "./tests/assets/dummy_results/identifier_mismatch"
+    }
+}
+
diff --git a/tests/assets/config/invalid_colors.json b/tests/assets/config/invalid_colors.json
deleted file mode 100644
index 6b56c6a8..00000000
--- a/tests/assets/config/invalid_colors.json
+++ /dev/null
@@ -1,20 +0,0 @@
-
-{ 
-
-    "grid": {
-            "name": "Daylight-Factor",
-            "object_type": "grid",
-            "file_paths": ["./tests/assets/df_results/TestRoom_1.res",
-            "./tests/assets/df_results/TestRoom_2.res"],
-            "legend_parameters": {
-                "colors": "red"
-            }
-    },
-    "radiation":{
-        "name": "Radiation",
-        "object_type": "shade",
-        "file_paths": ["./tests/assets/radiation_results/radiation.csv"]
-    }
-
-}
-
diff --git a/tests/assets/config/invalid_file_paths.json b/tests/assets/config/invalid_file_paths.json
deleted file mode 100644
index b76d7450..00000000
--- a/tests/assets/config/invalid_file_paths.json
+++ /dev/null
@@ -1,18 +0,0 @@
-
-{ 
-
-    "grid": {
-            "name": "Daylight-Factor",
-            "object_type": "terrace",
-            "file_paths": ["./tests/assets/df_results/TestRoom_11.res",
-            "./tests/assets/df_results/TestRoom_22.res"]
-
-    },
-    "radiation":{
-        "name": "Radiation",
-        "object_type": "shade",
-        "file_paths": ["./tests/assets/radiation_results/radiation.csv"]
-    }
-
-}
-
diff --git a/tests/assets/config/invalid_label_format.json b/tests/assets/config/invalid_label_format.json
deleted file mode 100644
index 26d00dfd..00000000
--- a/tests/assets/config/invalid_label_format.json
+++ /dev/null
@@ -1,20 +0,0 @@
-
-{ 
-
-    "grid": {
-            "name": "Daylight-Factor",
-            "object_type": "grid",
-            "file_paths": ["./tests/assets/df_results/TestRoom_1.res",
-            "./tests/assets/df_results/TestRoom_2.res"],
-            "legend_parameters": {
-                "label_format": "float"
-            }
-    },
-    "radiation":{
-        "name": "Radiation",
-        "object_type": "shade",
-        "file_paths": ["./tests/assets/radiation_results/radiation.csv"]
-    }
-
-}
-
diff --git a/tests/assets/config/invalid_object_type.json b/tests/assets/config/invalid_object_type.json
deleted file mode 100644
index 53775429..00000000
--- a/tests/assets/config/invalid_object_type.json
+++ /dev/null
@@ -1,18 +0,0 @@
-
-{ 
-
-    "grid": {
-            "name": "Daylight-Factor",
-            "object_type": "terrace",
-            "file_paths": ["./tests/assets/df_results/TestRoom_1.res",
-            "./tests/assets/df_results/TestRoom_2.res"]
-
-    },
-    "radiation":{
-        "name": "Radiation",
-        "object_type": "shade",
-        "file_paths": ["./tests/assets/radiation_results/radiation.csv"]
-    }
-
-}
-
diff --git a/tests/assets/config/invalid_orientation.json b/tests/assets/config/invalid_orientation.json
deleted file mode 100644
index 02544bbe..00000000
--- a/tests/assets/config/invalid_orientation.json
+++ /dev/null
@@ -1,20 +0,0 @@
-
-{ 
-
-    "grid": {
-            "name": "Daylight-Factor",
-            "object_type": "grid",
-            "file_paths": ["./tests/assets/df_results/TestRoom_1.res",
-            "./tests/assets/df_results/TestRoom_2.res"],
-            "legend_parameters": {
-                "orientation": 90
-            }
-    },
-    "radiation":{
-        "name": "Radiation",
-        "object_type": "shade",
-        "file_paths": ["./tests/assets/radiation_results/radiation.csv"]
-    }
-
-}
-
diff --git a/tests/assets/config/more_files.json b/tests/assets/config/more_files.json
deleted file mode 100644
index e0f2b054..00000000
--- a/tests/assets/config/more_files.json
+++ /dev/null
@@ -1,18 +0,0 @@
-
-{ 
-
-    "grid": {
-            "name": "Daylight-Factor",
-            "object_type": "grid",
-            "file_paths": ["./tests/assets/df_results/TestRoom_1.res",
-            "./tests/assets/df_results/TestRoom_2.res"]
-    },
-    "radiation":{
-        "name": "Radiation",
-        "object_type": "shade",
-        "file_paths": ["./tests/assets/radiation_results/radiation.csv", 
-            "./tests/assets/radiation_results/test.csv"]
-    }
-
-}
-
diff --git a/tests/assets/config/more_grids.json b/tests/assets/config/more_grids.json
index 68e856dd..21f9c3bc 100644
--- a/tests/assets/config/more_grids.json
+++ b/tests/assets/config/more_grids.json
@@ -2,18 +2,10 @@
 { 
 
     "grid": {
-            "name": "Daylight-Factor",
+            "identifier": "Daylight-Factor",
             "object_type": "grid",
-            "file_paths": ["./tests/assets/df_results/TestRoom_1.res",
-            "./tests/assets/df_results/TestRoom_2.res",
-            "./tests/assets/df_results/more_grids.res"
-        ]
-    },
-    "radiation":{
-        "name": "Radiation",
-        "object_type": "shade",
-        "file_paths": ["./tests/assets/radiation_results/radiation.csv"]
+            "unit": "Percentage",
+            "path": "./tests/assets/dummy_results/more_grids"
     }
-
 }
 
diff --git a/tests/assets/config/no_file.json b/tests/assets/config/no_file.json
deleted file mode 100644
index 8184c601..00000000
--- a/tests/assets/config/no_file.json
+++ /dev/null
@@ -1,16 +0,0 @@
-
-{ 
-
-    "grid": {
-            "name": "Daylight-Factor",
-            "object_type": "grid",
-            "file_paths": []
-    },
-    "radiation":{
-        "name": "Radiation",
-        "object_type": "shade",
-        "file_paths": []
-    }
-
-}
-
diff --git a/tests/assets/config/range.json b/tests/assets/config/range.json
new file mode 100644
index 00000000..98e0368b
--- /dev/null
+++ b/tests/assets/config/range.json
@@ -0,0 +1,27 @@
+
+{ 
+
+"grid": {
+        "identifier": "Daylight-factor",
+        "object_type": "grid",
+        "unit": "Percentage",
+        "path": "./tests/assets/df_results",
+        "hide": false,
+        "legend_parameters": {
+            "hide_legend": false,
+            "color_set": "original",
+            "position": [0.5, 0.05],
+            "label_parameters": {
+                "color": [34, 247, 10],
+                "size": 0,
+                "bold": true
+            }
+        }
+}
+
+
+
+
+
+}
+
diff --git a/tests/assets/config/short_length.json b/tests/assets/config/short_length.json
index 59eae24e..6a2c8513 100644
--- a/tests/assets/config/short_length.json
+++ b/tests/assets/config/short_length.json
@@ -3,17 +3,11 @@
 
 
     "grid": {
-        "name": "UDI",
+        "identifier": "Daylight-Factor",
         "object_type": "grid",
-        "file_paths": ["./tests/assets/udi_results/TestRoom_1.res",
-        "./tests/assets/udi_results/TestRoom_2.res"]
-},
-    "radiation":{
-        "name": "Radiation",
-        "object_type": "shade",
-        "file_paths": ["./tests/assets/radiation_results/radiation.csv", 
-            "./tests/assets/radiation_results/test.csv"]
-    }
+        "path": "./tests/assets/dummy_results/short_length"
+}
+
 
 }
 
diff --git a/tests/assets/config/valid.json b/tests/assets/config/valid.json
index 522bfaef..4e5e1cd0 100644
--- a/tests/assets/config/valid.json
+++ b/tests/assets/config/valid.json
@@ -1,17 +1,46 @@
 
 { 
 
-    "grid": {
-            "name": "Daylight-Factor",
-            "object_type": "grid",
-            "file_paths": ["./tests/assets/df_results/TestRoom_1.res",
-            "./tests/assets/df_results/TestRoom_2.res"]
-    },
-    "radiation":{
-        "name": "Radiation",
-        "object_type": "shade",
-        "file_paths": ["./tests/assets/radiation_results/radiation.csv"]
+"grid": {
+        "identifier": "Daylight-Factor",
+        "object_type": "grid",
+        "unit": "Percentage",
+        "path": "./tests/assets/df_results",
+        "hide": false,
+        "legend_parameters": {
+            "hide_legend": false,
+            "min": 0,
+            "max": 20,
+            "color_set": "original",
+            "position": [0.5, 0.05],
+            "label_parameters": {
+                "color": [34, 247, 10],
+                "size": 0,
+                "bold": true
+            }
+        }
+},
+"grid1": {
+    "identifier": "UDI",
+    "object_type": "grid",
+    "unit": "Percentage",
+    "path": "./tests/assets/udi_results",
+    "hide": true,
+    "legend_parameters": {
+        "hide_legend": false,
+        "min": 0,
+        "max": 100,
+        "color_set": "nuanced",
+        "position": [0.9, 0.5],
+        "orientation": "vertical",
+        "width": 0.05,
+        "height": 0.45
+
     }
+}
+
+
+
 
 }
 
diff --git a/tests/assets/df_results/TestRoom_1.res b/tests/assets/df_results/TestRoom_1.res
index 69a23f8d..f6fd327e 100644
--- a/tests/assets/df_results/TestRoom_1.res
+++ b/tests/assets/df_results/TestRoom_1.res
@@ -1,416 +1,416 @@
-2.42693749
-3.91931419
-5.22741218
-6.74245565
-7.74868625
-8.17619553
-8.50924114
-8.23444213
-7.41495149
-6.08855254
-4.62465832
-3.49957888
-2.92785288
-2.45095213
-2.25023943
-2.23600356
-2.5072172
-2.87571734
-3.26427622
-3.45973348
-3.65380707
-3.38043648
-3.02421932
-2.84519963
-2.36358939
-1.40770272
-3.9855961
-6.28702595
-7.19978991
-9.20149679
-10.7679079
-11.738922
-12.1231133
-11.7156753
-10.9493924
-8.95924177
-6.75101185
-4.94897947
-3.84097305
-3.00781397
-2.82497621
-2.90664138
-3.27749716
-4.00542214
-4.70349529
-5.1388573
-5.39090899
-5.19995537
-4.84042492
-4.36909644
-4.31733501
-3.4231781
-9.04872387
-8.88422108
-9.73322524
-11.6520712
-14.1267104
-15.6281052
-16.3428432
-16.1879384
-14.7186008
-12.2066651
-9.30512526
-6.64795976
-4.82287218
-3.94634498
-3.60232488
-3.91506115
-4.58774315
-5.72937651
-7.01755717
-7.91490028
-8.48733691
-8.22397779
-7.52080493
-7.10392288
-7.43436404
-9.06882736
-10.7143744
-10.9645304
-11.577319
-14.0469838
-17.0562226
-19.1518186
-20.251523
-19.7726443
-18.1850396
-14.8643426
-11.2282726
-7.96999111
-5.87993878
-4.56927214
-4.26477345
-4.82614609
-6.04812897
-8.15143983
-10.055189
-11.5702181
-12.5347184
-12.2739011
-11.4884312
-10.7126041
-10.705675
-12.3720522
-12.003672
-12.4711323
-13.1139499
-16.1298959
-19.0483745
-21.7586135
-22.9898113
-22.556327
-20.7378123
-17.2325663
-12.9712064
-9.18181037
-6.58679009
-5.42136584
-4.90497053
-5.86723515
-7.73735018
-10.4838796
-13.5246941
-15.7685539
-16.9932272
-16.6919684
-15.4962448
-14.0371424
-13.5444557
-14.5705051
-12.4460383
-13.1042123
-14.1294921
-17.4304508
-20.9272659
-23.5430108
-24.9408039
-24.3910233
-22.3378933
-18.7732873
-14.1304676
-9.90354732
-7.18656897
-5.83121498
-5.62465793
-6.74280649
-9.23974014
-12.6316219
-16.3948517
-19.0457253
-20.5296353
-20.399914
-18.6978925
-17.1726639
-15.9092945
-16.0890355
-12.7998389
-13.6589602
-14.7568191
-18.3152621
-21.7326585
-24.4115367
-26.0693631
-25.6121076
-23.3977702
-19.4538811
-14.5929499
-10.3222641
-7.66166898
-6.2211808
-6.06777064
-7.39007228
-10.1809741
-14.165353
-18.1985362
-21.4817542
-23.2236927
-23.033899
-21.2977959
-19.077283
-17.5280326
-17.2821403
-12.7349711
-13.449267
-15.174793
-18.401021
-22.1272819
-25.0123144
-26.4447619
-25.933699
-23.8473108
-20.1208888
-15.1468135
-10.8095147
-7.88512542
-6.50339757
-6.27475371
-7.78323683
-10.5098418
-14.9529744
-19.1905363
-22.4930326
-24.5579229
-24.2524057
-22.3909131
-19.9768833
-18.2200878
-17.8150144
-12.7749526
-13.4308229
-15.0279414
-18.4903957
-22.1011658
-25.2362076
-26.4157102
-26.1129675
-23.7461937
-20.0380297
-15.2716786
-11.0619745
-8.17697418
-6.43999756
-6.32996268
-7.77377489
-10.5025744
-15.0306032
-19.2247611
-22.7137217
-24.5684481
-24.4371695
-22.603762
-20.4778148
-18.3189137
-17.9926683
-12.6988006
-13.4968936
-14.6520772
-18.363968
-21.7888108
-24.6493382
-26.1542986
-25.7956721
-23.5404332
-19.8207595
-15.1426625
-10.9687906
-7.8647409
-6.37521746
-6.33774023
-7.3954029
-10.0716122
-14.0211989
-18.1390903
-21.3370685
-23.1562634
-23.3053346
-21.6182059
-19.3476625
-17.7071884
-17.6209659
-12.5165159
-13.2134506
-14.2048797
-17.5455621
-21.1326684
-23.8756644
-25.2417208
-25.1026199
-23.2994455
-19.4512677
-14.8327187
-10.5659028
-7.92301435
-6.0177652
-5.88475388
-6.84417956
-9.21802565
-12.733711
-16.351965
-19.1511384
-20.803917
-20.9150223
-19.4029377
-17.7319781
-16.3436201
-16.8643758
-11.9600139
-12.5608471
-13.5094236
-16.2149889
-19.8327704
-22.7995343
-23.9165838
-24.0138166
-22.0608013
-18.5430575
-14.2583721
-10.2369259
-7.29197491
-5.70919605
-5.39766982
-6.02049674
-7.72813526
-10.7814654
-13.6886527
-15.7783452
-17.1159567
-17.1362356
-16.2852929
-14.9048288
-14.2557426
-15.4093868
-11.3206635
-11.3641408
-11.8275772
-14.5147323
-17.8486574
-20.5084238
-21.901724
-22.0902647
-20.2033183
-17.1309784
-13.3590833
-9.40426262
-6.67300365
-5.23443614
-4.59800522
-5.08119603
-6.41108906
-8.2977419
-10.289355
-11.8720694
-12.889688
-12.8784539
-12.2735055
-11.5863782
-11.4988598
-13.3968487
-9.09310334
-9.29008568
-9.91374495
-12.1518124
-14.8372205
-16.9561724
-18.1311606
-18.0956112
-16.6934756
-14.1307379
-11.0922559
-8.08993722
-5.70786966
-4.33950058
-3.9121882
-4.03696731
-4.85602298
-6.00724716
-7.21820185
-8.22089004
-8.77787897
-8.80474687
-8.28507944
-7.9351953
-8.32207516
-10.3711508
-4.34878173
-6.17001365
-7.36510894
-9.36359919
-11.4272795
-13.1214715
-14.0519171
-13.9467939
-12.7683904
-11.0059188
-8.70750512
-6.51163515
-4.74460443
-3.6313551
-3.18419341
-3.16876003
-3.68001983
-4.17951575
-4.97548937
-5.47727828
-5.73135446
-5.69688443
-5.49572244
-5.40798917
-5.33338913
-4.37506788
-2.61520074
-4.13801818
-5.59487054
-7.07136099
-8.55364746
-9.65945755
-10.0381589
-10.0193711
-9.45846024
-7.97929195
-6.53426254
-4.95401832
-3.78748248
-3.0280535
-2.62994855
-2.56571619
-2.78391361
-3.14278713
-3.55062431
-3.82548955
-3.85907353
-3.96560001
-3.79084768
-3.82560053
-3.44882522
-2.45096466
+2.3434143
+3.9235189
+5.37017542
+6.75922079
+7.6049761
+8.11785048
+8.35334825
+8.06134913
+7.31663037
+6.15064406
+4.67770139
+3.59421439
+2.81563062
+2.42440106
+2.23723508
+2.33144636
+2.48622766
+2.87238257
+3.33180039
+3.56365014
+3.61616337
+3.3848184
+2.99580665
+2.64278643
+2.32142236
+1.41376062
+4.06352554
+5.93812631
+7.25779486
+9.1876583
+10.5025332
+11.5971827
+12.1581651
+12.0059005
+10.7532997
+9.08142538
+6.86865781
+4.99050747
+3.85603411
+3.06216374
+2.77370703
+2.96286349
+3.36727282
+4.03769405
+4.67652178
+5.17594073
+5.43262136
+5.3470522
+4.61567252
+4.40872704
+4.33867002
+3.40631272
+9.01176216
+9.04441534
+9.67050722
+11.7539723
+14.0303064
+15.5747059
+16.226597
+16.2273614
+14.5784617
+12.4695929
+9.25024386
+6.47434766
+4.9543262
+3.80969817
+3.4606786
+3.85599473
+4.56566529
+5.74908441
+6.93595286
+7.93403001
+8.42310455
+8.12956603
+7.55385907
+6.96504752
+7.40695377
+9.30436093
+11.0716261
+10.9546013
+11.5566929
+14.0556904
+16.8592045
+19.0561789
+20.1422256
+19.6188117
+18.0824905
+15.1227291
+11.1420179
+7.88053049
+5.87841012
+4.8449751
+4.4151782
+4.88044574
+6.08764322
+8.11719713
+10.3006427
+11.7662177
+12.6290425
+12.3270963
+11.4456771
+10.6188134
+10.7532818
+12.8091201
+12.0730291
+12.3833095
+12.9974352
+16.0836082
+19.3145117
+21.6669834
+22.9060035
+22.4971317
+20.7365951
+17.1681209
+12.8703273
+9.08905973
+6.52223553
+5.18755604
+4.93105083
+5.75061665
+7.64907633
+10.3756222
+13.3671508
+15.6267286
+16.9104361
+16.7835842
+15.379723
+14.0315809
+13.6287879
+14.4717043
+12.3873531
+13.1016258
+14.1625874
+17.2353766
+20.6562062
+23.3271189
+24.7314813
+24.3819659
+22.2524029
+18.6060118
+14.2505749
+9.98291413
+7.21834326
+5.80584889
+5.56329852
+6.77866735
+9.08969518
+12.5407579
+16.0829298
+19.1595514
+20.5768734
+20.2860521
+19.0512564
+17.0148719
+15.8528056
+16.1915291
+12.6282567
+13.381222
+14.6707827
+18.2356966
+21.7620503
+24.5496352
+25.8594498
+25.5822683
+23.2774822
+19.7079179
+14.6036703
+10.2461086
+7.52167129
+6.2405307
+6.03511746
+7.34155612
+10.1237621
+14.0163283
+18.2800528
+21.4124633
+23.2619987
+22.9028352
+21.2643766
+18.9639402
+17.3703122
+16.955639
+12.7513049
+13.8004865
+14.8040357
+18.3534607
+22.2090491
+24.9903332
+26.6646634
+25.9397671
+23.5612688
+19.787734
+14.9586684
+10.8855073
+7.90444668
+6.57431379
+6.25440857
+7.66900619
+10.5093317
+14.7038225
+19.165888
+22.6899147
+24.620018
+24.2693749
+22.5019826
+20.1949769
+18.1397705
+17.7102725
+12.8853812
+13.8132134
+14.8779663
+18.5377233
+22.0736714
+24.9224027
+26.455663
+25.9133109
+23.9372046
+20.2588262
+15.3126212
+10.8855324
+8.04234291
+6.69744968
+6.44242301
+7.78724822
+10.6051253
+14.7310968
+19.3403056
+22.4679189
+24.5216396
+24.4251586
+22.5020721
+20.5497907
+18.1864358
+18.0101745
+12.7266977
+13.4668985
+14.5460842
+18.2871054
+21.9087945
+24.6740939
+26.2471817
+25.9971008
+23.4056462
+19.8042557
+15.0670547
+10.702879
+7.98582903
+6.37892097
+6.31510389
+7.41050692
+10.1421686
+14.3280461
+18.1634522
+21.5213311
+23.260334
+23.3683247
+21.6648891
+19.5845511
+17.7805175
+17.8827963
+12.3374085
+13.1872737
+14.0525346
+17.5452721
+21.1734446
+23.987432
+25.2950091
+25.0866889
+23.1821289
+19.4763098
+14.8049235
+10.5256171
+7.72488462
+6.16044073
+6.01453783
+7.01128501
+9.36829973
+12.6605196
+16.3528565
+19.1021461
+20.6787602
+20.7041603
+19.7343025
+17.7044622
+16.812353
+17.0651118
+11.8511873
+12.5449232
+13.4214254
+16.5315826
+20.1264557
+22.7778037
+24.2660992
+23.9204144
+22.1224489
+18.8414505
+14.2935975
+10.3335733
+7.35737435
+5.83699847
+5.36205956
+6.15177355
+8.08231182
+10.5621313
+13.802622
+15.9903117
+17.1748442
+17.1048802
+16.11566
+14.725503
+14.2290752
+15.5462091
+11.7056638
+11.371512
+11.9030865
+14.5047495
+17.7957486
+20.4414599
+22.1579446
+21.8391098
+20.2630864
+17.2068279
+13.2865829
+9.47230052
+6.7403703
+5.11422869
+4.4762351
+5.06088848
+6.37115774
+8.20909573
+10.3207516
+11.9435119
+12.877575
+13.0302424
+12.1537241
+11.6420347
+11.6636042
+13.3096739
+9.42754694
+9.27958554
+10.0096227
+11.9892285
+14.9381837
+17.1890406
+18.040873
+18.00561
+16.7329809
+14.1944064
+11.0464892
+8.03786791
+5.6386969
+4.38176785
+3.80227504
+3.98328521
+4.86276054
+6.00782175
+7.30971739
+8.17146814
+8.70829272
+8.85368189
+8.47210222
+8.13727914
+8.3400933
+9.97497548
+4.09446211
+6.28835234
+7.54972059
+9.62200001
+11.4067303
+13.1610681
+14.0497064
+14.0213815
+12.8965705
+11.1464822
+8.70665308
+6.54445301
+4.7261549
+3.72155141
+3.13193973
+3.20389236
+3.56469371
+4.25247794
+4.91357506
+5.51644527
+5.83077643
+5.81465032
+5.56725084
+5.53243355
+5.43483559
+4.34483657
+2.49773557
+4.07441769
+5.52394358
+7.16760213
+8.41606985
+9.66516407
+10.0918249
+10.1992034
+9.47295208
+8.18140622
+6.64860416
+5.08543833
+3.92603743
+3.05397807
+2.62511734
+2.6598326
+2.7039561
+3.13276671
+3.47098363
+3.80490813
+3.91565006
+4.03362538
+3.85442132
+3.84433288
+3.49582883
+2.38447869
diff --git a/tests/assets/df_results/TestRoom_2.res b/tests/assets/df_results/TestRoom_2.res
index 3080ac0a..68c73636 100644
--- a/tests/assets/df_results/TestRoom_2.res
+++ b/tests/assets/df_results/TestRoom_2.res
@@ -1,468 +1,468 @@
-4.8378867
-5.44790259
-5.77869638
-6.13551319
-5.80542108
-4.99017453
-4.38626612
-3.38095021
-2.83245304
-2.09139483
-2.01429416
-2.06507109
-2.24883428
-2.66376881
-2.84293707
-2.93454032
-2.50299996
-0.790256539
-5.67266036
-6.4646387
-6.88239606
-6.9722648
-6.7415875
-6.16156664
-4.96264791
-4.06102491
-3.16265434
-2.76752079
-2.52981058
-2.50801196
-2.80047827
-3.14433548
-3.74737216
-4.31850209
-4.66888743
-2.69091774
-6.39666345
-7.14377544
-8.03624796
-8.30623187
-7.91599397
-7.19111378
-5.88897112
-5.05684666
-3.94052748
-3.06366913
-2.97367509
-2.94984124
-3.16720094
-3.79729705
-4.69566583
-5.79758446
-7.37301716
-8.55779847
-7.25067603
-8.04356369
-8.82488974
-9.10248473
-8.90678761
-8.01892434
-6.70463116
-5.55951804
-4.34210324
-3.59526333
-3.37054852
-3.45696077
-3.82459276
-4.40892931
-5.46639329
-6.99403299
-9.08615098
-10.8578715
-7.75465769
-9.04906755
-9.68555217
-9.95068876
-9.87575578
-8.87437071
-7.58466497
-6.20445325
-4.72795564
-4.02313956
-3.49069869
-3.7122094
-4.09033974
-4.55631612
-5.95887241
-7.65525183
-9.99032294
-11.7570565
-8.41051369
-9.71260265
-10.4152063
-10.7568833
-10.6203009
-9.71369992
-8.15577163
-6.75605428
-5.45470101
-4.4437824
-3.88817893
-3.81929257
-4.16980321
-4.7993659
-5.9097208
-7.41519672
-9.98326855
-11.6549746
-9.13999776
-10.3782517
-10.9579003
-11.6782661
-11.2849977
-9.88209596
-8.61288572
-7.20273446
-5.72563541
-4.5817019
-4.12043859
-4.0796785
-3.9824636
-4.49348891
-5.56066543
-7.0783223
-9.10216969
-11.1373174
-9.38043235
-10.6340517
-11.7071585
-12.0944644
-11.5326532
-10.6280248
-8.95803889
-7.55610015
-5.89595928
-4.82394976
-4.07236456
-4.01092281
-3.9880842
-4.3349683
-4.784491
-6.12932158
-7.43375186
-8.6927412
-9.77811844
-11.1471391
-12.028809
-12.5974239
-11.9715594
-10.9314137
-9.40754906
-7.72350632
-6.10571506
-4.82348436
-4.0909555
-3.84172485
-3.76606692
-3.74610842
-3.98129294
-4.48339689
-4.78911994
-2.86366885
-10.1285378
-11.4040882
-12.3601397
-12.7637257
-12.4987967
-11.2007711
-9.70251958
-7.73987766
-6.21190323
-4.83849172
-4.14887095
-3.65681248
-3.38246634
-3.22205549
-3.41654257
-3.11337385
-2.43722462
-0.982590965
-10.2490657
-11.3698008
-12.6141085
-12.7542709
-12.6387479
-11.2567086
-9.61402198
-7.89704145
-6.19436302
-4.56398627
-4.05429272
-3.66563897
-3.07305231
-2.8789286
-2.49606729
-2.29056634
-1.6070219
-0.716658004
-10.0935236
-11.6431893
-12.8018115
-13.433166
-12.6015069
-11.4788673
-9.98886767
-7.95984718
-6.40063546
-4.70110564
-4.10783878
-3.21757154
-2.89295862
-2.51438615
-2.21869963
-1.69485989
-1.17765335
-0.729628702
-10.2356263
-11.6125641
-12.5303258
-13.1523007
-12.6917193
-11.4665503
-9.91341917
-7.91268605
-6.12361864
-4.81752724
-3.8531003
-3.15109989
-2.84717579
-2.34338387
-2.01720112
-1.58970294
-1.04388486
-0.693754954
-10.074052
-11.6495921
-12.7097518
-12.7740558
-12.5595099
-11.2774063
-9.68988755
-7.83404419
-6.14674723
-4.78669986
-3.7981652
-3.09086818
-2.86491469
-2.34093157
-1.93689993
-1.45593624
-1.01648497
-0.654612308
-9.93821604
-11.3939264
-12.2863112
-12.4426802
-12.2282973
-10.9888548
-9.44481686
-7.69707876
-5.87660759
-4.47100114
-3.76861409
-3.18791124
-2.89260241
-2.47482894
-2.00591517
-1.52473453
-0.829532361
-0.705926596
-9.68322159
-11.0067315
-11.9708756
-12.3514923
-12.0451928
-10.9479228
-9.46763041
-7.48288378
-5.95157995
-4.58718288
-3.85621311
-3.22181205
-2.95933361
-2.46875189
-2.06080194
-1.57108264
-0.789171083
-0.684213001
-9.39884966
-10.5225866
-11.7602535
-12.3119386
-11.8234977
-10.407921
-9.07275283
-7.53815898
-5.69925439
-4.37659296
-3.79311382
-3.12672546
-2.88210406
-2.56752588
-2.31099024
-1.48192328
-0.840067943
-0.631583242
-8.88927246
-10.3290608
-11.0265539
-11.5681524
-11.1645952
-10.058121
-8.67403391
-6.99966433
-5.4282287
-4.46367288
-3.61248313
-3.09479902
-2.8698712
-2.84731362
-2.21604148
-1.72170828
-0.770987189
-0.683838712
-8.3266146
-9.58039146
-10.538165
-10.7763943
-10.4534586
-9.35311516
-8.17590197
-6.6807275
-5.25227528
-4.16961526
-3.51129085
-3.10209327
-2.77860268
-2.71330527
-2.24001137
-1.62001158
-0.874062907
-0.582444699
-7.79694107
-8.95419934
-9.62350003
-9.76816962
-9.60794851
-8.80146401
-7.56452747
-6.0837088
-4.73647425
-3.67128105
-3.12693489
-2.80104749
-2.68967369
-2.46226493
-1.98540714
-1.69700341
-0.886029057
-0.540392945
-6.96882084
-7.90433033
-8.79316557
-8.97727065
-8.82836592
-8.00517714
-6.80898816
-5.57228611
-4.28545869
-3.20231
-2.83030862
-2.74478421
-2.50119385
-2.35918241
-2.11009675
-1.81350986
-0.697105834
-0.482523498
-6.3259495
-7.2237598
-7.71830816
-7.89995915
-7.60644032
-6.9308263
-5.64950313
-4.73366574
-3.71786938
-2.83387251
-2.54731141
-2.50331679
-2.1981737
-2.1860912
-2.12508621
-1.43243569
-0.761779966
-0.481930471
-5.36227794
-5.99882163
-6.57477203
-6.93432575
-6.55153962
-5.9012899
-4.99354331
-3.99530506
-3.07478503
-2.4310706
-2.07161891
-1.98868642
-2.04708875
-1.98717566
-1.74134583
-1.47666677
-0.549531253
-0.366856204
-4.5794644
-5.03453789
-5.55028164
-5.69115106
-5.47404912
-4.74832763
-4.12456275
-3.35819752
-2.4645436
-1.80883975
-1.74409044
-1.71631161
-1.68604826
-1.73285282
-1.44992757
-1.03892853
-0.471709571
-0.312077192
-3.84911755
-4.3548373
-4.56843442
-4.94068819
-4.64573736
-4.00916324
-3.39991168
-2.84511192
-2.27377972
-1.74646111
-1.53800935
-1.51650465
-1.56999575
-1.38850873
-1.19926563
-0.92278617
-0.390432473
-0.260173099
-3.23586355
-3.63444822
-3.88436623
-3.98934436
-3.8083324
-3.47559467
-2.95451135
-2.44875759
-1.95810785
-1.60449263
-1.45352797
-1.31066002
-1.37484244
-1.19134614
-1.05423214
-0.82076333
-0.354174949
-0.238344944
+4.83899471
+5.39940791
+5.90597254
+6.04049283
+5.81181675
+5.28824175
+4.43110383
+3.50973892
+2.58991341
+2.17450632
+1.84249533
+2.0648545
+2.29757956
+2.5445745
+2.91056685
+3.0533999
+2.51812725
+0.851485279
+5.47390413
+6.3220115
+6.98653289
+7.25014082
+6.72740533
+6.05914642
+5.15713499
+4.2090955
+3.26633472
+2.61387972
+2.40771826
+2.62013756
+2.7949239
+3.26506203
+3.86298647
+4.25650723
+4.6493997
+2.81150467
+6.46131467
+7.41261912
+7.92032577
+8.18585079
+7.75687729
+6.93831208
+6.23444828
+5.06380081
+3.84761753
+3.0083635
+2.90371294
+2.8817389
+3.33466081
+3.84649878
+4.67011895
+5.95330551
+7.63402064
+8.64971318
+7.24236506
+8.14074995
+8.95510508
+9.26998219
+8.95741955
+8.00813243
+6.65791395
+5.6823371
+4.51984129
+3.55757667
+3.45888144
+3.2588561
+3.64952181
+4.30328888
+5.34228722
+7.0416631
+9.19861131
+10.9144301
+7.82830366
+8.90685563
+9.71961766
+10.0488506
+9.82618531
+8.91086523
+7.49781238
+6.167982
+4.83308055
+4.07923816
+3.72131334
+3.70703272
+3.85472383
+4.5477456
+5.77699946
+7.49842993
+9.99434507
+11.6662767
+8.49778156
+9.61729231
+10.6720605
+11.0108628
+10.6042643
+9.63152997
+8.1944052
+6.79675351
+5.36736691
+4.35155444
+3.98468857
+3.95940124
+4.00021503
+4.69096887
+5.94186204
+7.55278507
+9.93506385
+11.7542892
+8.96370603
+10.4132212
+11.2482616
+11.6483552
+11.3526955
+10.0754768
+8.69727527
+7.26746444
+5.47483672
+4.59478143
+4.03998525
+3.84128451
+4.04906413
+4.57816307
+5.4594284
+7.17852113
+9.1644957
+10.9199344
+9.45506461
+10.6747098
+11.8252108
+12.0268435
+11.7192464
+10.5641916
+8.82627878
+7.58409575
+5.83606946
+4.6249662
+4.28677076
+3.9560074
+3.92430113
+4.30668451
+5.01965046
+6.01615778
+7.51822196
+8.77988556
+9.73151758
+11.3487504
+12.1179671
+12.7358607
+12.1361248
+11.0362969
+9.36430445
+7.63358567
+6.15480223
+4.72544427
+4.24905546
+3.7722639
+3.73526997
+3.85886231
+4.05044422
+4.55892952
+4.68877612
+3.03960616
+10.0871172
+11.530464
+12.2241176
+12.8173344
+12.1994944
+11.3295526
+9.91065541
+7.9177607
+6.1016804
+4.83209963
+4.02501369
+3.84312821
+3.24903616
+3.30886333
+3.2652285
+3.00850849
+2.59573807
+0.933500215
+9.96938352
+11.6409231
+12.5322518
+13.2010567
+12.5637218
+11.4209697
+9.79579648
+7.73503392
+5.98678209
+4.72162262
+4.01811861
+3.46120844
+2.93448483
+2.95693322
+2.56466904
+2.2540933
+1.46603578
+0.747150475
+9.9317792
+11.4775606
+12.3667574
+13.1157041
+12.4819296
+11.3317579
+9.98370531
+8.08352365
+6.43396168
+4.5939276
+3.88763835
+3.33198655
+2.87323461
+2.40289958
+2.19213245
+1.66803584
+1.13362436
+0.700055754
+10.0251671
+11.5903216
+12.6122326
+13.169601
+12.5896786
+11.4905255
+9.8520347
+7.98538511
+6.40890168
+4.92528703
+3.76175302
+3.48484002
+2.79523715
+2.33881758
+1.98487909
+1.51156228
+0.972417321
+0.595444753
+10.2267981
+11.154811
+12.4762893
+12.9809368
+12.6228473
+11.3508733
+9.7914253
+8.06703417
+5.9679495
+4.55157083
+4.0369691
+3.277311
+2.77511934
+2.35641149
+1.72602379
+1.51235185
+0.942305046
+0.672964999
+10.1213867
+11.4989636
+12.3327939
+12.7204095
+12.3650336
+10.884709
+9.45613503
+7.65805855
+6.14573588
+4.7306836
+3.69304029
+3.1309069
+2.79196861
+2.29539397
+1.99970924
+1.3729019
+0.853582622
+0.707831335
+9.54199059
+11.313831
+11.9338226
+12.3393256
+12.0305452
+10.9412139
+9.43711091
+7.65761284
+5.93351169
+4.54209099
+3.61616695
+3.15821693
+2.74026983
+2.48590188
+1.95855535
+1.52855099
+0.848859528
+0.682617395
+9.59594477
+10.8227589
+11.5691978
+12.3249949
+11.8275467
+10.4971292
+8.86715701
+7.3875448
+5.80977794
+4.40384213
+3.84960085
+3.07307737
+3.17992605
+2.64685152
+2.16304674
+1.66893102
+0.868219094
+0.672876036
+9.00753239
+10.0623006
+10.8664474
+11.7131102
+11.2845126
+10.0157213
+8.81563186
+7.19404043
+5.53628563
+4.29731207
+3.52571288
+3.02408686
+2.9223361
+2.59152262
+2.14967186
+1.71792923
+0.863416882
+0.609781937
+8.49767774
+9.68120784
+10.4220727
+10.9005218
+10.3959924
+9.63502047
+8.00472069
+6.86188624
+5.24994649
+3.93409601
+3.57438298
+3.15070788
+3.04757703
+2.62704159
+2.34185342
+1.90699977
+0.805115329
+0.605979261
+7.65418678
+8.88533267
+9.77670792
+10.0904573
+9.79982756
+8.7911733
+7.57284918
+6.04567309
+4.88043142
+3.6191294
+3.06994129
+2.90489792
+2.62212983
+2.51955925
+2.28205668
+1.5495203
+0.755724933
+0.519384431
+6.95090652
+8.261924
+8.84983518
+9.20398489
+8.78323107
+7.92412057
+6.53048027
+5.47494412
+4.26784867
+3.16227486
+3.0044613
+2.60108659
+2.65431403
+2.53710125
+1.96612705
+1.72031548
+0.679681974
+0.469118725
+6.32851278
+7.13519955
+7.46608463
+8.04500285
+7.59901182
+6.94892678
+5.74680753
+4.71132475
+3.6411643
+2.86836939
+2.56360041
+2.29869294
+2.20828541
+2.1195927
+2.06835395
+1.66994237
+0.666378157
+0.467135942
+5.39380521
+6.12333582
+6.49208298
+6.84576192
+6.55833088
+6.05305147
+4.85714352
+3.93874106
+2.99079286
+2.41256737
+2.21238093
+1.97711407
+1.84973588
+1.96901074
+1.82058215
+1.44119541
+0.672598944
+0.409928616
+4.59195323
+5.19632167
+5.55056804
+5.6696997
+5.42246848
+4.82543546
+4.03893631
+3.12775113
+2.35531601
+1.94038327
+1.66889666
+1.67638781
+1.6213709
+1.64399614
+1.50549257
+1.13108972
+0.464153265
+0.398562832
+3.72051679
+4.28501656
+4.70529961
+4.64883227
+4.65681209
+4.10663411
+3.39384358
+2.67862939
+2.28704899
+1.77370653
+1.64584611
+1.6097905
+1.54291144
+1.4184105
+1.33091763
+0.954302521
+0.41834627
+0.247475734
+3.08323383
+3.58581392
+3.89220822
+4.03186939
+3.7999731
+3.43762877
+2.95280727
+2.3895605
+2.08798667
+1.6115268
+1.53319479
+1.6235402
+1.24941481
+1.17311552
+0.98028276
+0.829163979
+0.379304222
+0.27774714
diff --git a/tests/assets/df_results/more_grids.res b/tests/assets/df_results/more_grids.res
deleted file mode 100644
index 3080ac0a..00000000
--- a/tests/assets/df_results/more_grids.res
+++ /dev/null
@@ -1,468 +0,0 @@
-4.8378867
-5.44790259
-5.77869638
-6.13551319
-5.80542108
-4.99017453
-4.38626612
-3.38095021
-2.83245304
-2.09139483
-2.01429416
-2.06507109
-2.24883428
-2.66376881
-2.84293707
-2.93454032
-2.50299996
-0.790256539
-5.67266036
-6.4646387
-6.88239606
-6.9722648
-6.7415875
-6.16156664
-4.96264791
-4.06102491
-3.16265434
-2.76752079
-2.52981058
-2.50801196
-2.80047827
-3.14433548
-3.74737216
-4.31850209
-4.66888743
-2.69091774
-6.39666345
-7.14377544
-8.03624796
-8.30623187
-7.91599397
-7.19111378
-5.88897112
-5.05684666
-3.94052748
-3.06366913
-2.97367509
-2.94984124
-3.16720094
-3.79729705
-4.69566583
-5.79758446
-7.37301716
-8.55779847
-7.25067603
-8.04356369
-8.82488974
-9.10248473
-8.90678761
-8.01892434
-6.70463116
-5.55951804
-4.34210324
-3.59526333
-3.37054852
-3.45696077
-3.82459276
-4.40892931
-5.46639329
-6.99403299
-9.08615098
-10.8578715
-7.75465769
-9.04906755
-9.68555217
-9.95068876
-9.87575578
-8.87437071
-7.58466497
-6.20445325
-4.72795564
-4.02313956
-3.49069869
-3.7122094
-4.09033974
-4.55631612
-5.95887241
-7.65525183
-9.99032294
-11.7570565
-8.41051369
-9.71260265
-10.4152063
-10.7568833
-10.6203009
-9.71369992
-8.15577163
-6.75605428
-5.45470101
-4.4437824
-3.88817893
-3.81929257
-4.16980321
-4.7993659
-5.9097208
-7.41519672
-9.98326855
-11.6549746
-9.13999776
-10.3782517
-10.9579003
-11.6782661
-11.2849977
-9.88209596
-8.61288572
-7.20273446
-5.72563541
-4.5817019
-4.12043859
-4.0796785
-3.9824636
-4.49348891
-5.56066543
-7.0783223
-9.10216969
-11.1373174
-9.38043235
-10.6340517
-11.7071585
-12.0944644
-11.5326532
-10.6280248
-8.95803889
-7.55610015
-5.89595928
-4.82394976
-4.07236456
-4.01092281
-3.9880842
-4.3349683
-4.784491
-6.12932158
-7.43375186
-8.6927412
-9.77811844
-11.1471391
-12.028809
-12.5974239
-11.9715594
-10.9314137
-9.40754906
-7.72350632
-6.10571506
-4.82348436
-4.0909555
-3.84172485
-3.76606692
-3.74610842
-3.98129294
-4.48339689
-4.78911994
-2.86366885
-10.1285378
-11.4040882
-12.3601397
-12.7637257
-12.4987967
-11.2007711
-9.70251958
-7.73987766
-6.21190323
-4.83849172
-4.14887095
-3.65681248
-3.38246634
-3.22205549
-3.41654257
-3.11337385
-2.43722462
-0.982590965
-10.2490657
-11.3698008
-12.6141085
-12.7542709
-12.6387479
-11.2567086
-9.61402198
-7.89704145
-6.19436302
-4.56398627
-4.05429272
-3.66563897
-3.07305231
-2.8789286
-2.49606729
-2.29056634
-1.6070219
-0.716658004
-10.0935236
-11.6431893
-12.8018115
-13.433166
-12.6015069
-11.4788673
-9.98886767
-7.95984718
-6.40063546
-4.70110564
-4.10783878
-3.21757154
-2.89295862
-2.51438615
-2.21869963
-1.69485989
-1.17765335
-0.729628702
-10.2356263
-11.6125641
-12.5303258
-13.1523007
-12.6917193
-11.4665503
-9.91341917
-7.91268605
-6.12361864
-4.81752724
-3.8531003
-3.15109989
-2.84717579
-2.34338387
-2.01720112
-1.58970294
-1.04388486
-0.693754954
-10.074052
-11.6495921
-12.7097518
-12.7740558
-12.5595099
-11.2774063
-9.68988755
-7.83404419
-6.14674723
-4.78669986
-3.7981652
-3.09086818
-2.86491469
-2.34093157
-1.93689993
-1.45593624
-1.01648497
-0.654612308
-9.93821604
-11.3939264
-12.2863112
-12.4426802
-12.2282973
-10.9888548
-9.44481686
-7.69707876
-5.87660759
-4.47100114
-3.76861409
-3.18791124
-2.89260241
-2.47482894
-2.00591517
-1.52473453
-0.829532361
-0.705926596
-9.68322159
-11.0067315
-11.9708756
-12.3514923
-12.0451928
-10.9479228
-9.46763041
-7.48288378
-5.95157995
-4.58718288
-3.85621311
-3.22181205
-2.95933361
-2.46875189
-2.06080194
-1.57108264
-0.789171083
-0.684213001
-9.39884966
-10.5225866
-11.7602535
-12.3119386
-11.8234977
-10.407921
-9.07275283
-7.53815898
-5.69925439
-4.37659296
-3.79311382
-3.12672546
-2.88210406
-2.56752588
-2.31099024
-1.48192328
-0.840067943
-0.631583242
-8.88927246
-10.3290608
-11.0265539
-11.5681524
-11.1645952
-10.058121
-8.67403391
-6.99966433
-5.4282287
-4.46367288
-3.61248313
-3.09479902
-2.8698712
-2.84731362
-2.21604148
-1.72170828
-0.770987189
-0.683838712
-8.3266146
-9.58039146
-10.538165
-10.7763943
-10.4534586
-9.35311516
-8.17590197
-6.6807275
-5.25227528
-4.16961526
-3.51129085
-3.10209327
-2.77860268
-2.71330527
-2.24001137
-1.62001158
-0.874062907
-0.582444699
-7.79694107
-8.95419934
-9.62350003
-9.76816962
-9.60794851
-8.80146401
-7.56452747
-6.0837088
-4.73647425
-3.67128105
-3.12693489
-2.80104749
-2.68967369
-2.46226493
-1.98540714
-1.69700341
-0.886029057
-0.540392945
-6.96882084
-7.90433033
-8.79316557
-8.97727065
-8.82836592
-8.00517714
-6.80898816
-5.57228611
-4.28545869
-3.20231
-2.83030862
-2.74478421
-2.50119385
-2.35918241
-2.11009675
-1.81350986
-0.697105834
-0.482523498
-6.3259495
-7.2237598
-7.71830816
-7.89995915
-7.60644032
-6.9308263
-5.64950313
-4.73366574
-3.71786938
-2.83387251
-2.54731141
-2.50331679
-2.1981737
-2.1860912
-2.12508621
-1.43243569
-0.761779966
-0.481930471
-5.36227794
-5.99882163
-6.57477203
-6.93432575
-6.55153962
-5.9012899
-4.99354331
-3.99530506
-3.07478503
-2.4310706
-2.07161891
-1.98868642
-2.04708875
-1.98717566
-1.74134583
-1.47666677
-0.549531253
-0.366856204
-4.5794644
-5.03453789
-5.55028164
-5.69115106
-5.47404912
-4.74832763
-4.12456275
-3.35819752
-2.4645436
-1.80883975
-1.74409044
-1.71631161
-1.68604826
-1.73285282
-1.44992757
-1.03892853
-0.471709571
-0.312077192
-3.84911755
-4.3548373
-4.56843442
-4.94068819
-4.64573736
-4.00916324
-3.39991168
-2.84511192
-2.27377972
-1.74646111
-1.53800935
-1.51650465
-1.56999575
-1.38850873
-1.19926563
-0.92278617
-0.390432473
-0.260173099
-3.23586355
-3.63444822
-3.88436623
-3.98934436
-3.8083324
-3.47559467
-2.95451135
-2.44875759
-1.95810785
-1.60449263
-1.45352797
-1.31066002
-1.37484244
-1.19134614
-1.05423214
-0.82076333
-0.354174949
-0.238344944
diff --git a/tests/assets/dummy_results/identifier_mismatch/TestRoom_x.res b/tests/assets/dummy_results/identifier_mismatch/TestRoom_x.res
new file mode 100644
index 00000000..f6fd327e
--- /dev/null
+++ b/tests/assets/dummy_results/identifier_mismatch/TestRoom_x.res
@@ -0,0 +1,416 @@
+2.3434143
+3.9235189
+5.37017542
+6.75922079
+7.6049761
+8.11785048
+8.35334825
+8.06134913
+7.31663037
+6.15064406
+4.67770139
+3.59421439
+2.81563062
+2.42440106
+2.23723508
+2.33144636
+2.48622766
+2.87238257
+3.33180039
+3.56365014
+3.61616337
+3.3848184
+2.99580665
+2.64278643
+2.32142236
+1.41376062
+4.06352554
+5.93812631
+7.25779486
+9.1876583
+10.5025332
+11.5971827
+12.1581651
+12.0059005
+10.7532997
+9.08142538
+6.86865781
+4.99050747
+3.85603411
+3.06216374
+2.77370703
+2.96286349
+3.36727282
+4.03769405
+4.67652178
+5.17594073
+5.43262136
+5.3470522
+4.61567252
+4.40872704
+4.33867002
+3.40631272
+9.01176216
+9.04441534
+9.67050722
+11.7539723
+14.0303064
+15.5747059
+16.226597
+16.2273614
+14.5784617
+12.4695929
+9.25024386
+6.47434766
+4.9543262
+3.80969817
+3.4606786
+3.85599473
+4.56566529
+5.74908441
+6.93595286
+7.93403001
+8.42310455
+8.12956603
+7.55385907
+6.96504752
+7.40695377
+9.30436093
+11.0716261
+10.9546013
+11.5566929
+14.0556904
+16.8592045
+19.0561789
+20.1422256
+19.6188117
+18.0824905
+15.1227291
+11.1420179
+7.88053049
+5.87841012
+4.8449751
+4.4151782
+4.88044574
+6.08764322
+8.11719713
+10.3006427
+11.7662177
+12.6290425
+12.3270963
+11.4456771
+10.6188134
+10.7532818
+12.8091201
+12.0730291
+12.3833095
+12.9974352
+16.0836082
+19.3145117
+21.6669834
+22.9060035
+22.4971317
+20.7365951
+17.1681209
+12.8703273
+9.08905973
+6.52223553
+5.18755604
+4.93105083
+5.75061665
+7.64907633
+10.3756222
+13.3671508
+15.6267286
+16.9104361
+16.7835842
+15.379723
+14.0315809
+13.6287879
+14.4717043
+12.3873531
+13.1016258
+14.1625874
+17.2353766
+20.6562062
+23.3271189
+24.7314813
+24.3819659
+22.2524029
+18.6060118
+14.2505749
+9.98291413
+7.21834326
+5.80584889
+5.56329852
+6.77866735
+9.08969518
+12.5407579
+16.0829298
+19.1595514
+20.5768734
+20.2860521
+19.0512564
+17.0148719
+15.8528056
+16.1915291
+12.6282567
+13.381222
+14.6707827
+18.2356966
+21.7620503
+24.5496352
+25.8594498
+25.5822683
+23.2774822
+19.7079179
+14.6036703
+10.2461086
+7.52167129
+6.2405307
+6.03511746
+7.34155612
+10.1237621
+14.0163283
+18.2800528
+21.4124633
+23.2619987
+22.9028352
+21.2643766
+18.9639402
+17.3703122
+16.955639
+12.7513049
+13.8004865
+14.8040357
+18.3534607
+22.2090491
+24.9903332
+26.6646634
+25.9397671
+23.5612688
+19.787734
+14.9586684
+10.8855073
+7.90444668
+6.57431379
+6.25440857
+7.66900619
+10.5093317
+14.7038225
+19.165888
+22.6899147
+24.620018
+24.2693749
+22.5019826
+20.1949769
+18.1397705
+17.7102725
+12.8853812
+13.8132134
+14.8779663
+18.5377233
+22.0736714
+24.9224027
+26.455663
+25.9133109
+23.9372046
+20.2588262
+15.3126212
+10.8855324
+8.04234291
+6.69744968
+6.44242301
+7.78724822
+10.6051253
+14.7310968
+19.3403056
+22.4679189
+24.5216396
+24.4251586
+22.5020721
+20.5497907
+18.1864358
+18.0101745
+12.7266977
+13.4668985
+14.5460842
+18.2871054
+21.9087945
+24.6740939
+26.2471817
+25.9971008
+23.4056462
+19.8042557
+15.0670547
+10.702879
+7.98582903
+6.37892097
+6.31510389
+7.41050692
+10.1421686
+14.3280461
+18.1634522
+21.5213311
+23.260334
+23.3683247
+21.6648891
+19.5845511
+17.7805175
+17.8827963
+12.3374085
+13.1872737
+14.0525346
+17.5452721
+21.1734446
+23.987432
+25.2950091
+25.0866889
+23.1821289
+19.4763098
+14.8049235
+10.5256171
+7.72488462
+6.16044073
+6.01453783
+7.01128501
+9.36829973
+12.6605196
+16.3528565
+19.1021461
+20.6787602
+20.7041603
+19.7343025
+17.7044622
+16.812353
+17.0651118
+11.8511873
+12.5449232
+13.4214254
+16.5315826
+20.1264557
+22.7778037
+24.2660992
+23.9204144
+22.1224489
+18.8414505
+14.2935975
+10.3335733
+7.35737435
+5.83699847
+5.36205956
+6.15177355
+8.08231182
+10.5621313
+13.802622
+15.9903117
+17.1748442
+17.1048802
+16.11566
+14.725503
+14.2290752
+15.5462091
+11.7056638
+11.371512
+11.9030865
+14.5047495
+17.7957486
+20.4414599
+22.1579446
+21.8391098
+20.2630864
+17.2068279
+13.2865829
+9.47230052
+6.7403703
+5.11422869
+4.4762351
+5.06088848
+6.37115774
+8.20909573
+10.3207516
+11.9435119
+12.877575
+13.0302424
+12.1537241
+11.6420347
+11.6636042
+13.3096739
+9.42754694
+9.27958554
+10.0096227
+11.9892285
+14.9381837
+17.1890406
+18.040873
+18.00561
+16.7329809
+14.1944064
+11.0464892
+8.03786791
+5.6386969
+4.38176785
+3.80227504
+3.98328521
+4.86276054
+6.00782175
+7.30971739
+8.17146814
+8.70829272
+8.85368189
+8.47210222
+8.13727914
+8.3400933
+9.97497548
+4.09446211
+6.28835234
+7.54972059
+9.62200001
+11.4067303
+13.1610681
+14.0497064
+14.0213815
+12.8965705
+11.1464822
+8.70665308
+6.54445301
+4.7261549
+3.72155141
+3.13193973
+3.20389236
+3.56469371
+4.25247794
+4.91357506
+5.51644527
+5.83077643
+5.81465032
+5.56725084
+5.53243355
+5.43483559
+4.34483657
+2.49773557
+4.07441769
+5.52394358
+7.16760213
+8.41606985
+9.66516407
+10.0918249
+10.1992034
+9.47295208
+8.18140622
+6.64860416
+5.08543833
+3.92603743
+3.05397807
+2.62511734
+2.6598326
+2.7039561
+3.13276671
+3.47098363
+3.80490813
+3.91565006
+4.03362538
+3.85442132
+3.84433288
+3.49582883
+2.38447869
diff --git a/tests/assets/dummy_results/identifier_mismatch/TestRoom_y.res b/tests/assets/dummy_results/identifier_mismatch/TestRoom_y.res
new file mode 100644
index 00000000..68c73636
--- /dev/null
+++ b/tests/assets/dummy_results/identifier_mismatch/TestRoom_y.res
@@ -0,0 +1,468 @@
+4.83899471
+5.39940791
+5.90597254
+6.04049283
+5.81181675
+5.28824175
+4.43110383
+3.50973892
+2.58991341
+2.17450632
+1.84249533
+2.0648545
+2.29757956
+2.5445745
+2.91056685
+3.0533999
+2.51812725
+0.851485279
+5.47390413
+6.3220115
+6.98653289
+7.25014082
+6.72740533
+6.05914642
+5.15713499
+4.2090955
+3.26633472
+2.61387972
+2.40771826
+2.62013756
+2.7949239
+3.26506203
+3.86298647
+4.25650723
+4.6493997
+2.81150467
+6.46131467
+7.41261912
+7.92032577
+8.18585079
+7.75687729
+6.93831208
+6.23444828
+5.06380081
+3.84761753
+3.0083635
+2.90371294
+2.8817389
+3.33466081
+3.84649878
+4.67011895
+5.95330551
+7.63402064
+8.64971318
+7.24236506
+8.14074995
+8.95510508
+9.26998219
+8.95741955
+8.00813243
+6.65791395
+5.6823371
+4.51984129
+3.55757667
+3.45888144
+3.2588561
+3.64952181
+4.30328888
+5.34228722
+7.0416631
+9.19861131
+10.9144301
+7.82830366
+8.90685563
+9.71961766
+10.0488506
+9.82618531
+8.91086523
+7.49781238
+6.167982
+4.83308055
+4.07923816
+3.72131334
+3.70703272
+3.85472383
+4.5477456
+5.77699946
+7.49842993
+9.99434507
+11.6662767
+8.49778156
+9.61729231
+10.6720605
+11.0108628
+10.6042643
+9.63152997
+8.1944052
+6.79675351
+5.36736691
+4.35155444
+3.98468857
+3.95940124
+4.00021503
+4.69096887
+5.94186204
+7.55278507
+9.93506385
+11.7542892
+8.96370603
+10.4132212
+11.2482616
+11.6483552
+11.3526955
+10.0754768
+8.69727527
+7.26746444
+5.47483672
+4.59478143
+4.03998525
+3.84128451
+4.04906413
+4.57816307
+5.4594284
+7.17852113
+9.1644957
+10.9199344
+9.45506461
+10.6747098
+11.8252108
+12.0268435
+11.7192464
+10.5641916
+8.82627878
+7.58409575
+5.83606946
+4.6249662
+4.28677076
+3.9560074
+3.92430113
+4.30668451
+5.01965046
+6.01615778
+7.51822196
+8.77988556
+9.73151758
+11.3487504
+12.1179671
+12.7358607
+12.1361248
+11.0362969
+9.36430445
+7.63358567
+6.15480223
+4.72544427
+4.24905546
+3.7722639
+3.73526997
+3.85886231
+4.05044422
+4.55892952
+4.68877612
+3.03960616
+10.0871172
+11.530464
+12.2241176
+12.8173344
+12.1994944
+11.3295526
+9.91065541
+7.9177607
+6.1016804
+4.83209963
+4.02501369
+3.84312821
+3.24903616
+3.30886333
+3.2652285
+3.00850849
+2.59573807
+0.933500215
+9.96938352
+11.6409231
+12.5322518
+13.2010567
+12.5637218
+11.4209697
+9.79579648
+7.73503392
+5.98678209
+4.72162262
+4.01811861
+3.46120844
+2.93448483
+2.95693322
+2.56466904
+2.2540933
+1.46603578
+0.747150475
+9.9317792
+11.4775606
+12.3667574
+13.1157041
+12.4819296
+11.3317579
+9.98370531
+8.08352365
+6.43396168
+4.5939276
+3.88763835
+3.33198655
+2.87323461
+2.40289958
+2.19213245
+1.66803584
+1.13362436
+0.700055754
+10.0251671
+11.5903216
+12.6122326
+13.169601
+12.5896786
+11.4905255
+9.8520347
+7.98538511
+6.40890168
+4.92528703
+3.76175302
+3.48484002
+2.79523715
+2.33881758
+1.98487909
+1.51156228
+0.972417321
+0.595444753
+10.2267981
+11.154811
+12.4762893
+12.9809368
+12.6228473
+11.3508733
+9.7914253
+8.06703417
+5.9679495
+4.55157083
+4.0369691
+3.277311
+2.77511934
+2.35641149
+1.72602379
+1.51235185
+0.942305046
+0.672964999
+10.1213867
+11.4989636
+12.3327939
+12.7204095
+12.3650336
+10.884709
+9.45613503
+7.65805855
+6.14573588
+4.7306836
+3.69304029
+3.1309069
+2.79196861
+2.29539397
+1.99970924
+1.3729019
+0.853582622
+0.707831335
+9.54199059
+11.313831
+11.9338226
+12.3393256
+12.0305452
+10.9412139
+9.43711091
+7.65761284
+5.93351169
+4.54209099
+3.61616695
+3.15821693
+2.74026983
+2.48590188
+1.95855535
+1.52855099
+0.848859528
+0.682617395
+9.59594477
+10.8227589
+11.5691978
+12.3249949
+11.8275467
+10.4971292
+8.86715701
+7.3875448
+5.80977794
+4.40384213
+3.84960085
+3.07307737
+3.17992605
+2.64685152
+2.16304674
+1.66893102
+0.868219094
+0.672876036
+9.00753239
+10.0623006
+10.8664474
+11.7131102
+11.2845126
+10.0157213
+8.81563186
+7.19404043
+5.53628563
+4.29731207
+3.52571288
+3.02408686
+2.9223361
+2.59152262
+2.14967186
+1.71792923
+0.863416882
+0.609781937
+8.49767774
+9.68120784
+10.4220727
+10.9005218
+10.3959924
+9.63502047
+8.00472069
+6.86188624
+5.24994649
+3.93409601
+3.57438298
+3.15070788
+3.04757703
+2.62704159
+2.34185342
+1.90699977
+0.805115329
+0.605979261
+7.65418678
+8.88533267
+9.77670792
+10.0904573
+9.79982756
+8.7911733
+7.57284918
+6.04567309
+4.88043142
+3.6191294
+3.06994129
+2.90489792
+2.62212983
+2.51955925
+2.28205668
+1.5495203
+0.755724933
+0.519384431
+6.95090652
+8.261924
+8.84983518
+9.20398489
+8.78323107
+7.92412057
+6.53048027
+5.47494412
+4.26784867
+3.16227486
+3.0044613
+2.60108659
+2.65431403
+2.53710125
+1.96612705
+1.72031548
+0.679681974
+0.469118725
+6.32851278
+7.13519955
+7.46608463
+8.04500285
+7.59901182
+6.94892678
+5.74680753
+4.71132475
+3.6411643
+2.86836939
+2.56360041
+2.29869294
+2.20828541
+2.1195927
+2.06835395
+1.66994237
+0.666378157
+0.467135942
+5.39380521
+6.12333582
+6.49208298
+6.84576192
+6.55833088
+6.05305147
+4.85714352
+3.93874106
+2.99079286
+2.41256737
+2.21238093
+1.97711407
+1.84973588
+1.96901074
+1.82058215
+1.44119541
+0.672598944
+0.409928616
+4.59195323
+5.19632167
+5.55056804
+5.6696997
+5.42246848
+4.82543546
+4.03893631
+3.12775113
+2.35531601
+1.94038327
+1.66889666
+1.67638781
+1.6213709
+1.64399614
+1.50549257
+1.13108972
+0.464153265
+0.398562832
+3.72051679
+4.28501656
+4.70529961
+4.64883227
+4.65681209
+4.10663411
+3.39384358
+2.67862939
+2.28704899
+1.77370653
+1.64584611
+1.6097905
+1.54291144
+1.4184105
+1.33091763
+0.954302521
+0.41834627
+0.247475734
+3.08323383
+3.58581392
+3.89220822
+4.03186939
+3.7999731
+3.43762877
+2.95280727
+2.3895605
+2.08798667
+1.6115268
+1.53319479
+1.6235402
+1.24941481
+1.17311552
+0.98028276
+0.829163979
+0.379304222
+0.27774714
diff --git a/tests/assets/dummy_results/identifier_mismatch/grids_info.json b/tests/assets/dummy_results/identifier_mismatch/grids_info.json
new file mode 100644
index 00000000..a1dedbb2
--- /dev/null
+++ b/tests/assets/dummy_results/identifier_mismatch/grids_info.json
@@ -0,0 +1,23 @@
+[
+  {
+    "name": "TestRoom_x",
+    "identifier": "TestRoom_x",
+    "count": 416,
+    "group": "",
+    "full_id": "TestRoom_x"
+  },
+  {
+    "name": "TestRoom_y",
+    "identifier": "TestRoom_y",
+    "count": 468,
+    "group": "",
+    "full_id": "TestRoom_y"
+  },
+  {
+    "name": "TestRoom_3",
+    "identifier": "TestRoom_3",
+    "count": 468,
+    "group": "",
+    "full_id": "TestRoom_3"
+  }
+]
\ No newline at end of file
diff --git a/tests/assets/dummy_results/more_grids/TestRoom_1.res b/tests/assets/dummy_results/more_grids/TestRoom_1.res
new file mode 100644
index 00000000..f6fd327e
--- /dev/null
+++ b/tests/assets/dummy_results/more_grids/TestRoom_1.res
@@ -0,0 +1,416 @@
+2.3434143
+3.9235189
+5.37017542
+6.75922079
+7.6049761
+8.11785048
+8.35334825
+8.06134913
+7.31663037
+6.15064406
+4.67770139
+3.59421439
+2.81563062
+2.42440106
+2.23723508
+2.33144636
+2.48622766
+2.87238257
+3.33180039
+3.56365014
+3.61616337
+3.3848184
+2.99580665
+2.64278643
+2.32142236
+1.41376062
+4.06352554
+5.93812631
+7.25779486
+9.1876583
+10.5025332
+11.5971827
+12.1581651
+12.0059005
+10.7532997
+9.08142538
+6.86865781
+4.99050747
+3.85603411
+3.06216374
+2.77370703
+2.96286349
+3.36727282
+4.03769405
+4.67652178
+5.17594073
+5.43262136
+5.3470522
+4.61567252
+4.40872704
+4.33867002
+3.40631272
+9.01176216
+9.04441534
+9.67050722
+11.7539723
+14.0303064
+15.5747059
+16.226597
+16.2273614
+14.5784617
+12.4695929
+9.25024386
+6.47434766
+4.9543262
+3.80969817
+3.4606786
+3.85599473
+4.56566529
+5.74908441
+6.93595286
+7.93403001
+8.42310455
+8.12956603
+7.55385907
+6.96504752
+7.40695377
+9.30436093
+11.0716261
+10.9546013
+11.5566929
+14.0556904
+16.8592045
+19.0561789
+20.1422256
+19.6188117
+18.0824905
+15.1227291
+11.1420179
+7.88053049
+5.87841012
+4.8449751
+4.4151782
+4.88044574
+6.08764322
+8.11719713
+10.3006427
+11.7662177
+12.6290425
+12.3270963
+11.4456771
+10.6188134
+10.7532818
+12.8091201
+12.0730291
+12.3833095
+12.9974352
+16.0836082
+19.3145117
+21.6669834
+22.9060035
+22.4971317
+20.7365951
+17.1681209
+12.8703273
+9.08905973
+6.52223553
+5.18755604
+4.93105083
+5.75061665
+7.64907633
+10.3756222
+13.3671508
+15.6267286
+16.9104361
+16.7835842
+15.379723
+14.0315809
+13.6287879
+14.4717043
+12.3873531
+13.1016258
+14.1625874
+17.2353766
+20.6562062
+23.3271189
+24.7314813
+24.3819659
+22.2524029
+18.6060118
+14.2505749
+9.98291413
+7.21834326
+5.80584889
+5.56329852
+6.77866735
+9.08969518
+12.5407579
+16.0829298
+19.1595514
+20.5768734
+20.2860521
+19.0512564
+17.0148719
+15.8528056
+16.1915291
+12.6282567
+13.381222
+14.6707827
+18.2356966
+21.7620503
+24.5496352
+25.8594498
+25.5822683
+23.2774822
+19.7079179
+14.6036703
+10.2461086
+7.52167129
+6.2405307
+6.03511746
+7.34155612
+10.1237621
+14.0163283
+18.2800528
+21.4124633
+23.2619987
+22.9028352
+21.2643766
+18.9639402
+17.3703122
+16.955639
+12.7513049
+13.8004865
+14.8040357
+18.3534607
+22.2090491
+24.9903332
+26.6646634
+25.9397671
+23.5612688
+19.787734
+14.9586684
+10.8855073
+7.90444668
+6.57431379
+6.25440857
+7.66900619
+10.5093317
+14.7038225
+19.165888
+22.6899147
+24.620018
+24.2693749
+22.5019826
+20.1949769
+18.1397705
+17.7102725
+12.8853812
+13.8132134
+14.8779663
+18.5377233
+22.0736714
+24.9224027
+26.455663
+25.9133109
+23.9372046
+20.2588262
+15.3126212
+10.8855324
+8.04234291
+6.69744968
+6.44242301
+7.78724822
+10.6051253
+14.7310968
+19.3403056
+22.4679189
+24.5216396
+24.4251586
+22.5020721
+20.5497907
+18.1864358
+18.0101745
+12.7266977
+13.4668985
+14.5460842
+18.2871054
+21.9087945
+24.6740939
+26.2471817
+25.9971008
+23.4056462
+19.8042557
+15.0670547
+10.702879
+7.98582903
+6.37892097
+6.31510389
+7.41050692
+10.1421686
+14.3280461
+18.1634522
+21.5213311
+23.260334
+23.3683247
+21.6648891
+19.5845511
+17.7805175
+17.8827963
+12.3374085
+13.1872737
+14.0525346
+17.5452721
+21.1734446
+23.987432
+25.2950091
+25.0866889
+23.1821289
+19.4763098
+14.8049235
+10.5256171
+7.72488462
+6.16044073
+6.01453783
+7.01128501
+9.36829973
+12.6605196
+16.3528565
+19.1021461
+20.6787602
+20.7041603
+19.7343025
+17.7044622
+16.812353
+17.0651118
+11.8511873
+12.5449232
+13.4214254
+16.5315826
+20.1264557
+22.7778037
+24.2660992
+23.9204144
+22.1224489
+18.8414505
+14.2935975
+10.3335733
+7.35737435
+5.83699847
+5.36205956
+6.15177355
+8.08231182
+10.5621313
+13.802622
+15.9903117
+17.1748442
+17.1048802
+16.11566
+14.725503
+14.2290752
+15.5462091
+11.7056638
+11.371512
+11.9030865
+14.5047495
+17.7957486
+20.4414599
+22.1579446
+21.8391098
+20.2630864
+17.2068279
+13.2865829
+9.47230052
+6.7403703
+5.11422869
+4.4762351
+5.06088848
+6.37115774
+8.20909573
+10.3207516
+11.9435119
+12.877575
+13.0302424
+12.1537241
+11.6420347
+11.6636042
+13.3096739
+9.42754694
+9.27958554
+10.0096227
+11.9892285
+14.9381837
+17.1890406
+18.040873
+18.00561
+16.7329809
+14.1944064
+11.0464892
+8.03786791
+5.6386969
+4.38176785
+3.80227504
+3.98328521
+4.86276054
+6.00782175
+7.30971739
+8.17146814
+8.70829272
+8.85368189
+8.47210222
+8.13727914
+8.3400933
+9.97497548
+4.09446211
+6.28835234
+7.54972059
+9.62200001
+11.4067303
+13.1610681
+14.0497064
+14.0213815
+12.8965705
+11.1464822
+8.70665308
+6.54445301
+4.7261549
+3.72155141
+3.13193973
+3.20389236
+3.56469371
+4.25247794
+4.91357506
+5.51644527
+5.83077643
+5.81465032
+5.56725084
+5.53243355
+5.43483559
+4.34483657
+2.49773557
+4.07441769
+5.52394358
+7.16760213
+8.41606985
+9.66516407
+10.0918249
+10.1992034
+9.47295208
+8.18140622
+6.64860416
+5.08543833
+3.92603743
+3.05397807
+2.62511734
+2.6598326
+2.7039561
+3.13276671
+3.47098363
+3.80490813
+3.91565006
+4.03362538
+3.85442132
+3.84433288
+3.49582883
+2.38447869
diff --git a/tests/assets/dummy_results/more_grids/TestRoom_2.res b/tests/assets/dummy_results/more_grids/TestRoom_2.res
new file mode 100644
index 00000000..68c73636
--- /dev/null
+++ b/tests/assets/dummy_results/more_grids/TestRoom_2.res
@@ -0,0 +1,468 @@
+4.83899471
+5.39940791
+5.90597254
+6.04049283
+5.81181675
+5.28824175
+4.43110383
+3.50973892
+2.58991341
+2.17450632
+1.84249533
+2.0648545
+2.29757956
+2.5445745
+2.91056685
+3.0533999
+2.51812725
+0.851485279
+5.47390413
+6.3220115
+6.98653289
+7.25014082
+6.72740533
+6.05914642
+5.15713499
+4.2090955
+3.26633472
+2.61387972
+2.40771826
+2.62013756
+2.7949239
+3.26506203
+3.86298647
+4.25650723
+4.6493997
+2.81150467
+6.46131467
+7.41261912
+7.92032577
+8.18585079
+7.75687729
+6.93831208
+6.23444828
+5.06380081
+3.84761753
+3.0083635
+2.90371294
+2.8817389
+3.33466081
+3.84649878
+4.67011895
+5.95330551
+7.63402064
+8.64971318
+7.24236506
+8.14074995
+8.95510508
+9.26998219
+8.95741955
+8.00813243
+6.65791395
+5.6823371
+4.51984129
+3.55757667
+3.45888144
+3.2588561
+3.64952181
+4.30328888
+5.34228722
+7.0416631
+9.19861131
+10.9144301
+7.82830366
+8.90685563
+9.71961766
+10.0488506
+9.82618531
+8.91086523
+7.49781238
+6.167982
+4.83308055
+4.07923816
+3.72131334
+3.70703272
+3.85472383
+4.5477456
+5.77699946
+7.49842993
+9.99434507
+11.6662767
+8.49778156
+9.61729231
+10.6720605
+11.0108628
+10.6042643
+9.63152997
+8.1944052
+6.79675351
+5.36736691
+4.35155444
+3.98468857
+3.95940124
+4.00021503
+4.69096887
+5.94186204
+7.55278507
+9.93506385
+11.7542892
+8.96370603
+10.4132212
+11.2482616
+11.6483552
+11.3526955
+10.0754768
+8.69727527
+7.26746444
+5.47483672
+4.59478143
+4.03998525
+3.84128451
+4.04906413
+4.57816307
+5.4594284
+7.17852113
+9.1644957
+10.9199344
+9.45506461
+10.6747098
+11.8252108
+12.0268435
+11.7192464
+10.5641916
+8.82627878
+7.58409575
+5.83606946
+4.6249662
+4.28677076
+3.9560074
+3.92430113
+4.30668451
+5.01965046
+6.01615778
+7.51822196
+8.77988556
+9.73151758
+11.3487504
+12.1179671
+12.7358607
+12.1361248
+11.0362969
+9.36430445
+7.63358567
+6.15480223
+4.72544427
+4.24905546
+3.7722639
+3.73526997
+3.85886231
+4.05044422
+4.55892952
+4.68877612
+3.03960616
+10.0871172
+11.530464
+12.2241176
+12.8173344
+12.1994944
+11.3295526
+9.91065541
+7.9177607
+6.1016804
+4.83209963
+4.02501369
+3.84312821
+3.24903616
+3.30886333
+3.2652285
+3.00850849
+2.59573807
+0.933500215
+9.96938352
+11.6409231
+12.5322518
+13.2010567
+12.5637218
+11.4209697
+9.79579648
+7.73503392
+5.98678209
+4.72162262
+4.01811861
+3.46120844
+2.93448483
+2.95693322
+2.56466904
+2.2540933
+1.46603578
+0.747150475
+9.9317792
+11.4775606
+12.3667574
+13.1157041
+12.4819296
+11.3317579
+9.98370531
+8.08352365
+6.43396168
+4.5939276
+3.88763835
+3.33198655
+2.87323461
+2.40289958
+2.19213245
+1.66803584
+1.13362436
+0.700055754
+10.0251671
+11.5903216
+12.6122326
+13.169601
+12.5896786
+11.4905255
+9.8520347
+7.98538511
+6.40890168
+4.92528703
+3.76175302
+3.48484002
+2.79523715
+2.33881758
+1.98487909
+1.51156228
+0.972417321
+0.595444753
+10.2267981
+11.154811
+12.4762893
+12.9809368
+12.6228473
+11.3508733
+9.7914253
+8.06703417
+5.9679495
+4.55157083
+4.0369691
+3.277311
+2.77511934
+2.35641149
+1.72602379
+1.51235185
+0.942305046
+0.672964999
+10.1213867
+11.4989636
+12.3327939
+12.7204095
+12.3650336
+10.884709
+9.45613503
+7.65805855
+6.14573588
+4.7306836
+3.69304029
+3.1309069
+2.79196861
+2.29539397
+1.99970924
+1.3729019
+0.853582622
+0.707831335
+9.54199059
+11.313831
+11.9338226
+12.3393256
+12.0305452
+10.9412139
+9.43711091
+7.65761284
+5.93351169
+4.54209099
+3.61616695
+3.15821693
+2.74026983
+2.48590188
+1.95855535
+1.52855099
+0.848859528
+0.682617395
+9.59594477
+10.8227589
+11.5691978
+12.3249949
+11.8275467
+10.4971292
+8.86715701
+7.3875448
+5.80977794
+4.40384213
+3.84960085
+3.07307737
+3.17992605
+2.64685152
+2.16304674
+1.66893102
+0.868219094
+0.672876036
+9.00753239
+10.0623006
+10.8664474
+11.7131102
+11.2845126
+10.0157213
+8.81563186
+7.19404043
+5.53628563
+4.29731207
+3.52571288
+3.02408686
+2.9223361
+2.59152262
+2.14967186
+1.71792923
+0.863416882
+0.609781937
+8.49767774
+9.68120784
+10.4220727
+10.9005218
+10.3959924
+9.63502047
+8.00472069
+6.86188624
+5.24994649
+3.93409601
+3.57438298
+3.15070788
+3.04757703
+2.62704159
+2.34185342
+1.90699977
+0.805115329
+0.605979261
+7.65418678
+8.88533267
+9.77670792
+10.0904573
+9.79982756
+8.7911733
+7.57284918
+6.04567309
+4.88043142
+3.6191294
+3.06994129
+2.90489792
+2.62212983
+2.51955925
+2.28205668
+1.5495203
+0.755724933
+0.519384431
+6.95090652
+8.261924
+8.84983518
+9.20398489
+8.78323107
+7.92412057
+6.53048027
+5.47494412
+4.26784867
+3.16227486
+3.0044613
+2.60108659
+2.65431403
+2.53710125
+1.96612705
+1.72031548
+0.679681974
+0.469118725
+6.32851278
+7.13519955
+7.46608463
+8.04500285
+7.59901182
+6.94892678
+5.74680753
+4.71132475
+3.6411643
+2.86836939
+2.56360041
+2.29869294
+2.20828541
+2.1195927
+2.06835395
+1.66994237
+0.666378157
+0.467135942
+5.39380521
+6.12333582
+6.49208298
+6.84576192
+6.55833088
+6.05305147
+4.85714352
+3.93874106
+2.99079286
+2.41256737
+2.21238093
+1.97711407
+1.84973588
+1.96901074
+1.82058215
+1.44119541
+0.672598944
+0.409928616
+4.59195323
+5.19632167
+5.55056804
+5.6696997
+5.42246848
+4.82543546
+4.03893631
+3.12775113
+2.35531601
+1.94038327
+1.66889666
+1.67638781
+1.6213709
+1.64399614
+1.50549257
+1.13108972
+0.464153265
+0.398562832
+3.72051679
+4.28501656
+4.70529961
+4.64883227
+4.65681209
+4.10663411
+3.39384358
+2.67862939
+2.28704899
+1.77370653
+1.64584611
+1.6097905
+1.54291144
+1.4184105
+1.33091763
+0.954302521
+0.41834627
+0.247475734
+3.08323383
+3.58581392
+3.89220822
+4.03186939
+3.7999731
+3.43762877
+2.95280727
+2.3895605
+2.08798667
+1.6115268
+1.53319479
+1.6235402
+1.24941481
+1.17311552
+0.98028276
+0.829163979
+0.379304222
+0.27774714
diff --git a/tests/assets/dummy_results/more_grids/TestRoom_3.res b/tests/assets/dummy_results/more_grids/TestRoom_3.res
new file mode 100644
index 00000000..68c73636
--- /dev/null
+++ b/tests/assets/dummy_results/more_grids/TestRoom_3.res
@@ -0,0 +1,468 @@
+4.83899471
+5.39940791
+5.90597254
+6.04049283
+5.81181675
+5.28824175
+4.43110383
+3.50973892
+2.58991341
+2.17450632
+1.84249533
+2.0648545
+2.29757956
+2.5445745
+2.91056685
+3.0533999
+2.51812725
+0.851485279
+5.47390413
+6.3220115
+6.98653289
+7.25014082
+6.72740533
+6.05914642
+5.15713499
+4.2090955
+3.26633472
+2.61387972
+2.40771826
+2.62013756
+2.7949239
+3.26506203
+3.86298647
+4.25650723
+4.6493997
+2.81150467
+6.46131467
+7.41261912
+7.92032577
+8.18585079
+7.75687729
+6.93831208
+6.23444828
+5.06380081
+3.84761753
+3.0083635
+2.90371294
+2.8817389
+3.33466081
+3.84649878
+4.67011895
+5.95330551
+7.63402064
+8.64971318
+7.24236506
+8.14074995
+8.95510508
+9.26998219
+8.95741955
+8.00813243
+6.65791395
+5.6823371
+4.51984129
+3.55757667
+3.45888144
+3.2588561
+3.64952181
+4.30328888
+5.34228722
+7.0416631
+9.19861131
+10.9144301
+7.82830366
+8.90685563
+9.71961766
+10.0488506
+9.82618531
+8.91086523
+7.49781238
+6.167982
+4.83308055
+4.07923816
+3.72131334
+3.70703272
+3.85472383
+4.5477456
+5.77699946
+7.49842993
+9.99434507
+11.6662767
+8.49778156
+9.61729231
+10.6720605
+11.0108628
+10.6042643
+9.63152997
+8.1944052
+6.79675351
+5.36736691
+4.35155444
+3.98468857
+3.95940124
+4.00021503
+4.69096887
+5.94186204
+7.55278507
+9.93506385
+11.7542892
+8.96370603
+10.4132212
+11.2482616
+11.6483552
+11.3526955
+10.0754768
+8.69727527
+7.26746444
+5.47483672
+4.59478143
+4.03998525
+3.84128451
+4.04906413
+4.57816307
+5.4594284
+7.17852113
+9.1644957
+10.9199344
+9.45506461
+10.6747098
+11.8252108
+12.0268435
+11.7192464
+10.5641916
+8.82627878
+7.58409575
+5.83606946
+4.6249662
+4.28677076
+3.9560074
+3.92430113
+4.30668451
+5.01965046
+6.01615778
+7.51822196
+8.77988556
+9.73151758
+11.3487504
+12.1179671
+12.7358607
+12.1361248
+11.0362969
+9.36430445
+7.63358567
+6.15480223
+4.72544427
+4.24905546
+3.7722639
+3.73526997
+3.85886231
+4.05044422
+4.55892952
+4.68877612
+3.03960616
+10.0871172
+11.530464
+12.2241176
+12.8173344
+12.1994944
+11.3295526
+9.91065541
+7.9177607
+6.1016804
+4.83209963
+4.02501369
+3.84312821
+3.24903616
+3.30886333
+3.2652285
+3.00850849
+2.59573807
+0.933500215
+9.96938352
+11.6409231
+12.5322518
+13.2010567
+12.5637218
+11.4209697
+9.79579648
+7.73503392
+5.98678209
+4.72162262
+4.01811861
+3.46120844
+2.93448483
+2.95693322
+2.56466904
+2.2540933
+1.46603578
+0.747150475
+9.9317792
+11.4775606
+12.3667574
+13.1157041
+12.4819296
+11.3317579
+9.98370531
+8.08352365
+6.43396168
+4.5939276
+3.88763835
+3.33198655
+2.87323461
+2.40289958
+2.19213245
+1.66803584
+1.13362436
+0.700055754
+10.0251671
+11.5903216
+12.6122326
+13.169601
+12.5896786
+11.4905255
+9.8520347
+7.98538511
+6.40890168
+4.92528703
+3.76175302
+3.48484002
+2.79523715
+2.33881758
+1.98487909
+1.51156228
+0.972417321
+0.595444753
+10.2267981
+11.154811
+12.4762893
+12.9809368
+12.6228473
+11.3508733
+9.7914253
+8.06703417
+5.9679495
+4.55157083
+4.0369691
+3.277311
+2.77511934
+2.35641149
+1.72602379
+1.51235185
+0.942305046
+0.672964999
+10.1213867
+11.4989636
+12.3327939
+12.7204095
+12.3650336
+10.884709
+9.45613503
+7.65805855
+6.14573588
+4.7306836
+3.69304029
+3.1309069
+2.79196861
+2.29539397
+1.99970924
+1.3729019
+0.853582622
+0.707831335
+9.54199059
+11.313831
+11.9338226
+12.3393256
+12.0305452
+10.9412139
+9.43711091
+7.65761284
+5.93351169
+4.54209099
+3.61616695
+3.15821693
+2.74026983
+2.48590188
+1.95855535
+1.52855099
+0.848859528
+0.682617395
+9.59594477
+10.8227589
+11.5691978
+12.3249949
+11.8275467
+10.4971292
+8.86715701
+7.3875448
+5.80977794
+4.40384213
+3.84960085
+3.07307737
+3.17992605
+2.64685152
+2.16304674
+1.66893102
+0.868219094
+0.672876036
+9.00753239
+10.0623006
+10.8664474
+11.7131102
+11.2845126
+10.0157213
+8.81563186
+7.19404043
+5.53628563
+4.29731207
+3.52571288
+3.02408686
+2.9223361
+2.59152262
+2.14967186
+1.71792923
+0.863416882
+0.609781937
+8.49767774
+9.68120784
+10.4220727
+10.9005218
+10.3959924
+9.63502047
+8.00472069
+6.86188624
+5.24994649
+3.93409601
+3.57438298
+3.15070788
+3.04757703
+2.62704159
+2.34185342
+1.90699977
+0.805115329
+0.605979261
+7.65418678
+8.88533267
+9.77670792
+10.0904573
+9.79982756
+8.7911733
+7.57284918
+6.04567309
+4.88043142
+3.6191294
+3.06994129
+2.90489792
+2.62212983
+2.51955925
+2.28205668
+1.5495203
+0.755724933
+0.519384431
+6.95090652
+8.261924
+8.84983518
+9.20398489
+8.78323107
+7.92412057
+6.53048027
+5.47494412
+4.26784867
+3.16227486
+3.0044613
+2.60108659
+2.65431403
+2.53710125
+1.96612705
+1.72031548
+0.679681974
+0.469118725
+6.32851278
+7.13519955
+7.46608463
+8.04500285
+7.59901182
+6.94892678
+5.74680753
+4.71132475
+3.6411643
+2.86836939
+2.56360041
+2.29869294
+2.20828541
+2.1195927
+2.06835395
+1.66994237
+0.666378157
+0.467135942
+5.39380521
+6.12333582
+6.49208298
+6.84576192
+6.55833088
+6.05305147
+4.85714352
+3.93874106
+2.99079286
+2.41256737
+2.21238093
+1.97711407
+1.84973588
+1.96901074
+1.82058215
+1.44119541
+0.672598944
+0.409928616
+4.59195323
+5.19632167
+5.55056804
+5.6696997
+5.42246848
+4.82543546
+4.03893631
+3.12775113
+2.35531601
+1.94038327
+1.66889666
+1.67638781
+1.6213709
+1.64399614
+1.50549257
+1.13108972
+0.464153265
+0.398562832
+3.72051679
+4.28501656
+4.70529961
+4.64883227
+4.65681209
+4.10663411
+3.39384358
+2.67862939
+2.28704899
+1.77370653
+1.64584611
+1.6097905
+1.54291144
+1.4184105
+1.33091763
+0.954302521
+0.41834627
+0.247475734
+3.08323383
+3.58581392
+3.89220822
+4.03186939
+3.7999731
+3.43762877
+2.95280727
+2.3895605
+2.08798667
+1.6115268
+1.53319479
+1.6235402
+1.24941481
+1.17311552
+0.98028276
+0.829163979
+0.379304222
+0.27774714
diff --git a/tests/assets/dummy_results/more_grids/grids_info.json b/tests/assets/dummy_results/more_grids/grids_info.json
new file mode 100644
index 00000000..8b34cc86
--- /dev/null
+++ b/tests/assets/dummy_results/more_grids/grids_info.json
@@ -0,0 +1,23 @@
+[
+  {
+    "name": "TestRoom_1",
+    "identifier": "TestRoom_1",
+    "count": 416,
+    "group": "",
+    "full_id": "TestRoom_1"
+  },
+  {
+    "name": "TestRoom_2",
+    "identifier": "TestRoom_2",
+    "count": 468,
+    "group": "",
+    "full_id": "TestRoom_2"
+  },
+  {
+    "name": "TestRoom_3",
+    "identifier": "TestRoom_3",
+    "count": 468,
+    "group": "",
+    "full_id": "TestRoom_3"
+  }
+]
\ No newline at end of file
diff --git a/tests/assets/dummy_results/short_length/TestRoom_1.res b/tests/assets/dummy_results/short_length/TestRoom_1.res
new file mode 100644
index 00000000..5eda6eec
--- /dev/null
+++ b/tests/assets/dummy_results/short_length/TestRoom_1.res
@@ -0,0 +1,415 @@
+2.3434143
+3.9235189
+5.37017542
+6.75922079
+7.6049761
+8.11785048
+8.35334825
+8.06134913
+7.31663037
+6.15064406
+4.67770139
+3.59421439
+2.81563062
+2.42440106
+2.23723508
+2.33144636
+2.48622766
+2.87238257
+3.33180039
+3.56365014
+3.61616337
+3.3848184
+2.99580665
+2.64278643
+2.32142236
+1.41376062
+4.06352554
+5.93812631
+7.25779486
+9.1876583
+10.5025332
+11.5971827
+12.1581651
+12.0059005
+10.7532997
+9.08142538
+6.86865781
+4.99050747
+3.85603411
+3.06216374
+2.77370703
+2.96286349
+3.36727282
+4.03769405
+4.67652178
+5.17594073
+5.43262136
+5.3470522
+4.61567252
+4.40872704
+4.33867002
+3.40631272
+9.01176216
+9.04441534
+9.67050722
+11.7539723
+14.0303064
+15.5747059
+16.226597
+16.2273614
+14.5784617
+12.4695929
+9.25024386
+6.47434766
+4.9543262
+3.80969817
+3.4606786
+3.85599473
+4.56566529
+5.74908441
+6.93595286
+7.93403001
+8.42310455
+8.12956603
+7.55385907
+6.96504752
+7.40695377
+9.30436093
+11.0716261
+10.9546013
+11.5566929
+14.0556904
+16.8592045
+19.0561789
+20.1422256
+19.6188117
+18.0824905
+15.1227291
+11.1420179
+7.88053049
+5.87841012
+4.8449751
+4.4151782
+4.88044574
+6.08764322
+8.11719713
+10.3006427
+11.7662177
+12.6290425
+12.3270963
+11.4456771
+10.6188134
+10.7532818
+12.8091201
+12.0730291
+12.3833095
+12.9974352
+16.0836082
+19.3145117
+21.6669834
+22.9060035
+22.4971317
+20.7365951
+17.1681209
+12.8703273
+9.08905973
+6.52223553
+5.18755604
+4.93105083
+5.75061665
+7.64907633
+10.3756222
+13.3671508
+15.6267286
+16.9104361
+16.7835842
+15.379723
+14.0315809
+13.6287879
+14.4717043
+12.3873531
+13.1016258
+14.1625874
+17.2353766
+20.6562062
+23.3271189
+24.7314813
+24.3819659
+22.2524029
+18.6060118
+14.2505749
+9.98291413
+7.21834326
+5.80584889
+5.56329852
+6.77866735
+9.08969518
+12.5407579
+16.0829298
+19.1595514
+20.5768734
+20.2860521
+19.0512564
+17.0148719
+15.8528056
+16.1915291
+12.6282567
+13.381222
+14.6707827
+18.2356966
+21.7620503
+24.5496352
+25.8594498
+25.5822683
+23.2774822
+19.7079179
+14.6036703
+10.2461086
+7.52167129
+6.2405307
+6.03511746
+7.34155612
+10.1237621
+14.0163283
+18.2800528
+21.4124633
+23.2619987
+22.9028352
+21.2643766
+18.9639402
+17.3703122
+16.955639
+12.7513049
+13.8004865
+14.8040357
+18.3534607
+22.2090491
+24.9903332
+26.6646634
+25.9397671
+23.5612688
+19.787734
+14.9586684
+10.8855073
+7.90444668
+6.57431379
+6.25440857
+7.66900619
+10.5093317
+14.7038225
+19.165888
+22.6899147
+24.620018
+24.2693749
+22.5019826
+20.1949769
+18.1397705
+17.7102725
+12.8853812
+13.8132134
+14.8779663
+18.5377233
+22.0736714
+24.9224027
+26.455663
+25.9133109
+23.9372046
+20.2588262
+15.3126212
+10.8855324
+8.04234291
+6.69744968
+6.44242301
+7.78724822
+10.6051253
+14.7310968
+19.3403056
+22.4679189
+24.5216396
+24.4251586
+22.5020721
+20.5497907
+18.1864358
+18.0101745
+12.7266977
+13.4668985
+14.5460842
+18.2871054
+21.9087945
+24.6740939
+26.2471817
+25.9971008
+23.4056462
+19.8042557
+15.0670547
+10.702879
+7.98582903
+6.37892097
+6.31510389
+7.41050692
+10.1421686
+14.3280461
+18.1634522
+21.5213311
+23.260334
+23.3683247
+21.6648891
+19.5845511
+17.7805175
+17.8827963
+12.3374085
+13.1872737
+14.0525346
+17.5452721
+21.1734446
+23.987432
+25.2950091
+25.0866889
+23.1821289
+19.4763098
+14.8049235
+10.5256171
+7.72488462
+6.16044073
+6.01453783
+7.01128501
+9.36829973
+12.6605196
+16.3528565
+19.1021461
+20.6787602
+20.7041603
+19.7343025
+17.7044622
+16.812353
+17.0651118
+11.8511873
+12.5449232
+13.4214254
+16.5315826
+20.1264557
+22.7778037
+24.2660992
+23.9204144
+22.1224489
+18.8414505
+14.2935975
+10.3335733
+7.35737435
+5.83699847
+5.36205956
+6.15177355
+8.08231182
+10.5621313
+13.802622
+15.9903117
+17.1748442
+17.1048802
+16.11566
+14.725503
+14.2290752
+15.5462091
+11.7056638
+11.371512
+11.9030865
+14.5047495
+17.7957486
+20.4414599
+22.1579446
+21.8391098
+20.2630864
+17.2068279
+13.2865829
+9.47230052
+6.7403703
+5.11422869
+4.4762351
+5.06088848
+6.37115774
+8.20909573
+10.3207516
+11.9435119
+12.877575
+13.0302424
+12.1537241
+11.6420347
+11.6636042
+13.3096739
+9.42754694
+9.27958554
+10.0096227
+11.9892285
+14.9381837
+17.1890406
+18.040873
+18.00561
+16.7329809
+14.1944064
+11.0464892
+8.03786791
+5.6386969
+4.38176785
+3.80227504
+3.98328521
+4.86276054
+6.00782175
+7.30971739
+8.17146814
+8.70829272
+8.85368189
+8.47210222
+8.13727914
+8.3400933
+9.97497548
+4.09446211
+6.28835234
+7.54972059
+9.62200001
+11.4067303
+13.1610681
+14.0497064
+14.0213815
+12.8965705
+11.1464822
+8.70665308
+6.54445301
+4.7261549
+3.72155141
+3.13193973
+3.20389236
+3.56469371
+4.25247794
+4.91357506
+5.51644527
+5.83077643
+5.81465032
+5.56725084
+5.53243355
+5.43483559
+4.34483657
+2.49773557
+4.07441769
+5.52394358
+7.16760213
+8.41606985
+9.66516407
+10.0918249
+10.1992034
+9.47295208
+8.18140622
+6.64860416
+5.08543833
+3.92603743
+3.05397807
+2.62511734
+2.6598326
+2.7039561
+3.13276671
+3.47098363
+3.80490813
+3.91565006
+4.03362538
+3.85442132
+3.84433288
+3.49582883
diff --git a/tests/assets/dummy_results/short_length/TestRoom_2.res b/tests/assets/dummy_results/short_length/TestRoom_2.res
new file mode 100644
index 00000000..68c73636
--- /dev/null
+++ b/tests/assets/dummy_results/short_length/TestRoom_2.res
@@ -0,0 +1,468 @@
+4.83899471
+5.39940791
+5.90597254
+6.04049283
+5.81181675
+5.28824175
+4.43110383
+3.50973892
+2.58991341
+2.17450632
+1.84249533
+2.0648545
+2.29757956
+2.5445745
+2.91056685
+3.0533999
+2.51812725
+0.851485279
+5.47390413
+6.3220115
+6.98653289
+7.25014082
+6.72740533
+6.05914642
+5.15713499
+4.2090955
+3.26633472
+2.61387972
+2.40771826
+2.62013756
+2.7949239
+3.26506203
+3.86298647
+4.25650723
+4.6493997
+2.81150467
+6.46131467
+7.41261912
+7.92032577
+8.18585079
+7.75687729
+6.93831208
+6.23444828
+5.06380081
+3.84761753
+3.0083635
+2.90371294
+2.8817389
+3.33466081
+3.84649878
+4.67011895
+5.95330551
+7.63402064
+8.64971318
+7.24236506
+8.14074995
+8.95510508
+9.26998219
+8.95741955
+8.00813243
+6.65791395
+5.6823371
+4.51984129
+3.55757667
+3.45888144
+3.2588561
+3.64952181
+4.30328888
+5.34228722
+7.0416631
+9.19861131
+10.9144301
+7.82830366
+8.90685563
+9.71961766
+10.0488506
+9.82618531
+8.91086523
+7.49781238
+6.167982
+4.83308055
+4.07923816
+3.72131334
+3.70703272
+3.85472383
+4.5477456
+5.77699946
+7.49842993
+9.99434507
+11.6662767
+8.49778156
+9.61729231
+10.6720605
+11.0108628
+10.6042643
+9.63152997
+8.1944052
+6.79675351
+5.36736691
+4.35155444
+3.98468857
+3.95940124
+4.00021503
+4.69096887
+5.94186204
+7.55278507
+9.93506385
+11.7542892
+8.96370603
+10.4132212
+11.2482616
+11.6483552
+11.3526955
+10.0754768
+8.69727527
+7.26746444
+5.47483672
+4.59478143
+4.03998525
+3.84128451
+4.04906413
+4.57816307
+5.4594284
+7.17852113
+9.1644957
+10.9199344
+9.45506461
+10.6747098
+11.8252108
+12.0268435
+11.7192464
+10.5641916
+8.82627878
+7.58409575
+5.83606946
+4.6249662
+4.28677076
+3.9560074
+3.92430113
+4.30668451
+5.01965046
+6.01615778
+7.51822196
+8.77988556
+9.73151758
+11.3487504
+12.1179671
+12.7358607
+12.1361248
+11.0362969
+9.36430445
+7.63358567
+6.15480223
+4.72544427
+4.24905546
+3.7722639
+3.73526997
+3.85886231
+4.05044422
+4.55892952
+4.68877612
+3.03960616
+10.0871172
+11.530464
+12.2241176
+12.8173344
+12.1994944
+11.3295526
+9.91065541
+7.9177607
+6.1016804
+4.83209963
+4.02501369
+3.84312821
+3.24903616
+3.30886333
+3.2652285
+3.00850849
+2.59573807
+0.933500215
+9.96938352
+11.6409231
+12.5322518
+13.2010567
+12.5637218
+11.4209697
+9.79579648
+7.73503392
+5.98678209
+4.72162262
+4.01811861
+3.46120844
+2.93448483
+2.95693322
+2.56466904
+2.2540933
+1.46603578
+0.747150475
+9.9317792
+11.4775606
+12.3667574
+13.1157041
+12.4819296
+11.3317579
+9.98370531
+8.08352365
+6.43396168
+4.5939276
+3.88763835
+3.33198655
+2.87323461
+2.40289958
+2.19213245
+1.66803584
+1.13362436
+0.700055754
+10.0251671
+11.5903216
+12.6122326
+13.169601
+12.5896786
+11.4905255
+9.8520347
+7.98538511
+6.40890168
+4.92528703
+3.76175302
+3.48484002
+2.79523715
+2.33881758
+1.98487909
+1.51156228
+0.972417321
+0.595444753
+10.2267981
+11.154811
+12.4762893
+12.9809368
+12.6228473
+11.3508733
+9.7914253
+8.06703417
+5.9679495
+4.55157083
+4.0369691
+3.277311
+2.77511934
+2.35641149
+1.72602379
+1.51235185
+0.942305046
+0.672964999
+10.1213867
+11.4989636
+12.3327939
+12.7204095
+12.3650336
+10.884709
+9.45613503
+7.65805855
+6.14573588
+4.7306836
+3.69304029
+3.1309069
+2.79196861
+2.29539397
+1.99970924
+1.3729019
+0.853582622
+0.707831335
+9.54199059
+11.313831
+11.9338226
+12.3393256
+12.0305452
+10.9412139
+9.43711091
+7.65761284
+5.93351169
+4.54209099
+3.61616695
+3.15821693
+2.74026983
+2.48590188
+1.95855535
+1.52855099
+0.848859528
+0.682617395
+9.59594477
+10.8227589
+11.5691978
+12.3249949
+11.8275467
+10.4971292
+8.86715701
+7.3875448
+5.80977794
+4.40384213
+3.84960085
+3.07307737
+3.17992605
+2.64685152
+2.16304674
+1.66893102
+0.868219094
+0.672876036
+9.00753239
+10.0623006
+10.8664474
+11.7131102
+11.2845126
+10.0157213
+8.81563186
+7.19404043
+5.53628563
+4.29731207
+3.52571288
+3.02408686
+2.9223361
+2.59152262
+2.14967186
+1.71792923
+0.863416882
+0.609781937
+8.49767774
+9.68120784
+10.4220727
+10.9005218
+10.3959924
+9.63502047
+8.00472069
+6.86188624
+5.24994649
+3.93409601
+3.57438298
+3.15070788
+3.04757703
+2.62704159
+2.34185342
+1.90699977
+0.805115329
+0.605979261
+7.65418678
+8.88533267
+9.77670792
+10.0904573
+9.79982756
+8.7911733
+7.57284918
+6.04567309
+4.88043142
+3.6191294
+3.06994129
+2.90489792
+2.62212983
+2.51955925
+2.28205668
+1.5495203
+0.755724933
+0.519384431
+6.95090652
+8.261924
+8.84983518
+9.20398489
+8.78323107
+7.92412057
+6.53048027
+5.47494412
+4.26784867
+3.16227486
+3.0044613
+2.60108659
+2.65431403
+2.53710125
+1.96612705
+1.72031548
+0.679681974
+0.469118725
+6.32851278
+7.13519955
+7.46608463
+8.04500285
+7.59901182
+6.94892678
+5.74680753
+4.71132475
+3.6411643
+2.86836939
+2.56360041
+2.29869294
+2.20828541
+2.1195927
+2.06835395
+1.66994237
+0.666378157
+0.467135942
+5.39380521
+6.12333582
+6.49208298
+6.84576192
+6.55833088
+6.05305147
+4.85714352
+3.93874106
+2.99079286
+2.41256737
+2.21238093
+1.97711407
+1.84973588
+1.96901074
+1.82058215
+1.44119541
+0.672598944
+0.409928616
+4.59195323
+5.19632167
+5.55056804
+5.6696997
+5.42246848
+4.82543546
+4.03893631
+3.12775113
+2.35531601
+1.94038327
+1.66889666
+1.67638781
+1.6213709
+1.64399614
+1.50549257
+1.13108972
+0.464153265
+0.398562832
+3.72051679
+4.28501656
+4.70529961
+4.64883227
+4.65681209
+4.10663411
+3.39384358
+2.67862939
+2.28704899
+1.77370653
+1.64584611
+1.6097905
+1.54291144
+1.4184105
+1.33091763
+0.954302521
+0.41834627
+0.247475734
+3.08323383
+3.58581392
+3.89220822
+4.03186939
+3.7999731
+3.43762877
+2.95280727
+2.3895605
+2.08798667
+1.6115268
+1.53319479
+1.6235402
+1.24941481
+1.17311552
+0.98028276
+0.829163979
+0.379304222
+0.27774714
diff --git a/tests/assets/dummy_results/short_length/grids_info.json b/tests/assets/dummy_results/short_length/grids_info.json
new file mode 100644
index 00000000..8b34cc86
--- /dev/null
+++ b/tests/assets/dummy_results/short_length/grids_info.json
@@ -0,0 +1,23 @@
+[
+  {
+    "name": "TestRoom_1",
+    "identifier": "TestRoom_1",
+    "count": 416,
+    "group": "",
+    "full_id": "TestRoom_1"
+  },
+  {
+    "name": "TestRoom_2",
+    "identifier": "TestRoom_2",
+    "count": 468,
+    "group": "",
+    "full_id": "TestRoom_2"
+  },
+  {
+    "name": "TestRoom_3",
+    "identifier": "TestRoom_3",
+    "count": 468,
+    "group": "",
+    "full_id": "TestRoom_3"
+  }
+]
\ No newline at end of file
diff --git a/tests/assets/udi_results/TestRoom_1.res b/tests/assets/udi_results/TestRoom_1.res
deleted file mode 100644
index 5c0ddd4b..00000000
--- a/tests/assets/udi_results/TestRoom_1.res
+++ /dev/null
@@ -1,104 +0,0 @@
-86.71
-84.66
-77.22
-70.6
-69.15
-73.85
-77.09
-81.75
-85.64
-82.86
-79.66
-78.46
-77.18
-48.16
-66.32
-57.31
-49.1
-52.78
-62.14
-72.95
-81.54
-86.92
-77.39
-70.3
-66.67
-65.68
-35.6
-51.03
-41.37
-36.71
-40.0
-53.16
-65.81
-79.15
-82.01
-61.54
-49.15
-48.5
-48.85
-33.93
-44.4
-35.98
-32.39
-36.03
-46.41
-61.07
-76.71
-75.47
-48.55
-38.33
-37.74
-39.57
-34.79
-44.19
-35.26
-30.9
-35.64
-45.26
-60.47
-75.85
-75.21
-48.72
-37.99
-36.67
-38.21
-36.2
-50.77
-40.13
-34.79
-37.01
-47.61
-61.97
-75.77
-80.43
-61.5
-49.32
-46.62
-45.0
-47.69
-64.44
-54.96
-45.3
-47.18
-53.97
-65.94
-78.8
-85.64
-76.2
-69.15
-64.66
-63.16
-84.79
-82.31
-71.84
-65.3
-65.51
-65.9
-73.29
-79.79
-85.26
-84.06
-79.06
-75.51
-74.62
diff --git a/tests/assets/udi_results/TestRoom_1.udi b/tests/assets/udi_results/TestRoom_1.udi
new file mode 100644
index 00000000..59e11a3a
--- /dev/null
+++ b/tests/assets/udi_results/TestRoom_1.udi
@@ -0,0 +1,416 @@
+93.44
+89.85
+88.17
+86.6
+83.6
+80.18
+78.21
+77.76
+75.93
+78.47
+78.5
+80.61
+80.87
+83.69
+85.06
+86.94
+87.25
+87.23
+87.31
+86.6
+84.97
+84.66
+85.06
+85.26
+85.12
+82.52
+85.86
+81.86
+82.98
+79.64
+75.08
+69.58
+68.26
+67.29
+68.95
+72.4
+75.28
+78.9
+79.27
+81.89
+84.12
+86.46
+87.71
+88.08
+86.74
+84.66
+84.26
+82.26
+82.21
+81.58
+81.47
+80.84
+65.5
+65.44
+71.57
+68.58
+63.13
+56.52
+54.23
+53.58
+56.6
+61.73
+67.86
+72.71
+76.93
+80.87
+83.21
+86.48
+88.31
+87.8
+85.63
+81.49
+78.3
+77.13
+76.3
+75.65
+75.11
+72.54
+53.72
+52.07
+59.02
+57.71
+51.75
+46.31
+45.02
+45.51
+47.85
+53.44
+61.05
+67.47
+73.74
+78.04
+82.69
+85.83
+88.71
+86.0
+79.27
+71.91
+67.81
+66.47
+66.07
+66.67
+64.84
+61.28
+50.33
+45.22
+50.64
+49.19
+44.31
+40.46
+38.87
+39.32
+42.2
+47.93
+55.23
+62.65
+68.29
+76.53
+81.98
+85.71
+86.94
+81.64
+69.83
+61.59
+56.23
+54.23
+54.52
+55.37
+55.29
+54.32
+48.33
+41.29
+45.51
+43.17
+39.55
+36.73
+34.53
+35.22
+38.41
+44.51
+51.87
+57.97
+66.21
+75.85
+80.75
+84.69
+85.14
+73.42
+60.99
+52.64
+48.36
+46.05
+46.68
+48.3
+49.16
+46.45
+47.88
+39.83
+42.74
+40.23
+37.41
+34.07
+34.27
+34.87
+37.04
+42.12
+48.36
+55.52
+62.73
+72.65
+79.3
+82.78
+81.89
+68.66
+55.29
+48.05
+43.31
+42.4
+42.34
+43.43
+43.77
+42.83
+47.62
+38.64
+41.69
+39.26
+36.16
+33.33
+32.56
+33.19
+35.19
+40.75
+46.45
+52.92
+61.56
+71.77
+78.81
+81.69
+80.55
+66.58
+53.01
+45.28
+40.29
+39.35
+39.83
+41.57
+41.86
+40.06
+47.33
+38.58
+41.12
+38.61
+36.18
+34.05
+32.65
+32.36
+35.87
+41.49
+45.88
+52.3
+61.19
+71.46
+78.36
+82.29
+81.32
+65.33
+52.61
+45.54
+41.15
+39.38
+39.58
+41.4
+41.4
+40.06
+47.9
+38.95
+40.89
+38.75
+37.24
+34.73
+32.96
+33.28
+35.64
+40.95
+46.16
+52.41
+60.94
+71.97
+79.07
+82.38
+81.24
+68.41
+55.06
+47.31
+43.11
+41.83
+40.72
+41.89
+42.14
+40.21
+48.39
+39.04
+43.17
+40.66
+38.27
+36.38
+35.04
+34.79
+37.07
+41.86
+46.08
+53.41
+62.45
+72.48
+80.21
+83.46
+83.95
+72.2
+58.74
+51.07
+47.31
+44.97
+44.77
+45.51
+45.14
+42.97
+48.85
+41.8
+47.9
+45.31
+41.8
+39.61
+36.81
+37.33
+39.24
+42.2
+48.7
+55.52
+64.56
+73.6
+80.41
+84.0
+85.94
+77.93
+67.35
+60.08
+54.78
+52.15
+50.98
+51.55
+51.7
+49.42
+50.98
+50.96
+55.75
+53.32
+46.96
+42.97
+41.4
+41.49
+43.83
+47.31
+52.52
+59.34
+66.7
+75.68
+81.12
+85.14
+87.74
+83.89
+76.65
+69.8
+65.73
+61.88
+61.39
+60.85
+58.91
+55.32
+64.67
+62.65
+68.52
+64.33
+57.11
+51.33
+48.62
+48.19
+50.44
+55.35
+60.02
+66.18
+72.0
+78.1
+82.49
+85.46
+87.28
+86.94
+83.43
+79.78
+76.87
+75.39
+72.46
+71.69
+70.32
+68.15
+86.51
+81.44
+81.07
+76.3
+68.78
+63.16
+59.22
+57.94
+60.85
+63.7
+67.15
+70.15
+75.42
+80.1
+83.23
+85.86
+87.48
+86.91
+85.8
+83.55
+82.32
+81.55
+79.87
+78.33
+77.96
+78.79
+94.1
+90.42
+87.77
+83.23
+78.98
+73.2
+70.6
+69.86
+71.86
+72.57
+73.71
+74.62
+78.44
+82.92
+84.57
+87.0
+87.4
+86.6
+85.66
+84.8
+84.66
+83.92
+82.44
+81.18
+81.18
+81.35
diff --git a/tests/assets/udi_results/TestRoom_2.res b/tests/assets/udi_results/TestRoom_2.res
deleted file mode 100644
index 6a092e4c..00000000
--- a/tests/assets/udi_results/TestRoom_2.res
+++ /dev/null
@@ -1,117 +0,0 @@
-90.98
-84.83
-79.57
-76.03
-73.25
-82.86
-87.22
-89.83
-88.89
-91.15
-83.85
-77.14
-72.86
-70.47
-81.84
-86.2
-89.1
-88.97
-90.3
-80.68
-72.14
-68.85
-67.69
-79.19
-83.72
-87.91
-84.4
-89.57
-77.91
-68.59
-64.44
-65.81
-75.9
-81.54
-86.92
-87.61
-88.72
-75.26
-66.88
-63.42
-63.25
-73.8
-80.43
-83.5
-85.38
-90.0
-73.03
-63.93
-61.5
-62.99
-71.5
-79.06
-79.74
-74.7
-90.17
-72.09
-63.38
-61.24
-63.21
-70.85
-77.99
-78.12
-71.32
-90.56
-74.36
-67.31
-64.15
-63.97
-73.29
-77.99
-78.5
-70.47
-91.71
-80.68
-69.74
-66.24
-64.36
-74.36
-79.79
-79.91
-68.89
-92.18
-82.44
-72.31
-69.79
-67.52
-75.85
-80.81
-81.62
-68.5
-92.61
-86.15
-78.76
-75.0
-71.2
-79.4
-82.86
-81.88
-67.31
-92.39
-87.44
-82.01
-77.56
-73.97
-81.5
-83.97
-81.45
-61.28
-90.85
-87.99
-82.52
-78.42
-76.67
-80.68
-81.24
-77.74
-38.21
diff --git a/tests/assets/udi_results/TestRoom_2.udi b/tests/assets/udi_results/TestRoom_2.udi
new file mode 100644
index 00000000..bfeb76f2
--- /dev/null
+++ b/tests/assets/udi_results/TestRoom_2.udi
@@ -0,0 +1,468 @@
+93.76
+92.36
+90.59
+87.45
+86.74
+85.8
+84.6
+82.78
+81.35
+86.0
+87.74
+89.96
+91.53
+91.7
+92.81
+93.24
+91.96
+79.01
+94.9
+92.76
+89.68
+86.91
+84.52
+82.98
+82.58
+81.41
+80.07
+81.24
+85.74
+88.45
+90.13
+91.79
+92.81
+93.7
+94.87
+90.36
+95.27
+92.61
+88.88
+84.92
+83.12
+81.15
+80.84
+79.98
+78.44
+80.98
+84.17
+86.77
+88.28
+90.93
+92.3
+93.36
+93.24
+92.24
+94.75
+91.73
+88.2
+83.35
+82.06
+79.27
+79.07
+78.27
+78.21
+81.18
+83.12
+86.11
+87.71
+90.36
+91.9
+92.64
+90.96
+87.43
+95.24
+91.7
+86.68
+82.12
+79.41
+77.87
+78.02
+77.07
+76.87
+79.01
+82.15
+85.4
+86.43
+89.65
+91.22
+91.47
+88.08
+85.17
+94.95
+90.5
+85.17
+79.1
+77.59
+77.1
+76.7
+75.59
+75.82
+76.5
+80.7
+84.69
+85.91
+89.16
+90.82
+90.76
+86.88
+82.49
+94.41
+89.62
+83.21
+77.59
+75.62
+75.36
+74.96
+75.25
+75.19
+75.53
+78.47
+83.12
+85.54
+88.82
+90.93
+90.25
+88.85
+84.72
+94.38
+88.34
+81.81
+74.96
+72.8
+73.22
+72.54
+73.22
+73.82
+75.56
+78.04
+83.09
+85.63
+88.0
+90.08
+91.16
+92.04
+89.93
+94.67
+88.2
+80.13
+74.68
+71.74
+72.4
+72.83
+73.48
+73.31
+75.22
+79.44
+82.78
+84.86
+87.2
+88.94
+89.96
+91.05
+88.88
+94.44
+87.62
+79.38
+74.65
+71.74
+72.65
+72.74
+73.34
+73.28
+75.88
+78.59
+82.09
+84.57
+85.8
+87.74
+88.54
+87.97
+79.7
+94.13
+86.14
+77.5
+72.0
+69.77
+70.06
+70.57
+72.08
+73.51
+75.65
+77.5
+81.72
+83.6
+85.4
+86.17
+86.97
+84.69
+75.93
+94.01
+86.31
+76.93
+72.03
+68.29
+69.0
+69.58
+71.43
+73.0
+74.76
+77.36
+82.18
+84.49
+84.8
+84.83
+84.72
+80.33
+74.74
+93.81
+85.91
+76.79
+71.4
+68.35
+68.55
+70.0
+71.97
+72.6
+73.88
+75.91
+80.3
+84.55
+84.17
+85.06
+83.03
+79.5
+72.17
+94.98
+86.83
+77.47
+72.74
+69.66
+69.72
+70.83
+71.46
+71.97
+75.16
+76.62
+80.81
+83.97
+84.29
+84.89
+82.55
+77.99
+72.54
+94.92
+87.57
+78.61
+73.82
+71.66
+71.54
+72.08
+72.28
+73.71
+75.56
+77.82
+81.15
+83.97
+84.55
+84.2
+82.63
+77.19
+72.51
+94.55
+87.54
+79.38
+74.25
+71.46
+71.54
+72.34
+73.77
+73.51
+75.56
+77.82
+82.12
+84.46
+85.74
+84.69
+82.69
+77.33
+71.14
+94.7
+88.31
+81.04
+75.05
+73.0
+72.43
+72.88
+74.37
+74.31
+75.73
+78.02
+82.98
+84.49
+86.06
+85.71
+83.66
+76.05
+70.37
+94.95
+89.54
+83.43
+77.3
+75.62
+74.96
+74.65
+74.88
+73.88
+75.59
+78.7
+83.29
+84.8
+86.71
+86.2
+82.66
+75.56
+71.37
+95.72
+90.62
+85.17
+79.27
+77.25
+76.28
+76.36
+76.59
+76.25
+76.48
+80.75
+82.61
+85.06
+86.63
+86.4
+83.8
+76.25
+70.2
+96.24
+91.39
+86.71
+82.06
+79.98
+77.96
+77.82
+77.62
+76.73
+76.42
+81.21
+83.15
+85.91
+87.43
+86.91
+85.09
+76.13
+66.95
+96.24
+92.7
+88.48
+83.8
+82.41
+78.96
+78.39
+78.5
+77.19
+78.47
+83.43
+84.97
+86.83
+87.82
+87.23
+84.26
+75.36
+65.36
+96.32
+93.27
+89.79
+85.34
+83.63
+81.15
+80.72
+81.12
+79.61
+80.27
+84.23
+85.91
+87.57
+88.14
+87.62
+84.86
+73.45
+67.15
+95.84
+93.33
+90.31
+87.37
+84.52
+82.26
+81.09
+80.87
+79.07
+80.72
+84.8
+87.0
+88.0
+88.0
+87.54
+85.46
+72.17
+56.89
+95.27
+93.1
+90.82
+87.71
+86.4
+84.55
+82.86
+82.69
+82.06
+85.91
+86.97
+88.17
+88.88
+88.37
+86.8
+83.52
+67.92
+53.84
+94.41
+92.59
+90.48
+87.74
+86.23
+85.2
+83.55
+83.46
+83.43
+85.66
+87.8
+87.85
+88.34
+87.68
+85.46
+80.95
+62.73
+39.55
+93.41
+91.87
+90.13
+88.79
+86.74
+85.17
+83.89
+83.86
+83.29
+85.71
+86.88
+86.71
+87.11
+85.49
+82.52
+75.08
+45.71
+38.1
diff --git a/tests/assets/udi_results/grids_info.json b/tests/assets/udi_results/grids_info.json
new file mode 100644
index 00000000..6c90d3d7
--- /dev/null
+++ b/tests/assets/udi_results/grids_info.json
@@ -0,0 +1,1 @@
+[{"name": "TestRoom_1", "identifier": "TestRoom_1", "count": 416, "group": "", "full_id": "TestRoom_1"}, {"name": "TestRoom_2", "identifier": "TestRoom_2", "count": 468, "group": "", "full_id": "TestRoom_2"}]
\ No newline at end of file
diff --git a/tests/github/_helper_test.py b/tests/github/_helper_test.py
index e5a94fdd..fe34e2e2 100644
--- a/tests/github/_helper_test.py
+++ b/tests/github/_helper_test.py
@@ -7,17 +7,28 @@
 def test_check_tuple():
     """Test all the functionalities of this method."""
     val = (1, 2, 3)
-    assert _validate_input(val, int, max_val=4)
+    assert _validate_input(val, [int], max_val=4)
 
     val = (0.1, 0.2, 0.3)
-    assert _validate_input(val, float, 1)
-    assert _validate_input(val, float)
+    assert _validate_input(val, [float], 1)
+    assert _validate_input(val, [float])
 
     val = (1, 2, 3)
-    assert not _validate_input(val, float)
+    assert not _validate_input(val, [float])
 
     val = (1.2, 3.4, 5.4)
-    assert not _validate_input(val, float, 1.0)
+    assert not _validate_input(val, [float], 1.0)
+
+    val = (1.2, 3.4, 5.4)
+    with pytest.raises(AssertionError):
+        _validate_input(val, [float], 1.0, 2)
+
+    val = (1, 3, 5)
+    with pytest.raises(AssertionError):
+        _validate_input(val, [float], num_val=2)
+
+    val = (1.5, 3, 5)
+    assert _validate_input(val, val_type=[int, float])
 
 
 def test_get_min_max():
diff --git a/tests/github/camera_test.py b/tests/github/camera_test.py
index 9c70ddb7..14c709f2 100644
--- a/tests/github/camera_test.py
+++ b/tests/github/camera_test.py
@@ -39,3 +39,40 @@ def test_from_view_file():
     vf = r'tests/assets/view.vf'
     camera = Camera.from_view_file(vf)
     assert isinstance(camera, Camera)
+
+
+def test_aerial_cameras():
+    """Test creation of default aerial cameras."""
+    file_path = r'tests/assets/revit_model/model.hbjson'
+    model = Model.from_hbjson(file_path)
+    actors = Actor.from_model(model)
+    bounds = Actor.get_bounds(actors)
+    centroid = Actor.get_centroid(actors)
+    cameras = Camera.aerial_cameras(bounds, centroid)
+
+    assert len(cameras) == 4
+
+    def rounded(tup):
+        return list(map(lambda x: round(x, 4), tup))
+
+    cam_01, cam_02, cam_03, cam_04 = cameras
+    assert rounded((cam_01.position)) == rounded(
+        (124.35035099551129, 87.54659771487164, 56.45049285888672))
+    assert rounded((cam_01.direction)) == rounded((-108.78812527224468, -
+                                                   108.78812527224468, -41.03615807294845))
+    assert cam_01.up_vector == (0.0, 0.0, 1.0)
+    assert rounded((cam_02.position)) == rounded((-93.22589954897808,
+                                                  87.54659771487164, 56.45049285888672))
+    assert rounded((cam_02.direction)) == rounded((
+        108.78812527224468, -108.78812527224468, -41.03615807294845))
+    assert cam_02.up_vector == (0.0, 0.0, 1.0)
+    assert rounded((cam_03.position)) == rounded((-93.22589954897808, -
+                                                  130.02965282961773, 56.45049285888672))
+    assert rounded((cam_03.direction)) == rounded((
+        108.78812527224468, 108.78812527224468, -41.03615807294845))
+    assert cam_03.up_vector == (0.0, 0.0, 1.0)
+    assert rounded((cam_04.position)) == rounded((
+        124.35035099551129, -130.02965282961773, 56.45049285888672))
+    assert rounded((cam_04.direction)) == rounded((-108.78812527224468,
+                                                   108.78812527224468, -41.03615807294845))
+    assert cam_04.up_vector == (0.0, 0.0, 1.0)
diff --git a/tests/github/config_test.py b/tests/github/config_test.py
index 5dfbef29..a092b27c 100644
--- a/tests/github/config_test.py
+++ b/tests/github/config_test.py
@@ -1,90 +1,226 @@
 """Unit tests for the config module."""
 
-import pydantic
+
+from _pytest.config import Config
 import pytest
+
 from pydantic import ValidationError
+from honeybee_vtk.legend_parameter import LegendParameter, Orientation, ColorSets
 from honeybee_vtk.model import Model
 from honeybee_vtk.scene import Scene
-from honeybee_vtk.config import load_config
+from honeybee_vtk.camera import Camera
+from honeybee_vtk.actor import Actor
+from honeybee_vtk.config import Autocalculate, DataConfig, LegendConfig, _load_legend_parameters,\
+    load_config, TextConfig, DecimalCount
 from honeybee_vtk.vtkjs.schema import SensorGridOptions
 
+file_path = r'tests/assets/gridbased.hbjson'
+valid_json_path = r'tests/assets/config/valid.json'
+range_json_path = r'tests/assets/config/range.json'
+invalid_json_path = r'tests/assets/config/invalid.json'
+more_grids = r'tests/assets/config/more_grids.json'
+identifier_mismatch = r'tests/assets/config/identifier_mismatch.json'
+short_length = r'tests/assets/config/short_length.json'
 
-def test_data_config():
-    """Test loading config file."""
 
-    file_path = r'tests/assets/gridbased.hbjson'
-    valid_json_path = r'tests/assets/config/valid.json'
-    invalid_json_path = r'tests/assets/config/invalid.json'
-    more_grids = r'tests/assets/config/more_grids.json'
-    no_file = r'tests/assets/config/no_file.json'
-    more_files = r'tests/assets/config/more_files.json'
-    short_length = r'tests/assets/config/short_length.json'
-    invalid_object_type = r'tests/assets/config/invalid_object_type.json'
-    invalid_file_paths = r'tests/assets/config/invalid_file_paths.json'
+def test_text_config_defaults():
+    text_config = TextConfig()
+    assert text_config.color == [0, 0, 0]
+    assert text_config.size == 30
+    assert text_config.bold == False
 
-    model = Model.from_hbjson(file_path)
-    scene = Scene()
 
-    # invalid json file
-    with pytest.raises(TypeError):
-        load_config(invalid_json_path, model, scene)
+def test_text_config_validators():
+    text_config = TextConfig()
 
-    # when grids are not loaded on a model and one is trying to mount data for grids
-    with pytest.raises(AssertionError):
-        load_config(valid_json_path, model, scene)
+    with pytest.raises(ValidationError):
+        text_config.size = -15
 
-    model = Model.from_hbjson(file_path, load_grids=SensorGridOptions.Mesh)
+    with pytest.raises(ValidationError):
+        text_config.color = 'Red'
 
-    # trying to load more grids than grids in the model
-    with pytest.raises(ValueError):
-        load_config(more_grids, model, scene)
+    with pytest.raises(ValidationError):
+        text_config.bold = "okay"
 
-    # if Empty list is provided in file_paths
-    with pytest.raises(ValueError):
-        load_config(no_file, model, scene)
+    text_config.bold = 1
+    assert text_config.bold == True
 
-    # If more than one files are provided in file_path for non-grid object_type
-    with pytest.raises(ValueError):
-        load_config(more_files, model, scene)
+    text_config.bold = 'no'
+    assert text_config.bold == False
 
-    # if file lengths do not match grid size
-    with pytest.raises(ValueError):
-        load_config(short_length, model, scene)
 
-    # invalid object_type value
+def test_legend_config_defaults():
+    legend_config = LegendConfig()
+    assert legend_config.color_set == ColorSets.ecotect
+    assert legend_config.min == Autocalculate()
+    assert legend_config.max == Autocalculate()
+    assert not legend_config.hide_legend
+    assert legend_config.orientation == Orientation.horizontal
+    assert legend_config.width == 0.45
+    assert legend_config.height == 0.05
+    assert legend_config.position == [0.5, 0.1]
+    assert legend_config.color_count == Autocalculate()
+    assert legend_config.label_count == Autocalculate()
+    assert legend_config.decimal_count == DecimalCount.default
+    assert legend_config.preceding_labels == False
+    assert legend_config.label_parameters == TextConfig()
+    assert legend_config.title_parameters == TextConfig(bold=True)
+
+
+def text_legend_config_validators():
+    legend_config = LegendConfig()
+
     with pytest.raises(ValidationError):
-        load_config(invalid_object_type, model, scene)
+        legend_config.colors = "red"
 
-    # invalid file paths
     with pytest.raises(ValidationError):
-        load_config(invalid_file_paths, model, scene)
+        legend_config.colors = 255
 
+    legend_config.min = -10
+    assert legend_config.min == -10
 
-def test_legend_config():
-    """Test adding legend parameters."""
+    with pytest.raises(ValidationError):
+        legend_config.max = -20
 
-    file_path = r'tests/assets/gridbased.hbjson'
-    invalid_colors = r'tests/assets/config/invalid_colors.json'
-    invalid_orientation = r'tests/assets/config/invalid_orientation.json'
-    invalid_label_format = r'tests/assets/config/invalid_label_format.json'
-    color_by = r'tests/assets/config/color_by.json'
+    with pytest.raises(ValidationError):
+        legend_config.min = 'less'
 
-    model = Model.from_hbjson(file_path, load_grids=SensorGridOptions.Mesh)
-    scene = Scene()
+    with pytest.raises(ValidationError):
+        legend_config.max = 'more'
+
+    with pytest.raises(ValidationError):
+        legend_config.orientation = 'up'
+
+    with pytest.raises(ValidationError):
+        legend_config.width = 200
+
+    with pytest.raises(ValidationError):
+        legend_config.height == 500
+
+    with pytest.raises(ValidationError):
+        legend_config.position = (0, 5, 4)
+
+    with pytest.raises(ValidationError):
+        legend_config.color_count = 25
+
+    with pytest.raises(ValidationError):
+        legend_config.label_count = 26
+
+    with pytest.raises(ValidationError):
+        legend_config.decimal_count = 2
+
+    with pytest.raises(ValidationError):
+        legend_config.preceding_labels = 'no'
+
+    with pytest.raises(ValidationError):
+        legend_config.label_parameters = {'color': [0, 0, 0]}
 
-    # if invalid colors in legend parameters raises error
     with pytest.raises(ValidationError):
-        load_config(invalid_colors, model, scene)
+        legend_config.title_parameters = {'color': [0, 0, 0]}
 
-    # if invalid orientation in legend parameters raises error
+
+def test_data_config_defaults():
+
+    data_config = DataConfig(
+        identifier='Daylight-factor', object_type='grid', unit='Percentage',
+        path='tests/assets/df_results')
+
+    assert not data_config.hide
+    assert data_config.legend_parameters == LegendConfig()
+
+
+def test_data_config_validators():
+    # all required fields missing
+    with pytest.raises(KeyError):
+        data_config = DataConfig()
+
+    # required fields missing
     with pytest.raises(ValidationError):
-        load_config(invalid_orientation, model, scene)
+        data_config = DataConfig(identifier='Starlight')
 
-    # if invalid Label_format in legend parameters raises error
+    # invalid folder path
     with pytest.raises(ValidationError):
-        load_config(invalid_label_format, model, scene)
+        data_config = DataConfig(
+            identifier='Daylight-factor', object_type='grid', unit='Percentage',
+            folder_path='tests/assets/config/valid.json')
 
-    # if warning is raised in case legend parameters are provided for data that is
-    # not going to color the object_type
+    # invalid object type
+    with pytest.raises(ValidationError):
+        data_config = DataConfig(
+            identifier='Daylight-factor', object_type='ground', unit='Percentage',
+            folder_path='tests/assets/df_results')
+
+
+def test_data_config_legend_parameter_validator():
+    # width greater than position in X direction
+    legend_params = LegendConfig()
+    legend_params.position = [0.5, 0.5]
+    legend_params.width = 0.6
+    with pytest.raises(ValidationError):
+        data_config = DataConfig(
+            identifier='Daylight-factor', object_type='grid', unit='Percentage',
+            folder_path='tests/assets/df_results', legend_parameters=legend_params)
+
+    # height greater than position in Y direction
+    legend_params = LegendConfig()
+    legend_params.position = [0.5, 0.5]
+    legend_params.height = 0.6
+    with pytest.raises(ValidationError):
+        data_config = DataConfig(
+            identifier='Daylight-factor', object_type='grid', unit='Percentage',
+            folder_path='tests/assets/df_results', legend_parameters=legend_params)
+
+
+def test_load_legend_parameter():
+
+    model = Model.from_hbjson(file_path, load_grids=SensorGridOptions.Mesh)
+    cameras = model.cameras
+    actors = Actor.from_model(model)
+    scene = Scene()
+    scene.add_cameras(cameras)
+    scene.add_actors(actors)
+
+    # warning when loading data that is requested to be kept hidden
     with pytest.warns(Warning):
-        load_config(color_by, model, scene)
+        load_config(valid_json_path, model, scene)
+
+    # warning when loading data without min and max of legend specified
+    with pytest.warns(Warning):
+        load_config(range_json_path, model, scene)
+
+
+model = Model.from_hbjson(file_path)
+scene = Scene()
+
+
+def test_validate_data_invalid_json():
+    with pytest.raises(TypeError):
+        load_config(invalid_json_path, model, scene)
+
+
+def test_validate_data_grids_not_loaded():
+    with pytest.raises(AssertionError):
+        load_config(valid_json_path, model, scene)
+
+
+model_grids_loaded = Model.from_hbjson(file_path, load_grids=SensorGridOptions.Mesh)
+scene_grids_loaded = Scene()
+cameras = model_grids_loaded.cameras
+actors = Actor.from_model(model_grids_loaded)
+scene_grids_loaded.add_cameras(cameras)
+scene_grids_loaded.add_actors(actors)
+
+
+def test_validate_data_number_of_grids_mismatch():
+    with pytest.raises(AssertionError):
+        load_config(more_grids, model_grids_loaded, scene_grids_loaded)
+
+
+def test_validate_data_identifier_mismatch():
+    with pytest.raises(AssertionError):
+        load_config(identifier_mismatch, model_grids_loaded, scene_grids_loaded)
+
+
+def test_validate_data_file_lengths_mismatch():
+    with pytest.raises(ValueError):
+        load_config(short_length, model_grids_loaded, scene_grids_loaded)
diff --git a/tests/github/legend_parameter_test.py b/tests/github/legend_parameter_test.py
index 335a789a..ad6dd9f1 100644
--- a/tests/github/legend_parameter_test.py
+++ b/tests/github/legend_parameter_test.py
@@ -2,15 +2,15 @@
 
 import pytest
 import vtk
-from honeybee_vtk.legend_parameter import Font, LabelFormat, LegendParameter
-from honeybee_vtk.legend_parameter import Colors, Orientation
+from honeybee_vtk.legend_parameter import Text, DecimalCount, LegendParameter
+from honeybee_vtk.legend_parameter import ColorSets, Orientation
 from honeybee_vtk._helper import _validate_input
 
 
 def test_font_initialization():
     """Testing initialization of a Font object."""
 
-    font = Font()
+    font = Text()
 
     assert font.color == (0, 0, 0)
     assert font.size == (30)
@@ -21,7 +21,7 @@ def test_font_initialization():
 def test_font_errors():
     """Testing if correct exceptions are raised."""
 
-    font = Font()
+    font = Text()
 
     with pytest.raises(ValueError):
         font.color = 0.1, 0.1, 0.1
@@ -33,7 +33,7 @@ def test_font_errors():
         font.bold = 2
 
     font.color = (54, 54, 54)
-    assert _validate_input(font.color, float)
+    assert _validate_input(font.color, [float])
 
 
 def test_legend_parameter_initialization():
@@ -42,19 +42,23 @@ def test_legend_parameter_initialization():
     lp = LegendParameter()
 
     assert lp.name == 'Legend'
-    assert lp.colors == Colors.ecotect
-    assert lp.range == (0, 100)
-    assert not lp.show_legend
+    assert lp.colors == ColorSets.ecotect
+    assert not lp.auto_range
+    assert not lp.min
+    assert not lp.max
+    assert not lp.hide_legend
+    assert not lp.range
     assert lp.orientation == Orientation.horizontal
     assert lp.position == (0.5, 0.1)
     assert lp.width == 0.45
     assert lp.height == 0.05
-    assert not lp.number_of_colors
-    assert not lp.number_of_labels
-    assert lp.label_format == LabelFormat.integer
-    assert lp.label_position == 0
-    assert isinstance(lp.label_font, Font)
-    assert isinstance(lp.title_font, Font)
+    assert not lp.color_count
+    assert not lp.label_count
+    assert lp.decimal_count == DecimalCount.default
+    assert lp.preceding_labels == 0
+    assert isinstance(lp.label_parameters, Text)
+    assert isinstance(lp.title_parameters, Text)
+    lp.auto_range = (0, 100)
     assert isinstance(lp.get_lookuptable(), vtk.vtkLookupTable)
     assert isinstance(lp.get_scalarbar(), vtk.vtkScalarBarActor)
 
@@ -67,9 +71,7 @@ def test_legend_parameter_errors():
     with pytest.raises(ValueError):
         lp.name = 2
     with pytest.raises(ValueError):
-        lp.range = (0.1, 0.5, 3)
-    with pytest.raises(ValueError):
-        lp.show_legend = 3
+        lp.hide_legend = 3
     with pytest.raises(ValueError):
         lp.orientation = 90
     with pytest.raises(ValueError):
@@ -79,14 +81,48 @@ def test_legend_parameter_errors():
     with pytest.raises(ValueError):
         lp.height = 0.96
     with pytest.raises(ValueError):
-        lp.number_of_labels = 25
+        lp.label_count = 25
+    with pytest.raises(ValueError):
+        lp.color_count = 25
+    with pytest.raises(ValueError):
+        lp.decimal_count = int
+    with pytest.raises(ValueError):
+        lp.preceding_labels = 4
     with pytest.raises(ValueError):
-        lp.number_of_colors = 25
+        lp.label_parameters = 'Arial'
     with pytest.raises(ValueError):
-        lp.label_format = int
+        lp.title_parameters = 'Italic'
+    with pytest.raises(AssertionError):
+        lp.auto_range = (0.1, 0.5, 3)
     with pytest.raises(ValueError):
-        lp.label_position = 4
+        lp.min = "min"
     with pytest.raises(ValueError):
-        lp.label_font = 'Arial'
+        lp.max = "max"
+
+
+def test_range():
+    """Test setting range through min and max."""
+
+    with pytest.raises(ValueError):
+        lp = LegendParameter()
+        lp.min = 50
+        lp.max = 45
+        lp.range
+
+    with pytest.raises(ValueError):
+        lp = LegendParameter()
+        lp.auto_range = (10, 20)
+        lp.min = 30
+        lp.range
+
+    with pytest.raises(ValueError):
+        lp = LegendParameter()
+        lp.auto_range = (10, 20)
+        lp.max = 5
+        lp.range
+
     with pytest.raises(ValueError):
-        lp.title_font = 'Italic'
+        lp = LegendParameter()
+        lp.min = 10
+        lp.max = 5
+        lp.range
diff --git a/tests/github/model_test.py b/tests/github/model_test.py
index d749eeae..207e5de7 100644
--- a/tests/github/model_test.py
+++ b/tests/github/model_test.py
@@ -5,7 +5,7 @@
 import pytest
 from ladybug.color import Color
 from honeybee_vtk.model import Model
-from honeybee_vtk.types import ModelDataSet
+from honeybee_vtk.types import ModelDataSet, DataSetNames
 from honeybee_vtk.vtkjs.schema import SensorGridOptions, DisplayMode
 
 
@@ -120,11 +120,9 @@ def test_views():
     assert len(model.cameras) == 1
 
 
-def test_polydata():
-    """Test length of Polydata in model."""
-
+def test_get_modeldataset():
+    """Test get_modeldataset method."""
     file_path = r'tests/assets/gridbased.hbjson'
-    model = Model.from_hbjson(file_path)
-    apertures = model.apertures.data
-    print(f'Total number of aprertures are {len(apertures)}')
-    print(f'Total number of shades are {len(model.shades.data)}')
+    model = Model.from_hbjson(file_path, load_grids=SensorGridOptions.Mesh)
+
+    assert model.get_modeldataset(DataSetNames.wall).name == 'Wall'
diff --git a/tests/github/scene_test.py b/tests/github/scene_test.py
index b3a2512d..93ef72b0 100644
--- a/tests/github/scene_test.py
+++ b/tests/github/scene_test.py
@@ -12,8 +12,8 @@
 from honeybee_vtk.vtkjs.schema import SensorGridOptions, DisplayMode
 from honeybee_vtk.camera import Camera
 from honeybee_vtk.actor import Actor
-from honeybee_vtk.types import ImageTypes, Colors
-from honeybee_vtk.legend_parameter import LabelFormat, Orientation
+from honeybee_vtk.types import ImageTypes, ColorSets
+from honeybee_vtk.legend_parameter import DecimalCount, Orientation
 
 
 def test_class_initialization():
diff --git a/tests/local/cli/export_test.py b/tests/local/cli/export_test.py
index 260347d9..1d5f2d94 100644
--- a/tests/local/cli/export_test.py
+++ b/tests/local/cli/export_test.py
@@ -16,12 +16,14 @@ def test_export_image():
     view_file_1 = r'tests/assets/view1.vf'
     config_path = r'tests/assets/config/valid.json'
 
+    nukedir(target_folder, True)
+
     result = runner.invoke(
         export, [
             file_path, '--folder', target_folder, '--name', 'Model', '--image-type',
             'PNG', '--image-width', 200, '--image-height', 500,
             '--background-color', 255, 255, 255, '--grid-options', 'Meshes',
-            '--display-mode-model', 'Shaded', '--display-mode-grid', 'SurfaceWithEdges',
+            '--model-display-mode', 'Shaded', '--grid-display-mode', 'SurfaceWithEdges',
             '--view', view_file, '--view', view_file_1, '--config', config_path])
 
     assert result.exit_code == 0
diff --git a/tests/local/scene_test.py b/tests/local/scene_test.py
index de07ce69..f1d8a32e 100644
--- a/tests/local/scene_test.py
+++ b/tests/local/scene_test.py
@@ -11,8 +11,8 @@
 from honeybee_vtk.vtkjs.schema import SensorGridOptions, DisplayMode
 from honeybee_vtk.camera import Camera
 from honeybee_vtk.actor import Actor
-from honeybee_vtk.types import ImageTypes, Colors
-from honeybee_vtk.legend_parameter import LabelFormat, Orientation
+from honeybee_vtk.types import ImageTypes, ColorSets
+from honeybee_vtk.legend_parameter import DecimalCount, Orientation
 
 
 def test_export_images_from_view_file():
@@ -92,7 +92,7 @@ def test_export_images():
             radiation.append([float(data[0])])
 
     model.shades.add_data_fields(radiation, name='Radiation', data_range=(0, 2000),
-                                 colors=Colors.original)
+                                 colors=ColorSets.original)
     model.shades.color_by = 'Radiation'
     model.shades.display_mode = DisplayMode.SurfaceWithEdges
 
@@ -104,15 +104,15 @@ def test_export_images():
     scene.add_actors(actors)
 
     scene.legend_parameters['Daylight-factor'].orientation = Orientation.horizontal
-    scene.legend_parameters['Daylight-factor'].show_legend = True
+    scene.legend_parameters['Daylight-factor'].hide_legend = True
     scene.legend_parameters['Daylight-factor'].position = (0.0, 0.1)
 
     rd = scene.legend_parameter('Radiation')
     rd.orientation = Orientation.vertical
     rd.height = 0.45
     rd.width = 0.05
-    rd.label_format = LabelFormat.integer
-    rd.show_legend = True
+    rd.decimal_count = DecimalCount.integer
+    rd.hide_legend = True
     rd.position = (0.90, 0.1)
 
     # A camera setup using the constructor