summaryrefslogtreecommitdiff
path: root/editeng/qa
diff options
context:
space:
mode:
authorTomaž Vajngerl <quikee@gmail.com>2012-07-30 23:11:30 +0200
committerTomaž Vajngerl <quikee@gmail.com>2012-07-30 23:43:47 +0200
commitfa351042bc425f0437bfb50d09220bedbc257948 (patch)
tree18fed4ecefc93e9e6ecec5c8bc84982dcbfdaf20 /editeng/qa
parent2fe93734ba9136da402162c4c892e8af991164f9 (diff)
LookupTree for fast autocompletion lookups (by Nico Weyand).
LookupTree is a tree structure for fast autocompletion lookups. Additionally the tree structure stores word probabilities, so each autocompletion request returns a result with highest probability. LatinLookupTree is an implementation which was designed to be even faster and more efficient latin text, however it works with any kind of unicode strings. The tree structure was coded by Nico Weyand, Unicode strings support and conversion to Libreoffice code structure was done by me. Change-Id: I6549ee45d0952407b8a070f30ed0598fcb420aa7
Diffstat (limited to 'editeng/qa')
-rw-r--r--editeng/qa/lookuptree/lookuptree_test.cxx225
1 files changed, 225 insertions, 0 deletions
diff --git a/editeng/qa/lookuptree/lookuptree_test.cxx b/editeng/qa/lookuptree/lookuptree_test.cxx
new file mode 100644
index 000000000000..9ca8bdcc38d9
--- /dev/null
+++ b/editeng/qa/lookuptree/lookuptree_test.cxx
@@ -0,0 +1,225 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * 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 .
+ */
+
+#include <sal/types.h>
+#include <cppunit/TestFixture.h>
+#include <cppunit/extensions/HelperMacros.h>
+#include <cppunit/plugin/TestPlugIn.h>
+
+#include <editeng/LookupTree.hxx>
+#include <editeng/LatinLookupTree.hxx>
+
+namespace {
+
+class LookupTreeTest : public CppUnit::TestFixture
+{
+ public:
+ void test();
+
+ CPPUNIT_TEST_SUITE(LookupTreeTest);
+ CPPUNIT_TEST(test);
+ CPPUNIT_TEST_SUITE_END();
+};
+
+CPPUNIT_TEST_SUITE_REGISTRATION(LookupTreeTest);
+
+void LookupTreeTest::test()
+{
+ LookupTree* a = new LatinLookupTree( "a" );
+
+ a->insert( OUString("vorschlagnummer1"), 2 );
+ a->insert( OUString("vorschlagnummer12") );
+ a->insert( OUString("vorschlagnummer2") );
+
+ CPPUNIT_ASSERT_EQUAL( OUString("vorschlagnummer1"), a->suggestAutoCompletion() );
+
+ a->insert( OUString("vorschlagnummer12") );
+ CPPUNIT_ASSERT_EQUAL( OUString("vorschlagnummer12"), a->suggestAutoCompletion() );
+
+ a->insert( OUString("vorschlagnummer2") );
+ a->insert( OUString("vorschlagnummer2") );
+ CPPUNIT_ASSERT_EQUAL( OUString("vorschlagnummer2"), a->suggestAutoCompletion() );
+
+ a->insert( OUString("vorschlag"), 15 );
+ CPPUNIT_ASSERT_EQUAL( OUString("vorschlag"), a->suggestAutoCompletion() );
+
+ a->insert( OUString("vorschlagnummer2"), 16 );
+ CPPUNIT_ASSERT_EQUAL( OUString("vorschlagnummer2"), a->suggestAutoCompletion() );
+
+ a->remove( OUString("vorschlagnummer2") );
+ CPPUNIT_ASSERT_EQUAL( OUString("vorschlag"), a->suggestAutoCompletion() );
+
+ a->insert( OUString("vorschlag20"), 20 );
+ CPPUNIT_ASSERT_EQUAL( OUString("vorschlag20"), a->suggestAutoCompletion() );
+
+ a->remove( OUString("vorschlag20") );
+ CPPUNIT_ASSERT_EQUAL( OUString("vorschlag"), a->suggestAutoCompletion() );
+
+ a->insert( OUString("vorschlagn"), 14 );
+ CPPUNIT_ASSERT_EQUAL( OUString("vorschlag"), a->suggestAutoCompletion() );
+
+ a->remove( OUString("vorschlag") );
+ CPPUNIT_ASSERT_EQUAL( OUString("vorschlagn"), a->suggestAutoCompletion() );
+
+ a->remove( OUString("vorschlagn") );
+ CPPUNIT_ASSERT_EQUAL( OUString("vorschlagnummer12"), a->suggestAutoCompletion() );
+
+ a->insert( OUString("aber"), 1 );
+ CPPUNIT_ASSERT_EQUAL( OUString("vorschlagnummer12"), a->suggestAutoCompletion() );
+
+ a->advance( 'a' );
+ CPPUNIT_ASSERT_EQUAL( OUString("ber"), a->suggestAutoCompletion() );
+
+ a->goBack();
+ CPPUNIT_ASSERT_EQUAL( OUString("vorschlagnummer12"), a->suggestAutoCompletion() );
+
+ a->insert( OUString("vorschlag"), 15 );
+ CPPUNIT_ASSERT_EQUAL( OUString("vorschlag"), a->suggestAutoCompletion() );
+
+ a->insert( OUString("vorschlag13"), 13 );
+ CPPUNIT_ASSERT_EQUAL( OUString("vorschlag"), a->suggestAutoCompletion() );
+
+ a->gotoNode( "vorsch" );
+ CPPUNIT_ASSERT_EQUAL( OUString("lag"), a->suggestAutoCompletion() );
+
+ a->advance( 'l' );
+ CPPUNIT_ASSERT_EQUAL( OUString("ag"), a->suggestAutoCompletion() );
+
+ a->advance( 'a' );
+ CPPUNIT_ASSERT_EQUAL( OUString("g13"), a->suggestAutoCompletion() );
+
+ a->advance( 'g' );
+ CPPUNIT_ASSERT_EQUAL( OUString("13"), a->suggestAutoCompletion() );
+
+ a->advance( '1' );
+ CPPUNIT_ASSERT_EQUAL( OUString("3"), a->suggestAutoCompletion() );
+
+ a->advance( '3' );
+ CPPUNIT_ASSERT ( a->suggestAutoCompletion().isEmpty() );
+
+ a->goBack();
+ a->advance( 'z' );
+ CPPUNIT_ASSERT ( a->suggestAutoCompletion().isEmpty() );
+
+ a->gotoNode( "vorschlag13" );
+ CPPUNIT_ASSERT ( a->suggestAutoCompletion().isEmpty() );
+
+ a->advance( 'g' );
+ a->advance( '1' );
+ a->advance( '3' );
+ a->remove( "vorschlag13" );
+ CPPUNIT_ASSERT_EQUAL( OUString(""), a->suggestAutoCompletion() );
+
+ a->insert( "VeraHatMichL1eb.", 1000000 );
+ a->returnToRoot();
+ CPPUNIT_ASSERT_EQUAL( OUString("VeraHatMichL1eb."), a->suggestAutoCompletion() );
+
+ a->gotoNode( "VeraHatMich" );
+ a->remove( "VeraHatMichL1eb." );
+ CPPUNIT_ASSERT_EQUAL( OUString(""), a->suggestAutoCompletion() );
+
+ a->returnToRoot();
+ CPPUNIT_ASSERT_EQUAL( OUString("vorschlag"), a->suggestAutoCompletion() );
+
+ a->gotoNode( "VeraLiebtMich" );
+ a->insert( 600 );
+ a->returnToRoot();
+ CPPUNIT_ASSERT_EQUAL( OUString("VeraLiebtMich"), a->suggestAutoCompletion() );
+
+ a->insert( "VeraHatMichL1eb.", 1000000 );
+ a->returnToRoot();
+ CPPUNIT_ASSERT_EQUAL( OUString("VeraHatMichL1eb."), a->suggestAutoCompletion() );
+
+ a->gotoNode( "VeraHatMich" );
+ a->remove( "VeraHatMichL1eb." );
+ CPPUNIT_ASSERT ( a->suggestAutoCompletion().isEmpty() );
+
+ a->advance( 'L' );
+ CPPUNIT_ASSERT ( a->suggestAutoCompletion().isEmpty() );
+
+ a->insert( "VeraHatMichL1eb.", 1000000 );
+ a->returnToRoot();
+ a->gotoNode( "VeraHatMich" );
+ a->remove( "VeraHatMichL1eb." );
+ CPPUNIT_ASSERT ( a->suggestAutoCompletion().isEmpty() );
+
+ a->goBack();
+ CPPUNIT_ASSERT ( a->suggestAutoCompletion().isEmpty() );
+
+ a->insert( "VeraHatMichL1eb.", 1000000 );
+ a->returnToRoot();
+ a->gotoNode( "VeraHatMich" );
+ a->remove( "VeraHatMichL1eb." );
+ CPPUNIT_ASSERT ( a->suggestAutoCompletion().isEmpty() );
+
+ a->goBack();
+ CPPUNIT_ASSERT ( a->suggestAutoCompletion().isEmpty() );
+
+ a->insert( "neu", 2000 );
+ a->returnToRoot();
+ CPPUNIT_ASSERT_EQUAL( OUString("neu"), a->suggestAutoCompletion() );
+
+ a->gotoNode( "ne" );
+ CPPUNIT_ASSERT_EQUAL( OUString("u"), a->suggestAutoCompletion() );
+
+ a->advance( sal_Unicode('u') );
+ a->advance( sal_Unicode('e') );
+ a->advance( sal_Unicode('r') );
+ a->insert();
+ CPPUNIT_ASSERT ( a->suggestAutoCompletion().isEmpty() );
+
+ a->returnToRoot();
+ CPPUNIT_ASSERT_EQUAL( OUString("neu"), a->suggestAutoCompletion() );
+
+ a->advance( 'n' );
+ CPPUNIT_ASSERT_EQUAL( OUString("eu"), a->suggestAutoCompletion() );
+
+ a->advance( 'e' );
+ CPPUNIT_ASSERT_EQUAL( OUString("uer"), a->suggestAutoCompletion() );
+
+ // Test unicode
+ OUString aQueryString = rtl::OStringToOUString( "H\xC3\xA4llo", RTL_TEXTENCODING_UTF8 );
+ a->insert( aQueryString );
+ a->returnToRoot();
+ a->advance( sal_Unicode('H') );
+
+ OUString aAutocompletedString = a->suggestAutoCompletion();
+ OUString aExpectedString = rtl::OStringToOUString( "\xC3\xA4llo", RTL_TEXTENCODING_UTF8 );
+
+ CPPUNIT_ASSERT_EQUAL( aExpectedString, aAutocompletedString );
+
+ OString aUtf8String( "\xe3\x81\x82\xe3\x81\x97\xe3\x81\x9f" );
+ aQueryString = rtl::OStringToOUString( aUtf8String, RTL_TEXTENCODING_UTF8 );
+ a->insert( aQueryString );
+
+ OUString aGotoString = rtl::OStringToOUString( "\xe3\x81\x82", RTL_TEXTENCODING_UTF8 );
+ a->gotoNode( aGotoString );
+
+ aAutocompletedString = a->suggestAutoCompletion();
+ aExpectedString = rtl::OStringToOUString( "\xe3\x81\x97\xe3\x81\x9f", RTL_TEXTENCODING_UTF8 );
+ CPPUNIT_ASSERT_EQUAL( aExpectedString, aAutocompletedString );
+
+ delete a;
+}
+
+} // namespace end
+
+CPPUNIT_PLUGIN_IMPLEMENT();
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */