/*
   * Test that functionality is maintained under high load.
   */
  public void test_load() {

    WordTrie wt = new WordTrie();

    final int TEST_LIMIT = 5000;

    for (int i = 0; i < TEST_LIMIT; ++i) {
      wt.add("WORD" + characterSequence(i));
    }

    for (int i = 0; i < TEST_LIMIT; ++i) {
      boolean t =
          wt.contains("WORD" + characterSequence(i))
              && wt.containsPrefix("WORD" + characterSequence(i));

      Assert.assertTrue(t);
    }
  }
  public void test_serialization() {
    WordTrie wt = new WordTrie();
    wt.add("WORD");

    byte[] s = wt.serialize();
    wt = null;
    System.gc();

    WordTrie n = WordTrie.deserialize(s);

    Assert.assertNotNull(n);
    Assert.assertTrue(n.contains("WORD"));
  }
  /*
   * Test class's functionality and error handling
   */
  public void test_functional() {

    WordTrie wt = new WordTrie();

    int r;
    boolean t;

    // Newly constructed trie should not contain any words

    t = wt.contains(null);
    Assert.assertFalse(t);

    t = wt.contains("");
    Assert.assertFalse(t);

    t = wt.contains("word");
    Assert.assertFalse(t);

    t = wt.contains("1@��$%^&*");
    Assert.assertFalse(t);

    // Test adding words to trie

    r = wt.add(null);
    Assert.assertFalse(r > 0);
    t = wt.contains(null);
    Assert.assertFalse(t);

    r = wt.add("");
    Assert.assertFalse(r > 0);
    t = wt.contains("");
    Assert.assertFalse(t);

    r = wt.add("1@��$%^&* /~");
    Assert.assertFalse(r > 0);
    t = wt.contains("1@��$%^&* /~");
    Assert.assertFalse(t);

    r = wt.add("lower");
    Assert.assertFalse(r > 0);
    t = wt.contains("lower");
    Assert.assertFalse(t);

    r = wt.add("UPPERlower");
    Assert.assertFalse(r > 0);
    t = wt.contains("UPPERlower");
    Assert.assertFalse(t);

    final String longString = "LONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONG";

    r = wt.add(longString);
    Assert.assertTrue(r >= 0);
    t = wt.contains(longString);
    Assert.assertTrue(t);

    // Test adding similar words

    r = wt.add("WORD");
    Assert.assertTrue(r >= 0);
    t = wt.contains("WORD");
    Assert.assertTrue(t);

    r = wt.add("PREFIXWORD");
    Assert.assertTrue(r >= 0);
    r = wt.add("WORDSUFFIX");
    Assert.assertTrue(r >= 0);
    r = wt.add("PREFIXWORDSUFFIX");
    Assert.assertTrue(r >= 0);
    r = wt.add("DROW");
    Assert.assertTrue(r >= 0);

    t =
        wt.contains("WORD")
            && wt.contains("PREFIXWORD")
            && wt.contains("PREFIXWORD")
            && wt.contains("PREFIXWORDSUFFIX")
            && wt.contains("DROW");
    Assert.assertTrue(t);

    // Add duplicate entry

    r = wt.add("WORD");
    Assert.assertTrue(r >= 0);
    t = wt.contains("WORD");
    Assert.assertTrue(t);

    // Prefix checking

    wt.add("ABCD");
    t =
        wt.containsPrefix("")
            && wt.containsPrefix("A")
            && wt.containsPrefix("AB")
            && wt.containsPrefix("ABC")
            && wt.containsPrefix("ABCD");
    Assert.assertTrue(t);

    t =
        wt.containsPrefix("B")
            || wt.containsPrefix("BCD")
            || wt.containsPrefix("ABD")
            || wt.containsPrefix("ABCDE");
    Assert.assertFalse(t);

    t = wt.containsPrefix(null);
    Assert.assertFalse(t);
  }