12d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert// © 2016 and later: Unicode, Inc. and others.
22d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert// License & terms of use: http://www.unicode.org/copyright.html#License
37935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/*
47935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert******************************************************************************
57935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* Copyright (C) 2007-2010, International Business Machines Corporation and   *
67935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* others. All Rights Reserved.                                               *
77935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert******************************************************************************
87935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*/
97935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert// Copyright 2006 Google Inc.  All Rights Reserved.
117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpackage com.ibm.icu.dev.test.duration;
137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.io.StringReader;
157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.io.StringWriter;
167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
172d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubertimport org.junit.Test;
18fe77e7203e518f62b5bd8e8c603bca361e9cf47bFredrik Roubertimport org.junit.runner.RunWith;
19fe77e7203e518f62b5bd8e8c603bca361e9cf47bFredrik Roubertimport org.junit.runners.JUnit4;
202d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.dev.test.TestFmwk;
227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.impl.duration.impl.XMLRecordReader;
237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.impl.duration.impl.XMLRecordWriter;
247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
25fe77e7203e518f62b5bd8e8c603bca361e9cf47bFredrik Roubert@RunWith(JUnit4.class)
267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpublic class DataReadWriteTest extends TestFmwk {
277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // strip line ends and trailing spaces
287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private String normalize(String str) {
297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringBuffer sb = new StringBuffer();
307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        boolean inLine = true;
317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < str.length(); ++i) {
327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            char c = str.charAt(i);
337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (inLine && c == ' ') {
347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                continue;
357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (c == '\n') {
377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                inLine = true;
387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                continue;
397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            inLine = false;
417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            sb.append("" + c);
427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return sb.toString();
447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
462d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void testOpenClose() {
487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringWriter sw = new StringWriter();
497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        XMLRecordWriter xrw = new XMLRecordWriter(sw);
507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertTrue(null, xrw.open("Test"));
517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertTrue(null, xrw.close());
527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        xrw.flush();
537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String str = sw.toString();
547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals(null, "<Test></Test>", normalize(str));
557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringReader sr = new StringReader(str);
577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        XMLRecordReader xrr = new XMLRecordReader(sr);
587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertTrue(null, xrr.open("Test"));
597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertTrue(null, xrr.close());
607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
622d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void testBool() {
647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringWriter sw = new StringWriter();
657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        XMLRecordWriter xrw = new XMLRecordWriter(sw);
667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        xrw.bool("x", true);
677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        xrw.bool("y", false);
687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        xrw.flush();
697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String str = sw.toString();
707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals(null, "<x>true</x><y>false</y>", normalize(str));
717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringReader sr = new StringReader(str);
737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        XMLRecordReader xrr = new XMLRecordReader(sr);
747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertTrue(null, xrr.bool("x"));
757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertFalse(null, xrr.bool("y"));
767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
782d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void testBoolArray() {
807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        boolean[][] datas = {
817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {},
827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { true },
837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { true, false },
847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { true, false, true },
857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
86fe77e7203e518f62b5bd8e8c603bca361e9cf47bFredrik Roubert
877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[] targets = {
887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            "<testList></testList>",
897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            "<testList><test>true</test></testList>",
907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            "<testList><test>true</test><test>false</test></testList>",
917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            "<testList><test>true</test><test>false</test>" +
927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            "<test>true</test></testList>",
937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int j = 0; j < datas.length; ++j) {
967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            boolean[] data = datas[j];
977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String target = targets[j];
987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            StringWriter sw = new StringWriter();
1007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            XMLRecordWriter xrw = new XMLRecordWriter(sw);
1017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            xrw.boolArray("test", data);
1027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            xrw.flush();
1037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String str = sw.toString();
1047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            assertEquals("" + j, target, normalize(str));
1057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            StringReader sr = new StringReader(str);
1077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            XMLRecordReader xrr = new XMLRecordReader(sr);
1087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            boolean[] out = xrr.boolArray("test");
1097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            assertNotNull("" + j, out);
1117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            assertEquals("" + j, data.length, out.length);
1127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            for (int i = 0; i < data.length; ++i) {
1137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                assertEquals("" + j + "/" + i, data[i], out[i]);
1147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
1157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1182d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
1197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void testCharacter() {
1207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringWriter sw = new StringWriter();
1217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        XMLRecordWriter xrw = new XMLRecordWriter(sw);
1227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        xrw.character("x", 'a');
1237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        xrw.character("y", 'b');
1247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        xrw.flush();
1257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String str = sw.toString();
1267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals(null, "<x>a</x><y>b</y>", normalize(str));
1277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringReader sr = new StringReader(str);
1297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        XMLRecordReader xrr = new XMLRecordReader(sr);
1307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals(null, 'a', xrr.character("x"));
1317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals(null, 'b', xrr.character("y"));
1327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1342d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
1357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void testCharacterArray() {
1367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        char[][] datas = {
1377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {},
1387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 'a' },
1397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 'a', 'b' },
1407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 'a', 'b', 'c' },
1417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
1427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[] targets = {
1447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            "<testList></testList>",
1457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            "<testList><test>a</test></testList>",
1467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            "<testList><test>a</test><test>b</test></testList>",
1477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            "<testList><test>a</test><test>b</test>" +
1487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            "<test>c</test></testList>",
1497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
1507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int j = 0; j < datas.length; ++j) {
1527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            char[] data = datas[j];
1537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String target = targets[j];
1547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            StringWriter sw = new StringWriter();
1567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            XMLRecordWriter xrw = new XMLRecordWriter(sw);
1577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            xrw.characterArray("test", data);
1587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            xrw.flush();
1597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String str = sw.toString();
1607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            assertEquals("" + j, target, normalize(str));
1617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            StringReader sr = new StringReader(str);
1637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            XMLRecordReader xrr = new XMLRecordReader(sr);
1647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            char[] out = xrr.characterArray("test");
1657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            assertNotNull("" + j, out);
1677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            assertEquals("" + j, data.length, out.length);
1687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            for (int i = 0; i < data.length; ++i) {
1697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                assertEquals("" + j + "/" + i, data[i], out[i]);
1707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
1717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1742d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
1757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void testNamedIndex() {
1767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringWriter sw = new StringWriter();
1777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        XMLRecordWriter xrw = new XMLRecordWriter(sw);
1787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[] names = { "zero", "one" };
1797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        xrw.namedIndex("x", names, 0);
1817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        xrw.namedIndex("y", names, 1);
1827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        xrw.flush();
1837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String str = sw.toString();
1847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals(null, "<x>zero</x><y>one</y>", normalize(str));
1857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringReader sr = new StringReader(str);
1877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        XMLRecordReader xrr = new XMLRecordReader(sr);
1887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals(null, 0, xrr.namedIndex("x", names));
1897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals(null, 1, xrr.namedIndex("y", names));
1907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1922d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
1937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void testNamedIndexArray() {
1947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[] names = { "zero", "one" };
1957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        byte[][] datas = {
1967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {},
1977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0 },
1987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 1, 0 },
1997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0, 1, 0 },
2007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
2017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[] targets = {
2037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            "<testList></testList>",
2047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            "<testList><test>zero</test></testList>",
2057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            "<testList><test>one</test><test>zero</test></testList>",
2067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            "<testList><test>zero</test><test>one</test>" +
2077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            "<test>zero</test></testList>",
2087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
2097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int j = 0; j < datas.length; ++j) {
2117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            byte[] data = datas[j];
2127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String target = targets[j];
2137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            StringWriter sw = new StringWriter();
2157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            XMLRecordWriter xrw = new XMLRecordWriter(sw);
2167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            xrw.namedIndexArray("test", names, data);
2177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            xrw.flush();
2187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String str = sw.toString();
2197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            assertEquals("" + j, target, normalize(str));
2207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            StringReader sr = new StringReader(str);
2227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            XMLRecordReader xrr = new XMLRecordReader(sr);
2237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            byte[] out = xrr.namedIndexArray("test", names);
2247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            assertNotNull("" + j, out);
2267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            assertEquals("" + j, data.length, out.length);
2277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            for (int i = 0; i < data.length; ++i) {
2287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                assertEquals("" + j + "/" + i, data[i], out[i]);
2297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
2307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
2317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
2327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2332d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
2347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void testString() {
2357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringWriter sw = new StringWriter();
2367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        XMLRecordWriter xrw = new XMLRecordWriter(sw);
2377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String s = " This is <a> &&\t test. ";
2397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String s1 = " This is <a> && test. ";
2407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String t = " This is &lt;a> &amp;&amp; test. ";
2417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        xrw.string("x", s);
2427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        xrw.flush();
2437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String str = sw.toString();
2447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("\n'" + normalize(str) + "' = \n'<x>" + t + "</x>", "<x>"
2457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                + t + "</x>", normalize(str));
2467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringReader sr = new StringReader(str);
2487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        XMLRecordReader xrr = new XMLRecordReader(sr);
2497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String res = xrr.string("x");
2507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("\n'" + res + "' == \n'" + s1 + "'", s1, res);
2517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
2527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2532d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
2547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void testStringArray() {
2557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String s1 = "";
2567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String s2 = " ";
2577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String s3 = "This is a test";
2587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String s4 = "  It is\n   only  a test\t  ";
2597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String s4x = " It is only a test ";
2607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
261fe77e7203e518f62b5bd8e8c603bca361e9cf47bFredrik Roubert        String[][] datas = {
2627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {},
2637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { s1 },
2647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { s2, s1 },
2657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { s3, s2, s1 },
2667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { s3, null, s1, null },
2677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { s4, s1, s3, s2 }
2687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
2697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[] targets = {
2717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            "<testList></testList>",
2727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            "<testList><test>" + s1 + "</test></testList>",
2737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            "<testList><test>" + s2 + "</test><test>" + s1 + "</test></testList>",
274fe77e7203e518f62b5bd8e8c603bca361e9cf47bFredrik Roubert            "<testList><test>" + s3 + "</test><test>" + s2 +
2757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "</test><test>" + s1 + "</test></testList>",
276fe77e7203e518f62b5bd8e8c603bca361e9cf47bFredrik Roubert            "<testList><test>" + s3 + "</test><test>Null</test><test>" + s1 +
2777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "</test><test>Null</test></testList>",
278fe77e7203e518f62b5bd8e8c603bca361e9cf47bFredrik Roubert            "<testList><test>" + s4x + "</test><test>" + s1 +
2797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "</test><test>" + s3 + "</test><test>" + s2 + "</test></testList>",
2807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
2817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int j = 0; j < datas.length; ++j) {
2837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String[] data = datas[j];
2847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String target = targets[j];
2857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            StringWriter sw = new StringWriter();
2877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            XMLRecordWriter xrw = new XMLRecordWriter(sw);
2887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            xrw.stringArray("test", data);
2897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            xrw.flush();
2907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String str = sw.toString();
2917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            assertEquals("" + j + " '" + str + "'", target, normalize(str));
2927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            StringReader sr = new StringReader(str);
2947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            XMLRecordReader xrr = new XMLRecordReader(sr);
2957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String[] out = xrr.stringArray("test");
2967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            assertNotNull("" + j, out);
2987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            assertEquals("" + j, data.length, out.length);
2997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            for (int i = 0; i < data.length; ++i) {
3007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String standin = data[i];
3017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (s4.equals(standin)) {
3027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    standin = s4x;
3037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
3047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                assertEquals("" + j + "/" + i + " '" + out[i] + "'", standin,
3057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        out[i]);
3067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
3077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
3087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
3097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3102d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
3117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void testStringTable() {
3127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String s1 = "";
3137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String s2 = " ";
3147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String s3 = "This is a test";
3157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String s4 = "It is only a test";
3167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
317fe77e7203e518f62b5bd8e8c603bca361e9cf47bFredrik Roubert        String[][] table = {
3187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {},
3197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { s1 },
3207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { s2, s1 },
3217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { s3, s2, s1 },
3227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            null,
3237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { s4, s1, s3, s2 }
3247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
3257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String target = "<testTable>" +
3277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            "<testList></testList>" +
3287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            "<testList><test></test></testList>" +
3297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            "<testList><test> </test><test></test></testList>" +
330fe77e7203e518f62b5bd8e8c603bca361e9cf47bFredrik Roubert            "<testList><test>This is a test</test><test> </test>" +
3317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "<test></test></testList>" +
3327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            "<testList>Null</testList>" +
3337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            "<testList><test>It is only a test</test><test></test>" +
3347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "<test>This is a test</test><test> </test></testList>" +
3357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            "</testTable>";
3367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringWriter sw = new StringWriter();
3387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        XMLRecordWriter xrw = new XMLRecordWriter(sw);
3397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        xrw.stringTable("test", table);
3407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        xrw.flush();
3417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String str = sw.toString();
3427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("'" + str + "'", target, normalize(str));
3437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
3447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3452d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
3467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void testOmittedFields() {
3477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringWriter sw = new StringWriter();
3487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        XMLRecordWriter xrw = new XMLRecordWriter(sw);
3497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        xrw.open("omit");
3507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        xrw.bool("x", true);
3517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        xrw.bool("y", false);
3527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        xrw.close();
3537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        xrw.flush();
3547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String str = sw.toString();
3557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringReader sr = new StringReader(str);
3577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        XMLRecordReader xrr = new XMLRecordReader(sr);
3587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertTrue(null, xrr.open("omit"));
3597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertTrue(null, xrr.bool("x"));
3607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals(null, '\uffff', xrr.character("z"));
3617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertFalse(null, xrr.bool("y"));
3627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertTrue(null, xrr.close());
3637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
3647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert}
365