/*
******************************************************************************
* Copyright (C) 2007-2010, International Business Machines Corporation and   *
* others. All Rights Reserved.                                               *
******************************************************************************
*/

// Copyright 2006 Google Inc.  All Rights Reserved.

package com.ibm.icu.dev.test.duration;

import java.io.StringReader;
import java.io.StringWriter;

import com.ibm.icu.dev.test.TestFmwk;
import com.ibm.icu.impl.duration.impl.XMLRecordReader;
import com.ibm.icu.impl.duration.impl.XMLRecordWriter;

public class DataReadWriteTest extends TestFmwk {

    /**
     * Invoke the tests.
     */
    public static void main(String[] args) {
        new DataReadWriteTest().run(args);
    }

    // strip line ends and trailing spaces
    private String normalize(String str) {
        StringBuffer sb = new StringBuffer();
        boolean inLine = true;
        for (int i = 0; i < str.length(); ++i) {
            char c = str.charAt(i);
            if (inLine && c == ' ') {
                continue;
            }
            if (c == '\n') {
                inLine = true;
                continue;
            }
            inLine = false;
            sb.append("" + c);
        }
        return sb.toString();
    }

    public void testOpenClose() {
        StringWriter sw = new StringWriter();
        XMLRecordWriter xrw = new XMLRecordWriter(sw);
        assertTrue(null, xrw.open("Test"));
        assertTrue(null, xrw.close());
        xrw.flush();
        String str = sw.toString();
        assertEquals(null, "<Test></Test>", normalize(str));

        StringReader sr = new StringReader(str);
        XMLRecordReader xrr = new XMLRecordReader(sr);
        assertTrue(null, xrr.open("Test"));
        assertTrue(null, xrr.close());
    }

    public void testBool() {
        StringWriter sw = new StringWriter();
        XMLRecordWriter xrw = new XMLRecordWriter(sw);
        xrw.bool("x", true);
        xrw.bool("y", false);
        xrw.flush();
        String str = sw.toString();
        assertEquals(null, "<x>true</x><y>false</y>", normalize(str));

        StringReader sr = new StringReader(str);
        XMLRecordReader xrr = new XMLRecordReader(sr);
        assertTrue(null, xrr.bool("x"));
        assertFalse(null, xrr.bool("y"));
    }

    public void testBoolArray() {
        boolean[][] datas = {
            {},
            { true },
            { true, false },
            { true, false, true },
        };
    
        String[] targets = {
            "<testList></testList>",
            "<testList><test>true</test></testList>",
            "<testList><test>true</test><test>false</test></testList>",
            "<testList><test>true</test><test>false</test>" +
            "<test>true</test></testList>",
        };

        for (int j = 0; j < datas.length; ++j) {
            boolean[] data = datas[j];
            String target = targets[j];

            StringWriter sw = new StringWriter();
            XMLRecordWriter xrw = new XMLRecordWriter(sw);
            xrw.boolArray("test", data);
            xrw.flush();
            String str = sw.toString();
            assertEquals("" + j, target, normalize(str));

            StringReader sr = new StringReader(str);
            XMLRecordReader xrr = new XMLRecordReader(sr);
            boolean[] out = xrr.boolArray("test");

            assertNotNull("" + j, out);
            assertEquals("" + j, data.length, out.length);
            for (int i = 0; i < data.length; ++i) {
                assertEquals("" + j + "/" + i, data[i], out[i]);
            }
        }
    }

    public void testCharacter() {
        StringWriter sw = new StringWriter();
        XMLRecordWriter xrw = new XMLRecordWriter(sw);
        xrw.character("x", 'a');
        xrw.character("y", 'b');
        xrw.flush();
        String str = sw.toString();
        assertEquals(null, "<x>a</x><y>b</y>", normalize(str));

        StringReader sr = new StringReader(str);
        XMLRecordReader xrr = new XMLRecordReader(sr);
        assertEquals(null, 'a', xrr.character("x"));
        assertEquals(null, 'b', xrr.character("y"));
    }

    public void testCharacterArray() {
        char[][] datas = {
            {},
            { 'a' },
            { 'a', 'b' },
            { 'a', 'b', 'c' },
        };

        String[] targets = {
            "<testList></testList>",
            "<testList><test>a</test></testList>",
            "<testList><test>a</test><test>b</test></testList>",
            "<testList><test>a</test><test>b</test>" +
            "<test>c</test></testList>",
        };

        for (int j = 0; j < datas.length; ++j) {
            char[] data = datas[j];
            String target = targets[j];

            StringWriter sw = new StringWriter();
            XMLRecordWriter xrw = new XMLRecordWriter(sw);
            xrw.characterArray("test", data);
            xrw.flush();
            String str = sw.toString();
            assertEquals("" + j, target, normalize(str));

            StringReader sr = new StringReader(str);
            XMLRecordReader xrr = new XMLRecordReader(sr);
            char[] out = xrr.characterArray("test");

            assertNotNull("" + j, out);
            assertEquals("" + j, data.length, out.length);
            for (int i = 0; i < data.length; ++i) {
                assertEquals("" + j + "/" + i, data[i], out[i]);
            }
        }
    }

    public void testNamedIndex() {
        StringWriter sw = new StringWriter();
        XMLRecordWriter xrw = new XMLRecordWriter(sw);
        String[] names = { "zero", "one" };

        xrw.namedIndex("x", names, 0);
        xrw.namedIndex("y", names, 1);
        xrw.flush();
        String str = sw.toString();
        assertEquals(null, "<x>zero</x><y>one</y>", normalize(str));

        StringReader sr = new StringReader(str);
        XMLRecordReader xrr = new XMLRecordReader(sr);
        assertEquals(null, 0, xrr.namedIndex("x", names));
        assertEquals(null, 1, xrr.namedIndex("y", names));
    }

