/*
 *  Licensed to the Apache Software Foundation (ASF) under one or more
 *  contributor license agreements.  See the NOTICE file distributed with
 *  this work for additional information regarding copyright ownership.
 *  The ASF licenses this file to You 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 org.apache.harmony.tests.java.io;

import junit.framework.TestCase;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.Console;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.io.Reader;
import java.lang.reflect.Constructor;
import java.util.Calendar;
import java.util.GregorianCalendar;

/**
 * This file is test for java.io.Console. Due to the redirect problem, it can
 * only be run on Harmony.
 *
 * @since 1.6
 */
public class ConsoleTest extends TestCase {
    private static final byte[] bytes = "hello world\n".getBytes();

    private InputStream in = new ByteArrayInputStream(bytes);
    private OutputStream out = new ByteArrayOutputStream();
    private Console console = null;

    @Override
    protected void setUp() throws Exception {
        super.setUp();
        Constructor<Console> constructor =
                Console.class.getDeclaredConstructor(InputStream.class, OutputStream.class);
        constructor.setAccessible(true);
        console = constructor.newInstance(in, out);
    }

    @Override
    protected void tearDown() throws Exception {
        console = null;
        super.tearDown();
    }

    public void test_flush() {
        console.flush();
        assertFalse(console.writer().checkError());
    }

    public void test_format_LString_LObject() {
        assertSame(console, console.format("%d %s", 1, "hello"));
        String prompt = new String(((ByteArrayOutputStream) out).toByteArray());
        assertEquals("1 hello", prompt);
    }

    public void test_printf_LString_LObject() {
        Calendar c = new GregorianCalendar(1983, 2, 21);
        assertSame(console, console.printf("%1$tm %1$te,%1$tY", c));
        String prompt = new String(((ByteArrayOutputStream) out).toByteArray());
        assertEquals("03 21,1983", prompt);
    }

    public void test_reader() throws IOException {
        Reader reader1 = console.reader();
        assertTrue(reader1.ready());
        Reader reader2 = console.reader();
        assertSame(reader1, reader2);
    }

    public void test_readLine() {
        String line = console.readLine();
        assertEquals("hello world", line);
    }

    public void test_readLine_LString_LObject() {
        String line = console.readLine("%d %s", 2, "Please input a line of string to test:");
        assertEquals("hello world", line);
        String prompt = new String(((ByteArrayOutputStream) out).toByteArray());
        assertEquals("2 Please input a line of string to test:", prompt);
    }

    public void test_readPassword_LString_LObject() {
        console.readPassword("%d", 3);
        String prompt = new String(((ByteArrayOutputStream) out).toByteArray());
        assertEquals("3\n", prompt);
    }

    /**
     * {@link java.io.Console#writer()}
     */
    public void test_writer() {
        PrintWriter writer1 = console.writer();
        PrintWriter writer2 = console.writer();
        assertSame(writer1, writer2);
    }
}
