/*
 * Copyright (C) 2011 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.email.activity;

import com.android.email.R;

import android.app.Activity;
import android.content.Context;
import android.test.AndroidTestCase;
import android.view.View;

import java.util.Locale;

public class UiUtilitiesTests extends AndroidTestCase {
    public void brokentestFormatSize() {
        if (!"en".equalsIgnoreCase(Locale.getDefault().getLanguage())) {
            return; // Only works on the EN locale.
        }
        assertEquals("0B", UiUtilities.formatSize(getContext(), 0));
        assertEquals("1B", UiUtilities.formatSize(getContext(), 1));
        assertEquals("1023B", UiUtilities.formatSize(getContext(), 1023));
        assertEquals("1KB", UiUtilities.formatSize(getContext(), 1024));
        assertEquals("1023KB", UiUtilities.formatSize(getContext(), 1024 * 1024 - 1));
        assertEquals("1MB", UiUtilities.formatSize(getContext(), 1024 * 1024));
        assertEquals("1023MB", UiUtilities.formatSize(getContext(), 1024 * 1024 * 1024 - 1));
        assertEquals("1GB", UiUtilities.formatSize(getContext(), 1024 * 1024 * 1024));
        assertEquals("5GB", UiUtilities.formatSize(getContext(), 5L * 1024 * 1024 * 1024));
    }

    public void brokentestGetMessageCountForUi() {
        final Context c = getContext();

        // Negavive valeus not really expected, but at least shouldn't crash.
        assertEquals("-1", UiUtilities.getMessageCountForUi(c, -1, true));
        assertEquals("-1", UiUtilities.getMessageCountForUi(c, -1, false));

        assertEquals("", UiUtilities.getMessageCountForUi(c, 0, true));
        assertEquals("0", UiUtilities.getMessageCountForUi(c, 0, false));

        assertEquals("1", UiUtilities.getMessageCountForUi(c, 1, true));
        assertEquals("1", UiUtilities.getMessageCountForUi(c, 1, false));

        assertEquals("999", UiUtilities.getMessageCountForUi(c, 999, true));
        assertEquals("999", UiUtilities.getMessageCountForUi(c, 999, false));

        final String moreThan999 = c.getString(R.string.more_than_999);

        assertEquals(moreThan999, UiUtilities.getMessageCountForUi(c, 1000, true));
        assertEquals(moreThan999, UiUtilities.getMessageCountForUi(c, 1000, false));

        assertEquals(moreThan999, UiUtilities.getMessageCountForUi(c, 1001, true));
        assertEquals(moreThan999, UiUtilities.getMessageCountForUi(c, 1001, false));
    }

    public void testGetView() {
        // Test for getView(Activity, int)
        DummyActivity a = new DummyActivity();
        DummyView v = new DummyView(getContext());

        a.mDummyViewId = 10;
        a.mDummyView = v;
        assertEquals(v, UiUtilities.getView(a, 10));

        try {
            assertEquals(v, UiUtilities.getView(a, 11));
            fail();
        } catch (IllegalArgumentException expected) {
        }

        // TODO Test for getView(View, int)?
        // Unfortunately View.findViewById is final, so can't use the same approach.
        // Also it's a huge pain to set up an actual, nested views in unit tests, so let's leave
        // it for now.
    }

    public void testSetVisibilitySafe() {
        {
            DummyView v = new DummyView(getContext());
            UiUtilities.setVisibilitySafe(v, View.VISIBLE);
            assertEquals(View.VISIBLE, v.mVisibility);

            // Shouldn't crash
            UiUtilities.setVisibilitySafe(null, View.VISIBLE);
        }

        {
            DummyActivity a = new DummyActivity();
            DummyView v = new DummyView(getContext());
            a.mDummyViewId = 3;
            a.mDummyView = v;

            UiUtilities.setVisibilitySafe(a, 3, View.VISIBLE);
            assertEquals(View.VISIBLE, v.mVisibility);

            // shouldn't crash
            UiUtilities.setVisibilitySafe(a, 5, View.VISIBLE);
        }
        // No test for setVisibilitySafe(View, int, int) -- see testGetView().
    }

    private static class DummyActivity extends Activity {
        public int mDummyViewId;
        public View mDummyView;

        @Override
        public View findViewById(int id) {
            return (id == mDummyViewId) ? mDummyView : null;
        }
    }

    private static class DummyView extends View {
        public int mVisibility = View.GONE;

        public DummyView(Context context) {
            super(context);
        }

        @Override
        public void setVisibility(int visibility) {
            mVisibility = visibility;
        }
    }
}
