@Test
public void testComplete() throws Exception {

	// Mock what is required
	Session session = Mockito.mock( Session.class );
	CommandLine commandLine = Mockito.mock( CommandLine.class );
	Mockito.when( commandLine.getCursorArgument()).thenReturn( "" );
	Mockito.when( commandLine.getArgumentPosition()).thenReturn( 0 );
	final List<ManagedApplication> mas = new ArrayList<> ();
	IApplicationMngr applicationMngr = Mockito.mock( IApplicationMngr.class );
	Mockito.when( applicationMngr.getManagedApplications()).thenReturn( mas );
	Manager manager = Mockito.mock( Manager.class );
	Mockito.when( manager.applicationMngr()).thenReturn( applicationMngr );
	ApplicationTemplate tpl = new ApplicationTemplate( "whatever" ).directory( this.folder.newFolder());
	// Nothing typed in yet
	ApplicationCompleter completer = new ApplicationCompleter();
	completer.manager = manager;
	List<String> candidates = new ArrayList<> ();
	Assert.assertEquals( 0, candidates.size());
	Assert.assertEquals( -1, completer.complete( session, commandLine, candidates ));
	Assert.assertEquals( 0, candidates.size());
	// Complete "I"
	candidates = new ArrayList<> ();
	Mockito.when( commandLine.getCursorArgument()).thenReturn( "I" );
	Mockito.when( commandLine.getArgumentPosition()).thenReturn( 1 ); // "I".length()
	Assert.assertEquals( 0, candidates.size());
	Assert.assertEquals( -1, completer.complete( session, commandLine, candidates ));
	Assert.assertEquals( 0, candidates.size());
	mas.add( new ManagedApplication( new Application( "Ito", tpl )));
	Assert.assertEquals( -1, completer.complete( session, commandLine, candidates ));
	Assert.assertEquals( 1, candidates.size());
	Assert.assertEquals( "Ito", candidates.get( 0 ).trim());
	// Complete "i" (case insensitive)
	candidates = new ArrayList<> ();
	Mockito.when( commandLine.getCursorArgument()).thenReturn( "i" );
	Mockito.when( commandLine.getArgumentPosition()).thenReturn( 1 ); // "i".length()
	Assert.assertEquals( 0, candidates.size());
	Assert.assertEquals( -1, completer.complete( session, commandLine, candidates ));
	Assert.assertEquals( 1, candidates.size());
	Assert.assertEquals( "Ito", candidates.get( 0 ).trim());
	// Try with several apps - and still "i"
	mas.add( new ManagedApplication( new Application( "uto", tpl )));
	mas.add( new ManagedApplication( new Application( "ito2", tpl )));
	mas.add( new ManagedApplication( new Application( "as", tpl )));
	candidates = new ArrayList<> ();
	Assert.assertEquals( 0, candidates.size());
	Assert.assertEquals( -1, completer.complete( session, commandLine, candidates ));
	Assert.assertEquals( 2, candidates.size());
	Assert.assertEquals( "Ito", candidates.get( 0 ).trim());
	Assert.assertEquals( "ito2", candidates.get( 1 ).trim());
	// Better search
	candidates = new ArrayList<> ();
	Mockito.when( commandLine.getCursorArgument()).thenReturn( "ito2" );
	Mockito.when( commandLine.getArgumentPosition()).thenReturn( 4 ); // "ito2".length()
	Assert.assertEquals( 0, candidates.size());
	Assert.assertEquals( -4, completer.complete( session, commandLine, candidates ));
	Assert.assertEquals( 1, candidates.size());
	Assert.assertEquals( "ito2", candidates.get( 0 ).trim());
	// Unknown
	candidates = new ArrayList<> ();
	Mockito.when( commandLine.getCursorArgument()).thenReturn( "unknown" );
	Mockito.when( commandLine.getArgumentPosition()).thenReturn( "unknown".length());
	Assert.assertEquals( 0, candidates.size());
	Assert.assertEquals( -1, completer.complete( session, commandLine, candidates ));
}