public void cacheShouldBeConfigurable() {
    ConfigurationParameters parameters = new ConfigurationParameters();
    parameters.addParameter(CACHE_CLASS, TestCache.class.getName());

    configuration = new DefaultConfiguration(parameters);

    assert configuration.getCache() instanceof TestCache;
  }
  public void typeFinderShouldBeConfigurable() {
    ConfigurationParameters parameters = new ConfigurationParameters();
    parameters.addParameter(TYPE_FINDER_CLASS, TestTypeFinder.class.getName());

    configuration = new DefaultConfiguration(parameters);

    assert configuration.getTypeFinder() instanceof TestTypeFinder;
  }
  public void templateStoreFinderShouldBeConfigurable() {
    ConfigurationParameters parameters = new ConfigurationParameters();
    parameters.addParameter(TEMPLATE_STORE_FINDER_CLASS, TestTemplateStoreFinder.class.getName());

    configuration = new DefaultConfiguration(parameters);

    assert configuration.getTemplateStoreFinder() instanceof TestTemplateStoreFinder;
  }
  public void converterRegistryShouldBeConfigurable() {
    ConfigurationParameters parameters = new ConfigurationParameters();
    parameters.addParameter(CONVERTER_REGISTRY_CLASS, TestConverterRegistry.class.getName());

    configuration = new DefaultConfiguration(parameters);

    assert configuration.getConverterRegistry() instanceof TestConverterRegistry;
  }
  public void configurationShouldInitialiseCache() {
    ConfigurationParameters parameters = new ConfigurationParameters();
    parameters.addParameter(CACHE_CLASS, TestCache.class.getName());

    configuration = new DefaultConfiguration(parameters);

    assert ((TestCache) configuration.getCache()).getConfiguration() == configuration;
  }
  public void templateElementFactoryShouldBeConfigurable() {
    ConfigurationParameters parameters = new ConfigurationParameters();
    parameters.addParameter(
        TEMPLATE_ELEMENT_FACTORY_CLASS, TestTemplateElementFactory.class.getName());

    configuration = new DefaultConfiguration(parameters);

    assert configuration.getTemplateElementFactory() instanceof TestTemplateElementFactory;
  }
  @Test(dependsOnMethods = "typeFinderShouldBeConfigurable")
  public void configurationShoulInitialiseTypeFinder() {
    ConfigurationParameters parameters = new ConfigurationParameters();
    parameters.addParameter(TYPE_FINDER_CLASS, TestTypeFinder.class.getName());

    configuration = new DefaultConfiguration(parameters);

    assert ((TestTypeFinder) configuration.getTypeFinder()).getConfiguration() == configuration;
  }
  @Test(dependsOnMethods = "serialisersShouldNotBeNull")
  public void serialiserPackagesShouldBeConfigurable() {
    ConfigurationParameters parameters = new ConfigurationParameters();
    parameters.addParameter(SERIALISER_PACKAGES, getPackageName(ExternalSerialiser.class));

    configuration = new DefaultConfiguration(parameters);

    assert findSerialiserOfType(configuration, ExternalSerialiser.class) != null;
  }
  @Test(dependsOnMethods = "parsersShouldNotBeNull")
  public void parserPackagesShouldBeExtendedByConfigurationElementPackages() {
    ConfigurationParameters parameters = new ConfigurationParameters();
    parameters.addParameter(CONFIGURATION_ELEMENT_PACKAGES, getPackageName(ExternalParser.class));

    configuration = new DefaultConfiguration(parameters);

    assert findParserOfType(configuration, ExternalParser.class) != null;
  }
  @Test(dependsOnMethods = "librariesShouldNotBeNull")
  public void libraryPackagesShouldBeConfigurable() {
    ConfigurationParameters parameters = new ConfigurationParameters();
    parameters.addParameter(LIBRARY_PACKAGES, getPackageName(ExternalLibrary.class));

    configuration = new DefaultConfiguration(parameters);

    assert findLibraryOfType(configuration, ExternalLibrary.class) != null;
  }
  @Test(dependsOnMethods = "expressionFactoriesShouldNotBeNull")
  public void expressionFactoryPackagesShouldBeConfigurable() {
    ConfigurationParameters parameters = new ConfigurationParameters();
    parameters.addParameter(
        EXPRESSION_FACTORY_PACKAGES, getPackageName(ExternalExpressionFactory.class));

    configuration = new DefaultConfiguration(parameters);

    assert findExpressionFactoryOfType(configuration, ExternalExpressionFactory.class) != null;
  }
  @Test(dependsOnMethods = "converterRegistryShouldBeConfigurable")
  public void configurationShouldInitialiseConverterRegistry() {
    ConfigurationParameters parameters = new ConfigurationParameters();
    parameters.addParameter(CONVERTER_REGISTRY_CLASS, TestConverterRegistry.class.getName());

    configuration = new DefaultConfiguration(parameters);

    assert ((TestConverterRegistry) configuration.getConverterRegistry()).getConfiguration()
        == configuration;
  }
  public void configurationElementFactoryShouldBeConfigurable() {
    ConfigurationParameters parameters = new ConfigurationParameters();
    parameters.addParameter(
        CONFIGURATION_ELEMENT_FACTORY_CLASS, TestConfigurationElementFactory.class.getName());

    configuration = new DefaultConfiguration(parameters);

    assert configuration.getConfigurationElementFactory()
        instanceof TestConfigurationElementFactory;
  }
  @Test(dependsOnMethods = "contextEnrichersShouldNotBeNull")
  public void contextEnricherPackagesShouldBeConfigurable() {
    ConfigurationParameters parameters = new ConfigurationParameters();
    parameters.addParameter(
        CONTEXT_ENRICHER_PACKAGES,
        ReflectionUtilities.getPackageName(ExternalContextEnricher.class));

    configuration = new DefaultConfiguration(parameters);

    assert findContextEnricherOfType(configuration, ExternalContextEnricher.class) != null;
  }
  @Test(dependsOnMethods = "parserPackagesShouldBeConfigurable")
  public void parserNamesShouldBeOverridable() {
    ConfigurationParameters parameters = new ConfigurationParameters();
    parameters.addParameter(PARSER_PACKAGES, getPackageName(ExternalParser.class));

    configuration = new DefaultConfiguration(parameters);
    Map<String, Parser> parsers = configuration.getParsers();

    assert parsers.containsKey("external");
    assert parsers.get("external") == findParserOfType(configuration, ExternalParser.class);
  }
  @Test(dependsOnMethods = "configurationElementFactoryShouldBeConfigurable")
  public void configurationShouldInitialiseConfigurationElementFactory() {
    ConfigurationParameters parameters = new ConfigurationParameters();
    parameters.addParameter(
        CONFIGURATION_ELEMENT_FACTORY_CLASS, TestConfigurationElementFactory.class.getName());

    configuration = new DefaultConfiguration(parameters);

    TestConfigurationElementFactory configurationElementFactory =
        (TestConfigurationElementFactory) configuration.getConfigurationElementFactory();
    assert configurationElementFactory.getConfiguration() == configuration;
  }
  @Test(dependsOnMethods = "templateElementFactoryShouldBeConfigurable")
  public void configurationShouldInitialiseTemplateElementFactory() {
    ConfigurationParameters parameters = new ConfigurationParameters();
    parameters.addParameter(
        TEMPLATE_ELEMENT_FACTORY_CLASS, TestTemplateElementFactory.class.getName());

    configuration = new DefaultConfiguration(parameters);

    TestTemplateElementFactory templateElementFactory =
        (TestTemplateElementFactory) configuration.getTemplateElementFactory();
    assert templateElementFactory.getConfiguration() == configuration;
  }
  @Test(dependsOnMethods = "configurationShouldInitialiseCache")
  public void configurationShouldDisableCacheWhenItIsClosed() {
    ConfigurationParameters parameters = new ConfigurationParameters();
    parameters.addParameter(CACHE_CLASS, TestCache.class.getName());

    Configuration configuration = new DefaultConfiguration(parameters);

    TestCache cache = (TestCache) configuration.getCache();

    configuration.close();

    assert cache.getConfiguration() == null;
  }
  @Test(dependsOnMethods = "configurationShouldInitialiseTemplateFinder")
  public void configurationShouldDisableTemplateFinderWhenItIsClosed() {
    ConfigurationParameters parameters = new ConfigurationParameters();
    parameters.addParameter(TEMPLATE_FINDER_CLASS, TestTemplateFinder.class.getName());

    Configuration configuration = new DefaultConfiguration(parameters);

    TestTemplateFinder templateFinder = (TestTemplateFinder) configuration.getTemplateFinder();

    configuration.close();

    assert templateFinder.getConfiguration() == null;
  }
  @Test(dependsOnMethods = "configurationShouldInitialiseConverterRegistry")
  public void configurationShouldDisableConverterRegistryWhenItIsClosed() {
    ConfigurationParameters parameters = new ConfigurationParameters();
    parameters.addParameter(CONVERTER_REGISTRY_CLASS, TestConverterRegistry.class.getName());

    Configuration configuration = new DefaultConfiguration(parameters);

    TestConverterRegistry converterRegistry =
        (TestConverterRegistry) configuration.getConverterRegistry();

    configuration.close();

    assert converterRegistry.getConfiguration() == null;
  }