/* ******************************************************************************* * Copyright (C) 2001-2007, International Business Machines * Corporation and others. All Rights Reserved. ******************************************************************************* */ package com.ibm.icu.dev.test.bidi; import com.ibm.icu.impl.Utility; import com.ibm.icu.text.Bidi; /** * Regression test for streaming mode * * @author Lina Kemmel, Matitiahu Allouche */ public class TestStreaming extends BidiTest { static final int MAXPORTIONS = 10; static class TestCase { String textIn; int chunk; int[] nPortions; int[][] portionLens; String[] message; public TestCase(String in, int ch, int[] np, int[][] lens, String[] msg) { this.textIn = in; this.chunk = ch; this.nPortions = np; this.portionLens = lens; this.message = msg; } } static final TestCase[] testCases = { new TestCase("123\n" + "abc45\r" + "67890\n" + "\r" + "02468\r" + "ghi", 6, new int[] { 6, 6 }, new int[][] {{ 6, 4, 6, 1, 6, 3}, { 4, 6, 6, 1, 6, 3 }}, new String[] {"6, 4, 6, 1, 6, 3", "4, 6, 6, 1, 6, 3"} ), new TestCase("abcd\nfgh\r12345\n456", 6, new int[] { 4, 4 }, new int[][] {{ 6, 3, 6, 3 }, { 5, 4, 6, 3 }}, new String[] {"6, 3, 6, 3", "5, 4, 6, 3"} ), new TestCase("abcd\nfgh\r12345\n45\r", 6, new int[] { 4, 4 }, new int[][] {{ 6, 3, 6, 3 }, { 5, 4, 6, 3 }}, new String[] {"6, 3, 6, 3", "5, 4, 6, 3"} ), new TestCase("abcde\nfghi", 10, new int[] { 1, 2 }, new int[][] {{ 10 }, { 6, 4 }}, new String[] {"10", "6, 4"} ) }; static final int MAXLOOPS = 20; static final byte[] paraLevels = { Bidi.LTR, Bidi.RTL }; public void testStreaming() { String src, subsrc; Bidi bidi; int srcLen, processedLen, chunk, len, nPortions, offset; int i, j, levelIndex; byte level; int nTests = testCases.length, nLevels = paraLevels.length; boolean mismatch, testOK = true; StringBuffer processedLenStr = new StringBuffer(MAXLOOPS * 5); logln("\nEntering TestStreaming\n"); bidi = new Bidi(); bidi.orderParagraphsLTR(true); for (levelIndex = 0; levelIndex < nLevels; levelIndex++) { for (i = 0; i < nTests; i++) { src = testCases[i].textIn; srcLen = src.length(); chunk = testCases[i].chunk; nPortions = testCases[i].nPortions[levelIndex]; level = paraLevels[levelIndex]; processedLenStr.setLength(0); logln("Testing level " + level + ", case " + i); mismatch = false; bidi.setReorderingOptions(Bidi.OPTION_STREAMING); for (j = 0; j < MAXPORTIONS && srcLen > 0; j++) { len = chunk < srcLen ? chunk : srcLen; offset = src.length() - srcLen; subsrc = src.substring(offset, offset + len); bidi.setPara(subsrc, level, null); processedLen = bidi.getProcessedLength(); if (processedLen == 0) { bidi.setReorderingOptions(Bidi.OPTION_DEFAULT); j--; continue; } bidi.setReorderingOptions(Bidi.OPTION_STREAMING); mismatch |= j >= nPortions || processedLen != testCases[i].portionLens[levelIndex][j]; processedLenStr.append(Integer.toString(processedLen) + " "); srcLen -= processedLen; } if (mismatch || j != nPortions) { testOK = false; errln("\nProcessed lengths mismatch for" + "\n\tParagraph level = " + level + "\n\tInput string: " + Utility.escape(src) + "\n\tChunk = " + chunk + "\n\tActually processed portion lengths: { " + processedLenStr + " }" + "\n\tExpected portion lengths : { " + testCases[i].message[levelIndex] + " }\n"); } } } if (testOK) { logln("\nBidi streaming test OK"); } logln("\nExiting TestStreaming\n"); } public static void main(String[] args) { try { new TestStreaming().run(args); } catch (Exception e) { System.out.println(e); } } }