private void generateWords(final int number, final Random random) {
    final int[] codePointSet =
        CodePointUtils.generateCodePointSet(DEFAULT_CODE_POINT_SET_SIZE, random);
    final Set<String> wordSet = new HashSet<>();
    while (wordSet.size() < number) {
      wordSet.add(CodePointUtils.generateWord(random, codePointSet));
    }
    sWords.addAll(wordSet);

    final int[] largeCodePointSet =
        CodePointUtils.generateCodePointSet(LARGE_CODE_POINT_SET_SIZE, random);
    wordSet.clear();
    while (wordSet.size() < number) {
      wordSet.add(CodePointUtils.generateWord(random, largeCodePointSet));
    }
    sWordsWithVariousCodePoints.addAll(wordSet);
  }
  private void runGetTerminalPosition(
      final ArrayList<String> words,
      final SparseArray<List<Integer>> bigrams,
      final int bufferType,
      final FormatOptions formatOptions,
      final String message) {
    final String dictName = "testGetTerminalPosition";
    final String dictVersion = Long.toString(System.currentTimeMillis());
    final File file =
        BinaryDictUtils.getDictFile(
            dictName, dictVersion, formatOptions, getContext().getCacheDir());

    final FusionDictionary dict =
        new FusionDictionary(
            new PtNodeArray(),
            BinaryDictUtils.makeDictionaryOptions(dictName, dictVersion, formatOptions));
    addUnigrams(sWords.size(), dict, sWords, null /* shortcutMap */);
    addBigrams(dict, words, bigrams);
    timeWritingDictToFile(file, dict, formatOptions);

    final DictDecoder dictDecoder =
        BinaryDictIOUtils.getDictDecoder(file, 0, file.length(), DictDecoder.USE_BYTEARRAY);
    try {
      dictDecoder.openDictBuffer();
    } catch (IOException e) {
      Log.e(TAG, "IOException while opening the buffer", e);
    } catch (UnsupportedFormatException e) {
      Log.e(TAG, "IOException while opening the buffer", e);
    }
    assertTrue("Can't get the buffer", dictDecoder.isDictBufferOpen());

    try {
      // too long word
      final String longWord = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz";
      assertEquals(FormatSpec.NOT_VALID_WORD, dictDecoder.getTerminalPosition(longWord));

      // null
      assertEquals(FormatSpec.NOT_VALID_WORD, dictDecoder.getTerminalPosition(null));

      // empty string
      assertEquals(FormatSpec.NOT_VALID_WORD, dictDecoder.getTerminalPosition(""));
    } catch (IOException e) {
    } catch (UnsupportedFormatException e) {
    }

    // Test a word that is contained within the dictionary.
    long sum = 0;
    for (int i = 0; i < sWords.size(); ++i) {
      final long time = checkGetTerminalPosition(dictDecoder, sWords.get(i), true);
      sum += time == -1 ? 0 : time;
    }
    Log.d(
        TAG,
        "per search : "
            + (((double) sum) / sWords.size() / 1000000)
            + " : "
            + message
            + " : "
            + outputOptions(bufferType, formatOptions));

    // Test a word that isn't contained within the dictionary.
    final Random random = new Random((int) System.currentTimeMillis());
    final int[] codePointSet =
        CodePointUtils.generateCodePointSet(DEFAULT_CODE_POINT_SET_SIZE, random);
    for (int i = 0; i < 1000; ++i) {
      final String word = CodePointUtils.generateWord(random, codePointSet);
      if (sWords.indexOf(word) != -1) continue;
      checkGetTerminalPosition(dictDecoder, word, false);
    }
  }