Skip to content

Code Coverage Issues #1532

@imikejackson

Description

@imikejackson

Code Coverage Improvement TODO

Generated from GCOV coverage report (Jan 30 2025).
Overall: 38.9% line, 43.9% function, 24.5% branch coverage.

Excludes: parameterVersion() and clone() (covered by separate PR),
IdentifySampleFilter (already fixed), not_used/ algorithm stubs.


1. Algorithm Classes with 0% Coverage (Not Tested At All)

These are real algorithm implementations with zero test coverage. Each needs a
corresponding unit test that exercises the algorithm's operator()() through its
parent filter.

OrientationAnalysis Plugin

File Lines Comment
Filters/Algorithms/ComputeGBPDMetricBased.cpp 739 Times out
Filters/Algorithms/ComputeGBCDMetricBased.cpp 612 Times out
Filters/Algorithms/ComputeGBCD.cpp 479 Times out
Filters/Algorithms/ComputeTwinBoundaries.cpp 398 Times out
Filters/Algorithms/ComputeGBCDPoleFigure.cpp 335 Times out
Filters/Algorithms/ComputeFZQuaternions.cpp 180 Unit test is being run MAJ. Not sure what it is or is not covering

SimplnxCore Plugin

File Lines Action
Filters/Algorithms/ReadDeformKeyFileV12.cpp 840 Add unit test for ReadDeformKeyFileV12Filter
Filters/Algorithms/RegularGridSampleSurfaceMesh.cpp 283 Add unit test for RegularGridSampleSurfaceMeshFilter
Filters/Algorithms/WriteVtkStructuredPoints.cpp 74 Add unit test for WriteVtkStructuredPointsFilter
Filters/Algorithms/ComputeDifferencesMap.cpp 61 Add unit test for ComputeDifferencesMapFilter

Near-Zero Coverage

File Lines Coverage Action
Filters/Algorithms/ComputeArrayStatistics.cpp 1,288 9.5% Expand unit test to exercise more code paths

Core Utility

File Lines Action
simplnx/Utilities/ParallelData2DAlgorithm.cpp 39 Add or expand test that uses 2D parallel algorithm

2. Uncovered MakeErrorResult() Preflight Branches — Update Unit Tests

These are error-return branches in preflightImpl() that are never triggered by
any unit test. For each, add a test case that passes invalid inputs to trigger the
error path. Grouped by filter with line numbers and error codes.

AddBadDataFilter (4 uncovered)

  • L116 (-76234): No noise type selected — pass boundaryNoise=false, poissonNoise=false
  • L121 (-76235): Poisson volume fraction out of range — pass value > 1.0 or < 0.0
  • L126 (-76236): Boundary volume fraction out of range — pass value > 1.0 or < 0.0
  • L133 (-76237): Image geometry with null cell Attribute Matrix

AlignGeometriesFilter (1 uncovered)

  • L83 (-1): Invalid alignment type — pass value other than 0 or 1

ApplyTransformationToGeometryFilter (4 uncovered preflight + 4 other)

  • L173 (-82000): Null input geometry
  • L206 (-82010): Invalid precomputed transformation matrix path
  • L224 (-82002): Manual transformation matrix without exactly 4 rows
  • L228 (-82006): Manual transformation matrix without exactly 4 columns

ApproximatePointCloudHullFilter (1 uncovered)

  • L89 (-11001): Grid resolution with zero or negative values

BadDataNeighborOrientationCheckFilter (9 uncovered)

  • L120: Missing image geometry
  • L127: Missing mask array
  • L133: Mask array with != 1 component
  • L141: Missing cell phases array
  • L151: Cell phases array with != 1 component (not Int32)
  • L159: Missing crystal structures array
  • L169: Crystal structures array with != 1 component (not UInt32)
  • L176: Missing quaternions array
  • L186: Quaternion array with != 4 components (not Float32)

CAxisSegmentFeaturesFilter (4 uncovered)

  • L131 (-655): Misorientation tolerance == 0
  • L157: Missing mask array
  • L162: Mask array wrong type (not Bool or UInt8)
  • L170 (-651): DataArrays with unequal tuple counts

ChangeAngleRepresentationFilter (1 uncovered)

  • L122 (-67001): Conversion type > 1

ComputeArrayHistogramFilter (2 uncovered)

  • L154 (-57206): Mask array not Boolean or UInt8
  • L163 (-57207): Mask/input array tuple count mismatch

ComputeArrayHistogramByFeatureFilter (2 uncovered)

  • L154 (-57206): Mask array not Boolean or UInt8
  • L163 (-57207): Mask/input array tuple count mismatch

ComputeAvgCAxesFilter (1 uncovered)

  • L102 (-6400): DataArrays with unequal tuple counts

ComputeAvgOrientationsFilter (5 uncovered)

  • L117: Crystal structures array with != 1 component
  • L126: Quaternion array with != 4 components
  • L134: Phases array with != 1 component
  • L142: FeatureIds array with != 1 component
  • L150 (-651): DataArrays with unequal tuple counts

ComputeBiasedFeaturesFilter (1 uncovered)

  • L111 (-7460): DataArrays with unequal tuple counts

ComputeCAxisLocationsFilter (1 uncovered)

  • L95 (-3520): DataArrays with unequal tuple counts

ComputeDifferencesMapFilter (6 uncovered)

  • L38 (-90001): Selected arrays of different types
  • L44 (-90002): Selected DataPath not pointing to a DataArray
  • L149: Missing first input array
  • L158: Missing second input array
  • L181: First input array wrong number of components
  • L189: Second input array wrong number of components

ComputeFeatureClusteringFilter (4 uncovered)

  • L127 (-14310): Number of bins <= 0
  • L135 (-14311): FeaturePhases wrong type
  • L141 (-14312): Centroids wrong type
  • L151 (-14314): DataArrays with unequal tuple counts

ComputeFeatureNeighborsFilter (1 uncovered)

  • L216 (-24500): DataArrays with unequal tuple counts

ComputeFeaturePhasesBinaryFilter (1 uncovered)

  • L122 (-53800): DataArrays with unequal tuple counts

ComputeFeaturePhasesFilter (2 uncovered)

  • L93 (-4630): Missing feature ids array
  • L98 (-4631): Missing cell features Attribute Matrix

ComputeFeatureReferenceCAxisMisorientationsFilter (1 uncovered)

  • L114 (-9800): DataArrays with unequal tuple counts

ComputeFeatureReferenceMisorientationsFilter (1 uncovered)

  • L177 (-94520): Missing cell feature Attribute Matrix

ComputeFeatureSizesFilter (2 uncovered)

  • L108: Could not find target geometry
  • L113: Could not find Feature IDs array

ComputeGBCDFilter (7 uncovered)

  • L125 (-74350): Missing euler angles array
  • L129 (-74351): Missing phases array
  • L134 (-74352): Missing crystal structures array
  • L140 (-74353): Missing triangle geometry
  • L149 (-74354): Missing face labels array
  • L153 (-74355): Missing face normals array
  • L157 (-74356): Missing face areas array

ComputeGBCDPoleFigureFilter (3 uncovered)

  • L110 (-34640): Missing crystal structures array
  • L116 (-34641): Missing GBCD array
  • L122 (-34642): Phase index larger than number of Ensembles

ComputeIPFColorsFilter (5 uncovered)

  • L123: Crystal structures array with != 1 component
  • L132: Euler angles array with != 3 components
  • L140: Phases array with != 1 component
  • L153: Missing mask array
  • L167 (-651): DataArrays with unequal tuple counts

ComputeMisorientationsFilter (1 uncovered)

  • L141 (-651): DataArrays with unequal tuple counts

ComputeNeighborhoodsFilter (1 uncovered)

  • L115 (-5730): DataArrays with unequal tuple counts

ComputeNumFeaturesFilter (1 uncovered)

  • L95 (-47630): Missing ensemble Attribute Matrix

