# HG changeset patch # User Jaroslav Tulach # Date 1213430690 -7200 # Node ID 897361847d122c7b3697058c758f3ef25fa5f801 # Parent 675393d7093a0c7b5316215a52d6eb9afb40a8c1 Making the example with MixedClass vs. NonMixed solution more real, so it can be unit tested diff -r 675393d7093a -r 897361847d12 samples/sidemeanings/src/org/apidesign/sidemeanings/MixedClass.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/samples/sidemeanings/src/org/apidesign/sidemeanings/MixedClass.java Sat Jun 14 10:04:50 2008 +0200 @@ -0,0 +1,24 @@ +package org.apidesign.sidemeanings; + +// BEGIN: sidemeanings.Mixed.Dirty +public abstract class MixedClass { + private int counter; + private int sum; + + protected MixedClass() { + super(); + } + + public final int apiForClients() { + int subclass = toBeImplementedBySubclass(); + sum += subclass; + return sum / counter; + } + + protected abstract int toBeImplementedBySubclass(); + + protected final void toBeCalledBySubclass() { + counter++; + } +} +// END: sidemeanings.Mixed.Dirty diff -r 675393d7093a -r 897361847d12 samples/sidemeanings/src/org/apidesign/sidemeanings/NonMixed.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/samples/sidemeanings/src/org/apidesign/sidemeanings/NonMixed.java Sat Jun 14 10:04:50 2008 +0200 @@ -0,0 +1,43 @@ +package org.apidesign.sidemeanings; + +// BEGIN: sidemeanings.Mixed.Clean +public final class NonMixed { + private int counter; + private int sum; + private final Provider impl; + + private NonMixed(Provider impl) { + this.impl = impl; + } + public static NonMixed create(Provider impl) { + NonMixed api = new NonMixed(impl); + Callback callback = new Callback(api); + impl.initialize(callback); + return api; + } + + public final int apiForClients() { + int subclass = impl.toBeImplementedBySubclass(); + sum += subclass; + return sum / counter; + } + + public interface Provider { + public void initialize(Callback c); + public int toBeImplementedBySubclass(); + } + + public static final class Callback { + NonMixed api; + + Callback(NonMixed api) { + this.api = api; + } + public final void toBeCalledBySubclass() { + api.counter++; + } + } +} +// END: sidemeanings.Mixed.Clean + + diff -r 675393d7093a -r 897361847d12 samples/sidemeanings/test/org/apidesign/sidemeanings/test/MixedTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/samples/sidemeanings/test/org/apidesign/sidemeanings/test/MixedTest.java Sat Jun 14 10:04:50 2008 +0200 @@ -0,0 +1,63 @@ +package org.apidesign.sidemeanings.test; + + +import org.apidesign.sidemeanings.Mixed; +import org.apidesign.sidemeanings.MixedClass; +import org.apidesign.sidemeanings.NonMixed; +import org.apidesign.sidemeanings.NonMixed.Callback; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import static org.junit.Assert.*; + +public class MixedTest { + + public MixedTest() { + } + + @Before + public void setUp() { + } + + @After + public void tearDown() { + } + + // BEGIN: sidemeanings.Mixed.Use + @Test public void useOfClassWithMixedMeanings() { + class AddFiveMixedCounter extends MixedClass { + @Override + protected int toBeImplementedBySubclass() { + toBeCalledBySubclass(); + return 5; + } + } + AddFiveMixedCounter add5 = new AddFiveMixedCounter(); + assertEquals("5/1 = 5", 5, add5.apiForClients()); + assertEquals("10/2 = 5", 5, add5.apiForClients()); + assertEquals("15/3 = 5", 5, add5.apiForClients()); + } + // END: sidemeanings.Mixed.Use + + // BEGIN: sidemeanings.Mixed.Clean.Use + @Test public void useWithoutMixedMeanings() { + class AddFiveMixedCounter implements NonMixed.Provider { + private Callback callback; + + public int toBeImplementedBySubclass() { + callback.toBeCalledBySubclass(); + return 5; + } + + public void initialize(Callback c) { + callback = c; + } + } + NonMixed add5 = NonMixed.create(new AddFiveMixedCounter()); + assertEquals("5/1 = 5", 5, add5.apiForClients()); + assertEquals("10/2 = 5", 5, add5.apiForClients()); + assertEquals("15/3 = 5", 5, add5.apiForClients()); + } + // END: sidemeanings.Mixed.Clean.Use +} +