diff options
| -rw-r--r-- | background_scripts/completion.coffee | 5 | ||||
| -rw-r--r-- | tests/unit_tests/completion_test.coffee | 16 |
2 files changed, 16 insertions, 5 deletions
diff --git a/background_scripts/completion.coffee b/background_scripts/completion.coffee index 28bb1afa..c99a94cb 100644 --- a/background_scripts/completion.coffee +++ b/background_scripts/completion.coffee @@ -355,7 +355,10 @@ RegexpCache = # Avoid cost of constructing new strings if prefix/suffix are empty (which is expected to be a common case). regexpString = prefix + regexpString if prefix regexpString = regexpString + suffix if suffix - @cache[regexpString] ||= new RegExp(regexpString, "i") + return @cache[regexpString] if @cache[regexpString] + # Smartcase: regexp is case insensitive, unless `string` contains a capital letter. + modifier = if /[A-Z]/.test string then "" else "i" + @cache[regexpString] = new RegExp(regexpString, modifier) # Provides cached access to Chrome's history. As the user browses to new pages, we add those pages to this # history cache. diff --git a/tests/unit_tests/completion_test.coffee b/tests/unit_tests/completion_test.coffee index 08ce46c2..8b6ba3ea 100644 --- a/tests/unit_tests/completion_test.coffee +++ b/tests/unit_tests/completion_test.coffee @@ -258,16 +258,24 @@ context "suggestions", context "RankingUtils", should "do a case insensitive match", -> - assert.isTrue RankingUtils.matches(["aRi"], "MARIO", "MARio") + assert.isTrue RankingUtils.matches(["ari"], "maRio", "mario") should "do a case insensitive match on full term", -> - assert.isTrue RankingUtils.matches(["MaRiO"], "MARIO", "MARio") + assert.isTrue RankingUtils.matches(["mario"], "MARIO", "MARio") should "do a case insensitive match on more than just two terms", -> - assert.isTrue RankingUtils.matches(["aRi"], "DOES_NOT_MATCH", "DOES_NOT_MATCH_EITHER", "MARio") + assert.isTrue RankingUtils.matches(["ari"], "DOES_NOT_MATCH", "DOES_NOT_MATCH_EITHER", "MARio") + + should "do a smartcase match", -> + assert.isTrue RankingUtils.matches(["Mar"], "Mario", "mario") + assert.isFalse RankingUtils.matches(["Mar"], "mario", "mario") + + should "do a smartcase match on full term", -> + assert.isTrue RankingUtils.matches(["Mario"], "Mario") + assert.isFalse RankingUtils.matches(["Mario"], "mario") should "do case insensitive word relevancy (matching)", -> - assert.isTrue RankingUtils.wordRelevancy(["aRi"], "MARIO", "MARio") > 0.0 + assert.isTrue RankingUtils.wordRelevancy(["ari"], "MARIO", "MARio") > 0.0 should "do case insensitive word relevancy (not matching)", -> assert.isTrue RankingUtils.wordRelevancy(["DOES_NOT_MATCH"], "MARIO", "MARio") == 0.0 |