ComputeQuaternionConjugateFilter (1 uncovered)

  • L99: Quaternion array with != 4 components

ComputeSchmidsFilter (1 uncovered)

  • L172 (-13500): Slip plane and slip direction must be normal

ComputeShapesFilter (2 uncovered)

  • L118 (-12801): Missing cell feature Attribute Matrix
  • L125 (-12802): Centroids array wrong type

ComputeSurfaceFeaturesFilter (1 uncovered)

  • L100 (-1000): Image geometry not 3D or 2D

ComputeVertexToTriangleDistancesFilter (2 uncovered)

  • L108 (-4530): DataPath not a valid VertexGeometry
  • L114 (-4531): DataPath not a valid TriangleGeometry

ComputeVolumeFractionsFilter (1 uncovered)

  • L96 (-47630): Missing feature Attribute Matrix

ConvertColorToGrayScaleFilter (2 uncovered)

  • L113 (-10701): Invalid color channel selection (not 0, 1, or 2)
  • L141 (-10700): Input data array does not exist

ConvertDataFilter (2 uncovered)

  • L110 (-15201): Missing input data array
  • L166 (-1): FromSIMPL JSON conversion error

ConvertOrientationsFilter (1 uncovered)

  • L140: Invalid conversion parameters

ConvertOrientationsToVertexGeometryFilter (4 uncovered)

  • L124 (-1001): Input representation type not 0-6
  • L132 (-1002): Input component shape with multiple dimensions
  • L143 (-1003): Array validation failure
  • L172 (-1004): Array tuple count mismatch

ConvertQuaternionFilter (1 uncovered)

  • L105: Quaternion array with != 4 components

CopyFeatureArrayToElementArrayFilter (1 uncovered)

  • L145 (-3020): DataArrays with unequal tuple counts

CreateColorMapFilter (2 uncovered)

  • L133: Missing mask array
  • L147 (-651): DataArrays with unequal tuple counts

CreateGeometryFilter (3 uncovered preflight + 6 other)

  • L239 (-9840): Missing vertex list
  • L286 (-9841): Missing quadrilateral list
  • L291 (-9842): Missing quadrilateral list (second check)

CropImageGeometryFilter (3 uncovered preflight + 6 other)

  • L279 (-4010): No dimension selected to crop
  • L620 (-950): Crop bounds validation X
  • L627 (-951): Crop bounds validation Y
  • L634 (-952): Crop bounds validation Z

CropVertexGeometryFilter (1 uncovered)

  • L180 (-58556): Missing vertex data AttributeMatrix

EBSDSegmentFeaturesFilter (4 uncovered)

  • L131 (-655): Misorientation tolerance == 0
  • L157: Missing mask array
  • L162: Mask array wrong type
  • L170 (-651): DataArrays with unequal tuple counts

ErodeDilateBadDataFilter (1 uncovered)

  • L114 (-16700): Operation selection not 0 (Dilate) or 1 (Erode)

ErodeDilateCoordinationNumberFilter (1 uncovered)

  • L94 (-16800): Coordination number not between 0 and 6

ExtractComponentAsArrayFilter (1 uncovered)

  • L106 (-45630): Array component count must be > 1

ExtractInternalSurfacesFromTriangleGeometryFilter (4 uncovered)

  • L120: Missing geometry validation
  • L128: Missing geometry validation
  • L142: Missing geometry validation
  • L169: Missing geometry validation

ExtractPipelineToFileFilter (1 uncovered)

  • L153 (-2582): Error opening output path

ExtractVertexGeometryFilter (1 uncovered)

  • L139: Missing mask array

FillBadDataFilter (1 uncovered)

  • L99 (-16500): Minimum allowed defect size < 1

ITKImageWriterFilter (2 uncovered preflight + 4 other)

  • L352 (-25600): Image array dimensions must match ImageGeometry
  • L357 (-25601): Fill character should be a single value

ITKImportImageStackFilter (1 uncovered preflight + 3 other)

  • L850 (-4): Unsupported pixel component

