package it.globrutto.popularmovies.utils;

import junit.framework.Assert;

import java.util.concurrent.Callable;

/**
 * Created by giuseppelobrutto on 24/03/17.
 */

public abstract class PollingCheck {

    private static final long TIME_SLICE = 50;

    private long mTimeout = 3000;

    public PollingCheck() {
    }

    public PollingCheck(long timeout) {
        mTimeout = timeout;
    }

    public static void check(CharSequence message, long timeout, Callable<Boolean> condition) throws Exception {

        while (timeout > 0) {
            if (condition.call()) {
                return;
            }

            Thread.sleep(TIME_SLICE);
            timeout -= TIME_SLICE;
        }

        Assert.fail(message.toString());
    }

    protected abstract boolean check();

    public void run() {
        if (check()) {
            return;
        }

        long timeout = mTimeout;
        while (timeout > 0) {
            try {
                Thread.sleep(TIME_SLICE);
            } catch (InterruptedException e) {
                Assert.fail("Notification error, unexpected InterruptedException");
            }

            if (check()) {
                return;
            }

            timeout -= TIME_SLICE;
        }

        Assert.fail("Notification not set, unexpected timeout");
    }
}
