/*
 * Copyright (C) 2017 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.settingslib.graph;

import static com.google.common.truth.Truth.assertThat;

import android.content.Context;
import android.graphics.drawable.VectorDrawable;

import com.android.settingslib.R;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;

@RunWith(RobolectricTestRunner.class)
public class BluetoothDeviceLayerDrawableTest {
    private static final int RES_ID = com.android.internal.R.drawable.ic_phone;
    private static final int BATTERY_LEVEL = 15;
    private static final float BATTERY_ICON_SCALE = 0.75f;
    private static final int BATTERY_ICON_PADDING_TOP = 6;
    private static final float TOLERANCE = 0.001f;

    private Context mContext;

    @Before
    public void setUp() {
        mContext = RuntimeEnvironment.application;
    }

    @Test
    public void testCreateLayerDrawable_configCorrect() {
        BluetoothDeviceLayerDrawable drawable = BluetoothDeviceLayerDrawable.createLayerDrawable(
                mContext, RES_ID, BATTERY_LEVEL);

        assertThat(drawable.getDrawable(0)).isInstanceOf(VectorDrawable.class);
        assertThat(drawable.getDrawable(1)).isInstanceOf(
                BluetoothDeviceLayerDrawable.BatteryMeterDrawable.class);
        assertThat(drawable.getLayerInsetStart(1)).isEqualTo(
                drawable.getDrawable(0).getIntrinsicWidth());
        assertThat(drawable.getLayerInsetTop(1)).isEqualTo(0);
    }

    @Test
    public void testCreateLayerDrawable_withIconScale_configCorrect() {
        BluetoothDeviceLayerDrawable drawable = BluetoothDeviceLayerDrawable.createLayerDrawable(
                mContext, RES_ID, BATTERY_LEVEL, BATTERY_ICON_SCALE);

        assertThat(drawable.getDrawable(0)).isInstanceOf(VectorDrawable.class);
        assertThat(drawable.getDrawable(1)).isInstanceOf(
                BluetoothDeviceLayerDrawable.BatteryMeterDrawable.class);
        assertThat(drawable.getLayerInsetStart(1)).isEqualTo(
                drawable.getDrawable(0).getIntrinsicWidth());
        assertThat(drawable.getLayerInsetTop(1)).isEqualTo(BATTERY_ICON_PADDING_TOP);
    }

    @Test
    public void testBatteryMeterDrawable_configCorrect() {
        BluetoothDeviceLayerDrawable.BatteryMeterDrawable batteryDrawable =
                new BluetoothDeviceLayerDrawable.BatteryMeterDrawable(mContext,
                        R.color.meter_background_color, BATTERY_LEVEL);

        assertThat(batteryDrawable.getAspectRatio()).isWithin(TOLERANCE).of(0.35f);
        assertThat(batteryDrawable.getRadiusRatio()).isWithin(TOLERANCE).of(0f);
        assertThat(batteryDrawable.getBatteryLevel()).isEqualTo(BATTERY_LEVEL);
    }

    @Test
    public void testConstantState_returnTwinBluetoothLayerDrawable() {
        BluetoothDeviceLayerDrawable drawable = BluetoothDeviceLayerDrawable.createLayerDrawable(
                mContext, RES_ID, BATTERY_LEVEL);

        BluetoothDeviceLayerDrawable twinDrawable =
                (BluetoothDeviceLayerDrawable) drawable.getConstantState().newDrawable();

        assertThat(twinDrawable.getDrawable(0)).isNotNull();
        assertThat(twinDrawable.getDrawable(1)).isNotNull();
        assertThat(twinDrawable.getLayerInsetTop(1)).isEqualTo(drawable.getLayerInsetTop(1));
    }

    @Test
    public void testCreateLayerDrawable_bluetoothDrawable_hasCorrectFrameColor() {
        BluetoothDeviceLayerDrawable drawable = BluetoothDeviceLayerDrawable.createLayerDrawable(
                mContext, RES_ID, BATTERY_LEVEL);
        BluetoothDeviceLayerDrawable.BatteryMeterDrawable batteryMeterDrawable =
                (BluetoothDeviceLayerDrawable.BatteryMeterDrawable) drawable.getDrawable(1);

        assertThat(batteryMeterDrawable.mFrameColor).isEqualTo(
                mContext.getColor(R.color.meter_background_color));
    }
}