ITKMhaFileReaderFilter (1 uncovered preflight + 1 other)

  • L482 (-5001): Error applying transformation — unable to instantiate filter

InitializeImageGeomCellDataFilter (1 uncovered)

  • L258 (-3550): No data arrays selected

IterativeClosestPointFilter (3 uncovered)

  • L99: Missing geometry validation
  • L104: Missing geometry validation
  • L110: Missing geometry validation

MergeTwinsFilter (5 uncovered)

  • L145 (-6874600): Missing contiguous neighbor list (Int32)
  • L158 (-6874602): Missing feature ids array (Int32)
  • L167 (-6874603): Missing phases array (Int32)
  • L178 (-6874602): Missing average quaternions array (Float32)
  • L191 (-6874602): Missing crystal structures array (UInt32)

NeighborOrientationCorrelationFilter (7 uncovered preflight + 3 other)

  • L120: Missing input image geometry
  • L129: Missing confidence index array
  • L139: Confidence index array wrong type (not 1-component Float32)
  • L147: Missing cell phases array
  • L157: Cell phases wrong type (not 1-component Int32)
  • L165: Missing crystal structures array
  • L175: Crystal structures wrong type (not 1-component UInt32)

PadImageGeometryFilter (2 uncovered preflight + 1 other)

  • L137 (-4010): No dimension selected
  • L147 (-4115): Null Image geometry pointer

PartitionGeometryFilter (1 uncovered preflight + 12 other dataCheck)

  • L378 (-3010): Attribute matrix tuple count mismatch with geometry

QuickSurfaceMeshFilter (2 uncovered)

  • L142 (-76530): Missing grid geometry
  • L177 (-76531): DataArray wrong tuple count for element data copy

RandomizeFeatureIdsFilter (1 uncovered)

  • L102 (-82640): Attribute Matrix tuple count less than max FeatureId

ReadAngDataFilter (1 uncovered preflight + 1 other)

  • L108: File validation error

ReadBinaryCTNorthstarFilter (2 uncovered)

  • L420 (-38701): Input header file does not exist
  • L427: Error reading input header file

ReadChannel5DataFilter (3 uncovered)

  • L120 (-66500): Matching .crc file does not exist
  • L124 (-66501): std::exception checking file existence
  • L133: File validation error

ReadCtfDataFilter (1 uncovered)

  • L115: File validation error

ReadDREAM3DFilter (3 uncovered)

  • L82: Import file path not provided
  • L87: Failed to open HDF5 file
  • L151: Unsupported PathImportPolicy

ReadH5EbsdFilter (7 uncovered)

  • L113 (-67500): Could not read input file
  • L327-L347: Multiple JSON parameter conversion errors (6 checks)

ReadHDF5DatasetFilter (1 uncovered)

  • L318 (-21000): Error reading HDF5 file

ReadRawBinaryFilter (2 uncovered)

  • L110: Number of components must be positive
  • L125: File is empty

ReadVolumeGraphicsFileFilter (1 uncovered preflight + 5 other)

  • L446: Volume Graphics data file does not exist

RemoveFlaggedEdgesFilter (3 uncovered preflight + 2 other)

  • L149 (-5651): Missing edge data attribute matrix
  • L157 (-5652): Missing edge data attribute matrix (second geom)
  • L179 (-5653): Missing vertex data attribute matrix

RemoveFlaggedFeaturesFilter (2 uncovered)

  • L127 (-9890): Missing Feature Ids array
  • L132 (-9891): Missing Flagged Features array

RemoveFlaggedTrianglesFilter (2 uncovered preflight + 2 other)

  • L157 (-5251): Missing face data attribute matrix
  • L165 (-5252): Missing face data attribute matrix (second check)

RemoveFlaggedVerticesFilter (4 uncovered)

  • L132: Missing geometry validation
  • L139: Missing geometry validation
  • L167 (-5751): Missing cell data attribute matrix
  • L250 (-54070): Array validation error

