/*
 * Copyright 2018-present Open Networking Foundation
 *
 * 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 org.onosproject.net.config.basics;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.JsonNodeFactory;
import org.junit.Test;
import org.onosproject.net.config.ConfigApplyDelegate;

import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.is;

public class AllowedEntityConfigTest {

    class TestConfig extends AllowedEntityConfig<String> {
        TestConfig() {
        }
    }

    @Test
    public void basicTest() {
        ConfigApplyDelegate delegate = configApply -> { };
        ObjectMapper mapper = new ObjectMapper();

        TestConfig allowed = new TestConfig();
        TestConfig notAllowed = new TestConfig();

        allowed.init("enabled", "KEY", JsonNodeFactory.instance.objectNode(), mapper, delegate);

        notAllowed.init("disabled", "KEY", JsonNodeFactory.instance.objectNode(), mapper, delegate);
        notAllowed.isAllowed(false);

        assertThat(allowed.isAllowed(), is(true));
        assertThat(notAllowed.isAllowed(), is(false));

        notAllowed.isAllowed(true);
        allowed.isAllowed(false);
        assertThat(allowed.isAllowed(), is(false));
        assertThat(notAllowed.isAllowed(), is(true));
    }
}