// Path: planb-core/src/main/java/at/favre/lib/planb/data/InMemoryCrashDataHandler.java
// public class InMemoryCrashDataHandler implements CrashDataHandler {
//     private List<CrashData> crashDataList = new ArrayList<>();
//     private boolean unhandled = false;
// 
//     @Nullable
//     @Override
//     public CrashData getLatest() {
//         unhandled = false;
//         if (crashDataList.isEmpty()) {
//             return null;
//         }
//         return crashDataList.get(0);
//     }
// 
//     @NonNull
//     @Override
//     public List<CrashData> getAll() {
//         return crashDataList;
//     }
// 
//     @Override
//     public int size() {
//         return crashDataList.size();
//     }
// 
//     @Override
//     public boolean hasUnhandledCrash() {
//         return unhandled;
//     }
// 
//     @Override
//     public void persistCrashData(@NonNull CrashData crashData) {
//         unhandled = true;
//         crashDataList.add(crashData);
//     }
// 
//     @Override
//     public int countOfCrashesSince(long fromTimestamp) {
//         int count = 0;
//         for (CrashData crashData : getAll()) {
//             if (crashData.timestamp >= fromTimestamp) {
//                 count++;
//             }
//         }
//         return count;
//     }
// 
//     @Override
//     public void clear() {
//         crashDataList.clear();
//     }
// }
// 
// Path: planb-core/src/main/java/at/favre/lib/planb/interfaces/CrashDataHandler.java
// public interface CrashDataHandler {
// 
//     /**
//      * Gets the latest crashdata and resets the internal
//      * unhandled crash flag
//      *
//      * @return the latest crash data or null the handler is empty
//      */
//     @Nullable
//     CrashData getLatest();
// 
//     /**
//      * @return all persisted crash data
//      */
//     @NonNull
//     List<CrashData> getAll();
// 
//     /**
//      * @return currently persisted crash data
//      */
//     int size();
// 
//     /**
//      * If {@link #persistCrashData(CrashData)} was called this will return
//      * true until {@link #getLatest()} is called. Not every crash must be handled.
//      * One call to {@link #getLatest()} will reset multiple new crash data.
//      * <p>
//      * This is for checking after the app restarts if an crash occurred.
//      *
//      * @return true if an crash that wasn't handled was found
//      */
//     boolean hasUnhandledCrash();
// 
//     /**
//      * Persists a new crashdata
//      *
//      * @param crashData to persist
//      */
//     void persistCrashData(@NonNull CrashData crashData);
// 
//     /**
//      * Returns the count of crash data entries that were persisted after
//      * the given time.
//      *
//      * @param fromTimestamp timestamp from {@link java.util.Date}
//      * @return count of entries
//      */
//     int countOfCrashesSince(long fromTimestamp);
// 
//     /**
//      * Clears all persisted crash data entries.
//      */
//     void clear();
// }
// 
// Path: planb-core/src/main/java/at/favre/lib/planb/parser/MarkupRenderer.java
// public interface MarkupRenderer {
//     @Retention(RetentionPolicy.SOURCE)
//     @IntDef({ML_MARKDOWN, ML_TEXTILE, ML_ASCIIDOC, ML_HTML})
//     @interface MarkupLanguage {
//     }
// 
//     int ML_MARKDOWN = 0;
//     int ML_TEXTILE = 1;
//     int ML_ASCIIDOC = 2;
//     int ML_HTML = 3;
// 
//     /**
//      * Add a document header if necessary
//      *
//      * @return a header or empty string
//      */
//     @NonNull
//     String renderHeader();
// 
//     /**
//      * Renders the equivalent of given token in the specific language
//      *
//      * @param content   as string
//      * @param tokenType as defined in {@link GenericMLParser.MarkupToken}
//      * @return the rendered string in the implemented markup language
//      */
//     String render(String content, @GenericMLParser.MarkupToken int tokenType);
// 
//     /**
//      * Add a document footer if necessary
//      *
//      * @return a footer or empty string
//      */
//     @NonNull
//     String renderFooter();
// 
//     /**
//      * The type as defined in {@link MarkupLanguage}
//      * @return type as int
//      */
//     @MarkupLanguage
//     int getType();
// 
//     class Util {
//         public static MarkupRenderer getById(@MarkupLanguage int languageId) {
//             switch (languageId) {
//                 case ML_MARKDOWN:
//                     return new MarkdownRenderer();
//                 case ML_TEXTILE:
//                     return new TextileRenderer();
//                 case ML_ASCIIDOC:
//                     return new AsciiDocRenderer();
//                 case ML_HTML:
//                     return new HTML5Renderer();
//                 default:
//                     throw new IllegalArgumentException("unknown markup language " + languageId);
//             }
//         }
//     }
// }


