blob: c2e4621053f1d3ffbdfb866f70e47b6a1ce7b5f8 [file] [log] [blame]
// Copyright 2006, 2007, 2008 The Apache Software Foundation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package org.apache.tapestry5.internal.services;
import org.apache.tapestry5.internal.test.InternalBaseTestCase;
import org.apache.tapestry5.ioc.services.ClassNameLocator;
import org.apache.tapestry5.services.ComponentClassResolver;
import org.apache.tapestry5.services.LibraryMapping;
import org.easymock.EasyMock;
import static org.easymock.EasyMock.isA;
import org.slf4j.Logger;
import org.testng.annotations.Test;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
public class ComponentClassResolverImplTest extends InternalBaseTestCase
{
private static final String APP_ROOT_PACKAGE = "org.example.app";
private static final String CORE_PREFIX = "core";
private static final String CORE_ROOT_PACKAGE = "org.apache.tapestry5.corelib";
private static final String LIB_PREFIX = "lib";
private static final String LIB_ROOT_PACKAGE = "org.example.lib";
private ComponentClassResolverImpl create(Logger logger, ComponentInstantiatorSource source,
ClassNameLocator locator, LibraryMapping... mappings)
{
List<LibraryMapping> list = Arrays.asList(mappings);
return new ComponentClassResolverImpl(logger, source, locator, APP_ROOT_PACKAGE, list);
}
private Logger compliantLogger()
{
Logger logger = mockLogger();
logger.info(EasyMock.isA(String.class));
getMocksControl().atLeastOnce();
return logger;
}
@Test
public void simple_page_name()
{
ComponentInstantiatorSource source = mockComponentInstantiatorSource();
ClassNameLocator locator = newClassNameLocator();
Logger logger = compliantLogger();
train_for_app_packages(source);
String className = APP_ROOT_PACKAGE + ".pages.SimplePage";
train_locateComponentClassNames(locator, APP_ROOT_PACKAGE + ".pages", className);
replay();
ComponentClassResolver resolver = create(logger, source, locator);
assertEquals(resolver.resolvePageNameToClassName("SimplePage"), className);
verify();
}
/**
* TAPESTRY-1541
*/
@Test
public void page_name_matches_containing_folder_name()
{
ComponentInstantiatorSource source = mockComponentInstantiatorSource();
ClassNameLocator locator = newClassNameLocator();
Logger logger = compliantLogger();
train_for_app_packages(source);
String className = APP_ROOT_PACKAGE + ".pages.admin.product.ProductAdmin";
train_locateComponentClassNames(locator, APP_ROOT_PACKAGE + ".pages", className);
replay();
ComponentClassResolver resolver = create(logger, source, locator);
assertEquals(resolver.resolvePageNameToClassName("admin/product/ProductAdmin"), className);
verify();
}
@Test
public void canonicalize_existing_page_name()
{
ComponentInstantiatorSource source = mockComponentInstantiatorSource();
ClassNameLocator locator = newClassNameLocator();
Logger logger = compliantLogger();
train_for_app_packages(source);
String className = APP_ROOT_PACKAGE + ".pages.SimplePage";
train_locateComponentClassNames(locator, APP_ROOT_PACKAGE + ".pages", className);
replay();
ComponentClassResolver resolver = create(logger, source, locator);
assertEquals(resolver.canonicalizePageName("simplepage"), "SimplePage");
verify();
}
@Test
public void page_name_in_subfolder()
{
ComponentInstantiatorSource source = mockComponentInstantiatorSource();
ClassNameLocator locator = newClassNameLocator();
Logger logger = compliantLogger();
train_for_app_packages(source);
String className = APP_ROOT_PACKAGE + ".pages.subfolder.NestedPage";
train_locateComponentClassNames(locator, APP_ROOT_PACKAGE + ".pages", className);
replay();
ComponentClassResolver resolver = create(logger, source, locator);
assertEquals(resolver.resolvePageNameToClassName("subfolder/NestedPage"), className);
verify();
}
@Test
public void lots_of_prefixes_and_suffixes_stripped()
{
ComponentInstantiatorSource source = mockComponentInstantiatorSource();
ClassNameLocator locator = newClassNameLocator();
Logger logger = compliantLogger();
train_for_app_packages(source);
String className = APP_ROOT_PACKAGE + ".pages.admin.edit.AdminUserEdit";
train_locateComponentClassNames(locator, APP_ROOT_PACKAGE + ".pages", className);
replay();
ComponentClassResolver resolver = create(logger, source, locator);
assertEquals(resolver.resolvePageNameToClassName("admin/edit/User"), className);
assertEquals(resolver.resolvePageNameToClassName("admin/edit/AdminUserEdit"), className);
verify();
}
@Test
public void page_in_subfolder()
{
ComponentInstantiatorSource source = mockComponentInstantiatorSource();
ClassNameLocator locator = newClassNameLocator();
Logger logger = compliantLogger();
train_for_app_packages(source);
String className = APP_ROOT_PACKAGE + ".pages.subfolder.NestedPage";
train_locateComponentClassNames(locator, APP_ROOT_PACKAGE + ".pages", className);
replay();
ComponentClassResolver resolver = create(logger, source, locator);
assertEquals(resolver.resolvePageNameToClassName("subfolder/NestedPage"), className);
verify();
}
@Test
public void subfolder_name_as_classname_prefix_is_stripped()
{
ComponentInstantiatorSource source = mockComponentInstantiatorSource();
ClassNameLocator locator = newClassNameLocator();
Logger logger = compliantLogger();
train_for_app_packages(source);
String className = APP_ROOT_PACKAGE + ".pages.foo.FooBar";
train_locateComponentClassNames(locator, APP_ROOT_PACKAGE + ".pages", className);
replay();
ComponentClassResolver resolver = create(logger, source, locator);
assertEquals(resolver.resolvePageNameToClassName("foo/Bar"), className);
verify();
}
@Test
public void core_prefix_stripped_from_exception_message()
{
ComponentInstantiatorSource source = mockComponentInstantiatorSource();
ClassNameLocator locator = newClassNameLocator();
Logger logger = compliantLogger();
train_for_packages(source, CORE_ROOT_PACKAGE);
train_for_app_packages(source);
train_locateComponentClassNames(locator, CORE_ROOT_PACKAGE + ".pages", CORE_ROOT_PACKAGE + ".pages.Fred",
CORE_ROOT_PACKAGE + ".pages.Barney");
train_locateComponentClassNames(locator, APP_ROOT_PACKAGE + ".pages", APP_ROOT_PACKAGE + ".pages.Wilma",
APP_ROOT_PACKAGE + ".pages.Betty");
replay();
ComponentClassResolver resolver = create(logger, source, locator,
new LibraryMapping(CORE_PREFIX, CORE_ROOT_PACKAGE));
try
{
resolver.resolvePageNameToClassName("Unknown");
unreachable();
}
catch (RuntimeException ex)
{
assertEquals(ex.getMessage(),
"Unable to resolve \'Unknown\' to a page class name. Available page names: Barney, Betty, Fred, Wilma.");
}
verify();
}
@Test
public void is_page_name()
{
ComponentInstantiatorSource source = mockComponentInstantiatorSource();
ClassNameLocator locator = newClassNameLocator();
Logger logger = compliantLogger();
train_for_app_packages(source);
String className = APP_ROOT_PACKAGE + ".pages.SimplePage";
train_locateComponentClassNames(locator, APP_ROOT_PACKAGE + ".pages", className);
replay();
ComponentClassResolver resolver = create(logger, source, locator);
assertTrue(resolver.isPageName("SimplePage"));
assertTrue(resolver.isPageName("simplepage"));
assertFalse(resolver.isPageName("UnknownPage"));
verify();
}
@Test
public void index_page_name_at_root()
{
ComponentInstantiatorSource source = mockComponentInstantiatorSource();
ClassNameLocator locator = newClassNameLocator();
Logger logger = compliantLogger();
train_for_app_packages(source);
String className = APP_ROOT_PACKAGE + ".pages.Index";
train_locateComponentClassNames(locator, APP_ROOT_PACKAGE + ".pages", className);
replay();
ComponentClassResolver resolver = create(logger, source, locator);
assertTrue(resolver.isPageName("Index"));
assertTrue(resolver.isPageName(""));
verify();
}
@Test
public void is_page_name_for_core_page()
{
ComponentInstantiatorSource source = mockComponentInstantiatorSource();
ClassNameLocator locator = newClassNameLocator();
Logger logger = compliantLogger();
train_for_app_packages(source);
train_for_packages(source, CORE_ROOT_PACKAGE);
String className = CORE_ROOT_PACKAGE + ".pages.MyCorePage";
train_locateComponentClassNames(locator, CORE_ROOT_PACKAGE + ".pages", className);
replay();
ComponentClassResolver resolver = create(logger, source, locator,
new LibraryMapping(CORE_PREFIX, CORE_ROOT_PACKAGE));
// Can look like an application page, but still resolves to the core library class name.
assertTrue(resolver.isPageName("MyCorePage"));
// Or we can give it its true name
assertTrue(resolver.isPageName("core/mycorepage"));
assertFalse(resolver.isPageName("UnknownPage"));
verify();
}
protected final ClassNameLocator newClassNameLocator()
{
ClassNameLocator locator = newMock(ClassNameLocator.class);
stub_locateComponentClassNames(locator);
return locator;
}
private void stub_locateComponentClassNames(ClassNameLocator locator)
{
Collection<String> noMatches = Collections.emptyList();
expect(locator.locateClassNames(isA(String.class))).andStubReturn(noMatches);
}
protected final void train_locateComponentClassNames(ClassNameLocator locator, String packageName,
String... classNames)
{
expect(locator.locateClassNames(packageName)).andReturn(Arrays.asList(classNames));
}
@Test
public void class_name_to_simple_page_name()
{
String className = APP_ROOT_PACKAGE + ".pages.SimplePage";
ComponentInstantiatorSource source = mockComponentInstantiatorSource();
ClassNameLocator locator = newClassNameLocator();
Logger logger = compliantLogger();
train_for_app_packages(source);
train_locateComponentClassNames(locator, APP_ROOT_PACKAGE + ".pages", className);
replay();
ComponentClassResolver resolver = create(logger, source, locator);
assertEquals(resolver.resolvePageClassNameToPageName(className), "SimplePage");
verify();
}
/**
* All of the caches are handled identically, so we just test the pages for caching.
*/
@Test
public void resolved_page_names_are_cached()
{
String pageClassName = APP_ROOT_PACKAGE + ".pages.SimplePage";
ComponentInstantiatorSource source = mockComponentInstantiatorSource();
ClassNameLocator locator = newClassNameLocator();
Logger logger = compliantLogger();
train_for_app_packages(source);
train_locateComponentClassNames(locator, APP_ROOT_PACKAGE + ".pages", pageClassName);
replay();
ComponentClassResolverImpl resolver = create(logger, source, locator);
assertEquals(resolver.resolvePageNameToClassName("SimplePage"), pageClassName);
verify();
// No more training, because it's already cached.
replay();
assertEquals(resolver.resolvePageNameToClassName("SimplePage"), pageClassName);
verify();
// After clearing the cache, redoes the work.
train_locateComponentClassNames(locator, APP_ROOT_PACKAGE + ".pages", pageClassName);
stub_locateComponentClassNames(locator);
replay();
resolver.objectWasInvalidated();
assertEquals(resolver.resolvePageNameToClassName("SimplePage"), pageClassName);
verify();
}
@Test
public void page_found_in_core_lib()
{
String className = CORE_ROOT_PACKAGE + ".pages.MyCorePage";
ComponentInstantiatorSource source = mockComponentInstantiatorSource();
ClassNameLocator locator = newClassNameLocator();
Logger logger = compliantLogger();
train_for_packages(source, CORE_ROOT_PACKAGE);
train_for_app_packages(source);
train_locateComponentClassNames(locator, CORE_ROOT_PACKAGE + ".pages", className);
replay();
ComponentClassResolver resolver = create(logger, source, locator,
new LibraryMapping(CORE_PREFIX, CORE_ROOT_PACKAGE));
assertEquals(resolver.resolvePageNameToClassName("MyCorePage"), className);
verify();
}
@Test
public void page_class_name_resolved_to_core_page()
{
String className = CORE_ROOT_PACKAGE + ".pages.MyCorePage";
ComponentInstantiatorSource source = mockComponentInstantiatorSource();
ClassNameLocator locator = newClassNameLocator();
Logger logger = compliantLogger();
train_for_packages(source, CORE_ROOT_PACKAGE);
train_for_app_packages(source);
train_locateComponentClassNames(locator, CORE_ROOT_PACKAGE + ".pages", className);
replay();
ComponentClassResolver resolver = create(logger, source, locator,
new LibraryMapping(CORE_PREFIX, CORE_ROOT_PACKAGE));
assertEquals(resolver.resolvePageClassNameToPageName(className), "core/MyCorePage");
verify();
}
@Test
public void page_found_in_library()
{
String className = LIB_ROOT_PACKAGE + ".pages.MyLibPage";
ComponentInstantiatorSource source = mockComponentInstantiatorSource();
ClassNameLocator locator = newClassNameLocator();
Logger logger = compliantLogger();
train_for_packages(source, LIB_ROOT_PACKAGE);
train_for_packages(source, CORE_ROOT_PACKAGE);
train_for_app_packages(source);
train_locateComponentClassNames(locator, LIB_ROOT_PACKAGE + ".pages", className);
replay();
ComponentClassResolver resolver = create(logger, source, locator,
new LibraryMapping(LIB_PREFIX, LIB_ROOT_PACKAGE),
new LibraryMapping(CORE_PREFIX, CORE_ROOT_PACKAGE));
assertEquals(resolver.resolvePageNameToClassName("lib/MyLibPage"), className);
verify();
}
@Test
public void slashes_trimmed_from_library_prefix()
{
String className = LIB_ROOT_PACKAGE + ".pages.MyLibPage";
ComponentInstantiatorSource source = mockComponentInstantiatorSource();
ClassNameLocator locator = newClassNameLocator();
Logger logger = compliantLogger();
train_for_packages(source, LIB_ROOT_PACKAGE);
train_for_packages(source, CORE_ROOT_PACKAGE);
train_for_app_packages(source);
train_locateComponentClassNames(locator, LIB_ROOT_PACKAGE + ".pages", className);
replay();
ComponentClassResolver resolver = create(logger, source, locator,
new LibraryMapping("/" + LIB_PREFIX + "/", LIB_ROOT_PACKAGE),
new LibraryMapping(CORE_PREFIX, CORE_ROOT_PACKAGE));
assertEquals(resolver.resolvePageNameToClassName("lib/MyLibPage"), className);
verify();
}
@Test
public void lookup_by_logical_name_is_case_insensitive()
{
String className = LIB_ROOT_PACKAGE + ".pages.MyLibPage";
ComponentInstantiatorSource source = mockComponentInstantiatorSource();
ClassNameLocator locator = newClassNameLocator();
Logger logger = compliantLogger();
train_for_packages(source, LIB_ROOT_PACKAGE);
train_for_packages(source, CORE_ROOT_PACKAGE);
train_for_app_packages(source);
train_locateComponentClassNames(locator, LIB_ROOT_PACKAGE + ".pages", className);
replay();
ComponentClassResolver resolver = create(logger, source, locator,
new LibraryMapping(LIB_PREFIX, LIB_ROOT_PACKAGE),
new LibraryMapping(CORE_PREFIX, CORE_ROOT_PACKAGE));
assertEquals(resolver.resolvePageNameToClassName("lib/MyLibPage"), className);
verify();
}
@Test
public void name_stripping_includes_library_folder()
{
String className = LIB_ROOT_PACKAGE + ".pages.LibPage";
ComponentInstantiatorSource source = mockComponentInstantiatorSource();
ClassNameLocator locator = newClassNameLocator();
Logger logger = compliantLogger();
train_for_packages(source, LIB_ROOT_PACKAGE);
train_for_packages(source, CORE_ROOT_PACKAGE);
train_for_app_packages(source);
train_locateComponentClassNames(locator, LIB_ROOT_PACKAGE + ".pages", className);
replay();
ComponentClassResolver resolver = create(logger, source, locator,
new LibraryMapping(LIB_PREFIX, LIB_ROOT_PACKAGE),
new LibraryMapping(CORE_PREFIX, CORE_ROOT_PACKAGE));
assertEquals(resolver.resolvePageNameToClassName("lib/Page"), className);
verify();
}
@Test
public void name_stripping_for_complex_library_folder_name()
{
String libPrefix = "lib/deep";
String className = LIB_ROOT_PACKAGE + ".pages.LibDeepPage";
ComponentInstantiatorSource source = mockComponentInstantiatorSource();
ClassNameLocator locator = newClassNameLocator();
Logger logger = compliantLogger();
train_for_packages(source, LIB_ROOT_PACKAGE);
train_for_packages(source, CORE_ROOT_PACKAGE);
train_for_app_packages(source);
train_locateComponentClassNames(locator, LIB_ROOT_PACKAGE + ".pages", className);
replay();
ComponentClassResolver resolver = create(logger, source, locator,
new LibraryMapping(libPrefix, LIB_ROOT_PACKAGE),
new LibraryMapping(CORE_PREFIX, CORE_ROOT_PACKAGE));
assertEquals(resolver.resolvePageNameToClassName("lib/deep/Page"), className);
assertEquals(resolver.resolvePageNameToClassName("lib/deep/LibDeepPage"), className);
verify();
}
@Test
public void class_name_does_not_resolve_to_page_name()
{
ComponentInstantiatorSource source = mockComponentInstantiatorSource();
ClassNameLocator locator = newClassNameLocator();
Logger logger = mockLogger();
train_for_packages(source, CORE_ROOT_PACKAGE);
train_for_app_packages(source);
replay();
ComponentClassResolver resolver = create(logger, source, locator,
new LibraryMapping(CORE_PREFIX, CORE_ROOT_PACKAGE));
String className = LIB_ROOT_PACKAGE + ".pages.LibPage";
try
{
resolver.resolvePageClassNameToPageName(className);
unreachable();
}
catch (IllegalArgumentException ex)
{
assertEquals(ex.getMessage(), "Unable to resolve class name " + className + " to a logical page name.");
}
verify();
}
@Test
public void page_name_to_canonicalize_does_not_exist()
{
ComponentInstantiatorSource source = mockComponentInstantiatorSource();
ClassNameLocator locator = newClassNameLocator();
Logger logger = compliantLogger();
train_for_packages(source, CORE_ROOT_PACKAGE);
train_for_app_packages(source);
train_locateComponentClassNames(locator, APP_ROOT_PACKAGE + ".pages", APP_ROOT_PACKAGE + ".pages.Start");
replay();
ComponentClassResolver resolver = create(logger, source, locator,
new LibraryMapping(CORE_PREFIX, CORE_ROOT_PACKAGE));
try
{
resolver.canonicalizePageName("MissingPage");
unreachable();
}
catch (IllegalArgumentException ex)
{
assertEquals(ex.getMessage(),
"Unable to resolve \'MissingPage\' to a known page name. Available page names: Start.");
}
verify();
}
@Test
public void class_name_not_in_a_pages_package()
{
ComponentInstantiatorSource source = mockComponentInstantiatorSource();
ClassNameLocator locator = newClassNameLocator();
Logger logger = mockLogger();
train_for_packages(source, CORE_ROOT_PACKAGE);
train_for_app_packages(source);
replay();
ComponentClassResolver resolver = create(logger, source, locator,
new LibraryMapping(CORE_PREFIX, CORE_ROOT_PACKAGE));
String className = CORE_ROOT_PACKAGE + ".foo.CorePage";
try
{
resolver.resolvePageClassNameToPageName(className);
unreachable();
}
catch (IllegalArgumentException ex)
{
assertEquals(ex.getMessage(), "Unable to resolve class name " + className + " to a logical page name.");
}
verify();
}
@Test
public void multiple_mappings_for_same_prefix()
{
String secondaryLibPackage = "org.examples.addon.lib";
String className = secondaryLibPackage + ".pages.MyLibPage";
ComponentInstantiatorSource source = mockComponentInstantiatorSource();
ClassNameLocator locator = newClassNameLocator();
Logger logger = compliantLogger();
train_for_packages(source, LIB_ROOT_PACKAGE);
train_for_packages(source, secondaryLibPackage);
train_for_packages(source, CORE_ROOT_PACKAGE);
train_for_app_packages(source);
train_locateComponentClassNames(locator, secondaryLibPackage + ".pages", className);
replay();
ComponentClassResolver resolver = create(logger, source, locator,
new LibraryMapping(LIB_PREFIX, LIB_ROOT_PACKAGE),
new LibraryMapping(LIB_PREFIX, secondaryLibPackage),
new LibraryMapping(CORE_PREFIX, CORE_ROOT_PACKAGE));
assertEquals(resolver.resolvePageNameToClassName("lib/MyLibPage"), className);
verify();
}
@Test
public void complex_prefix_search_fails()
{
String deepPackage = "org.deep";
ComponentInstantiatorSource source = mockComponentInstantiatorSource();
ClassNameLocator locator = newClassNameLocator();
Logger logger = mockLogger();
train_for_packages(source, deepPackage);
train_for_packages(source, LIB_ROOT_PACKAGE);
train_for_packages(source, CORE_ROOT_PACKAGE);
train_for_app_packages(source);
// Is this test even needed any more with the new algorithm?
replay();
ComponentClassResolver resolver = create(logger, source, locator, new LibraryMapping("lib/deep", deepPackage),
new LibraryMapping(LIB_PREFIX, LIB_ROOT_PACKAGE),
new LibraryMapping(CORE_PREFIX, CORE_ROOT_PACKAGE));
try
{
resolver.resolvePageNameToClassName("lib/deep/DeepPage");
unreachable();
}
catch (IllegalArgumentException ex)
{
assertMessageContains(ex, "Unable to resolve 'lib/deep/DeepPage' to a page class name.");
}
verify();
}
private void train_for_packages(ComponentInstantiatorSource source, String packageName)
{
source.addPackage(packageName + ".pages");
source.addPackage(packageName + ".components");
source.addPackage(packageName + ".mixins");
source.addPackage(packageName + ".base");
}
/**
* The logic for searching is pretty much identical for both components and pages, so even a cursory test of
* component types should nail it.
*/
@Test
public void simple_component_type()
{
String className = APP_ROOT_PACKAGE + ".components.SimpleComponent";
ComponentInstantiatorSource source = mockComponentInstantiatorSource();
ClassNameLocator locator = newClassNameLocator();
Logger logger = compliantLogger();
train_for_app_packages(source);
train_locateComponentClassNames(locator, APP_ROOT_PACKAGE + ".components", className);
replay();
ComponentClassResolver resolver = create(logger, source, locator);
assertEquals(resolver.resolveComponentTypeToClassName("SimpleComponent"), className);
verify();
}
/**
* Likewise for mixins; it's all just setup for a particular method.
*/
@Test
public void simple_mixin_type()
{
String expectedClassName = APP_ROOT_PACKAGE + ".mixins.SimpleMixin";
ComponentInstantiatorSource source = mockComponentInstantiatorSource();
ClassNameLocator locator = newClassNameLocator();
Logger logger = compliantLogger();
train_for_app_packages(source);
train_locateComponentClassNames(locator, APP_ROOT_PACKAGE + ".mixins", expectedClassName);
replay();
ComponentClassResolver resolver = create(logger, source, locator);
assertEquals(resolver.resolveMixinTypeToClassName("SimpleMixin"), expectedClassName);
verify();
}
@Test
public void mixin_type_not_found()
{
ComponentInstantiatorSource source = mockComponentInstantiatorSource();
ClassNameLocator locator = newClassNameLocator();
Logger logger = mockLogger();
train_for_packages(source, CORE_ROOT_PACKAGE);
train_for_app_packages(source);
replay();
ComponentClassResolver resolver = create(logger, source, locator,
new LibraryMapping(CORE_PREFIX, CORE_ROOT_PACKAGE));
try
{
resolver.resolveMixinTypeToClassName("SimpleMixin");
unreachable();
}
catch (IllegalArgumentException ex)
{
assertMessageContains(ex, "Unable to resolve 'SimpleMixin' to a mixin class name.");
}
verify();
}
@Test
public void component_type_not_found()
{
ComponentInstantiatorSource source = mockComponentInstantiatorSource();
ClassNameLocator locator = newClassNameLocator();
Logger logger = mockLogger();
train_for_packages(source, CORE_ROOT_PACKAGE);
train_for_app_packages(source);
replay();
ComponentClassResolver resolver = create(logger, source, locator,
new LibraryMapping(CORE_PREFIX, CORE_ROOT_PACKAGE));
try
{
resolver.resolveComponentTypeToClassName("SimpleComponent");
unreachable();
}
catch (IllegalArgumentException ex)
{
assertTrue(ex.getMessage().contains("Unable to resolve 'SimpleComponent' to a component class name."));
}
verify();
}
private void train_for_app_packages(ComponentInstantiatorSource source)
{
train_for_packages(source, APP_ROOT_PACKAGE);
}
}