package org.qi4j.tests.regression.qi328;
import org.junit.Test;
import org.qi4j.api.injection.scope.This;
import org.qi4j.api.mixin.Mixins;
import org.qi4j.api.property.Property;
import org.qi4j.api.value.ValueBuilder;
import org.qi4j.api.value.ValueComposite;
import org.qi4j.bootstrap.AssemblyException;
import org.qi4j.bootstrap.ModuleAssembly;
import org.qi4j.test.AbstractQi4jTest;
import static org.junit.Assert.assertEquals;
public class Qi328TestCase extends AbstractQi4jTest
{
@Override
public void assemble( ModuleAssembly module )
throws AssemblyException
{
module.values( OuterValue.class );
}
@Test
public void givenValueCompositeWithInternalStateMixinWhenSerializingExpectInternalStateInOutput()
throws Exception
{
ValueBuilder<OuterValue> builder = module.newValueBuilder( OuterValue.class );
OuterValue.State prototype = builder.prototypeFor( OuterValue.State.class );
builder.prototype().firstName().set( "Niclas" );
prototype.lastName().set( "Hedhman" );
OuterValue value = builder.newInstance();
System.out.println("Niclas: " + value);
value.printName();
assertEquals( "{\"firstName\":\"Niclas\",\"lastName\":\"Hedhman\"}", value.toString() );
}
@Mixins( OuterValue.Mixin.class )
public interface OuterValue extends ValueComposite
{
void printName();
Property<String> firstName();
public abstract class Mixin
implements OuterValue
{
@This
private State state;
@Override
public void printName()
{
System.out.println( firstName().get() + " " + state.lastName().get() );
}
}
interface State
{
Property<String> lastName();
}
}
}