import android.support.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
import at.favre.lib.planb.data.InMemoryCrashDataHandler;
import at.favre.lib.planb.interfaces.CrashDataHandler;
import at.favre.lib.planb.parser.MarkupRenderer;
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertNull;
import static junit.framework.Assert.assertSame;
package at.favre.lib.planb;






@RunWith(AndroidJUnit4.class)
public class PlanBConfigTest {

    @Test
    public void testConfigBuilder() {
        CrashDataHandler handler = new InMemoryCrashDataHandler();
        PlanBConfig config = PlanBConfig.newBuilder()
                .applicationVariant("buildType", "flavor")
                .bugReportMarkupLanguage(MarkupRenderer.ML_ASCIIDOC)
                .ci("cibuildid", "cijob")
                .enableLog(true)
                .scm("scmRevHash", "scmBranch")
                .version("versionName", 1)
                .debugCrashDataHandler(handler)
                .releaseCrashDataHandler(null)
                .build();

        assertEquals("flavor", config.appFlavour);
        assertEquals("buildType", config.appBuiltType);
        assertEquals("cibuildid", config.ciBuildId);
// Path: planb-core/src/main/java/at/favre/lib/planb/data/InMemoryCrashDataHandler.java
// public class InMemoryCrashDataHandler implements CrashDataHandler {
//     private List<CrashData> crashDataList = new ArrayList<>();
//     private boolean unhandled = false;
// 
//     @Nullable
//     @Override
//     public CrashData getLatest() {
//         unhandled = false;
//         if (crashDataList.isEmpty()) {
//             return null;
//         }
//         return crashDataList.get(0);
//     }
// 
//     @NonNull
//     @Override
//     public List<CrashData> getAll() {
//         return crashDataList;
//     }
// 
//     @Override
//     public int size() {
//         return crashDataList.size();
//     }
// 
//     @Override
//     public boolean hasUnhandledCrash() {
//         return unhandled;
//     }
// 
//     @Override
//     public void persistCrashData(@NonNull CrashData crashData) {
//         unhandled = true;
//         crashDataList.add(crashData);
//     }
// 
//     @Override
//     public int countOfCrashesSince(long fromTimestamp) {
//         int count = 0;
//         for (CrashData crashData : getAll()) {
//             if (crashData.timestamp >= fromTimestamp) {
//                 count++;
//             }
//         }
//         return count;
//     }
// 
//     @Override
//     public void clear() {
//         crashDataList.clear();
//     }
// }
// 
// Path: planb-core/src/main/java/at/favre/lib/planb/interfaces/CrashDataHandler.java
// public interface CrashDataHandler {
// 
//     /**
//      * Gets the latest crashdata and resets the internal
//      * unhandled crash flag
//      *
//      * @return the latest crash data or null the handler is empty
//      */
//     @Nullable
//     CrashData getLatest();
// 
//     /**
//      * @return all persisted crash data
//      */
//     @NonNull
//     List<CrashData> getAll();
// 
//     /**
//      * @return currently persisted crash data
//      */
//     int size();
// 
//     /**
//      * If {@link #persistCrashData(CrashData)} was called this will return
//      * true until {@link #getLatest()} is called. Not every crash must be handled.
//      * One call to {@link #getLatest()} will reset multiple new crash data.
//      * <p>
//      * This is for checking after the app restarts if an crash occurred.
//      *
//      * @return true if an crash that wasn't handled was found
//      */
//     boolean hasUnhandledCrash();
// 
//     /**
//      * Persists a new crashdata
//      *
//      * @param crashData to persist
//      */
//     void persistCrashData(@NonNull CrashData crashData);
// 
//     /**
//      * Returns the count of crash data entries that were persisted after
//      * the given time.
//      *
//      * @param fromTimestamp timestamp from {@link java.util.Date}
//      * @return count of entries
//      */
//     int countOfCrashesSince(long fromTimestamp);
// 
//     /**
//      * Clears all persisted crash data entries.
//      */
//     void clear();
// }
// 
// Path: planb-core/src/main/java/at/favre/lib/planb/parser/MarkupRenderer.java
// public interface MarkupRenderer {
//     @Retention(RetentionPolicy.SOURCE)
//     @IntDef({ML_MARKDOWN, ML_TEXTILE, ML_ASCIIDOC, ML_HTML})
//     @interface MarkupLanguage {
//     }
// 
//     int ML_MARKDOWN = 0;
//     int ML_TEXTILE = 1;
//     int ML_ASCIIDOC = 2;
//     int ML_HTML = 3;
// 
//     /**
//      * Add a document header if necessary
//      *
//      * @return a header or empty string
//      */
//     @NonNull
//     String renderHeader();
// 
//     /**
//      * Renders the equivalent of given token in the specific language
//      *
//      * @param content   as string
//      * @param tokenType as defined in {@link GenericMLParser.MarkupToken}
//      * @return the rendered string in the implemented markup language
//      */
//     String render(String content, @GenericMLParser.MarkupToken int tokenType);
// 
//     /**
//      * Add a document footer if necessary
//      *
//      * @return a footer or empty string
//      */
//     @NonNull
//     String renderFooter();
// 
//     /**
//      * The type as defined in {@link MarkupLanguage}
//      * @return type as int
//      */
//     @MarkupLanguage
//     int getType();
// 
//     class Util {
//         public static MarkupRenderer getById(@MarkupLanguage int languageId) {
//             switch (languageId) {
//                 case ML_MARKDOWN:
//                     return new MarkdownRenderer();
//                 case ML_TEXTILE:
//                     return new TextileRenderer();
//                 case ML_ASCIIDOC:
//                     return new AsciiDocRenderer();
//                 case ML_HTML:
//                     return new HTML5Renderer();
//                 default:
//                     throw new IllegalArgumentException("unknown markup language " + languageId);
//             }
//         }
//     }
// }


// Path: planb-core/src/androidTest/java/at/favre/lib/planb/PlanBConfigTest.java
import android.support.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
import at.favre.lib.planb.data.InMemoryCrashDataHandler;
import at.favre.lib.planb.interfaces.CrashDataHandler;
import at.favre.lib.planb.parser.MarkupRenderer;
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertNull;
import static junit.framework.Assert.assertSame;

package at.favre.lib.planb;






@RunWith(AndroidJUnit4.class)
public class PlanBConfigTest {

    @Test
    public void testConfigBuilder() {
        CrashDataHandler handler = new InMemoryCrashDataHandler();
        PlanBConfig config = PlanBConfig.newBuilder()
                .applicationVariant("buildType", "flavor")
                .bugReportMarkupLanguage(MarkupRenderer.ML_ASCIIDOC)
                .ci("cibuildid", "cijob")
                .enableLog(true)
                .scm("scmRevHash", "scmBranch")
                .version("versionName", 1)
                .debugCrashDataHandler(handler)
                .releaseCrashDataHandler(null)
                .build();

        assertEquals("flavor", config.appFlavour);
        assertEquals("buildType", config.appBuiltType);
        assertEquals("cibuildid", config.ciBuildId);
        assertEquals("cijob", config.ciBuildJob);