/*
 * Copyright 2014 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.onlab.onos.event;

import org.junit.Before;
import org.junit.Test;

import static org.junit.Assert.*;

/**
 * Tests of the default event sink registry.
 */
public class DefaultEventSinkRegistryTest {

    private DefaultEventSinkRegistry registry;

    private static class FooEvent extends TestEvent {
        public FooEvent(String subject) {
            super(Type.FOO, subject);
        }
    }

    private static class BarEvent extends TestEvent {
        public BarEvent(String subject) {
            super(Type.BAR, subject);
        }
    }

    private static class FooSink implements EventSink<FooEvent> {
        @Override public void process(FooEvent event) {}
    }

    private static class BarSink implements EventSink<BarEvent> {
        @Override public void process(BarEvent event) {}
    }

    @Before
    public void setUp() {
        registry = new DefaultEventSinkRegistry();
    }

    @Test
    public void basics() {
        FooSink fooSink = new FooSink();
        BarSink barSink = new BarSink();
        registry.addSink(FooEvent.class, fooSink);
        registry.addSink(BarEvent.class, barSink);

        assertEquals("incorrect sink count", 2, registry.getSinks().size());
        assertEquals("incorrect sink", fooSink, registry.getSink(FooEvent.class));
        assertEquals("incorrect sink", barSink, registry.getSink(BarEvent.class));

        registry.removeSink(FooEvent.class);
        assertNull("incorrect sink", registry.getSink(FooEvent.class));
        assertEquals("incorrect sink", barSink, registry.getSink(BarEvent.class));

    }
}
