//------------------------------------------------------------------------------
// Copyright (c) 2005, 2006 IBM Corporation and others.
// All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0
// which accompanies this distribution, and is available at
// http://www.eclipse.org/legal/epl-v10.html
//
// Contributors:
// IBM Corporation - initial implementation
//------------------------------------------------------------------------------
package org.eclipse.epf.library.tests.exportimport;

import org.eclipse.epf.library.tester.LibraryJunitTestService;
import org.eclipse.epf.library.tester.iface.TCExeReply;
import org.eclipse.epf.library.tester.iface.TestCommand;
import org.eclipse.epf.library.tester.impl.ExportImportTestImpl;
import org.eclipse.epf.library.tester.impl.testcommands.TCCompareToLibrary;
import org.eclipse.epf.library.tester.impl.testcommands.TCCopyLibrary;
import org.eclipse.epf.library.tester.impl.testcommands.TCExportPlugins;
import org.eclipse.epf.library.tester.impl.testcommands.TCImportPlugins;
import org.eclipse.epf.library.tester.impl.testcommands.TCOpenLibrary;

/**
 * JUnit tests for plugin export/import
 * 
 * @author Weiping Lu
 * @since 1.0
 * 
 */
public class PluginExportImportTest0001 extends ExportImportTestMethodBase {
	
	public PluginExportImportTest0001(ExportImportTestImpl owner) {
		super(owner);
	}
	
	public boolean execute(String testName) {		
		LibraryJunitTestService service = getOwner().getService();
		
		TestCommand tcs[] = new TestCommand[6];
		
		tcs[0] = service.newTestCommand(TCCopyLibrary.class);
		tcs[0].setAttribute(TestCommand.AT_LibFolderName, "Paris");
		
		tcs[1] = service.newTestCommand(TCOpenLibrary.class);
		tcs[1].setAttribute(TestCommand.AT_LibFolderName, "Paris");
		
		tcs[2] = service.newTestCommand(TCExportPlugins.class);
		tcs[2].setAttribute(TestCommand.AT_ExportFolderName, "Export0001");
		
		tcs[3] = service.newTestCommand(TCOpenLibrary.class);
		tcs[3].setAttribute(TestCommand.AT_LibFolderName, "Base_1");
		
		tcs[4] = service.newTestCommand(TCImportPlugins.class);
		tcs[4].setAttribute(TestCommand.AT_ImportFolderName, "Export0001");
		
		tcs[5] = service.newTestCommand(TCCompareToLibrary.class);
		tcs[5].setAttribute(TestCommand.AT_GoldenLibFolderName, "Paris");
		
		boolean passing = true;
		for (int i=0; i<tcs.length; i++) {
			TCExeReply reply = tcs[i].execute();
			if (reply != null && ! reply.passing()) {
				passing = false;
			}				
		}
		getOwner().assertTrue(passing);
		
		return passing;
	}	
	
}
