package com.sandwich.koan.runner; import static com.sandwich.koan.constant.KoanConstants.ALL_SUCCEEDED; import static com.sandwich.koan.constant.KoanConstants.COMPLETE_CHAR; import static com.sandwich.koan.constant.KoanConstants.CONQUERED; import static com.sandwich.koan.constant.KoanConstants.ENCOURAGEMENT; import static com.sandwich.koan.constant.KoanConstants.EOL; import static com.sandwich.koan.constant.KoanConstants.FAILING_SUITES; import static com.sandwich.koan.constant.KoanConstants.INCOMPLETE_CHAR; import static com.sandwich.koan.constant.KoanConstants.INVESTIGATE_IN_THE; import static com.sandwich.koan.constant.KoanConstants.KOAN; import static com.sandwich.koan.constant.KoanConstants.OUT_OF; import static com.sandwich.koan.constant.KoanConstants.PASSING_SUITES; import static com.sandwich.koan.constant.KoanConstants.PROGRESS; import static com.sandwich.koan.constant.KoanConstants.PROGRESS_BAR_START; import static com.sandwich.koan.constant.KoanConstants.PROGRESS_BAR_WIDTH; import static com.sandwich.koan.constant.KoanConstants.WHATS_WRONG; import java.util.Arrays; import org.junit.Test; import com.sandwich.koan.cmdline.CommandLineArgumentRunner; import com.sandwich.koan.cmdline.CommandLineArgumentBuilder; import com.sandwich.koan.constant.KoanConstants; import com.sandwich.koan.path.CommandLineTestCase; import com.sandwich.koan.suite.OneFailingKoan; import com.sandwich.koan.suite.OneFailingKoanDifferentName; import com.sandwich.koan.suite.OnePassingKoan; import com.sandwich.koan.suite.OnePassingKoanDifferentName; public class ConsolePresenterTest extends CommandLineTestCase { @Test public void hintPresentation() throws Throwable { stubAllKoans(Arrays.asList(new OneFailingKoanDifferentName())); new CommandLineArgumentRunner(new CommandLineArgumentBuilder()).run(); assertSystemOutContains(new StringBuilder( INVESTIGATE_IN_THE).append( " ").append( OneFailingKoanDifferentName.class.getSimpleName()).append( " class's ").append( OneFailingKoanDifferentName.class.getDeclaredMethod("koanMethod").getName()).append( " method.").toString()); assertSystemOutContains("Line 11 may offer a clue as to how you may progress, now make haste!"); } @Test // uncomment enableEncouragement @ the top of ConsolePresenter class public void encouragement() throws Throwable { if(KoanConstants.ENABLE_ENCOURAGEMENT){ stubAllKoans(Arrays.asList(new Class<?>[] { OneFailingKoan.class })); new CommandLineArgumentRunner().run(); assertSystemOutContains(new StringBuilder( CONQUERED).append( " 0 ").append( OUT_OF).append( " 1 ").append( KOAN).append( "! ").append( ENCOURAGEMENT).toString()); assertSystemOutDoesntContain(ALL_SUCCEEDED); } } @Test public void testOneHundredPercentSuccessReward() throws Throwable { stubAllKoans(Arrays.asList(new Class<?>[] { OnePassingKoan.class })); new CommandLineArgumentRunner().run(); assertSystemOutContains(ALL_SUCCEEDED); assertSystemOutDoesntContain(CONQUERED); assertSystemOutDoesntContain(ENCOURAGEMENT); } @Test public void passingSuites() throws Throwable { stubAllKoans(Arrays.asList(new OnePassingKoan(), new OnePassingKoanDifferentName())); new CommandLineArgumentRunner().run(); assertSystemOutContains(PASSING_SUITES+" OnePassingKoan, OnePassingKoanDifferentName"); } @Test public void failingSuites() throws Throwable { stubAllKoans(Arrays.asList(new OneFailingKoan(), new OneFailingKoanDifferentName())); new CommandLineArgumentRunner().run(); assertSystemOutContains(FAILING_SUITES+" OneFailingKoan, OneFailingKoanDifferentName"); } @Test public void failingAndPassingSuites() throws Throwable { stubAllKoans(Arrays.asList(new OnePassingKoan(), new OneFailingKoan())); new CommandLineArgumentRunner().run(); assertSystemOutContains(PASSING_SUITES+" OnePassingKoan"+EOL+ FAILING_SUITES+" OneFailingKoan"); } @Test public void progressAllPassing() throws Throwable { stubAllKoans(Arrays.asList(new OnePassingKoan())); new CommandLineArgumentRunner().run(); StringBuilder sb = new StringBuilder(PROGRESS).append(" ") .append(PROGRESS_BAR_START); for(int i = 0; i < PROGRESS_BAR_WIDTH; i++){ // 100% success sb.append(COMPLETE_CHAR); } sb.append("] 1/1").append(EOL); assertSystemOutContains(sb.toString()); } @Test public void progressAllFailing() throws Throwable { stubAllKoans(Arrays.asList(new OneFailingKoan(), new OneFailingKoanDifferentName())); new CommandLineArgumentRunner().run(); StringBuilder sb = new StringBuilder( PROGRESS).append(" ").append( PROGRESS_BAR_START); for(int i = 0; i < PROGRESS_BAR_WIDTH; i++){ // 100% failed sb.append(INCOMPLETE_CHAR); } sb.append("] 0/2").append(EOL); assertSystemOutContains(sb.toString()); } @Test public void progressFiftyFifty() throws Throwable { stubAllKoans(Arrays.asList(new OnePassingKoan(), new OneFailingKoan())); new CommandLineArgumentRunner().run(); StringBuilder sb = new StringBuilder( PROGRESS).append(" ").append( PROGRESS_BAR_START); for(int i = 0; i < PROGRESS_BAR_WIDTH / 2; i++){ // 50% succeeded sb.append(COMPLETE_CHAR); } for(int i = 0; i < PROGRESS_BAR_WIDTH / 2; i++){ // 50% failed sb.append(INCOMPLETE_CHAR); } sb.append("] 1/2").append(EOL); assertSystemOutContains(sb.toString()); } @Test public void whatWentWrongExplanation() throws Throwable { stubAllKoans(Arrays.asList(new OneFailingKoan())); new CommandLineArgumentRunner().run(); assertSystemOutContains(new StringBuilder( WHATS_WRONG).append( EOL).append( "expected:<true> but was:<false>").toString()); } }