### Question:
DataTypeDestroyHandler extends DataTypeHandler { List<DataType> handleNestedDataTypes(final DataType dataType) { final List<DataType> affectedDataTypes = new ArrayList<>(); getClosestTopLevelDataType(dataType).ifPresent(topLevel -> { final String type = topLevel.getName(); affectedDataTypes.add(topLevel); refreshSubDataTypes(topLevel, type); if (!isStructure(topLevel)) { forEachSubDataTypesByTypeOrName(topLevel.getType(), subDataType -> { affectedDataTypes.add(refreshSubDataType(subDataType)); }); } forEachSubDataTypesByType(type, subDataType -> { affectedDataTypes.add(refreshSubDataType(subDataType)); }); }); return affectedDataTypes; } @Inject  DataTypeDestroyHandler(final DataTypeStore dataTypeStore,
                                  final DataTypeManager dataTypeManager); void destroy(final DataType dataType); List<DataType> refreshDependentDataTypes(final DataType dataType);  }### Answer:
@Test public void testHandleNestedDataTypes() { final DataType dataType = mock(DataType.class); final DataType dataType0 = mock(DataType.class); final DataType dataType1 = mock(DataType.class); final DataType dataType2 = mock(DataType.class); final DataType dataType3 = mock(DataType.class); final DataType dataTypeParent0 = mock(DataType.class); final DataType dataTypeParent1 = mock(DataType.class); final DataType dataTypeParent2 = mock(DataType.class); final DataType dataTypeParent3 = mock(DataType.class); final DataType topLevelDataType = mock(DataType.class); final String topLevelName = "name"; final String topLevelType = "type"; when(topLevelDataType.getName()).thenReturn(topLevelName); when(topLevelDataType.getType()).thenReturn(topLevelType); when(dataType0.getType()).thenReturn(topLevelName); when(dataType1.getType()).thenReturn(topLevelName); when(dataType2.getType()).thenReturn(topLevelName); when(dataType3.getType()).thenReturn(topLevelType); when(dataType3.isTopLevel()).thenReturn(true); when(dataTypeStore.getTopLevelDataTypes()).thenReturn(asList(dataType0, dataType1, dataType2, dataType3)); doReturn(dataTypeParent0).when(handler).parent(dataType0); doReturn(dataTypeParent1).when(handler).parent(dataType1); doReturn(dataTypeParent2).when(handler).parent(dataType2); doReturn(dataTypeParent3).when(handler).parent(dataType3); doReturn(Optional.of(topLevelDataType)).when(handler).getClosestTopLevelDataType(dataType); doReturn(false).when(handler).isStructure(topLevelDataType); doNothing().when(handler).refreshSubDataTypes(any(), anyString()); doNothing().when(handler).refreshSubDataTypes(any()); final List<DataType> expectedDependentDataTypes = asList(topLevelDataType, dataType3, dataTypeParent0, dataTypeParent1, dataTypeParent2); final List<DataType> actualDependentDataTypes = handler.handleNestedDataTypes(dataType); verify(handler).refreshSubDataTypes(topLevelDataType, topLevelName); verify(handler).refreshSubDataTypes(dataTypeParent0); verify(handler).refreshSubDataTypes(dataType3); verify(handler).refreshSubDataTypes(dataTypeParent1); verify(handler).refreshSubDataTypes(dataTypeParent2); assertEquals(expectedDependentDataTypes, actualDependentDataTypes); }