// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

package org.chromium.base;

import static org.junit.Assert.assertEquals;

import static org.chromium.base.test.util.BaseFlagTestRule.FEATURE_A;
import static org.chromium.base.test.util.BaseFlagTestRule.FEATURE_B;
import static org.chromium.base.test.util.BaseFlagTestRule.FEATURE_MAP;

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

import org.chromium.base.test.BaseRobolectricTestRunner;
import org.chromium.base.test.util.BaseFlagTestRule;

/** Unit Tests for {@link MutableIntegerParamWithSafeDefault}. */
@RunWith(BaseRobolectricTestRunner.class)
public class MutableIntParamWithSafeDefaultUnitTest {
    private static final String PARAM_A = "a";
    private static final String PARAM_B = "b";

    @Rule public final BaseFlagTestRule mBaseFlagTestRule = new BaseFlagTestRule();

    @Test(expected = AssertionError.class)
    public void testDuplicateFeature() {
        makeParam(FEATURE_A, PARAM_A, 1);
        makeParam(FEATURE_A, PARAM_A, 2);
    }

    @Test
    public void testNativeNotInitialized() {
        MutableIntParamWithSafeDefault paramAA = makeParam(FEATURE_A, PARAM_A, 1);
        MutableIntParamWithSafeDefault paramAB = makeParam(FEATURE_A, PARAM_B, 2);

        assertEquals(1, paramAA.getValue());
        assertEquals(2, paramAB.getValue());
    }

    @Test
    public void testNativeInitialized() {
        MutableIntParamWithSafeDefault paramAA = makeParam(FEATURE_A, PARAM_A, 1);
        MutableIntParamWithSafeDefault paramAB = makeParam(FEATURE_A, PARAM_B, 2);
        MutableIntParamWithSafeDefault paramBA = makeParam(FEATURE_B, PARAM_A, 3);
        MutableIntParamWithSafeDefault paramBB = makeParam(FEATURE_B, PARAM_B, 4);

        FeatureOverrides.newBuilder().enable(FEATURE_A).param(PARAM_A, 11).apply();

        assertEquals(11, paramAA.getValue());
        assertEquals(2, paramAB.getValue());
        assertEquals(3, paramBA.getValue());
        assertEquals(4, paramBB.getValue());
    }

    private MutableIntParamWithSafeDefault makeParam(
            String featureName, String paramName, int defaultValue) {
        return new MutableIntParamWithSafeDefault(
                FEATURE_MAP, featureName, paramName, defaultValue);
    }
}
