Package org.apache.felix.ipojo.manipulator.spi

Source Code of org.apache.felix.ipojo.manipulator.spi.AbsBindingModuleTestCase$ComponentLiteral

/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements.  See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership.  The ASF licenses this file
* to you 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.apache.felix.ipojo.manipulator.spi;

import junit.framework.TestCase;

import org.apache.felix.ipojo.annotations.Component;
import org.apache.felix.ipojo.annotations.Provides;
import org.apache.felix.ipojo.annotations.Requires;
import org.apache.felix.ipojo.manipulator.metadata.annotation.registry.Binding;
import org.apache.felix.ipojo.manipulator.metadata.annotation.visitor.generic.GenericVisitorFactory;
import org.apache.felix.ipojo.manipulator.metadata.annotation.visitor.ignore.NullBinding;
import org.apache.felix.ipojo.manipulator.metadata.annotation.visitor.stereotype.StereotypeVisitorFactory;

import java.lang.annotation.ElementType;
import java.util.Iterator;

import static org.apache.felix.ipojo.manipulator.spi.helper.Predicates.on;
import static org.mockito.Mockito.mock;
import static org.objectweb.asm.Type.getType;

/**
* Created with IntelliJ IDEA.
* User: guillaume
* Date: 10/10/12
* Time: 10:37 PM
* To change this template use File | Settings | File Templates.
*/
public class AbsBindingModuleTestCase extends TestCase {

    public void testSimpleBinding() throws Exception {
        final AnnotationVisitorFactory factory = mock(AnnotationVisitorFactory.class);
        AbsBindingModule module = new AbsBindingModule() {
            public void configure() {
                bind(Provides.class).to(factory);
            }
        };
        module.configure();

        Iterator<Binding> i = module.iterator();
        Binding one = i.next();
        assertNotNull(one);
        assertEquals(getType(Provides.class), one.getAnnotationType());
        assertEquals(factory, one.getFactory());

        // Only 1 Binding
        assertFalse(i.hasNext());
    }

    public void testTwoBindings() throws Exception {
        final AnnotationVisitorFactory factory = mock(AnnotationVisitorFactory.class);
        AbsBindingModule module = new AbsBindingModule() {
            public void configure() {
                bind(Provides.class).to(factory);
                bind(Requires.class).to(factory);
            }
        };
        module.configure();

        Iterator<Binding> i = module.iterator();
        Binding one = i.next();
        assertNotNull(one);
        assertEquals(getType(Provides.class), one.getAnnotationType());
        assertEquals(factory, one.getFactory());

        // Second Binding
        Binding two = i.next();
        assertNotNull(two);
        assertEquals(getType(Requires.class), two.getAnnotationType());
        assertEquals(factory, two.getFactory());
    }

    public void testTwoBindingsForSameAnnotation() throws Exception {
        final AnnotationVisitorFactory factory = mock(AnnotationVisitorFactory.class);
        final AnnotationVisitorFactory factory2 = mock(AnnotationVisitorFactory.class);
        AbsBindingModule module = new AbsBindingModule() {
            public void configure() {
                bind(Provides.class).to(factory);
                bind(Provides.class).to(factory2);
            }
        };
        module.configure();

        Iterator<Binding> i = module.iterator();
        Binding one = i.next();
        assertNotNull(one);
        assertEquals(getType(Provides.class), one.getAnnotationType());
        assertEquals(factory, one.getFactory());

        // Second Binding
        Binding two = i.next();
        assertNotNull(two);
        assertEquals(getType(Provides.class), two.getAnnotationType());
        assertEquals(factory2, two.getFactory());
    }

    public void testConditionalBinding() throws Exception {
        final AnnotationVisitorFactory factory = mock(AnnotationVisitorFactory.class);
        AbsBindingModule module = new AbsBindingModule() {
            public void configure() {
                bind(Provides.class)
                        .when(on(ElementType.FIELD))
                        .to(factory);
            }
        };
        module.configure();

        Iterator<Binding> i = module.iterator();
        Binding one = i.next();
        assertNotNull(one);
        assertEquals(getType(Provides.class), one.getAnnotationType());
        assertEquals(factory, one.getFactory());

        // Only 1 Binding
        assertFalse(i.hasNext());
    }

    public void testConditionalBindings() throws Exception {
        final AnnotationVisitorFactory factory = mock(AnnotationVisitorFactory.class);
        final AnnotationVisitorFactory factory2 = mock(AnnotationVisitorFactory.class);
        AbsBindingModule module = new AbsBindingModule() {
            public void configure() {
                bind(Provides.class)
                        .when(on(ElementType.FIELD))
                        .to(factory)
                        .when(on(ElementType.PARAMETER))
                        .to(factory2);
            }
        };
        module.configure();

        Iterator<Binding> i = module.iterator();
        Binding one = i.next();
        assertNotNull(one);
        assertEquals(getType(Provides.class), one.getAnnotationType());
        assertEquals(factory, one.getFactory());

        // Second Binding
        Binding two = i.next();
        assertNotNull(two);
        assertEquals(getType(Provides.class), two.getAnnotationType());
        assertEquals(factory2, two.getFactory());
    }

    public void testHandlerBindings() throws Exception {
        AbsBindingModule module = new AbsBindingModule() {
            public void configure() {
                bindHandlerBinding(Bound.class).to("com.acme", "foo");
            }
        };
        module.configure();

        Iterator<Binding> i = module.iterator();
        Binding one = i.next();
        assertNotNull(one);
        assertEquals(getType(Bound.class), one.getAnnotationType());
        assertTrue(one.getFactory() instanceof GenericVisitorFactory);
    }

    public void testStereotypeBindings() throws Exception {
        AbsBindingModule module = new AbsBindingModule() {
            public void configure() {
                bindStereotype(Bound.class)
                        .with(new ComponentLiteral() {
                            @Override
                            public boolean publicFactory() {
                                return false;
                            }
                        });
            }
        };
        module.configure();

        Iterator<Binding> i = module.iterator();
        Binding one = i.next();
        assertNotNull(one);
        assertEquals(getType(Bound.class), one.getAnnotationType());
        assertTrue(one.getFactory() instanceof StereotypeVisitorFactory);
    }


    public void testIgnoreBindings() throws Exception {
        AbsBindingModule module = new AbsBindingModule() {
            public void configure() {
                bindIgnore(Bound.class);
            }
        };
        module.configure();

        Iterator<Binding> i = module.iterator();
        Binding one = i.next();
        assertEquals(getType(Bound.class), one.getAnnotationType());
        assertTrue(one instanceof NullBinding);
    }

    private static @interface Bound {}

    private static class ComponentLiteral extends AnnotationLiteral<Component> implements Component {

        public boolean public_factory() {
            return true;
        }

        public boolean publicFactory() {
            return true;
        }

        public String name() {
            return "";
        }

        public boolean architecture() {
            return false;
        }

        public boolean immediate() {
            return false;
        }

        public boolean propagation() {
            return false;
        }

        public String managedservice() {
            return "";
        }

        public String factory_method() {
            return "";
        }

        public String factoryMethod() {
            return "";
        }

        public String version() {
            return "";
        }
    }


}
TOP

Related Classes of org.apache.felix.ipojo.manipulator.spi.AbsBindingModuleTestCase$ComponentLiteral

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.