/**
* Copyright 2014-2017 Linagora, Université Joseph Fourier, Floralis
*
* The present code is developed in the scope of the joint LINAGORA -
* Université Joseph Fourier - Floralis research program and is designated
* as a "Result" pursuant to the terms and conditions of the LINAGORA
* - Université Joseph Fourier - Floralis research program. Each copyright
* holder of Results enumerated here above fully & independently holds complete
* ownership of the complete Intellectual Property rights applicable to the whole
* of said Results, and may freely exploit it in any manner which does not infringe
* the moral rights of the other copyright holders.
*
* 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 net.roboconf.core.model.beans;
import java.util.Arrays;
import java.util.HashSet;
import org.junit.Assert;
import org.junit.Test;
import net.roboconf.core.internal.tests.TestApplication;
import net.roboconf.core.internal.tests.TestApplicationTemplate;
import net.roboconf.core.model.helpers.InstanceHelpers;
/**
* @author Vincent Zurczak - Linagora
*/
public class ApplicationTest {
@Test
public void testEqualsAndHashCode_1() {
Application app1 = new Application( new TestApplicationTemplate());
app1.setName( "app" );
Application app2 = new Application( new ApplicationTemplate());
app2.setName( "app" );
HashSet<Application> set = new HashSet<>( 2 );
set.add( app1 );
set.add( app2 );
Assert.assertEquals( 1, set.size());
}
@Test
public void testEqualsAndHashCode_2() {
Application app1 = new Application( new TestApplicationTemplate());
app1.setName( "app" );
Application app2 = new Application( app1.getTemplate());
app2.setName( "app" );
HashSet<Application> set = new HashSet<>( 2 );
set.add( app1 );
set.add( app2 );
Assert.assertEquals( 1, set.size());
}
@Test
public void testEqualsAndHashCode_3() {
Application app1 = new Application( new TestApplicationTemplate());
Application app2 = new Application( "app", app1.getTemplate());
HashSet<Application> set = new HashSet<>( 2 );
set.add( app1 );
set.add( app2 );
Assert.assertEquals( 2, set.size());
}
@Test
public void testEquals() {
Application app = new Application( "app", new ApplicationTemplate());
Assert.assertFalse( app.equals( null ));
Assert.assertFalse( app.equals( new Application( app.getTemplate())));
Assert.assertFalse( app.equals( new Object()));
Assert.assertEquals( app, app );
Assert.assertEquals( app, new Application( "app", app.getTemplate()));
Assert.assertEquals( app, new Application( "app", new ApplicationTemplate( "whatever" )));
}
@Test
public void testChain() {
Application app = new Application( new ApplicationTemplate()).name( "ins" ).description( "desc" );
Assert.assertEquals( "ins", app.getName());
Assert.assertEquals( "desc", app.getDescription());
}
@Test
public void testAssociations() {
ApplicationTemplate tpl = new ApplicationTemplate();
Assert.assertEquals( 0, tpl.getAssociatedApplications().size());
Application app1 = new Application( "1", tpl );
Assert.assertEquals( 1, tpl.getAssociatedApplications().size());
Application app2 = new Application( "2", tpl );
Assert.assertEquals( 2, tpl.getAssociatedApplications().size());
app1.removeAssociationWithTemplate();
Assert.assertEquals( 1, tpl.getAssociatedApplications().size());
app2.removeAssociationWithTemplate();
Assert.assertEquals( 0, tpl.getAssociatedApplications().size());
// Limits
app1.removeAssociationWithTemplate();
Application app3 = new Application( null );
app3.removeAssociationWithTemplate();
// No exception
}
@Test
public void checkInstanceReplication() {
TestApplicationTemplate tpl = new TestApplicationTemplate();
Application app = new Application( tpl );
Assert.assertEquals( 5, InstanceHelpers.getAllInstances( app ).size());
Assert.assertEquals( 5, InstanceHelpers.getAllInstances( tpl ).size());
for( Instance inst : InstanceHelpers.getAllInstances( tpl )) {
String instancePath = InstanceHelpers.computeInstancePath( inst );
Instance copiedInstance = InstanceHelpers.findInstanceByPath( app, instancePath );
Assert.assertNotNull( copiedInstance );
Assert.assertEquals( inst.getName(), copiedInstance.getName());
Assert.assertEquals( inst.getComponent(), copiedInstance.getComponent());
Assert.assertEquals( inst.getImports(), copiedInstance.getImports());
Assert.assertEquals( inst.getParent(), copiedInstance.getParent());
Assert.assertEquals( inst.getChildren().size(), copiedInstance.getChildren().size());
// Paths are the same, so the children are equal (even if they are not the same object)
Assert.assertEquals( inst.getChildren(), copiedInstance.getChildren());
Assert.assertEquals( inst.channels, copiedInstance.channels );
Assert.assertEquals( inst.overriddenExports, copiedInstance.overriddenExports );
Assert.assertEquals( inst.data, copiedInstance.data );
Assert.assertFalse( inst == copiedInstance );
}
}
@Test
public void testExternalExports() {
TestApplicationTemplate tpl = new TestApplicationTemplate();
Application app = new Application( tpl );
Assert.assertEquals( app.getExternalExports(), tpl.externalExports );
tpl.externalExports.put( "something", "here" );
Assert.assertEquals( app.getExternalExports(), tpl.externalExports );
}
@Test
public void testApplicationBindings() {
TestApplication app = new TestApplication();
Assert.assertEquals( 0, app.getApplicationBindings().size());
app.bindWithApplication( "p1", "app1" );
Assert.assertEquals( 1, app.getApplicationBindings().size());
Assert.assertEquals( 1, app.getApplicationBindings().get( "p1" ).size());
Assert.assertTrue( app.getApplicationBindings().get( "p1" ).contains( "app1" ));
app.bindWithApplication( "p2", "app1" );
Assert.assertEquals( 2, app.getApplicationBindings().size());
Assert.assertEquals( 1, app.getApplicationBindings().get( "p1" ).size());
Assert.assertEquals( 1, app.getApplicationBindings().get( "p2" ).size());
app.bindWithApplication( "p1", "app1" ); // idempotent
Assert.assertEquals( 2, app.getApplicationBindings().size());
Assert.assertEquals( 1, app.getApplicationBindings().get( "p1" ).size());
Assert.assertEquals( 1, app.getApplicationBindings().get( "p2" ).size());
app.bindWithApplication( "p1", "app2" );
Assert.assertEquals( 2, app.getApplicationBindings().size());
Assert.assertEquals( 2, app.getApplicationBindings().get( "p1" ).size());
Assert.assertTrue( app.getApplicationBindings().get( "p1" ).contains( "app1" ));
Assert.assertTrue( app.getApplicationBindings().get( "p1" ).contains( "app2" ));
Assert.assertEquals( 1, app.getApplicationBindings().get( "p2" ).size());
Assert.assertTrue( app.unbindFromApplication( "p1", "app1" ));
Assert.assertEquals( 2, app.getApplicationBindings().size());
Assert.assertEquals( 1, app.getApplicationBindings().get( "p1" ).size());
Assert.assertTrue( app.getApplicationBindings().get( "p1" ).contains( "app2" ));
Assert.assertEquals( 1, app.getApplicationBindings().get( "p2" ).size());
Assert.assertFalse( app.unbindFromApplication( "p1", "app1" ));
Assert.assertTrue( app.unbindFromApplication( "p1", "app2" ));
Assert.assertEquals( 1, app.getApplicationBindings().size());
Assert.assertEquals( 1, app.getApplicationBindings().get( "p2" ).size());
Assert.assertFalse( app.unbindFromApplication( "inexisting", "app2" ));
Assert.assertEquals( 1, app.getApplicationBindings().size());
Assert.assertEquals( 1, app.getApplicationBindings().get( "p2" ).size());
Assert.assertFalse( app.unbindFromApplication( "p2", "inexisting" ));
Assert.assertEquals( 1, app.getApplicationBindings().size());
Assert.assertEquals( 1, app.getApplicationBindings().get( "p2" ).size());
}
@Test
public void testReplaceApplicationBindings() {
TestApplication app = new TestApplication();
Assert.assertEquals( 0, app.getApplicationBindings().size());
app.bindWithApplication( "p1", "app1" );
Assert.assertEquals( 1, app.getApplicationBindings().size());
Assert.assertEquals( 1, app.getApplicationBindings().get( "p1" ).size());
Assert.assertTrue( app.getApplicationBindings().get( "p1" ).contains( "app1" ));
Assert.assertTrue( app.replaceApplicationBindings( "p1", new HashSet<>( Arrays.asList( "app1", "app2", "app3" ))));
Assert.assertEquals( 3, app.getApplicationBindings().get( "p1" ).size());
Assert.assertFalse( app.replaceApplicationBindings( "p1", new HashSet<>( Arrays.asList( "app1", "app2", "app3" ))));
Assert.assertEquals( 1, app.getApplicationBindings().size());
Assert.assertEquals( 3, app.getApplicationBindings().get( "p1" ).size());
Assert.assertTrue( app.getApplicationBindings().get( "p1" ).contains( "app1" ));
Assert.assertTrue( app.getApplicationBindings().get( "p1" ).contains( "app2" ));
Assert.assertTrue( app.getApplicationBindings().get( "p1" ).contains( "app3" ));
Assert.assertTrue( app.replaceApplicationBindings( "p1", new HashSet<>( Arrays.asList( "app2", "app3" ))));
Assert.assertFalse( app.replaceApplicationBindings( "p1", new HashSet<>( Arrays.asList( "app2", "app3" ))));
Assert.assertEquals( 1, app.getApplicationBindings().size());
Assert.assertEquals( 2, app.getApplicationBindings().get( "p1" ).size());
Assert.assertFalse( app.getApplicationBindings().get( "p1" ).contains( "app1" ));
Assert.assertTrue( app.getApplicationBindings().get( "p1" ).contains( "app2" ));
Assert.assertTrue( app.getApplicationBindings().get( "p1" ).contains( "app3" ));
Assert.assertTrue( app.replaceApplicationBindings( "p2", new HashSet<>( Arrays.asList( "app1", "app2", "app3" ))));
Assert.assertFalse( app.replaceApplicationBindings( "p2", new HashSet<>( Arrays.asList( "app1", "app2", "app3" ))));
Assert.assertEquals( 2, app.getApplicationBindings().size());
Assert.assertEquals( 2, app.getApplicationBindings().get( "p1" ).size());
Assert.assertFalse( app.getApplicationBindings().get( "p1" ).contains( "app1" ));
Assert.assertTrue( app.getApplicationBindings().get( "p1" ).contains( "app2" ));
Assert.assertTrue( app.getApplicationBindings().get( "p1" ).contains( "app3" ));
Assert.assertEquals( 3, app.getApplicationBindings().get( "p2" ).size());
Assert.assertTrue( app.getApplicationBindings().get( "p2" ).contains( "app1" ));
Assert.assertTrue( app.getApplicationBindings().get( "p2" ).contains( "app2" ));
Assert.assertTrue( app.getApplicationBindings().get( "p2" ).contains( "app3" ));
Assert.assertTrue( app.replaceApplicationBindings( "p1", new HashSet<String>( 0 )));
Assert.assertFalse( app.replaceApplicationBindings( "p1", new HashSet<String>( 0 )));
Assert.assertEquals( 1, app.getApplicationBindings().size());
Assert.assertNull( app.getApplicationBindings().get( "p1" ));
Assert.assertEquals( 3, app.getApplicationBindings().get( "p2" ).size());
Assert.assertTrue( app.getApplicationBindings().get( "p2" ).contains( "app1" ));
Assert.assertTrue( app.getApplicationBindings().get( "p2" ).contains( "app2" ));
Assert.assertTrue( app.getApplicationBindings().get( "p2" ).contains( "app3" ));
Assert.assertTrue( app.replaceApplicationBindings( "p2", new HashSet<>( Arrays.asList( "app4", "app5", "app6" ))));
Assert.assertFalse( app.replaceApplicationBindings( "p2", new HashSet<>( Arrays.asList( "app4", "app5", "app6" ))));
Assert.assertEquals( 1, app.getApplicationBindings().size());
Assert.assertNull( app.getApplicationBindings().get( "p1" ));
Assert.assertEquals( 3, app.getApplicationBindings().get( "p2" ).size());
Assert.assertTrue( app.getApplicationBindings().get( "p2" ).contains( "app4" ));
Assert.assertTrue( app.getApplicationBindings().get( "p2" ).contains( "app5" ));
Assert.assertTrue( app.getApplicationBindings().get( "p2" ).contains( "app6" ));
}
@Test
public void testShortcuts() {
Application app = new Application( null );
Assert.assertNull( app.getGraphs());
Assert.assertNotNull( app.getExternalExports());
Assert.assertEquals( 0, app.getExternalExports().size());
app = new TestApplication();
Assert.assertNotNull( app.getGraphs());
Assert.assertNotNull( app.getExternalExports());
}
@Test
public void testSetNameWithAccents() {
Application app = new Application( "avé dés àcçents", new TestApplicationTemplate());
Assert.assertEquals( "ave des accents", app.getName());
Assert.assertEquals( "avé dés àcçents", app.getDisplayName());
app.setName( " " );
Assert.assertEquals( "", app.getName());
Assert.assertEquals( "", app.getDisplayName());
app.setName( null );
Assert.assertNull( app.getName());
Assert.assertNull( app.getDisplayName());
app.setName( " âêû éèà " );
Assert.assertEquals( "aeu eea", app.getName());
Assert.assertEquals( "âêû éèà", app.getDisplayName());
}
}