/*
 * 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));

    }
}
