/*
 * 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.fonts;

import java.util.BitSet;
import java.util.HashMap;
import java.util.Map;

import org.junit.Before;
import org.junit.Test;

import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

import org.apache.fop.util.CharUtilities;

public class CIDFullTestCase {

    private CIDFull cidFull;
    private MultiByteFont mbFont;
    private BitSet bs;
    private char[] chars;
    private int[] widths;
    private Map<Integer, Integer> glyphs;

    @Before
    public void setup() {
        bs = new BitSet();
        glyphs = new HashMap<Integer, Integer>();
        chars = new char[18];
        widths = new int[18];
        int i = 0;
        for (int j = 0; j < 20; j++) {
            if (j == 10 || j == 11) {
                continue;
            }
            bs.set(j);
            glyphs.put(j, j);
            chars[i] = (char) j;
            widths[i] = 100;
            i++;
        }
        mbFont = mock(MultiByteFont.class);
        when(mbFont.getGlyphIndices()).thenReturn(bs);
        when(mbFont.getChars()).thenReturn(chars);
        when(mbFont.getWidths()).thenReturn(widths);
        cidFull = new CIDFull(mbFont);
    }

    @Test
    public void testGetOriginalGlyphIndex() {
        // index 5 exists
        assertEquals(cidFull.getOriginalGlyphIndex(5), 5);
    }

    @Test
    public void testGetUnicode() {
        // index 9 exists
        assertEquals(cidFull.getUnicode(9), (char) 9);
        // index 10 does not
        assertEquals(cidFull.getUnicode(10), CharUtilities.NOT_A_CHARACTER);
    }

    @Test
    public void testMapChar() {
        // index 9 exists
        char c = 'a';
        assertEquals(cidFull.mapChar(9, c), (char) 9);
    }

    @Test
    public void testMapCodePoint() {
        // index 9 exists
        char c = 'a';
        assertEquals(cidFull.mapCodePoint(9, c), (char) 9);
    }

    @Test
    public void testGetGlyphs() {
        Map<Integer, Integer> fontGlyphs = cidFull.getGlyphs();
        for (Map.Entry<Integer, Integer> integerIntegerEntry : fontGlyphs.entrySet()) {
            assertEquals(integerIntegerEntry.getValue(), glyphs.get(integerIntegerEntry.getKey()));
        }
        assertTrue(fontGlyphs.size() == glyphs.size());
    }

    @Test
    public void testGetChars() {
        assertArrayEquals(cidFull.getChars(), chars);
    }

    @Test
    public void testGetNumberOfGlyphs() {
        assertTrue(cidFull.getNumberOfGlyphs() == 20);
    }

    @Test
    public void testGetGlyphIndices() {
        assertEquals(bs, cidFull.getGlyphIndices());
    }

    @Test
    public void testGetWidths() {
        assertArrayEquals(cidFull.getWidths(), widths);
    }

}
