@VisibleForTesting
    static List<Tuple2<ConfigGroup, String>> generateTablesForClass(
            Class<?> optionsClass, Collection<OptionWithMetaInfo> optionWithMetaInfos) {
        ConfigGroups configGroups = optionsClass.getAnnotation(ConfigGroups.class);
        List<OptionWithMetaInfo> allOptions = selectOptionsToDocument(optionWithMetaInfos);

        if (allOptions.isEmpty()) {
            return Collections.emptyList();
        }

        List<Tuple2<ConfigGroup, String>> tables;
        if (configGroups != null) {
            tables = new ArrayList<>(configGroups.groups().length + 1);
            Tree tree = new Tree(configGroups.groups(), allOptions);

            for (ConfigGroup group : configGroups.groups()) {
                List<OptionWithMetaInfo> configOptions = tree.findConfigOptions(group);
                if (!configOptions.isEmpty()) {
                    sortOptions(configOptions);
                    tables.add(Tuple2.of(group, toHtmlTable(configOptions)));
                }
            }
            List<OptionWithMetaInfo> configOptions = tree.getDefaultOptions();
            if (!configOptions.isEmpty()) {
                sortOptions(configOptions);
                tables.add(Tuple2.of(null, toHtmlTable(configOptions)));
            }
        } else {
            sortOptions(allOptions);
            tables = Collections.singletonList(Tuple2.of(null, toHtmlTable(allOptions)));
        }
        return tables;
    }
@Test
    void testLongestPrefixMatching() {
        final List<Tuple2<ConfigGroup, String>> tables =
                ConfigOptionsDocGenerator.generateTablesForClass(
                        TestConfigPrefix.class,
                        ConfigurationOptionLocator.extractConfigOptions(TestConfigPrefix.class));

        assertThat(tables).hasSize(3);
        final Map<String, String> tablesConverted = new HashMap<>(tables.size());
        for (final Tuple2<ConfigGroup, String> table : tables) {
            tablesConverted.put(table.f0 != null ? table.f0.name() : "default", table.f1);
        }

        assertThat(tablesConverted.get("group1"))
                .contains("a.b.option", "a.b.c.option", "a.b.c.e.option")
                .doesNotContain("a.b.c.d.option");
        assertThat(tablesConverted.get("group2")).contains("a.b.c.d.option");
        assertThat(tablesConverted.get("default")).contains("a.option", "a.c.b.option");
    }