/*
 * Copyright 2015 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.provider.ProviderId;

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

    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 Annotations annotations() {
            return null;
        }
        @Override public ProviderId providerId() {
            return null;
        }
    }

    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);
        }
        @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);
        }
    }


}
