/* * 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. */ /* $Id$ */ package org.apache.fop.complexscripts.scripts.arabic; import java.nio.IntBuffer; import java.util.BitSet; import java.util.HashMap; import org.junit.Test; import static org.junit.Assert.assertTrue; import org.apache.fop.complexscripts.scripts.ScriptProcessor; import org.apache.fop.complexscripts.util.CharScript; import org.apache.fop.complexscripts.util.GlyphContextTester; import org.apache.fop.complexscripts.util.GlyphSequence; import org.apache.fop.complexscripts.util.ScriptContextTester; import org.apache.fop.complexscripts.util.UTF32; // CSOFF: LineLength /** * Tests for joiner (ZWJ, ZWNJ) functionality related to the arabic script. */ public class ArabicJoinersTestCase { private static final String[][] ZWJ_TESTS_ISOL = new String[][] { { "\u0643", "1", }, { "\u0643\u200D", "00", }, { "\u200D\u0643", "00", }, { "\u200D\u0643\u200D", "000", }, }; private static final String[][] ZWJ_TESTS_INIT = new String[][] { { "\u0643", "0", }, { "\u0643\u200D", "10", }, { "\u200D\u0643", "00", }, { "\u200D\u0643\u200D", "000", }, }; private static final String[][] ZWJ_TESTS_MEDI = new String[][] { { "\u0643", "0", }, { "\u0643\u200D", "00", }, { "\u200D\u0643", "00", }, { "\u200D\u0643\u200D", "010", }, }; private static final String[][] ZWJ_TESTS_FINA = new String[][] { { "\u0643", "0", }, { "\u0643\u200D", "00", }, { "\u200D\u0643", "01", }, { "\u200D\u0643\u200D", "000", }, }; private static final String[][] ZWJ_TESTS_LIGA = new String[][] { }; @Test public void testArabicJoiners() { String script = CharScript.scriptTagFromCode(CharScript.SCRIPT_ARABIC); ScriptProcessor sp = ScriptProcessor.getInstance(script, new HashMap<String, ScriptProcessor>()); assertTrue(sp != null); ScriptContextTester sct = sp.getSubstitutionContextTester(); assertTrue(sct != null); String language = "dflt"; int flags = 0; testZWJ(sct, script, language, "isol", flags, ZWJ_TESTS_ISOL); testZWJ(sct, script, language, "init", flags, ZWJ_TESTS_INIT); testZWJ(sct, script, language, "medi", flags, ZWJ_TESTS_MEDI); testZWJ(sct, script, language, "fina", flags, ZWJ_TESTS_FINA); testZWJ(sct, script, language, "liga", flags, ZWJ_TESTS_LIGA); } private void testZWJ(ScriptContextTester sct, String script, String language, String feature, int flags, String[][] tests) { GlyphContextTester gct = sct.getTester(feature); assertTrue(gct != null); for (String[] t : tests) { testZWJ(gct, script, language, feature, flags, t); } } private void testZWJ(GlyphContextTester gct, String script, String language, String feature, int flags, String[] test) { assert test.length == 2; String str = test[0]; BitSet act = new BitSet(); GlyphSequence gs = makeGlyphSequence(str); for (int i = 0, n = str.length(); i < n; ++i) { if (gct.test(script, language, feature, gs, i, flags)) { act.set(i); } } BitSet exp = parseBitSet(test[1]); assertTrue(act.equals(exp)); } private GlyphSequence makeGlyphSequence(String s) { Integer[] ca = UTF32.toUTF32(s, 0, true); IntBuffer cb = IntBuffer.allocate(ca.length); for (Integer c : ca) { cb.put(c); } cb.rewind(); return new GlyphSequence(cb, null, null); } private BitSet parseBitSet(String s) { BitSet bits = new BitSet(); for (int i = 0, n = s.length(); i < n; ++i) { char c = s.charAt(i); assert (c == '0') || (c == '1'); if (c == '1') { bits.set(i); } } return bits; } @Test public void testArabicNonJoiners() { } }