From 18a922c036f196e934fec1a1daab7cfaa98001ce Mon Sep 17 00:00:00 2001 From: Oleg Pudeyev Date: Thu, 8 Nov 2012 10:14:29 -0500 Subject: [PATCH 1/5] [ticket/11174] Started on search tests - keyword splitting. PHPBB3-11174 --- phpBB/includes/search/fulltext_native.php | 4 + tests/search/fixtures/posts.xml | 33 +++++++ tests/search/native_test.php | 113 ++++++++++++++++++++++ 3 files changed, 150 insertions(+) create mode 100644 tests/search/fixtures/posts.xml create mode 100644 tests/search/native_test.php diff --git a/phpBB/includes/search/fulltext_native.php b/phpBB/includes/search/fulltext_native.php index bbc2236b3c..bc4ac4bbe0 100644 --- a/phpBB/includes/search/fulltext_native.php +++ b/phpBB/includes/search/fulltext_native.php @@ -59,6 +59,10 @@ class phpbb_search_fulltext_native extends phpbb_search_base { include($this->phpbb_root_path . 'includes/utf/utf_normalizer.' . $this->php_ext); } + if (!function_exists('utf8_decode_ncr')) + { + include($this->phpbb_root_path . 'includes/utf/utf_tools.' . $this->php_ext); + } $error = false; } diff --git a/tests/search/fixtures/posts.xml b/tests/search/fixtures/posts.xml new file mode 100644 index 0000000000..875af55599 --- /dev/null +++ b/tests/search/fixtures/posts.xml @@ -0,0 +1,33 @@ + + + + post_username + post_subject + post_text + + foo + foo + foo + + + bar + bar + bar + +
+ + word_id + word_text + word_common + + 1 + foo + 0 + + + 2 + bar + 0 + +
+
diff --git a/tests/search/native_test.php b/tests/search/native_test.php new file mode 100644 index 0000000000..bcde11faf1 --- /dev/null +++ b/tests/search/native_test.php @@ -0,0 +1,113 @@ +must_contain_ids; } + public function get_must_not_contain_ids() { return \$this->must_not_contain_ids; } +} + "; + eval($code); + } + return $wrapped; +} + +class phpbb_search_native_test extends phpbb_database_test_case +{ + protected $db; + protected $search; + + public function getDataSet() + { + return $this->createXMLDataSet(dirname(__FILE__) . '/fixtures/posts.xml'); + } + + protected function setUp() + { + global $phpbb_root_path, $phpEx, $config, $user, $cache; + + parent::setUp(); + + // dbal uses cache + $cache = new phpbb_cache_driver_null; + + $this->db = $this->new_dbal(); + $error = null; + $class = phpbb_search_wrapper('phpbb_search_fulltext_native'); + $this->search = new $class($error, $phpbb_root_path, $phpEx, null, $config, $this->db, $user); + } + + protected function tearDown() + { + parent::tearDown(); + } + + public function keywords() + { + return array( + // keywords + // terms + // ok + // must contain ids + // must not contain ids + array( + 'foo', + 'all', + true, + array(1), + array(), + ), + array( + 'foo bar', + 'all', + true, + array(1, 2), + array(), + ), + array( + 'foo -bar', + 'all', + true, + array(1), + array(2), + ), + array( + '-foo', + 'all', + false, + array(), + array(), + ), + array( + '-foo -bar', + 'all', + false, + array(), + array(), + ), + ); + } + + /** + * @dataProvider keywords + */ + public function test_split_keywords($keywords, $terms, $ok, $must_contain, $must_not_contain) + { + $rv = $this->search->split_keywords($keywords, $terms); + $this->assertEquals($ok, $rv); + $this->assertEmpty(array_diff($must_contain, $this->search->get_must_contain_ids())); + $this->assertEmpty(array_diff($must_not_contain, $this->search->get_must_not_contain_ids())); + } +} From ed37141f512f857311b64bb283943634eba84525 Mon Sep 17 00:00:00 2001 From: Oleg Pudeyev Date: Thu, 8 Nov 2012 10:19:15 -0500 Subject: [PATCH 2/5] [ticket/11174] Clarify why that is the way it is. PHPBB3-11174 --- tests/search/native_test.php | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/search/native_test.php b/tests/search/native_test.php index bcde11faf1..15b4644498 100644 --- a/tests/search/native_test.php +++ b/tests/search/native_test.php @@ -107,6 +107,7 @@ class phpbb_search_native_test extends phpbb_database_test_case { $rv = $this->search->split_keywords($keywords, $terms); $this->assertEquals($ok, $rv); + // http://stackoverflow.com/questions/3838288/phpunit-assert-two-arrays-are-equal-but-order-of-elements-not-important $this->assertEmpty(array_diff($must_contain, $this->search->get_must_contain_ids())); $this->assertEmpty(array_diff($must_not_contain, $this->search->get_must_not_contain_ids())); } From 1aa0b4567fc1849712471e129b868927f400f773 Mon Sep 17 00:00:00 2001 From: Oleg Pudeyev Date: Thu, 8 Nov 2012 10:23:28 -0500 Subject: [PATCH 3/5] [ticket/11174] More tests. PHPBB3-11174 --- tests/search/native_test.php | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/tests/search/native_test.php b/tests/search/native_test.php index 15b4644498..8638a914ba 100644 --- a/tests/search/native_test.php +++ b/tests/search/native_test.php @@ -76,6 +76,29 @@ class phpbb_search_native_test extends phpbb_database_test_case array(1, 2), array(), ), + // leading, trailing and multiple spaces + array( + ' foo bar ', + 'all', + true, + array(1, 2), + array(), + ), + // words too short + array( + 'f', + 'all', + false, + array(), + array(), + ), + array( + 'f o o', + 'all', + false, + array(), + array(), + ), array( 'foo -bar', 'all', @@ -83,6 +106,7 @@ class phpbb_search_native_test extends phpbb_database_test_case array(1), array(2), ), + // all negative array( '-foo', 'all', From e523517e03d3f54daaa33b4e48743a0f065fba0f Mon Sep 17 00:00:00 2001 From: Oleg Pudeyev Date: Thu, 8 Nov 2012 11:01:34 -0500 Subject: [PATCH 4/5] [ticket/11174] Test for common words. PHPBB3-11174 --- tests/search/fixtures/posts.xml | 10 ++++++++++ tests/search/native_test.php | 16 ++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/tests/search/fixtures/posts.xml b/tests/search/fixtures/posts.xml index 875af55599..7b249ee303 100644 --- a/tests/search/fixtures/posts.xml +++ b/tests/search/fixtures/posts.xml @@ -14,6 +14,11 @@ bar bar + + commonword + commonword + commonword + word_id @@ -29,5 +34,10 @@ bar0 + + 3 + commonword + 1 +
diff --git a/tests/search/native_test.php b/tests/search/native_test.php index 8638a914ba..3726b96a82 100644 --- a/tests/search/native_test.php +++ b/tests/search/native_test.php @@ -121,6 +121,22 @@ class phpbb_search_native_test extends phpbb_database_test_case array(), array(), ), + // all common + array( + 'commonword', + 'all', + false, + array(), + array(), + ), + // some common + array( + 'commonword foo', + 'all', + true, + array(1), + array(), + ), ); } From a5f7f99478a43206ab6021a80828dddf66f92e9f Mon Sep 17 00:00:00 2001 From: Oleg Pudeyev Date: Thu, 8 Nov 2012 11:15:46 -0500 Subject: [PATCH 5/5] [ticket/11174] Check common words, fix array equality assertion. PHPBB3-11174 --- tests/search/native_test.php | 54 ++++++++++++++++++++++++++++-------- 1 file changed, 43 insertions(+), 11 deletions(-) diff --git a/tests/search/native_test.php b/tests/search/native_test.php index 3726b96a82..66972079cf 100644 --- a/tests/search/native_test.php +++ b/tests/search/native_test.php @@ -62,12 +62,14 @@ class phpbb_search_native_test extends phpbb_database_test_case // ok // must contain ids // must not contain ids + // common words array( 'foo', 'all', true, array(1), array(), + array(), ), array( 'foo bar', @@ -75,6 +77,7 @@ class phpbb_search_native_test extends phpbb_database_test_case true, array(1, 2), array(), + array(), ), // leading, trailing and multiple spaces array( @@ -83,21 +86,25 @@ class phpbb_search_native_test extends phpbb_database_test_case true, array(1, 2), array(), + array(), ), // words too short array( 'f', 'all', false, - array(), - array(), + null, + null, + // short words count as "common" words + array('f'), ), array( 'f o o', 'all', false, - array(), - array(), + null, + null, + array('f', 'o', 'o'), ), array( 'foo -bar', @@ -105,20 +112,23 @@ class phpbb_search_native_test extends phpbb_database_test_case true, array(1), array(2), + array(), ), // all negative array( '-foo', 'all', false, - array(), + null, + null, array(), ), array( '-foo -bar', 'all', false, - array(), + null, + null, array(), ), // all common @@ -126,8 +136,9 @@ class phpbb_search_native_test extends phpbb_database_test_case 'commonword', 'all', false, - array(), - array(), + null, + null, + array('commonword'), ), // some common array( @@ -136,6 +147,7 @@ class phpbb_search_native_test extends phpbb_database_test_case true, array(1), array(), + array('commonword'), ), ); } @@ -143,12 +155,32 @@ class phpbb_search_native_test extends phpbb_database_test_case /** * @dataProvider keywords */ - public function test_split_keywords($keywords, $terms, $ok, $must_contain, $must_not_contain) + public function test_split_keywords($keywords, $terms, $ok, $must_contain, $must_not_contain, $common) { $rv = $this->search->split_keywords($keywords, $terms); $this->assertEquals($ok, $rv); + if ($ok) + { + // only check criteria if the search is going to be performed + $this->assert_array_content_equals($must_contain, $this->search->get_must_contain_ids()); + $this->assert_array_content_equals($must_not_contain, $this->search->get_must_not_contain_ids()); + } + $this->assert_array_content_equals($common, $this->search->get_common_words()); + } + + public function assert_array_content_equals($one, $two) + { // http://stackoverflow.com/questions/3838288/phpunit-assert-two-arrays-are-equal-but-order-of-elements-not-important - $this->assertEmpty(array_diff($must_contain, $this->search->get_must_contain_ids())); - $this->assertEmpty(array_diff($must_not_contain, $this->search->get_must_not_contain_ids())); + // but one array_diff is not enough! + if (sizeof(array_diff($one, $two)) || sizeof(array_diff($two, $one))) + { + // get a nice error message + $this->assertEquals($one, $two); + } + else + { + // increase assertion count + $this->assertTrue(true); + } } }