RequireMinNumNeighborsFilter (1 uncovered)

  • L135: Validation error

RequireMinimumSizeFeaturesFilter (5 uncovered)

  • L328: Validation error
  • L334: FeatureIds not Int32 Array
  • L339: NumCells not Int32 Array
  • L362: NumCells DataPath has no parent
  • L420 (-5555): Validation error

RobustAutomaticThresholdFilter (1 uncovered)

  • L121: Input array cannot be bool type

RodriguesConvertorFilter (1 uncovered)

  • L99: Rodrigues array must be 3-component Float32

RotateSampleRefFrameFilter (1 uncovered)

  • L196 (-5951): Missing cell data attribute matrix

ScalarSegmentFeaturesFilter (6 uncovered)

  • L121: Grid Geometry required
  • L136: Input array must be single component
  • L142: Input array not specified
  • L155: Missing mask array
  • L160: Mask array wrong type
  • L168 (-651): DataArrays with unequal tuple counts

SplitDataArrayByComponentFilter (2 uncovered)

  • L99 (-65400): Missing input data array
  • L104 (-65401): Array must have > 1 component

SplitDataArrayByTupleFilter (1 uncovered preflight + 4 other)

  • L418: Missing input array

SurfaceNetsFilter (1 uncovered)

  • L143 (-76530): Missing grid geometry

TriangleDihedralAngleFilter (2 uncovered)

  • L174 (-9860): Missing Triangle Geometry
  • L180 (-9861): Missing face data Attribute Matrix

WriteASCIIDataFilter (1 uncovered)

  • L200 (-11021): Unable to create output file

WriteBinaryDataFilter (1 uncovered)

  • L138 (-23430): OutputPath must be a directory

WriteDREAM3DFilter (2 uncovered)

  • L111: Failed to retrieve pipeline
  • L133: Write validation error

WriteFeatureDataCSVFilter (2 uncovered)

  • L115 (-64641): Error creating output file (parent path)
  • L150 (-64640): Error opening path

WriteGBCDGMTFileFilter (3 uncovered)

  • L111 (-96710): Missing crystal structures array
  • L117 (-96711): Missing GBCD array
  • L123 (-96712): Phase index larger than number of Ensembles

WriteGBCDTriangleDataFilter (1 uncovered)

  • L109 (-48320): DataArrays with unequal tuple counts

WritePoleFigureFilter (1 uncovered)

  • L199 (-680000): MaterialNames not a StringArray

WriteStatsGenOdfAngleFileFilter (1 uncovered)

  • L134 (-9402): DataArrays with unequal tuple counts

WriteVtkStructuredPointsFilter (1 uncovered)

  • L96 (-2071): DataArrays with unequal tuple counts

Summary Statistics

Category Count
Algorithm classes at 0% coverage (real code) 10
Algorithm classes near-zero (< 10%) 1
Core utility at 0% 1
Filters with uncovered preflight error branches 107
Total uncovered preflight MakeErrorResult() calls 213
Total uncovered non-preflight MakeErrorResult() calls 78

Suggested Priority Order

  1. High-value algorithm tests — ComputeArrayStatistics (1,288 lines at 9.5%),
    ReadDeformKeyFileV12 (840 lines), ComputeGBPDMetricBased (739 lines),
    ComputeGBCDMetricBased (612 lines)
  2. Filters with many uncovered branches — BadDataNeighborOrientationCheckFilter (9),
    ApplyTransformationToGeometryFilter (8), ComputeGBCDFilter (7),
    NeighborOrientationCorrelationFilter (7), ScalarSegmentFeaturesFilter (6),
    ComputeDifferencesMapFilter (6), ReadH5EbsdFilter (7), MergeTwinsFilter (5),
    ComputeAvgOrientationsFilter (5), ComputeIPFColorsFilter (5),
    RequireMinimumSizeFeaturesFilter (5)
  3. Quick wins — Filters with only 1-2 uncovered branches where a single
    additional test case with bad inputs would cover the error path

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions