| /******************************************************************************* |
| * Copyright (c) 2017 Andreas Loth 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: |
| * Andreas Loth - initial API and implementation |
| *******************************************************************************/ |
| |
| package org.eclipse.debug.tests.console; |
| |
| import java.io.IOException; |
| import java.nio.charset.StandardCharsets; |
| |
| import org.eclipse.jface.text.IDocument; |
| import org.eclipse.ui.console.IConsoleConstants; |
| import org.eclipse.ui.console.IOConsoleOutputStream; |
| import org.eclipse.ui.console.MessageConsole; |
| |
| import junit.framework.TestCase; |
| |
| |
| public class ConsoleTests extends TestCase { |
| |
| public ConsoleTests() { |
| super("ConsoleTests"); //$NON-NLS-1$ |
| } |
| |
| public ConsoleTests(String name) { |
| super(name); |
| } |
| |
| public void testConsoleOutputStreamEncoding() throws IOException, InterruptedException { |
| String testString = "abc\u00e4\u00f6\u00fcdef"; //$NON-NLS-1$ |
| // abcdef need 1 byte in UTF-8 each |
| // äöü (\u00e4\u00f6\u00fc) need 2 bytes each |
| byte[] testStringBuffer = testString.getBytes(StandardCharsets.UTF_8); |
| TestCase.assertEquals("Test string \"" + testString + "\" should consist of 12 UTF-8 bytes", 12, testStringBuffer.length); //$NON-NLS-1$ //$NON-NLS-2$ |
| MessageConsole console = new MessageConsole("Test Console", //$NON-NLS-1$ |
| IConsoleConstants.MESSAGE_CONSOLE_TYPE, null, StandardCharsets.UTF_8.name(), true); |
| IDocument document = console.getDocument(); |
| TestHelper.waitForJobs(); |
| TestCase.assertEquals("Document should be empty", "", document.get()); //$NON-NLS-1$ //$NON-NLS-2$ |
| try (IOConsoleOutputStream outStream = console.newOutputStream()) { |
| outStream.write(testStringBuffer, 0, 6); |
| // half of ö (\u00f6) is written so we don't expect this char in |
| // output but all previous chars can be decoded |
| TestHelper.waitForJobs(); |
| TestCase.assertEquals("First 4 chars should be written", testString.substring(0, 4), document.get()); //$NON-NLS-1$ |
| outStream.write(testStringBuffer, 6, 6); |
| // all remaining bytes are written so we expect the whole string |
| // including the ö (\u00f6) which was at buffer boundary |
| TestHelper.waitForJobs(); |
| TestCase.assertEquals("whole test string should be written", testString, document.get()); //$NON-NLS-1$ |
| } |
| TestHelper.waitForJobs(); |
| // after closing the stream, the document content should still be the |
| // same |
| TestCase.assertEquals("closing the stream should not alter the document", testString, document.get()); //$NON-NLS-1$ |
| } |
| |
| public void testConsoleOutputStreamLastR() throws IOException, InterruptedException { |
| String testString = "a\r"; //$NON-NLS-1$ |
| byte[] testStringBuffer = testString.getBytes(StandardCharsets.UTF_8); |
| TestCase.assertEquals("Test string \"" + testString + "\" should consist of 2 UTF-8 bytes", 2, testStringBuffer.length); //$NON-NLS-1$ //$NON-NLS-2$ |
| MessageConsole console = new MessageConsole("Test Console 2", //$NON-NLS-1$ |
| IConsoleConstants.MESSAGE_CONSOLE_TYPE, null, StandardCharsets.UTF_8.name(), true); |
| IDocument document = console.getDocument(); |
| TestHelper.waitForJobs(); |
| TestCase.assertEquals("Document should be empty", "", document.get()); //$NON-NLS-1$ //$NON-NLS-2$ |
| try (IOConsoleOutputStream outStream = console.newOutputStream()) { |
| outStream.write(testStringBuffer); |
| // everything but pending \r should be written |
| TestHelper.waitForJobs(); |
| TestCase.assertEquals("First char should be written", testString.substring(0, 1), document.get()); //$NON-NLS-1$ |
| } |
| TestHelper.waitForJobs(); |
| // after closing the stream, the document content should still be the |
| // same |
| TestCase.assertEquals("closing the stream should write the pending \\r", testString, document.get()); //$NON-NLS-1$ |
| } |
| |
| public void testConsoleOutputStreamDocumentClosed() throws IOException { |
| MessageConsole console = new MessageConsole("Test Console 3", //$NON-NLS-1$ |
| IConsoleConstants.MESSAGE_CONSOLE_TYPE, null, StandardCharsets.UTF_8.name(), true); |
| IDocument document = console.getDocument(); |
| try (IOConsoleOutputStream outStream = console.newOutputStream()) { |
| outStream.write("write1"); //$NON-NLS-1$ |
| document.getDocumentPartitioner().disconnect(); |
| try { |
| outStream.write("write2"); //$NON-NLS-1$ |
| TestCase.fail("IOException with message \"Document is closed\" expected"); //$NON-NLS-1$ |
| } catch (IOException ioe) { |
| TestCase.assertEquals("Document is closed", ioe.getMessage()); //$NON-NLS-1$ |
| } |
| } |
| } |
| |
| public void testConsoleOutputStreamClosed() throws IOException { |
| MessageConsole console = new MessageConsole("Test Console 4", //$NON-NLS-1$ |
| IConsoleConstants.MESSAGE_CONSOLE_TYPE, null, StandardCharsets.UTF_8.name(), true); |
| try (IOConsoleOutputStream outStream = console.newOutputStream()) { |
| outStream.write("test1".getBytes(StandardCharsets.UTF_8)); //$NON-NLS-1$ |
| outStream.close(); |
| try { |
| outStream.write("test2".getBytes(StandardCharsets.UTF_8)); //$NON-NLS-1$ |
| TestCase.fail("IOException with message \"Output Stream is closed\" expected"); //$NON-NLS-1$ |
| } catch (IOException ioe) { |
| TestCase.assertEquals("Output Stream is closed", ioe.getMessage()); //$NON-NLS-1$ |
| } |
| } |
| } |
| |
| public void testConsoleOutputStreamDocumentStreamClosed() throws IOException { |
| MessageConsole console = new MessageConsole("Test Console 5", //$NON-NLS-1$ |
| IConsoleConstants.MESSAGE_CONSOLE_TYPE, null, StandardCharsets.UTF_8.name(), true); |
| IDocument document = console.getDocument(); |
| try (IOConsoleOutputStream outStream = console.newOutputStream()) { |
| outStream.write("write1"); //$NON-NLS-1$ |
| document.getDocumentPartitioner().disconnect(); |
| try { |
| outStream.write("write2"); //$NON-NLS-1$ |
| TestCase.fail("IOException with message \"Document is closed\" expected"); //$NON-NLS-1$ |
| } catch (IOException ioe) { |
| TestCase.assertEquals("Document is closed", ioe.getMessage()); //$NON-NLS-1$ |
| } |
| try { |
| outStream.write("write3"); //$NON-NLS-1$ |
| TestCase.fail("IOException with message \"Output Stream is closed\" expected"); //$NON-NLS-1$ |
| } catch (IOException ioe) { |
| TestCase.assertEquals("Output Stream is closed", ioe.getMessage()); //$NON-NLS-1$ |
| } |
| } |
| } |
| |
| } |