/**
* Copyright 2016-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.tooling.core.autocompletion;
import static net.roboconf.core.dsl.ParsingConstants.KEYWORD_IMPORT;
import static net.roboconf.core.dsl.ParsingConstants.KEYWORD_INSTANCE_OF;
import static net.roboconf.core.dsl.ParsingConstants.PROPERTY_INSTANCE_CHANNELS;
import static net.roboconf.core.dsl.ParsingConstants.PROPERTY_INSTANCE_NAME;
import static net.roboconf.tooling.core.autocompletion.GraphsCompletionProposer.IMPORT_PREFIX;
import static net.roboconf.tooling.core.autocompletion.InstancesCompletionProposer.INSTANCE_OF_BLOCK;
import static net.roboconf.tooling.core.autocompletion.InstancesCompletionProposer.INSTANCE_OF_PREFIX;
import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.junit.Assert;
import org.junit.Test;
import net.roboconf.core.Constants;
import net.roboconf.core.internal.tests.TestUtils;
import net.roboconf.core.utils.Utils;
import net.roboconf.tooling.core.autocompletion.ICompletionProposer.RoboconfCompletionProposal;
/**
* @author Vincent Zurczak - Linagora
*/
public class InstancesCompletionProposerTest extends AbstractCompletionProposerTest {
@Test
public void testOffsetAtZero() throws Exception {
// Expected: import, instance of, instance of block
Couple couple = prepare( "app1", "initial.instances", 0 );
List<RoboconfCompletionProposal> proposals = couple.proposer.findProposals( couple.text );
verifyNeutralOffset( proposals );
}
@Test
public void testOffsetInComment_1() throws Exception {
// Expected: nothing
Couple couple = prepare( "app1", "initial.instances", 9 );
List<RoboconfCompletionProposal> proposals = couple.proposer.findProposals( couple.text );
Assert.assertEquals( 0, proposals.size());
}
@Test
public void testOffsetInComment_2() throws Exception {
// Expected: nothing
Couple couple = prepare( "app1", "initial.instances", 32 );
List<RoboconfCompletionProposal> proposals = couple.proposer.findProposals( couple.text );
Assert.assertEquals( 0, proposals.size());
}
@Test
public void testOffsetInInlineCommentInInstance() throws Exception {
// Expected: nothing
Couple couple = prepare( "app1", "initial.instances", 83 );
List<RoboconfCompletionProposal> proposals = couple.proposer.findProposals( couple.text );
Assert.assertEquals( 0, proposals.size());
}
@Test
public void testOffsetRightBeforeComment() throws Exception {
// Expected: import, instance of, instance of block
Couple couple = prepare( "app1", "initial.instances", 1 );
List<RoboconfCompletionProposal> proposals = couple.proposer.findProposals( couple.text );
verifyNeutralOffset( proposals );
}
@Test
public void testOffsetRightAfterCommentSymbol() throws Exception {
// Expected: nothing
Couple couple = prepare( "app1", "initial.instances", 2 );
List<RoboconfCompletionProposal> proposals = couple.proposer.findProposals( couple.text );
Assert.assertEquals( 0, proposals.size());
}
@Test
public void testOffsetOutisdeInstances() throws Exception {
// Expected: import, instance of, instance of block
Couple couple = prepare( "app1", "initial.instances", 43 );
List<RoboconfCompletionProposal> proposals = couple.proposer.findProposals( couple.text );
verifyNeutralOffset( proposals );
couple = prepare( "app1", "initial.instances", 107 );
proposals = couple.proposer.findProposals( couple.text );
verifyNeutralOffset( proposals );
}
@Test
public void testOffsetRightClosingCurlyBracket() throws Exception {
// Expected: nothing
Couple couple = prepare( "app1", "initial.instances", 2 );
couple.text = "instanceof Toto {\n}";
List<RoboconfCompletionProposal> proposals = couple.proposer.findProposals( couple.text );
Assert.assertEquals( 0, proposals.size());
}
@Test
public void testOffsetInsideInstances() throws Exception {
// Expected: "channels:", "name:", instance of, instance of block
Couple couple = prepare( "app1", "initial.instances", 61 );
List<RoboconfCompletionProposal> proposals = couple.proposer.findProposals( couple.text );
verifyBasicInstanceProperties( proposals );
couple = prepare( "app1", "initial.instances", 99 );
proposals = couple.proposer.findProposals( couple.text );
verifyBasicInstanceProperties( proposals );
couple = prepare( "app1", "initial.instances", 103 );
proposals = couple.proposer.findProposals( couple.text );
verifyBasicInstanceProperties( proposals );
}
@Test
public void testOffsetInsideInstancesWithInstanceOfPrefix() throws Exception {
// Expected: instance of, instance of block
Couple couple = prepare( "app1", "initial.instances", 61 );
couple.text += "inst";
List<RoboconfCompletionProposal> proposals = couple.proposer.findProposals( couple.text );
Assert.assertEquals( 2, proposals.size());
Assert.assertEquals( KEYWORD_INSTANCE_OF, proposals.get( 0 ).getProposalName());
Assert.assertEquals( INSTANCE_OF_PREFIX, proposals.get( 0 ).getProposalString());
Assert.assertNull( proposals.get( 0 ).getProposalDescription());
Assert.assertEquals( 4, proposals.get( 0 ).getReplacementOffset());
Assert.assertEquals( INSTANCE_OF_BLOCK, proposals.get( 1 ).getProposalName());
Assert.assertTrue( proposals.get( 1 ).getProposalString().startsWith( INSTANCE_OF_PREFIX ));
Assert.assertTrue( proposals.get( 1 ).getProposalDescription().startsWith( INSTANCE_OF_BLOCK ));
Assert.assertEquals( 4, proposals.get( 1 ).getReplacementOffset());
}
@Test
public void testOffsetInsideInstancesWithBasicPropertyPrefix_1() throws Exception {
// Expected: "name:"
Couple couple = prepare( "app1", "initial.instances", 61 );
couple.text += "nam";
List<RoboconfCompletionProposal> proposals = couple.proposer.findProposals( couple.text );
Assert.assertEquals( 1, proposals.size());
Assert.assertEquals( PROPERTY_INSTANCE_NAME + ": ", proposals.get( 0 ).getProposalName());
Assert.assertEquals( PROPERTY_INSTANCE_NAME + ": ", proposals.get( 0 ).getProposalString());
Assert.assertNull( proposals.get( 0 ).getProposalDescription());
Assert.assertEquals( 3, proposals.get( 0 ).getReplacementOffset());
}
@Test
public void testOffsetInsideInstancesWithBasicPropertyPrefix_2() throws Exception {
// Expected: "name:"
Couple couple = prepare( "app1", "initial.instances", 61 );
couple.text += "name";
List<RoboconfCompletionProposal> proposals = couple.proposer.findProposals( couple.text );
Assert.assertEquals( 1, proposals.size());
Assert.assertEquals( PROPERTY_INSTANCE_NAME + ": ", proposals.get( 0 ).getProposalName());
Assert.assertEquals( PROPERTY_INSTANCE_NAME + ": ", proposals.get( 0 ).getProposalString());
Assert.assertNull( proposals.get( 0 ).getProposalDescription());
Assert.assertEquals( 4, proposals.get( 0 ).getReplacementOffset());
}
@Test
public void testOffsetInsideInstancesWithBasicPropertyPrefix_3() throws Exception {
// Expected: "name:"
Couple couple = prepare( "app1", "initial.instances", 61 );
couple.text += "nAMe:";
List<RoboconfCompletionProposal> proposals = couple.proposer.findProposals( couple.text );
Assert.assertEquals( 1, proposals.size());
Assert.assertEquals( PROPERTY_INSTANCE_NAME + ": ", proposals.get( 0 ).getProposalName());
Assert.assertEquals( PROPERTY_INSTANCE_NAME + ": ", proposals.get( 0 ).getProposalString());
Assert.assertNull( proposals.get( 0 ).getProposalDescription());
Assert.assertEquals( 5, proposals.get( 0 ).getReplacementOffset());
}
@Test
public void testOffsetInsideInstancesWithBasicPropertyPrefix_4() throws Exception {
// Expected: "name:"
Couple couple = prepare( "app1", "initial.instances", 61 );
couple.text += "name: ";
List<RoboconfCompletionProposal> proposals = couple.proposer.findProposals( couple.text );
Assert.assertEquals( 0, proposals.size());
}
@Test
public void testOffsetInsideInstancesWithBasicPropertyPrefix_5() throws Exception {
// Expected: "name:"
Couple couple = prepare( "app1", "initial.instances", 61 );
couple.text += "name : ";
List<RoboconfCompletionProposal> proposals = couple.proposer.findProposals( couple.text );
Assert.assertEquals( 0, proposals.size());
}
@Test
public void testOffsetInsideInstancesWithInvalidPrefix() throws Exception {
// Expected: nothing
Couple couple = prepare( "app1", "initial.instances", 61 );
couple.text += "pop";
List<RoboconfCompletionProposal> proposals = couple.proposer.findProposals( couple.text );
Assert.assertEquals( 0, proposals.size());
}
@Test
public void testOffsetOutisdeInstancesWithImportPrefix() throws Exception {
// Expected: import
Couple couple = prepare( "app1", "initial.instances", 43 );
couple.text += "im";
List<RoboconfCompletionProposal> proposals = couple.proposer.findProposals( couple.text );
Assert.assertEquals( 1, proposals.size());
Assert.assertEquals( KEYWORD_IMPORT, proposals.get( 0 ).getProposalName());
Assert.assertEquals( IMPORT_PREFIX, proposals.get( 0 ).getProposalString());
Assert.assertNull( proposals.get( 0 ).getProposalDescription());
Assert.assertEquals( 2, proposals.get( 0 ).getReplacementOffset());
}
@Test
public void testOffsetOutisdeInstancesWithFakeImportPrefix() throws Exception {
// Expected: nothing
Couple couple = prepare( "app1", "initial.instances", 43 );
couple.text += "im po";
List<RoboconfCompletionProposal> proposals = couple.proposer.findProposals( couple.text );
Assert.assertEquals( 0, proposals.size());
}
@Test
public void testOffsetOutisdeInstancesWithInstanceOfPrefix() throws Exception {
// Expected: instance of, instance of block
Couple couple = prepare( "app1", "initial.instances", 43 );
couple.text += "in";
List<RoboconfCompletionProposal> proposals = couple.proposer.findProposals( couple.text );
Assert.assertEquals( 2, proposals.size());
Assert.assertEquals( KEYWORD_INSTANCE_OF, proposals.get( 0 ).getProposalName());
Assert.assertEquals( INSTANCE_OF_PREFIX, proposals.get( 0 ).getProposalString());
Assert.assertNull( proposals.get( 0 ).getProposalDescription());
Assert.assertEquals( 2, proposals.get( 0 ).getReplacementOffset());
Assert.assertEquals( INSTANCE_OF_BLOCK, proposals.get( 1 ).getProposalName());
Assert.assertTrue( proposals.get( 1 ).getProposalString().startsWith( INSTANCE_OF_PREFIX ));
Assert.assertTrue( proposals.get( 1 ).getProposalDescription().startsWith( INSTANCE_OF_BLOCK ));
Assert.assertEquals( 2, proposals.get( 1 ).getReplacementOffset());
}
@Test
public void testOffsetOutisdeInstancesWithFakeInstanceOfPrefix() throws Exception {
// Expected: nothing
Couple couple = prepare( "app1", "initial.instances", 43 );
couple.text += "instanceof";
List<RoboconfCompletionProposal> proposals = couple.proposer.findProposals( couple.text );
Assert.assertEquals( 0, proposals.size());
}
@Test
public void testOffsetInsideInstancesWithComponentPropertiesAndWithoutInheritance() throws Exception {
// Expected: "c2.ip", "channels:", "name:", instance of, instance of block
Couple couple = prepare( "app3", "initial.instances", 61 );
List<RoboconfCompletionProposal> proposals = couple.proposer.findProposals( couple.text );
Assert.assertEquals( 5, proposals.size());
Assert.assertEquals( "c2.ip: ", proposals.get( 0 ).getProposalName());
Assert.assertEquals( "c2.ip: ", proposals.get( 0 ).getProposalString());
Assert.assertEquals( CompletionUtils.SET_BY_ROBOCONF, proposals.get( 0 ).getProposalDescription());
Assert.assertEquals( 0, proposals.get( 0 ).getReplacementOffset());
Assert.assertEquals( PROPERTY_INSTANCE_CHANNELS + ": ", proposals.get( 1 ).getProposalName());
Assert.assertEquals( PROPERTY_INSTANCE_CHANNELS + ": ", proposals.get( 1 ).getProposalString());
Assert.assertNull( proposals.get( 1 ).getProposalDescription());
Assert.assertEquals( 0, proposals.get( 1 ).getReplacementOffset());
Assert.assertEquals( PROPERTY_INSTANCE_NAME + ": ", proposals.get( 2 ).getProposalName());
Assert.assertEquals( PROPERTY_INSTANCE_NAME + ": ", proposals.get( 2 ).getProposalString());
Assert.assertNull( proposals.get( 2 ).getProposalDescription());
Assert.assertEquals( 0, proposals.get( 2 ).getReplacementOffset());
Assert.assertEquals( KEYWORD_INSTANCE_OF, proposals.get( 3 ).getProposalName());
Assert.assertEquals( INSTANCE_OF_PREFIX, proposals.get( 3 ).getProposalString());
Assert.assertNull( proposals.get( 3 ).getProposalDescription());
Assert.assertEquals( 0, proposals.get( 3 ).getReplacementOffset());
Assert.assertEquals( INSTANCE_OF_BLOCK, proposals.get( 4 ).getProposalName());
Assert.assertTrue( proposals.get( 4 ).getProposalString().startsWith( INSTANCE_OF_PREFIX ));
Assert.assertTrue( proposals.get( 4 ).getProposalDescription().startsWith( INSTANCE_OF_BLOCK ));
Assert.assertEquals( 0, proposals.get( 4 ).getReplacementOffset());
}
@Test
public void testOffsetInsideInstancesWithComponentPropertiesAfterInstance() throws Exception {
// Expected: "c2.ip", "channels:", "name:", instance of, instance of block
Couple couple = prepare( "app3", "initial.instances", 142 );
List<RoboconfCompletionProposal> proposals = couple.proposer.findProposals( couple.text );
Assert.assertEquals( 5, proposals.size());
Assert.assertEquals( "c2.ip: ", proposals.get( 0 ).getProposalName());
Assert.assertEquals( "c2.ip: ", proposals.get( 0 ).getProposalString());
Assert.assertEquals( CompletionUtils.SET_BY_ROBOCONF, proposals.get( 0 ).getProposalDescription());
Assert.assertEquals( 0, proposals.get( 0 ).getReplacementOffset());
Assert.assertEquals( PROPERTY_INSTANCE_CHANNELS + ": ", proposals.get( 1 ).getProposalName());
Assert.assertEquals( PROPERTY_INSTANCE_CHANNELS + ": ", proposals.get( 1 ).getProposalString());
Assert.assertNull( proposals.get( 1 ).getProposalDescription());
Assert.assertEquals( 0, proposals.get( 1 ).getReplacementOffset());
Assert.assertEquals( PROPERTY_INSTANCE_NAME + ": ", proposals.get( 2 ).getProposalName());
Assert.assertEquals( PROPERTY_INSTANCE_NAME + ": ", proposals.get( 2 ).getProposalString());
Assert.assertNull( proposals.get( 2 ).getProposalDescription());
Assert.assertEquals( 0, proposals.get( 2 ).getReplacementOffset());
Assert.assertEquals( KEYWORD_INSTANCE_OF, proposals.get( 3 ).getProposalName());
Assert.assertEquals( INSTANCE_OF_PREFIX, proposals.get( 3 ).getProposalString());
Assert.assertNull( proposals.get( 3 ).getProposalDescription());
Assert.assertEquals( 0, proposals.get( 3 ).getReplacementOffset());
Assert.assertEquals( INSTANCE_OF_BLOCK, proposals.get( 4 ).getProposalName());
Assert.assertTrue( proposals.get( 4 ).getProposalString().startsWith( INSTANCE_OF_PREFIX ));
Assert.assertTrue( proposals.get( 4 ).getProposalDescription().startsWith( INSTANCE_OF_BLOCK ));
Assert.assertEquals( 0, proposals.get( 4 ).getReplacementOffset());
}
@Test
public void testOffsetInsideInstancesWithComponentPropertiesAndPrefixAndWithoutInheritance() throws Exception {
// Expected: "c2.ip", "channels:"
Couple couple = prepare( "app3", "initial.instances", 61 );
couple.text += "C";
List<RoboconfCompletionProposal> proposals = couple.proposer.findProposals( couple.text );
Assert.assertEquals( 2, proposals.size());
Assert.assertEquals( "c2.ip: ", proposals.get( 0 ).getProposalName());
Assert.assertEquals( "c2.ip: ", proposals.get( 0 ).getProposalString());
Assert.assertEquals( CompletionUtils.SET_BY_ROBOCONF, proposals.get( 0 ).getProposalDescription());
Assert.assertEquals( 1, proposals.get( 0 ).getReplacementOffset());
Assert.assertEquals( PROPERTY_INSTANCE_CHANNELS + ": ", proposals.get( 1 ).getProposalName());
Assert.assertEquals( PROPERTY_INSTANCE_CHANNELS + ": ", proposals.get( 1 ).getProposalString());
Assert.assertNull( proposals.get( 1 ).getProposalDescription());
Assert.assertEquals( 1, proposals.get( 1 ).getReplacementOffset());
}
@Test
public void testOffsetInsideInstancesWithInvalidComponent() throws Exception {
// Expected: nothing
Couple couple = prepare( "app3", "initial.instances", 500 );
couple.text += "instance of InvalidComponent {\n\t";
List<RoboconfCompletionProposal> proposals = couple.proposer.findProposals( couple.text );
verifyBasicInstanceProperties( proposals );
}
@Test
public void testOffsetInsideInstancesWithNoGraph() throws Exception {
// Expected: "channels:", "name:", instance of, instance of block
Couple couple = prepare( "app4", "initial.instances", 61 );
List<RoboconfCompletionProposal> proposals = couple.proposer.findProposals( couple.text );
verifyBasicInstanceProperties( proposals );
}
@Test
public void testOffsetInsideInstancesWithComponentPropertiesAndWithInheritance() throws Exception {
// Expected: variables, "channels:", "name:", instance of, instance of block
Map<String,String> expected = new LinkedHashMap<> ();
expected.put( "c1.ip: ", CompletionUtils.SET_BY_ROBOCONF );
expected.put( "c1.port: ", CompletionUtils.DEFAULT_VALUE + "8100" );
expected.put( "c1.v1: ", CompletionUtils.DEFAULT_VALUE + "version1" );
expected.put( "c1.v2: ", CompletionUtils.DEFAULT_VALUE + "version2" );
expected.put( PROPERTY_INSTANCE_CHANNELS + ": ", null );
expected.put( "f1.v1: ", CompletionUtils.DEFAULT_VALUE + "version1" );
expected.put( "f1.v2: ", CompletionUtils.DEFAULT_VALUE + "version2" );
expected.put( PROPERTY_INSTANCE_NAME + ": ", null );
Couple couple = prepare( "app3", "initial.instances", 135 );
List<RoboconfCompletionProposal> proposals = couple.proposer.findProposals( couple.text );
Assert.assertEquals( expected.size() + 2, proposals.size());
int index = 0;
for( Map.Entry<String,String> entry : expected.entrySet()) {
Assert.assertEquals( entry.getKey(), proposals.get( index ).getProposalName());
Assert.assertEquals( entry.getKey(), proposals.get( index ).getProposalString());
Assert.assertEquals( entry.getValue(), proposals.get( index ).getProposalDescription());
Assert.assertEquals( 0, proposals.get( index ).getReplacementOffset());
index ++;
}
Assert.assertEquals( KEYWORD_INSTANCE_OF, proposals.get( index ).getProposalName());
Assert.assertEquals( INSTANCE_OF_PREFIX, proposals.get( index ).getProposalString());
Assert.assertNull( proposals.get( index ).getProposalDescription());
Assert.assertEquals( 0, proposals.get( index ).getReplacementOffset());
index ++;
Assert.assertEquals( INSTANCE_OF_BLOCK, proposals.get( index ).getProposalName());
Assert.assertTrue( proposals.get( index ).getProposalString().startsWith( INSTANCE_OF_PREFIX ));
Assert.assertTrue( proposals.get( index ).getProposalDescription().startsWith( INSTANCE_OF_BLOCK ));
Assert.assertEquals( 0, proposals.get( index ).getReplacementOffset());
}
@Test
public void testOffsetInsideInstancesWithComponentPropertiesAndPrefixAndWithInheritance() throws Exception {
// Expected: "f" variables
Map<String,String> expected = new LinkedHashMap<> ();
expected.put( "f1.v1: ", CompletionUtils.DEFAULT_VALUE + "version1" );
expected.put( "f1.v2: ", CompletionUtils.DEFAULT_VALUE + "version2" );
Couple couple = prepare( "app3", "initial.instances", 135 );
couple.text += " F";
List<RoboconfCompletionProposal> proposals = couple.proposer.findProposals( couple.text );
Assert.assertEquals( expected.size(), proposals.size());
int index = 0;
for( Map.Entry<String,String> entry : expected.entrySet()) {
Assert.assertEquals( entry.getKey(), proposals.get( index ).getProposalName());
Assert.assertEquals( entry.getKey(), proposals.get( index ).getProposalString());
Assert.assertEquals( entry.getValue(), proposals.get( index ).getProposalDescription());
Assert.assertEquals( 1, proposals.get( index ).getReplacementOffset());
index ++;
}
}
@Test
public void testOffsetForComponentNameWithNoGraph() throws Exception {
// Expected: nothing
Couple couple = prepare( "app4", "initial.instances", 91 );
List<RoboconfCompletionProposal> proposals = couple.proposer.findProposals( couple.text );
Assert.assertEquals( 0, proposals.size());
}
@Test
public void testOffsetForRootComponentNameWithGraph() throws Exception {
// Expected: "c2"
Couple couple = prepare( "app3", "initial.instances", 91 );
List<RoboconfCompletionProposal> proposals = couple.proposer.findProposals( couple.text );
Assert.assertEquals( 1, proposals.size());
Assert.assertEquals( "c2", proposals.get( 0 ).getProposalName());
Assert.assertEquals( "c2", proposals.get( 0 ).getProposalString());
Assert.assertNull( proposals.get( 0 ).getProposalDescription());
Assert.assertEquals( 0, proposals.get( 0 ).getReplacementOffset());
}
@Test
public void testOffsetForRootComponentNameWithGraphAndPrefix() throws Exception {
// Expected: "c2"
Couple couple = prepare( "app3", "initial.instances", 91 );
couple.text += " C";
List<RoboconfCompletionProposal> proposals = couple.proposer.findProposals( couple.text );
Assert.assertEquals( 1, proposals.size());
Assert.assertEquals( "c2", proposals.get( 0 ).getProposalName());
Assert.assertEquals( "c2", proposals.get( 0 ).getProposalString());
Assert.assertNull( proposals.get( 0 ).getProposalDescription());
Assert.assertEquals( 1, proposals.get( 0 ).getReplacementOffset());
}
@Test
public void testOffsetForRootComponentNameWithGraphAndInvalidPrefix_1() throws Exception {
// Expected: nothing
Couple couple = prepare( "app3", "initial.instances", 91 );
couple.text += " C ";
List<RoboconfCompletionProposal> proposals = couple.proposer.findProposals( couple.text );
Assert.assertEquals( 0, proposals.size());
}
@Test
public void testOffsetForRootComponentNameWithGraphAndInvalidPrefix_2() throws Exception {
// Expected: nothing
Couple couple = prepare( "app3", "initial.instances", 91 );
couple.text += "d";
List<RoboconfCompletionProposal> proposals = couple.proposer.findProposals( couple.text );
Assert.assertEquals( 0, proposals.size());
}
@Test
public void testOffsetForChildComponentNameWithGraph() throws Exception {
// Expected: "c1"
Couple couple = prepare( "app3", "initial.instances", 125 );
List<RoboconfCompletionProposal> proposals = couple.proposer.findProposals( couple.text );
Assert.assertEquals( 1, proposals.size());
Assert.assertEquals( "c1", proposals.get( 0 ).getProposalName());
Assert.assertEquals( "c1", proposals.get( 0 ).getProposalString());
Assert.assertEquals( "A comment about c1", proposals.get( 0 ).getProposalDescription());
Assert.assertEquals( 0, proposals.get( 0 ).getReplacementOffset());
}
@Test
public void testOffsetForChildComponentNameWithGraphAndPrefix() throws Exception {
// Expected: "c1"
Couple couple = prepare( "app3", "initial.instances", 125 );
couple.text += " C";
List<RoboconfCompletionProposal> proposals = couple.proposer.findProposals( couple.text );
Assert.assertEquals( 1, proposals.size());
Assert.assertEquals( "c1", proposals.get( 0 ).getProposalName());
Assert.assertEquals( "c1", proposals.get( 0 ).getProposalString());
Assert.assertEquals( "A comment about c1", proposals.get( 0 ).getProposalDescription());
Assert.assertEquals( 1, proposals.get( 0 ).getReplacementOffset());
}
@Test
public void testOffsetForChildComponentNameWithGraphAndInvalidPrefix_1() throws Exception {
// Expected: nothing
Couple couple = prepare( "app3", "initial.instances", 125 );
couple.text += " C ";
List<RoboconfCompletionProposal> proposals = couple.proposer.findProposals( couple.text );
Assert.assertEquals( 0, proposals.size());
}
@Test
public void testOffsetForChildComponentNameWithGraphAndInvalidPrefix_2() throws Exception {
// Expected: nothing
Couple couple = prepare( "app3", "initial.instances", 125 );
couple.text += "d";
List<RoboconfCompletionProposal> proposals = couple.proposer.findProposals( couple.text );
Assert.assertEquals( 0, proposals.size());
}
@Test
public void testOffsetForComponentNameAndInvalidParent() throws Exception {
// Expected: nothing
Couple couple = prepare( "app3", "initial.instances", 700 );
couple.text += "instance of invalid {\n\tinstance of ";
List<RoboconfCompletionProposal> proposals = couple.proposer.findProposals( couple.text );
Assert.assertEquals( 0, proposals.size());
}
@Test
public void testOffsetForComponentNameAndValidParent() throws Exception {
// Expected: "c1"
Couple couple = prepare( "app3", "initial.instances", 700 );
couple.text += "instance of c2 {\n\tinstance of ";
List<RoboconfCompletionProposal> proposals = couple.proposer.findProposals( couple.text );
Assert.assertEquals( 1, proposals.size());
Assert.assertEquals( "c1", proposals.get( 0 ).getProposalName());
Assert.assertEquals( "c1", proposals.get( 0 ).getProposalString());
Assert.assertEquals( "A comment about c1", proposals.get( 0 ).getProposalDescription());
Assert.assertEquals( 0, proposals.get( 0 ).getReplacementOffset());
}
@Test
public void verifyIndentation_1() throws Exception {
Couple couple = prepare( "app3", "initial.instances", 700 );
couple.text = "";
List<RoboconfCompletionProposal> proposals = couple.proposer.findProposals( couple.text );
Assert.assertEquals( 3, proposals.size());
Assert.assertEquals( INSTANCE_OF_BLOCK, proposals.get( 2 ).getProposalName());
Assert.assertEquals( indentation( 0 ), proposals.get( 2 ).getProposalString());
Assert.assertEquals( 0, proposals.get( 2 ).getReplacementOffset());
}
@Test
public void verifyIndentation_2() throws Exception {
Couple couple = prepare( "app3", "initial.instances", 700 );
couple.text = "instance of n1 {\n";
List<RoboconfCompletionProposal> proposals = couple.proposer.findProposals( couple.text );
Assert.assertEquals( 4, proposals.size());
Assert.assertEquals( INSTANCE_OF_BLOCK, proposals.get( 3 ).getProposalName());
Assert.assertEquals( indentation( 1 ), proposals.get( 3 ).getProposalString());
Assert.assertEquals( 0, proposals.get( 3 ).getReplacementOffset());
}
@Test
public void verifyIndentation_3() throws Exception {
Couple couple = prepare( "app3", "initial.instances", 700 );
couple.text = "instance of n1 {\n\tinstance of n2 {\n";
List<RoboconfCompletionProposal> proposals = couple.proposer.findProposals( couple.text );
Assert.assertEquals( 4, proposals.size());
Assert.assertEquals( INSTANCE_OF_BLOCK, proposals.get( 3 ).getProposalName());
Assert.assertEquals( indentation( 2 ), proposals.get( 3 ).getProposalString());
Assert.assertEquals( 0, proposals.get( 3 ).getReplacementOffset());
}
@Test
public void verifyIndentation_4() throws Exception {
Couple couple = prepare( "app3", "initial.instances", 700 );
couple.text = "instance of n1 {\n\tinstance of n2 {\n\t\tinstance of n3 {\n";
List<RoboconfCompletionProposal> proposals = couple.proposer.findProposals( couple.text );
Assert.assertEquals( 4, proposals.size());
Assert.assertEquals( INSTANCE_OF_BLOCK, proposals.get( 3 ).getProposalName());
Assert.assertEquals( indentation( 3 ), proposals.get( 3 ).getProposalString());
Assert.assertEquals( 0, proposals.get( 3 ).getReplacementOffset());
}
@Test
public void verifyIndentationWithBadIndentationForParent() throws Exception {
Couple couple = prepare( "app3", "initial.instances", 700 );
couple.text = "instance of n1 {\ninstance of n2 {\n";
// instance of n1 {
// instance of n2 {
// ...
// => We take n2's indentation as a reference.
List<RoboconfCompletionProposal> proposals = couple.proposer.findProposals( couple.text );
Assert.assertEquals( 4, proposals.size());
Assert.assertEquals( INSTANCE_OF_BLOCK, proposals.get( 3 ).getProposalName());
Assert.assertEquals( indentation( 1 ), proposals.get( 3 ).getProposalString());
Assert.assertEquals( 0, proposals.get( 3 ).getReplacementOffset());
}
@Test
public void testOffsetForInstancesImportAllFiles() throws Exception {
// Expected: 3 files to import
Couple couple = prepare( "app4", "initial.instances", 700 );
couple.text += "\nimport ";
List<RoboconfCompletionProposal> proposals = couple.proposer.findProposals( couple.text );
Assert.assertEquals( 3, proposals.size());
String[] expected = {
"imports/imp1.instances",
"imports/subimports/imp2.instances",
"imports/subimports/imp3.instances"
};
for( int i=0; i<expected.length; i++ ) {
Assert.assertEquals( expected[ i ], proposals.get( i ).getProposalName());
Assert.assertEquals( expected[ i ], proposals.get( i ).getProposalString());
Assert.assertNull( proposals.get( i ).getProposalDescription());
Assert.assertEquals( 0, proposals.get( i ).getReplacementOffset());
}
}
@Test
public void testOffsetForInstancesImportNoSpaceAfterKeyword() throws Exception {
// Expected: "import"
Couple couple = prepare( "app4", "initial.instances", 700 );
couple.text += "\nimport";
List<RoboconfCompletionProposal> proposals = couple.proposer.findProposals( couple.text );
Assert.assertEquals( 1, proposals.size());
Assert.assertEquals( KEYWORD_IMPORT, proposals.get( 0 ).getProposalName());
Assert.assertEquals( IMPORT_PREFIX, proposals.get( 0 ).getProposalString());
Assert.assertNull( proposals.get( 0 ).getProposalDescription());
Assert.assertEquals( KEYWORD_IMPORT.length(), proposals.get( 0 ).getReplacementOffset());
}
@Test
public void testOffsetForInstancesImportWithPrefix() throws Exception {
// Expected: 2 files to import
Couple couple = prepare( "app4", "initial.instances", 700 );
couple.text += "\nimport imports/s";
List<RoboconfCompletionProposal> proposals = couple.proposer.findProposals( couple.text );
Assert.assertEquals( 2, proposals.size());
String[] expected = {
"imports/subimports/imp2.instances",
"imports/subimports/imp3.instances"
};
for( int i=0; i<expected.length; i++ ) {
Assert.assertEquals( expected[ i ], proposals.get( i ).getProposalName());
Assert.assertEquals( expected[ i ], proposals.get( i ).getProposalString());
Assert.assertNull( proposals.get( i ).getProposalDescription());
Assert.assertEquals( 0, proposals.get( i ).getReplacementOffset());
}
}
@Test
public void testOffsetForInstancesImportAvoidDuplicates() throws Exception {
// Expected: 2 files to import
Couple couple = prepare( "app4", "initial.instances", 700 );
couple.text += "\nimport imports/subimports/imp2.instances\n\nimport ";
List<RoboconfCompletionProposal> proposals = couple.proposer.findProposals( couple.text );
Assert.assertEquals( 2, proposals.size());
String[] expected = {
"imports/imp1.instances",
"imports/subimports/imp3.instances"
};
for( int i=0; i<expected.length; i++ ) {
Assert.assertEquals( expected[ i ], proposals.get( i ).getProposalName());
Assert.assertEquals( expected[ i ], proposals.get( i ).getProposalString());
Assert.assertNull( proposals.get( i ).getProposalDescription());
Assert.assertEquals( 0, proposals.get( i ).getReplacementOffset());
}
}
@Test
public void testOffsetForInstancesImportAvoidNastyDuplicates() throws Exception {
// Expected: 2 files to import
Couple couple = prepare( "app4", "initial.instances", 700 );
couple.text += "\nimport imports/subimports/imp2.instances ; \n\nimport imp";
List<RoboconfCompletionProposal> proposals = couple.proposer.findProposals( couple.text );
Assert.assertEquals( 2, proposals.size());
String[] expected = {
"imports/imp1.instances",
"imports/subimports/imp3.instances"
};
for( int i=0; i<expected.length; i++ ) {
Assert.assertEquals( expected[ i ], proposals.get( i ).getProposalName());
Assert.assertEquals( expected[ i ], proposals.get( i ).getProposalString());
Assert.assertNull( proposals.get( i ).getProposalDescription());
Assert.assertEquals( 0, proposals.get( i ).getReplacementOffset());
}
}
@Test
public void testFindWhenNoDirectory() {
InstancesCompletionProposer proposer = new InstancesCompletionProposer( null, null );
Assert.assertEquals( 0, proposer.findComponentNames( null ).size());
Assert.assertEquals( 2, proposer.findExportedVariableNames( null ).size());
}
/**
* Prepares the expected replacement text with the right indentation.
* @param level the indentation level
* @return a non-null string
*/
private String indentation( int level ) {
StringBuilder sb = new StringBuilder();
sb.append( "instance of component {\n" );
for( int i=0; i<=level; i++ )
sb.append( "\t" );
sb.append( "name: name;\n" );
for( int i=0; i<level; i++ )
sb.append( "\t" );
sb.append( "}" );
return sb.toString();
}
/**
* Verifies neutral proposals.
* <p>
* When the offset is at the beginning of the document or between two instances definitions,
* the same proposals should be made (with imports).
* </p>
*
* @param proposals a non-null list of proposals
*/
private void verifyNeutralOffset( List<RoboconfCompletionProposal> proposals ) {
Assert.assertEquals( 3, proposals.size());
Assert.assertEquals( KEYWORD_IMPORT, proposals.get( 0 ).getProposalName());
Assert.assertEquals( IMPORT_PREFIX, proposals.get( 0 ).getProposalString());
Assert.assertNull( proposals.get( 0 ).getProposalDescription());
Assert.assertEquals( 0, proposals.get( 0 ).getReplacementOffset());
Assert.assertEquals( KEYWORD_INSTANCE_OF, proposals.get( 1 ).getProposalName());
Assert.assertEquals( INSTANCE_OF_PREFIX, proposals.get( 1 ).getProposalString());
Assert.assertNull( proposals.get( 1 ).getProposalDescription());
Assert.assertEquals( 0, proposals.get( 1 ).getReplacementOffset());
Assert.assertEquals( INSTANCE_OF_BLOCK, proposals.get( 2 ).getProposalName());
Assert.assertTrue( proposals.get( 2 ).getProposalString().startsWith( INSTANCE_OF_PREFIX ));
Assert.assertTrue( proposals.get( 2 ).getProposalDescription().startsWith( INSTANCE_OF_BLOCK ));
Assert.assertEquals( 0, proposals.get( 2 ).getReplacementOffset());
}
/**
* Verifies neutral proposals.
* <p>
* When the offset is at the beginning of the document or between two instances definitions,
* the same proposals should be made (with imports).
* </p>
*
* @param proposals a non-null list of proposals
*/
private void verifyBasicInstanceProperties( List<RoboconfCompletionProposal> proposals ) {
Assert.assertEquals( 4, proposals.size());
Assert.assertEquals( PROPERTY_INSTANCE_CHANNELS + ": ", proposals.get( 0 ).getProposalName());
Assert.assertEquals( PROPERTY_INSTANCE_CHANNELS + ": ", proposals.get( 0 ).getProposalString());
Assert.assertNull( proposals.get( 0 ).getProposalDescription());
Assert.assertEquals( 0, proposals.get( 0 ).getReplacementOffset());
Assert.assertEquals( PROPERTY_INSTANCE_NAME + ": ", proposals.get( 1 ).getProposalName());
Assert.assertEquals( PROPERTY_INSTANCE_NAME + ": ", proposals.get( 1 ).getProposalString());
Assert.assertNull( proposals.get( 1 ).getProposalDescription());
Assert.assertEquals( 0, proposals.get( 1 ).getReplacementOffset());
Assert.assertEquals( KEYWORD_INSTANCE_OF, proposals.get( 2 ).getProposalName());
Assert.assertEquals( INSTANCE_OF_PREFIX, proposals.get( 2 ).getProposalString());
Assert.assertNull( proposals.get( 2 ).getProposalDescription());
Assert.assertEquals( 0, proposals.get( 2 ).getReplacementOffset());
Assert.assertEquals( INSTANCE_OF_BLOCK, proposals.get( 3 ).getProposalName());
Assert.assertTrue( proposals.get( 3 ).getProposalString().startsWith( INSTANCE_OF_PREFIX ));
Assert.assertTrue( proposals.get( 3 ).getProposalDescription().startsWith( INSTANCE_OF_BLOCK ));
Assert.assertEquals( 0, proposals.get( 3 ).getReplacementOffset());
}
protected Couple prepare( String appName, String fileName, int offset )
throws IOException, URISyntaxException {
File appDir = TestUtils.findTestFile( "/completion/" + appName );
File instancesFile = new File( appDir, Constants.PROJECT_DIR_INSTANCES + "/" + fileName );
Couple result = new Couple();
result.proposer = new InstancesCompletionProposer( appDir, instancesFile );
String cacheKey = appName + "/" + fileName;
String fileContent = CACHE.get( cacheKey );
if( fileContent == null ) {
fileContent = Utils.readFileContent( instancesFile );
CACHE.put( cacheKey, fileContent );
}
result.text = fileContent;
if( offset < fileContent.length())
result.text = fileContent.substring( 0, offset );
return result;
}
}