/*
 * Copyright (C) 2016 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.setupwizardlib.test;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;

import android.content.Context;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.InsetDrawable;
import android.os.Build;
import android.support.test.InstrumentationRegistry;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
import android.view.ContextThemeWrapper;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import androidx.recyclerview.widget.RecyclerView;

import com.android.setupwizardlib.GlifPreferenceLayout;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;

@RunWith(AndroidJUnit4.class)
@SmallTest
public class GlifPreferenceLayoutTest {

    private Context mContext;

    @Before
    public void setUp() throws Exception {
        mContext = new ContextThemeWrapper(InstrumentationRegistry.getContext(),
                R.style.SuwThemeGlif_Light);
    }

    @Test
    public void testDefaultTemplate() {
        GlifPreferenceLayout layout = new GlifPreferenceLayout(mContext);
        assertPreferenceTemplateInflated(layout);
    }

    @Test
    public void testGetRecyclerView() {
        GlifPreferenceLayout layout = new GlifPreferenceLayout(mContext);
        assertPreferenceTemplateInflated(layout);
        assertNotNull("getRecyclerView should not be null", layout.getRecyclerView());
    }

    @Test
    public void testOnCreateRecyclerView() {
        GlifPreferenceLayout layout = new GlifPreferenceLayout(mContext);
        assertPreferenceTemplateInflated(layout);
        final RecyclerView recyclerView = layout.onCreateRecyclerView(LayoutInflater.from(mContext),
                layout, null /* savedInstanceState */);
        assertNotNull("RecyclerView created should not be null", recyclerView);
    }

    @Test
    public void testDividerInset() {
        GlifPreferenceLayout layout = new GlifPreferenceLayout(mContext);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            layout.setLayoutDirection(View.LAYOUT_DIRECTION_LTR);
        }
        assertPreferenceTemplateInflated(layout);

        layout.addView(layout.onCreateRecyclerView(LayoutInflater.from(mContext), layout,
                null /* savedInstanceState */));

        layout.setDividerInset(10);
        assertEquals("Divider inset should be 10", 10, layout.getDividerInset());

        final Drawable divider = layout.getDivider();
        assertTrue("Divider should be instance of InsetDrawable", divider instanceof InsetDrawable);
    }

    private void assertPreferenceTemplateInflated(GlifPreferenceLayout layout) {
        View contentContainer = layout.findViewById(R.id.suw_layout_content);
        assertTrue("@id/suw_layout_content should be a ViewGroup",
                contentContainer instanceof ViewGroup);

        assertNotNull("Header text view should not be null",
                layout.findManagedViewById(R.id.suw_layout_title));
        assertNotNull("Icon view should not be null",
                layout.findManagedViewById(R.id.suw_layout_icon));
    }
}