    public void testNamedIndexArray() {
        String[] names = { "zero", "one" };
        byte[][] datas = {
            {},
            { 0 },
            { 1, 0 },
            { 0, 1, 0 },
        };

        String[] targets = {
            "<testList></testList>",
            "<testList><test>zero</test></testList>",
            "<testList><test>one</test><test>zero</test></testList>",
            "<testList><test>zero</test><test>one</test>" +
            "<test>zero</test></testList>",
        };

        for (int j = 0; j < datas.length; ++j) {
            byte[] data = datas[j];
            String target = targets[j];

            StringWriter sw = new StringWriter();
            XMLRecordWriter xrw = new XMLRecordWriter(sw);
            xrw.namedIndexArray("test", names, data);
            xrw.flush();
            String str = sw.toString();
            assertEquals("" + j, target, normalize(str));

            StringReader sr = new StringReader(str);
            XMLRecordReader xrr = new XMLRecordReader(sr);
            byte[] out = xrr.namedIndexArray("test", names);

            assertNotNull("" + j, out);
            assertEquals("" + j, data.length, out.length);
            for (int i = 0; i < data.length; ++i) {
                assertEquals("" + j + "/" + i, data[i], out[i]);
            }
        }
    }

    public void testString() {
        StringWriter sw = new StringWriter();
        XMLRecordWriter xrw = new XMLRecordWriter(sw);

        String s = " This is <a> &&\t test. ";
        String s1 = " This is <a> && test. ";
        String t = " This is &lt;a> &amp;&amp; test. ";
        xrw.string("x", s);
        xrw.flush();
        String str = sw.toString();
        assertEquals("\n'" + normalize(str) + "' = \n'<x>" + t + "</x>", "<x>"
                + t + "</x>", normalize(str));

        StringReader sr = new StringReader(str);
        XMLRecordReader xrr = new XMLRecordReader(sr);
        String res = xrr.string("x");
        assertEquals("\n'" + res + "' == \n'" + s1 + "'", s1, res);
    }

    public void testStringArray() {
        String s1 = "";
        String s2 = " ";
        String s3 = "This is a test";
        String s4 = "  It is\n   only  a test\t  ";
        String s4x = " It is only a test ";

        String[][] datas = { 
            {},
            { s1 },
            { s2, s1 },
            { s3, s2, s1 },
            { s3, null, s1, null },
            { s4, s1, s3, s2 }
        };

        String[] targets = {
            "<testList></testList>",
            "<testList><test>" + s1 + "</test></testList>",
            "<testList><test>" + s2 + "</test><test>" + s1 + "</test></testList>",
            "<testList><test>" + s3 + "</test><test>" + s2 + 
                "</test><test>" + s1 + "</test></testList>",
            "<testList><test>" + s3 + "</test><test>Null</test><test>" + s1 + 
                "</test><test>Null</test></testList>",
            "<testList><test>" + s4x + "</test><test>" + s1 + 
                "</test><test>" + s3 + "</test><test>" + s2 + "</test></testList>",
        };

        for (int j = 0; j < datas.length; ++j) {
            String[] data = datas[j];
            String target = targets[j];

            StringWriter sw = new StringWriter();
            XMLRecordWriter xrw = new XMLRecordWriter(sw);
            xrw.stringArray("test", data);
            xrw.flush();
            String str = sw.toString();
            assertEquals("" + j + " '" + str + "'", target, normalize(str));

            StringReader sr = new StringReader(str);
            XMLRecordReader xrr = new XMLRecordReader(sr);
            String[] out = xrr.stringArray("test");

            assertNotNull("" + j, out);
            assertEquals("" + j, data.length, out.length);
            for (int i = 0; i < data.length; ++i) {
                String standin = data[i];
                if (s4.equals(standin)) {
                    standin = s4x;
                }
                assertEquals("" + j + "/" + i + " '" + out[i] + "'", standin,
                        out[i]);
            }
        }
    }

    public void testStringTable() {
        String s1 = "";
        String s2 = " ";
        String s3 = "This is a test";
        String s4 = "It is only a test";

        String[][] table = { 
            {},
            { s1 },
            { s2, s1 },
            { s3, s2, s1 },
            null,
            { s4, s1, s3, s2 }
        };

        String target = "<testTable>" +
            "<testList></testList>" +
            "<testList><test></test></testList>" +
            "<testList><test> </test><test></test></testList>" +
            "<testList><test>This is a test</test><test> </test>" + 
                "<test></test></testList>" +
            "<testList>Null</testList>" +
            "<testList><test>It is only a test</test><test></test>" +
                "<test>This is a test</test><test> </test></testList>" +
            "</testTable>";

        StringWriter sw = new StringWriter();
        XMLRecordWriter xrw = new XMLRecordWriter(sw);
        xrw.stringTable("test", table);
        xrw.flush();
        String str = sw.toString();
        assertEquals("'" + str + "'", target, normalize(str));
    }

    public void testOmittedFields() {
        StringWriter sw = new StringWriter();
        XMLRecordWriter xrw = new XMLRecordWriter(sw);
        xrw.open("omit");
        xrw.bool("x", true);
        xrw.bool("y", false);
        xrw.close();
        xrw.flush();
        String str = sw.toString();

        StringReader sr = new StringReader(str);
        XMLRecordReader xrr = new XMLRecordReader(sr);
        assertTrue(null, xrr.open("omit"));
        assertTrue(null, xrr.bool("x"));
        assertEquals(null, '\uffff', xrr.character("z"));
        assertFalse(null, xrr.bool("y"));
        assertTrue(null, xrr.close());
    }
}
