/*
 * Copyright 2015-present Open Networking Laboratory
 *
 * 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.ui.topo;

import org.onosproject.net.Annotations;
import org.onosproject.net.ConnectPoint;
import org.onosproject.net.DeviceId;
import org.onosproject.net.Link;
import org.onosproject.net.LinkKey;
import org.onosproject.net.PortNumber;
import org.onosproject.net.driver.Behaviour;
import org.onosproject.net.provider.ProviderId;
import org.onosproject.ui.AbstractUiTest;
import org.onosproject.ui.model.topo.UiLinkId;

/**
 * Base class for unit tests of {@link BiLink} and {@link BiLinkMap}.
 */
public abstract class BiLinkTestBase extends AbstractUiTest {

    protected static class FakeLink implements Link {
        private final ConnectPoint src;
        private final ConnectPoint dst;

        FakeLink(ConnectPoint src, ConnectPoint dst) {
            this.src = src;
            this.dst = dst;
        }

        @Override
        public ConnectPoint src() {
            return src;
        }

        @Override
        public ConnectPoint dst() {
            return dst;
        }

        @Override
        public Type type() {
            return null;
        }

        @Override
        public State state() {
            return null;
        }

        @Override
        public boolean isDurable() {
            return false;
        }

        @Override
        public boolean isExpected() {
            return false;
        }

        @Override
        public Annotations annotations() {
            return null;
        }

        @Override
        public ProviderId providerId() {
            return null;
        }

        @Override
        public <B extends Behaviour> B as(Class<B> projectionClass) {
            return null;
        }

        @Override
        public <B extends Behaviour> boolean is(Class<B> projectionClass) {
            return false;
        }
    }

    protected static final DeviceId DEV_A_ID = DeviceId.deviceId("device-A");
    protected static final DeviceId DEV_B_ID = DeviceId.deviceId("device-B");
    protected static final PortNumber PORT_1 = PortNumber.portNumber(1);
    protected static final PortNumber PORT_2 = PortNumber.portNumber(2);

    protected static final ConnectPoint CP_A1 = new ConnectPoint(DEV_A_ID, PORT_1);
    protected static final ConnectPoint CP_B2 = new ConnectPoint(DEV_B_ID, PORT_2);

    protected static final LinkKey KEY_AB = LinkKey.linkKey(CP_A1, CP_B2);
    protected static final LinkKey KEY_BA = LinkKey.linkKey(CP_B2, CP_A1);

    protected static final Link LINK_AB = new FakeLink(CP_A1, CP_B2);
    protected static final Link LINK_BA = new FakeLink(CP_B2, CP_A1);

    protected static class ConcreteLink extends BiLink {
        public ConcreteLink(LinkKey key, Link link) {
            super(key, link);
        }

        public ConcreteLink(UiLinkId uiLinkId) {
            super(uiLinkId);
        }

        @Override
        public LinkHighlight highlight(Enum<?> type) {
            return null;
        }
    }

    protected static class ConcreteLinkMap extends BiLinkMap<ConcreteLink> {
        @Override
        public ConcreteLink create(LinkKey key, Link link) {
            return new ConcreteLink(key, link);
        }
    }

}
