001package org.eclipse.aether.util.graph.selector;
002
003/*
004 * Licensed to the Apache Software Foundation (ASF) under one
005 * or more contributor license agreements.  See the NOTICE file
006 * distributed with this work for additional information
007 * regarding copyright ownership.  The ASF licenses this file
008 * to you under the Apache License, Version 2.0 (the
009 * "License"); you may not use this file except in compliance
010 * with the License.  You may obtain a copy of the License at
011 * 
012 *  http://www.apache.org/licenses/LICENSE-2.0
013 * 
014 * Unless required by applicable law or agreed to in writing,
015 * software distributed under the License is distributed on an
016 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
017 * KIND, either express or implied.  See the License for the
018 * specific language governing permissions and limitations
019 * under the License.
020 */
021
022import static org.junit.Assert.*;
023
024import org.eclipse.aether.artifact.DefaultArtifact;
025import org.eclipse.aether.collection.DependencyCollectionContext;
026import org.eclipse.aether.collection.DependencySelector;
027import org.eclipse.aether.graph.Dependency;
028import org.junit.Test;
029
030public class AndDependencySelectorTest
031{
032
033    static class DummyDependencySelector
034        implements DependencySelector
035    {
036
037        private final boolean select;
038
039        private final DependencySelector child;
040
041        public DummyDependencySelector()
042        {
043            this( true );
044        }
045
046        public DummyDependencySelector( boolean select )
047        {
048            this.select = select;
049            this.child = this;
050        }
051
052        public DummyDependencySelector( boolean select, DependencySelector child )
053        {
054            this.select = select;
055            this.child = child;
056        }
057
058        public boolean selectDependency( Dependency dependency )
059        {
060            return select;
061        }
062
063        public DependencySelector deriveChildSelector( DependencyCollectionContext context )
064        {
065            return child;
066        }
067
068        @Override
069        public String toString()
070        {
071            return "Dummy(" + select + ')';
072        }
073    }
074
075    @Test
076    public void testNewInstance()
077    {
078        assertNull( AndDependencySelector.newInstance( null, null ) );
079        DependencySelector selector = new DummyDependencySelector();
080        assertSame( selector, AndDependencySelector.newInstance( selector, null ) );
081        assertSame( selector, AndDependencySelector.newInstance( null, selector ) );
082        assertSame( selector, AndDependencySelector.newInstance( selector, selector ) );
083        assertNotNull( AndDependencySelector.newInstance( selector, new DummyDependencySelector() ) );
084    }
085
086    @Test
087    public void testTraverseDependency()
088    {
089        Dependency dependency = new Dependency( new DefaultArtifact( "g:a:v:1" ), "runtime" );
090
091        DependencySelector selector = new AndDependencySelector();
092        assertTrue( selector.selectDependency( dependency ) );
093
094        selector =
095            new AndDependencySelector( new DummyDependencySelector( false ), new DummyDependencySelector( false ) );
096        assertFalse( selector.selectDependency( dependency ) );
097
098        selector =
099            new AndDependencySelector( new DummyDependencySelector( true ), new DummyDependencySelector( false ) );
100        assertFalse( selector.selectDependency( dependency ) );
101
102        selector = new AndDependencySelector( new DummyDependencySelector( true ), new DummyDependencySelector( true ) );
103        assertTrue( selector.selectDependency( dependency ) );
104    }
105
106    @Test
107    public void testDeriveChildSelector_Unchanged()
108    {
109        DependencySelector other1 = new DummyDependencySelector( true );
110        DependencySelector other2 = new DummyDependencySelector( false );
111        DependencySelector selector = new AndDependencySelector( other1, other2 );
112        assertSame( selector, selector.deriveChildSelector( null ) );
113    }
114
115    @Test
116    public void testDeriveChildSelector_OneRemaining()
117    {
118        DependencySelector other1 = new DummyDependencySelector( true );
119        DependencySelector other2 = new DummyDependencySelector( false, null );
120        DependencySelector selector = new AndDependencySelector( other1, other2 );
121        assertSame( other1, selector.deriveChildSelector( null ) );
122    }
123
124    @Test
125    public void testDeriveChildSelector_ZeroRemaining()
126    {
127        DependencySelector other1 = new DummyDependencySelector( true, null );
128        DependencySelector other2 = new DummyDependencySelector( false, null );
129        DependencySelector selector = new AndDependencySelector( other1, other2 );
130        assertNull( selector.deriveChildSelector( null ) );
131    }
132
133    @Test
134    public void testEquals()
135    {
136        DependencySelector other1 = new DummyDependencySelector( true );
137        DependencySelector other2 = new DummyDependencySelector( false );
138        DependencySelector selector1 = new AndDependencySelector( other1, other2 );
139        DependencySelector selector2 = new AndDependencySelector( other2, other1 );
140        DependencySelector selector3 = new AndDependencySelector( other1 );
141        assertEquals( selector1, selector1 );
142        assertEquals( selector1, selector2 );
143        assertNotEquals( selector1, selector3 );
144        assertNotEquals( selector1, this );
145        assertNotEquals( selector1, null );
146    }
147
148    @Test
149    public void testHashCode()
150    {
151        DependencySelector other1 = new DummyDependencySelector( true );
152        DependencySelector other2 = new DummyDependencySelector( false );
153        DependencySelector selector1 = new AndDependencySelector( other1, other2 );
154        DependencySelector selector2 = new AndDependencySelector( other2, other1 );
155        assertEquals( selector1.hashCode(), selector2.hashCode() );
156    }
157
158    @Test
159    public void testToString()
160    {
161        DependencySelector andSelector = new AndDependencySelector(
162            new DummyDependencySelector( true ),
163            new DummyDependencySelector( false )
164        );
165        assertEquals("AndDependencySelector(Dummy(true) && Dummy(false))", andSelector.toString());
166    }
167
168}