package protect.budgetwatch;

import android.app.Activity;
import android.view.View;
import android.widget.ProgressBar;
import android.widget.TextView;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.Robolectric;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.android.controller.ActivityController;
import org.robolectric.annotation.Config;
import org.robolectric.shadows.ShadowLog;

import java.util.Calendar;
import java.util.List;

import static org.junit.Assert.assertEquals;

@RunWith(RobolectricTestRunner.class)
@Config(constants = BuildConfig.class, sdk = 17)
public class BudgetAdapterTest
{
    private long nowMs;
    private long lastYearMs;
    private final int MONTHS_PER_YEAR = 12;

    @Before
    public void setUp()
    {
        // Output logs emitted during tests so they may be accessed
        ShadowLog.stream = System.out;

        nowMs = System.currentTimeMillis();

        Calendar lastYear = Calendar.getInstance();
        lastYear.set(Calendar.YEAR, lastYear.get(Calendar.YEAR)-1);
        lastYearMs = lastYear.getTimeInMillis();
    }

    @Test
    public void TestAdapter()
    {
        ActivityController activityController = Robolectric.buildActivity(BudgetActivity.class).create();
        Activity activity = (Activity)activityController.get();

        DBHelper db = new DBHelper(activity);
        final String NAME = "name";
        final int BUDGET = 100;
        final double CURRENT = 50.01;
        final int CURRENT_CEIL = (int)Math.ceil(CURRENT);

        db.insertBudget(NAME, BUDGET);
        db.insertTransaction(DBHelper.TransactionDbIds.EXPENSE, "", "", NAME, CURRENT, "", nowMs, "");
        db.close();

        final int SCALED_BUDGET = BUDGET * (MONTHS_PER_YEAR+1);

        final List<Budget> budgets = db.getBudgets(lastYearMs, nowMs);
        final BudgetAdapter adapter = new BudgetAdapter(activity, budgets);

        View view = adapter.getView(0, null, null);

        final TextView budgetName = (TextView) view.findViewById(R.id.budgetName);
        final ProgressBar budgetBar = (ProgressBar) view.findViewById(R.id.budgetBar);
        final TextView budgetValue = (TextView) view.findViewById(R.id.budgetValue);

        assertEquals(NAME, budgetName.getText().toString());
        assertEquals(CURRENT_CEIL, budgetBar.getProgress());
        assertEquals(SCALED_BUDGET, budgetBar.getMax());

        String fractionFormat = activity.getResources().getString(R.string.fraction);
        String fraction = String.format(fractionFormat, CURRENT_CEIL, SCALED_BUDGET);
        assertEquals(fraction, budgetValue.getText().toString());
    }
}