public void testValidate() {
    {
      Settings settings =
          Settings.builder().put("cluster.routing.allocation.balance.shard", "2.0").build();
      SettingsModule module = new SettingsModule(settings);
      assertInstanceBinding(module, Settings.class, (s) -> s == settings);
    }
    {
      Settings settings =
          Settings.builder().put("cluster.routing.allocation.balance.shard", "[2.0]").build();
      IllegalArgumentException ex =
          expectThrows(IllegalArgumentException.class, () -> new SettingsModule(settings));
      assertEquals(
          "Failed to parse value [[2.0]] for setting [cluster.routing.allocation.balance.shard]",
          ex.getMessage());
    }

    {
      Settings settings =
          Settings.builder()
              .put("cluster.routing.allocation.balance.shard", "[2.0]")
              .put("some.foo.bar", 1)
              .build();
      IllegalArgumentException ex =
          expectThrows(IllegalArgumentException.class, () -> new SettingsModule(settings));
      assertEquals(
          "Failed to parse value [[2.0]] for setting [cluster.routing.allocation.balance.shard]",
          ex.getMessage());
      assertEquals(1, ex.getSuppressed().length);
      assertEquals(
          "unknown setting [some.foo.bar] please check that any required plugins are installed, or check the breaking "
              + "changes documentation for removed settings",
          ex.getSuppressed()[0].getMessage());
    }

    {
      Settings settings =
          Settings.builder().put("index.codec", "default").put("index.foo.bar", 1).build();
      IllegalArgumentException ex =
          expectThrows(IllegalArgumentException.class, () -> new SettingsModule(settings));
      assertEquals("node settings must not contain any index level settings", ex.getMessage());
    }

    {
      Settings settings = Settings.builder().put("index.codec", "default").build();
      SettingsModule module = new SettingsModule(settings);
      assertInstanceBinding(module, Settings.class, (s) -> s == settings);
    }
  }