/*******************************************************************************
 * Copyright (c) 2007, 2018 Wind River Systems, Inc. and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 * Michael Scharf (Wind River) - initial API and implementation
 * Martin Oberhuber (Wind River) - [225853][api] Provide more default functionality in TerminalConnectorImpl
 * Martin Oberhuber (Wind River) - [204796] Terminal should allow setting the encoding to use
 * Uwe Stieber (Wind River) - [282996] [terminal][api] Add "hidden" attribute to terminal connector extension point
 * Anton Leherbauer (Wind River) - [433751] Add option to enable VT100 line wrapping mode
 *******************************************************************************/
package org.eclipse.tm.internal.terminal.connector;

import java.io.OutputStream;

import junit.framework.TestCase;

import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.tm.internal.terminal.connector.TerminalConnector.Factory;
import org.eclipse.tm.internal.terminal.provisional.api.ISettingsStore;
import org.eclipse.tm.internal.terminal.provisional.api.ITerminalControl;
import org.eclipse.tm.internal.terminal.provisional.api.TerminalState;
import org.eclipse.tm.internal.terminal.provisional.api.provider.TerminalConnectorImpl;

public class TerminalConnectorTest extends TestCase {
	public class SettingsMock implements ISettingsStore {

		public String get(String key) {
			return null;
		}

		public String get(String key, String defaultValue) {
			return null;
		}

		public void put(String key, String value) {
		}

	}
	public static class TerminalControlMock implements ITerminalControl {

		public void setEncoding(String encoding) {
		}

		public String getEncoding() {
			return "ISO-8859-1"; //$NON-NLS-1$
		}

		public void displayTextInTerminal(String text) {
		}

		public OutputStream getRemoteToTerminalOutputStream() {
			return null;
		}

		public Shell getShell() {
			return null;
		}

		public TerminalState getState() {
			return null;
		}

		public void setMsg(String msg) {
		}

		public void setState(TerminalState state) {
		}

		public void setTerminalTitle(String title) {
		}

		public void setupTerminal(Composite parent) {
		}
		
		public boolean isConnectOnEnterIfClosed() {
			return false;
		}
		
		public void setConnectOnEnterIfClosed(boolean on) {
		}

		public void setVT100LineWrapping(boolean enable) {
		}

		public boolean isVT100LineWrapping() {
			return false;
		}
	}
	static class ConnectorMock extends TerminalConnectorImpl {

		public boolean fEcho;
		public int fWidth;
		public int fHeight;
		public ITerminalControl fTerminalControl;
		public ISettingsStore fSaveStore;
		public ISettingsStore fLoadStore;
		public boolean fDisconnect;

		public boolean isLocalEcho() {
			return fEcho;
		}
		public void setTerminalSize(int newWidth, int newHeight) {
			fWidth=newWidth;
			fHeight=newHeight;
		}
		public void connect(ITerminalControl control) {
			super.connect(control);
			fTerminalControl = control;
		}
		public void doDisconnect() {
			fDisconnect=true;
		}

		public OutputStream getTerminalToRemoteStream() {
			return null;
		}

		public String getSettingsSummary() {
			return "Summary";
		}

		public void load(ISettingsStore store) {
			fLoadStore=store;
		}

		public void save(ISettingsStore store) {
			fSaveStore=store;
		}
	}
	static class SimpleFactory implements Factory {
		final TerminalConnectorImpl fConnector;
		public SimpleFactory(TerminalConnectorImpl connector) {
			fConnector = connector;
		}
		public TerminalConnectorImpl makeConnector() throws Exception {
			// TODO Auto-generated method stub
			return fConnector;
		}
	}
	public void testGetInitializationErrorMessage() {
		TerminalConnector c=new TerminalConnector(new SimpleFactory(new ConnectorMock()),"xID","xName", false);
		c.connect(new TerminalControlMock());
		assertNull(c.getInitializationErrorMessage());

		c=new TerminalConnector(new SimpleFactory(new ConnectorMock(){
			public void initialize() throws Exception {
				throw new Exception("FAILED");
			}}),"xID","xName", false);
		c.connect(new TerminalControlMock());
		assertEquals("FAILED",c.getInitializationErrorMessage());

	}

	public void testGetIdAndName() {
		TerminalConnector c=new TerminalConnector(new SimpleFactory(new ConnectorMock()),"xID","xName", false);
		assertEquals("xID", c.getId());
		assertEquals("xName", c.getName());
	}

	public void testConnect() {
		TerminalConnector c=new TerminalConnector(new SimpleFactory(new ConnectorMock()),"xID","xName", false);
		assertFalse(c.isInitialized());
		c.connect(new TerminalControlMock());
		assertTrue(c.isInitialized());

	}

	public void testDisconnect() {
		ConnectorMock mock=new ConnectorMock();
		TerminalConnector c=new TerminalConnector(new SimpleFactory(mock),"xID","xName", false);
		TerminalControlMock control=new TerminalControlMock();
		c.connect(control);
		c.disconnect();
		assertTrue(mock.fDisconnect);
	}

	public void testGetTerminalToRemoteStream() {
		ConnectorMock mock=new ConnectorMock();
		TerminalConnector c=new TerminalConnector(new SimpleFactory(mock),"xID","xName", false);
		TerminalControlMock control=new TerminalControlMock();
		c.connect(control);
		assertSame(mock.fTerminalControl,control);
	}

	public void testGetSettingsSummary() {
		TerminalConnector c=new TerminalConnector(new SimpleFactory(new ConnectorMock()),"xID","xName", false);
		assertEquals("Not Initialized", c.getSettingsSummary());
		c.connect(new TerminalControlMock());
		assertEquals("Summary", c.getSettingsSummary());
	}

	public void testIsLocalEcho() {
		ConnectorMock mock=new ConnectorMock();
		TerminalConnector c=new TerminalConnector(new SimpleFactory(mock),"xID","xName", false);
		assertFalse(c.isLocalEcho());
		mock.fEcho=true;
		assertTrue(c.isLocalEcho());
	}

	public void testLoad() {
		ConnectorMock mock=new ConnectorMock();
		TerminalConnector c=new TerminalConnector(new SimpleFactory(mock),"xID","xName", false);
		ISettingsStore s=new SettingsMock();
		c.load(s);
		// the load is called after the connect...
		assertNull(mock.fLoadStore);
		c.connect(new TerminalControlMock());
		assertSame(s,mock.fLoadStore);
	}

	public void testSave() {
		ConnectorMock mock=new ConnectorMock();
		TerminalConnector c=new TerminalConnector(new SimpleFactory(mock),"xID","xName", false);
		ISettingsStore s=new SettingsMock();
		c.save(s);
		assertNull(mock.fSaveStore);
		c.connect(new TerminalControlMock());
		c.save(s);
		assertSame(s,mock.fSaveStore);
	}

	public void testSetDefaultSettings() {
		ConnectorMock mock=new ConnectorMock();
		TerminalConnector c=new TerminalConnector(new SimpleFactory(mock),"xID","xName", false);
		c.setDefaultSettings();
	}

	public void testSetTerminalSize() {
		ConnectorMock mock=new ConnectorMock();
		TerminalConnector c=new TerminalConnector(new SimpleFactory(mock),"xID","xName", false);
		c.setTerminalSize(100, 200);

	}

}
