### Question:
DataTypeHandler { Optional<DataType> getClosestTopLevelDataType(final DataType dataType) { final Optional<DataType> closestTopLevelDataType = getClosestTopLevel(parent(dataType)); if (closestTopLevelDataType.isPresent()) { final DataType topLevel = closestTopLevelDataType.get(); final String type = topLevel.isTopLevel() ? topLevel.getName() : topLevel.getType(); return findTopLevelDataTypeByName(type); } return Optional.empty(); } DataTypeHandler(final DataTypeStore dataTypeStore,
                    final DataTypeManager dataTypeManager); void init(final ItemDefinitionRecordEngine recordEngine);  }### Answer:
@Test public void testGetClosestTopLevelDataType() { final DataType dataType0 = makeDataType("name", "Text", false); final DataType dataType1 = makeDataType("name", "Text", false); final DataType dataType2 = makeDataType("name", "Text", false); final DataType dataType3 = makeDataType("city", "tCity", false); final DataType dataType5 = makeDataType("street", "Structure", false, dataType1); final DataType dataType4 = makeDataType("tCity", "Structure", true, dataType0, dataType5); final DataType dataType6 = makeDataType("tPerson", "Structure", true, dataType2, dataType3); doReturn(dataType4).when(handler).parent(dataType0); doReturn(dataType4).when(handler).parent(dataType5); doReturn(dataType5).when(handler).parent(dataType1); doReturn(dataType6).when(handler).parent(dataType2); doReturn(dataType6).when(handler).parent(dataType3); when(dataTypeStore.getTopLevelDataTypes()).thenReturn(asList(dataType4, dataType6)); final DataType closestTopLevelDataTypeForDataType1 = handler.getClosestTopLevelDataType(dataType1).orElseThrow(UnsupportedOperationException::new); final DataType closestTopLevelDataTypeForDataType3 = handler.getClosestTopLevelDataType(dataType3).orElseThrow(UnsupportedOperationException::new); assertEquals(dataType4, closestTopLevelDataTypeForDataType1); assertEquals(dataType6, closestTopLevelDataTypeForDataType3); }