13feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada/*
23feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada * Copyright (C) 2013 The Android Open Source Project
33feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada *
43feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada * Licensed under the Apache License, Version 2.0 (the "License");
53feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada * you may not use this file except in compliance with the License.
63feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada * You may obtain a copy of the License at
73feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada *
83feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada *      http://www.apache.org/licenses/LICENSE-2.0
93feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada *
103feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada * Unless required by applicable law or agreed to in writing, software
113feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada * distributed under the License is distributed on an "AS IS" BASIS,
123feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada * See the License for the specific language governing permissions and
143feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada * limitations under the License.
153feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada */
163feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada
173feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanadapackage com.android.inputmethod.latin.makedict;
183feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada
1977bce05e6f6e3a988253f9305ae22e51f56f5b1aYuichiro Hanadaimport com.android.inputmethod.latin.makedict.BinaryDictDecoderUtils.DictBuffer;
20065aad9501ae446aee5d73450c01dc21b8f3242aYuichiro Hanadaimport com.android.inputmethod.latin.makedict.DictDecoder.DictionaryBufferFactory;
21065aad9501ae446aee5d73450c01dc21b8f3242aYuichiro Hanadaimport com.android.inputmethod.latin.makedict.DictDecoder.DictionaryBufferFromByteArrayFactory;
22065aad9501ae446aee5d73450c01dc21b8f3242aYuichiro Hanadaimport com.android.inputmethod.latin.makedict.DictDecoder.
2377bce05e6f6e3a988253f9305ae22e51f56f5b1aYuichiro Hanada        DictionaryBufferFromReadOnlyByteBufferFactory;
24065aad9501ae446aee5d73450c01dc21b8f3242aYuichiro Hanadaimport com.android.inputmethod.latin.makedict.DictDecoder.
2577bce05e6f6e3a988253f9305ae22e51f56f5b1aYuichiro Hanada        DictionaryBufferFromWritableByteBufferFactory;
263feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada
273feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanadaimport android.test.AndroidTestCase;
283feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanadaimport android.util.Log;
293feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada
303feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanadaimport java.io.File;
313feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanadaimport java.io.FileOutputStream;
323feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanadaimport java.io.IOException;
333feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada
343feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada/**
35112257e40f6f6d914fac1c3a45f39a770693b386Yuichiro Hanada * Unit tests for Ver3DictDecoder
363feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada */
37112257e40f6f6d914fac1c3a45f39a770693b386Yuichiro Hanadapublic class Ver3DictDecoderTests extends AndroidTestCase {
38112257e40f6f6d914fac1c3a45f39a770693b386Yuichiro Hanada    private static final String TAG = Ver3DictDecoderTests.class.getSimpleName();
393feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada
403feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada    private final byte[] data = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
413feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada
423feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada    // Utilities for testing
433feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada    public void writeDataToFile(final File file) {
443feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada        FileOutputStream outStream = null;
453feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada        try {
463feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada            outStream = new FileOutputStream(file);
473feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada            outStream.write(data);
483feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada        } catch (IOException e) {
493feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada            fail ("Can't write data to the test file");
503feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada        } finally {
513feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada            if (outStream != null) {
523feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada                try {
533feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada                    outStream.close();
543feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada                } catch (IOException e) {
553feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada                    Log.e(TAG, "Failed to close the output stream", e);
563feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada                }
573feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada            }
583feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada        }
593feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada    }
603feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada
613feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada    @SuppressWarnings("null")
62065aad9501ae446aee5d73450c01dc21b8f3242aYuichiro Hanada    public void runTestOpenBuffer(final String testName, final DictionaryBufferFactory factory) {
633feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada        File testFile = null;
643feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada        try {
653feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada            testFile = File.createTempFile(testName, ".tmp", getContext().getCacheDir());
663feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada        } catch (IOException e) {
673feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada            Log.e(TAG, "IOException while the creating temporary file", e);
683feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada        }
693feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada
703feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada        assertNotNull(testFile);
71e9a10ff0f026b5ec458f116afc7a75806574cbcdYuichiro Hanada        final Ver3DictDecoder dictDecoder = new Ver3DictDecoder(testFile, factory);
723feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada        try {
73e9a10ff0f026b5ec458f116afc7a75806574cbcdYuichiro Hanada            dictDecoder.openDictBuffer();
743feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada        } catch (Exception e) {
753feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada            Log.e(TAG, "Failed to open the buffer", e);
763feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada        }
773feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada
783feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada        writeDataToFile(testFile);
793feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada
803feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada        try {
81e9a10ff0f026b5ec458f116afc7a75806574cbcdYuichiro Hanada            dictDecoder.openDictBuffer();
823feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada        } catch (Exception e) {
833feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada            Log.e(TAG, "Raised the exception while opening buffer", e);
843feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada        }
853feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada
8677bce05e6f6e3a988253f9305ae22e51f56f5b1aYuichiro Hanada        assertEquals(testFile.length(), dictDecoder.getDictBuffer().capacity());
873feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada    }
883feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada
893feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada    public void testOpenBufferWithByteBuffer() {
903feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada        runTestOpenBuffer("testOpenBufferWithByteBuffer",
9177bce05e6f6e3a988253f9305ae22e51f56f5b1aYuichiro Hanada                new DictionaryBufferFromReadOnlyByteBufferFactory());
923feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada    }
933feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada
943feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada    public void testOpenBufferWithByteArray() {
953feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada        runTestOpenBuffer("testOpenBufferWithByteArray",
9677bce05e6f6e3a988253f9305ae22e51f56f5b1aYuichiro Hanada                new DictionaryBufferFromByteArrayFactory());
973feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada    }
983feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada
99bbc8a930f706d16e45dce2376ea388a0fd74bb7aYuichiro Hanada    public void testOpenBufferWithWritableByteBuffer() {
100bbc8a930f706d16e45dce2376ea388a0fd74bb7aYuichiro Hanada        runTestOpenBuffer("testOpenBufferWithWritableByteBuffer",
10177bce05e6f6e3a988253f9305ae22e51f56f5b1aYuichiro Hanada                new DictionaryBufferFromWritableByteBufferFactory());
102bbc8a930f706d16e45dce2376ea388a0fd74bb7aYuichiro Hanada    }
103bbc8a930f706d16e45dce2376ea388a0fd74bb7aYuichiro Hanada
1043feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada    @SuppressWarnings("null")
105065aad9501ae446aee5d73450c01dc21b8f3242aYuichiro Hanada    public void runTestGetBuffer(final String testName, final DictionaryBufferFactory factory) {
1063feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada        File testFile = null;
1073feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada        try {
1083feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada            testFile = File.createTempFile(testName, ".tmp", getContext().getCacheDir());
1093feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada        } catch (IOException e) {
1103feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada            Log.e(TAG, "IOException while the creating temporary file", e);
1113feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada        }
1123feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada
113e9a10ff0f026b5ec458f116afc7a75806574cbcdYuichiro Hanada        final Ver3DictDecoder dictDecoder = new Ver3DictDecoder(testFile, factory);
1143feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada
1153feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada        // the default return value of getBuffer() must be null.
11677bce05e6f6e3a988253f9305ae22e51f56f5b1aYuichiro Hanada        assertNull("the default return value of getBuffer() is not null",
11777bce05e6f6e3a988253f9305ae22e51f56f5b1aYuichiro Hanada                dictDecoder.getDictBuffer());
1183feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada
1193feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada        writeDataToFile(testFile);
1203feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada        assertTrue(testFile.exists());
1213feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada        Log.d(TAG, "file length = " + testFile.length());
1223feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada
12377bce05e6f6e3a988253f9305ae22e51f56f5b1aYuichiro Hanada        DictBuffer dictBuffer = null;
1243feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada        try {
125e9a10ff0f026b5ec458f116afc7a75806574cbcdYuichiro Hanada            dictBuffer = dictDecoder.openAndGetDictBuffer();
1263feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada        } catch (IOException e) {
1273feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada            Log.e(TAG, "Failed to open and get the buffer", e);
1283feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada        }
12977bce05e6f6e3a988253f9305ae22e51f56f5b1aYuichiro Hanada        assertNotNull("the buffer must not be null", dictBuffer);
1303feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada
1313feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada        for (int i = 0; i < data.length; ++i) {
13277bce05e6f6e3a988253f9305ae22e51f56f5b1aYuichiro Hanada            assertEquals(data[i], dictBuffer.readUnsignedByte());
1333feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada        }
1343feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada    }
1353feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada
1363feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada    public void testGetBufferWithByteBuffer() {
1373feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada        runTestGetBuffer("testGetBufferWithByteBuffer",
13877bce05e6f6e3a988253f9305ae22e51f56f5b1aYuichiro Hanada                new DictionaryBufferFromReadOnlyByteBufferFactory());
1393feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada    }
1403feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada
1413feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada    public void testGetBufferWithByteArray() {
1423feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada        runTestGetBuffer("testGetBufferWithByteArray",
14377bce05e6f6e3a988253f9305ae22e51f56f5b1aYuichiro Hanada                new DictionaryBufferFromByteArrayFactory());
1443feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada    }
145bbc8a930f706d16e45dce2376ea388a0fd74bb7aYuichiro Hanada
146bbc8a930f706d16e45dce2376ea388a0fd74bb7aYuichiro Hanada    public void testGetBufferWithWritableByteBuffer() {
147bbc8a930f706d16e45dce2376ea388a0fd74bb7aYuichiro Hanada        runTestGetBuffer("testGetBufferWithWritableByteBuffer",
14877bce05e6f6e3a988253f9305ae22e51f56f5b1aYuichiro Hanada                new DictionaryBufferFromWritableByteBufferFactory());
149bbc8a930f706d16e45dce2376ea388a0fd74bb7aYuichiro Hanada    }
1503feacba1eb43fb906f50581df19ff2e468642ca8Yuichiro Hanada}
151