blob: 2639c109d4d1202137c9851e1162972479a062cf [file] [log] [blame]
/*
* Copyright 2014 Niclas Hedhman.
* Copyright 2014 Paul Merlin.
*
* 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.zest.bootstrap.builder;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import org.json.JSONException;
import org.junit.Test;
import org.apache.zest.api.activation.ActivationException;
import org.apache.zest.api.mixin.Mixins;
import org.apache.zest.api.structure.Application;
import org.apache.zest.api.structure.Module;
import org.apache.zest.bootstrap.Assembler;
import org.apache.zest.bootstrap.AssemblyException;
import org.apache.zest.bootstrap.ModuleAssembly;
import static org.hamcrest.core.IsEqual.equalTo;
import static org.junit.Assert.assertThat;
import static org.apache.zest.bootstrap.ClassScanner.findClasses;
import static org.apache.zest.bootstrap.ClassScanner.matches;
import static org.apache.zest.functional.Iterables.filter;
public class ApplicationBuilderTest
{
@Test
public void givenBuilderUseWhenBuildingApplicationExpectSuccess()
throws AssemblyException, ActivationException
{
ApplicationBuilder builder = new ApplicationBuilder( "Build from API test." );
builder.withLayer( "layer1" ).using( "layer2" ).using( "layer3" );
builder.withLayer( "layer2" );
builder.withLayer( "layer3" ).withModule( "test module" ).
withAssemblers( filter( matches( ".*ServiceAssembler" ), findClasses( getClass() ) ) );
Application application = builder.newApplication();
Module module = application.findModule( "layer3", "test module" );
TestService service = module.findService( TestService.class ).get();
assertThat( service.sayHello(), equalTo( "Hello Zest!" ) );
}
@Test
public void givenJsonWhenBuildingApplicationExpectSuccess()
throws JSONException, ActivationException, AssemblyException
{
ApplicationBuilder builder = ApplicationBuilder.fromJson( APPLICATION );
Application application = builder.newApplication();
Module module = application.findModule( "layer3", "test module" );
TestService service = module.findService( TestService.class ).get();
assertThat( service.sayHello(), equalTo( "Hello Zest!" ) );
}
@Test
public void givenJsonInputStreamWhenBuildingApplicationExpectSuccess()
throws IOException, JSONException, ActivationException, AssemblyException
{
InputStream input = new ByteArrayInputStream( APPLICATION.getBytes( "UTF-8" ) );
ApplicationBuilder builder = ApplicationBuilder.fromJson( input );
Application application = builder.newApplication();
Module module = application.findModule( "layer3", "test module" );
TestService service = module.findService( TestService.class ).get();
assertThat( service.sayHello(), equalTo( "Hello Zest!" ) );
}
private static final String APPLICATION =
"{\n" +
" \"name\": \"Build from JSON test.\",\n" +
" \"layers\": [\n" +
" {\n" +
" \"name\": \"layer1\",\n" +
" \"uses\": [ \"layer2\", \"layer3\"]\n" +
" },\n" +
" {\n" +
" \"name\": \"layer2\"\n" +
" },\n" +
" {\n" +
" \"name\": \"layer3\",\n" +
" \"modules\" : [\n" +
" {\n" +
" \"name\" : \"test module\",\n" +
" \"assemblers\" : [\n" +
" \"org.qi4j.bootstrap.builder.ApplicationBuilderTest$TestServiceAssembler\"\n" +
" ]\n" +
" }\n" +
" ]\n" +
" }\n" +
" ]\n" +
"}";
public static class TestServiceAssembler
implements Assembler
{
@Override
public void assemble( ModuleAssembly module )
throws AssemblyException
{
module.addServices( TestService.class );
}
}
@Mixins( TestService.TestMixin.class )
public interface TestService
{
String sayHello();
class TestMixin
implements TestService
{
@Override
public String sayHello()
{
return "Hello Zest!";
}
}
}
}