blob: 6e5c4a893cf218519fbb92bd1104b1faae62f487 [file] [log] [blame]
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/language/core/browser/url_language_histogram.h"
#include "components/prefs/testing_pref_service.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
using testing::ElementsAre;
using testing::FloatEq;
using testing::Gt;
using testing::SizeIs;
namespace {
const char kLang1[] = "en";
const char kLang2[] = "de";
const char kLang3[] = "es";
} // namespace
namespace language {
bool operator==(const UrlLanguageHistogram::LanguageInfo& lhs,
const UrlLanguageHistogram::LanguageInfo& rhs) {
return lhs.language_code == rhs.language_code;
}
TEST(UrlLanguageHistogramTest, ListSorted) {
TestingPrefServiceSimple prefs;
UrlLanguageHistogram::RegisterProfilePrefs(prefs.registry());
UrlLanguageHistogram hist(&prefs);
for (int i = 0; i < 50; i++) {
hist.OnPageVisited(kLang1);
hist.OnPageVisited(kLang1);
hist.OnPageVisited(kLang1);
hist.OnPageVisited(kLang2);
}
// Note: LanguageInfo's operator== only checks the language code, not the
// frequency.
EXPECT_THAT(hist.GetTopLanguages(),
ElementsAre(UrlLanguageHistogram::LanguageInfo(kLang1, 0.0f),
UrlLanguageHistogram::LanguageInfo(kLang2, 0.0f)));
}
TEST(UrlLanguageHistogramTest, ListSortedReversed) {
TestingPrefServiceSimple prefs;
UrlLanguageHistogram::RegisterProfilePrefs(prefs.registry());
UrlLanguageHistogram hist(&prefs);
for (int i = 0; i < 50; i++) {
hist.OnPageVisited(kLang2);
hist.OnPageVisited(kLang1);
hist.OnPageVisited(kLang1);
hist.OnPageVisited(kLang1);
}
// Note: LanguageInfo's operator== only checks the language code, not the
// frequency.
EXPECT_THAT(hist.GetTopLanguages(),
ElementsAre(UrlLanguageHistogram::LanguageInfo(kLang1, 0.0f),
UrlLanguageHistogram::LanguageInfo(kLang2, 0.0f)));
}
TEST(UrlLanguageHistogramTest, RightFrequencies) {
TestingPrefServiceSimple prefs;
UrlLanguageHistogram::RegisterProfilePrefs(prefs.registry());
UrlLanguageHistogram hist(&prefs);
for (int i = 0; i < 50; i++) {
hist.OnPageVisited(kLang1);
hist.OnPageVisited(kLang1);
hist.OnPageVisited(kLang1);
hist.OnPageVisited(kLang2);
}
// Corresponding frequencies are given by the hist.
EXPECT_THAT(hist.GetLanguageFrequency(kLang1), FloatEq(0.75f));
EXPECT_THAT(hist.GetLanguageFrequency(kLang2), FloatEq(0.25f));
// An unknown language gets frequency 0.
EXPECT_THAT(hist.GetLanguageFrequency(kLang3), 0);
}
TEST(UrlLanguageHistogramTest, RareLanguageDiscarded) {
TestingPrefServiceSimple prefs;
UrlLanguageHistogram::RegisterProfilePrefs(prefs.registry());
UrlLanguageHistogram hist(&prefs);
hist.OnPageVisited(kLang2);
for (int i = 0; i < 900; i++)
hist.OnPageVisited(kLang1);
// Lang 2 is in the hist.
EXPECT_THAT(hist.GetLanguageFrequency(kLang2), Gt(0.0f));
// Another 100 visits cause the cleanup (total > 1000).
for (int i = 0; i < 100; i++)
hist.OnPageVisited(kLang1);
// Lang 2 is removed from the hist.
EXPECT_THAT(hist.GetTopLanguages(),
ElementsAre(UrlLanguageHistogram::LanguageInfo{kLang1, 1}));
}
TEST(UrlLanguageHistogramTest, ShouldClearHistoryIfAllTimes) {
TestingPrefServiceSimple prefs;
UrlLanguageHistogram::RegisterProfilePrefs(prefs.registry());
UrlLanguageHistogram hist(&prefs);
for (int i = 0; i < 100; i++) {
hist.OnPageVisited(kLang1);
}
EXPECT_THAT(hist.GetTopLanguages(), SizeIs(1));
EXPECT_THAT(hist.GetLanguageFrequency(kLang1), FloatEq(1.0));
hist.ClearHistory(base::Time(), base::Time::Max());
EXPECT_THAT(hist.GetTopLanguages(), SizeIs(0));
EXPECT_THAT(hist.GetLanguageFrequency(kLang1), FloatEq(0.0));
}
TEST(UrlLanguageHistogramTest, ShouldNotClearHistoryIfNotAllTimes) {
TestingPrefServiceSimple prefs;
UrlLanguageHistogram::RegisterProfilePrefs(prefs.registry());
UrlLanguageHistogram hist(&prefs);
for (int i = 0; i < 100; i++) {
hist.OnPageVisited(kLang1);
}
EXPECT_THAT(hist.GetTopLanguages(), SizeIs(1));
EXPECT_THAT(hist.GetLanguageFrequency(kLang1), FloatEq(1.0));
// Clearing only the last hour of the history has no effect.
hist.ClearHistory(base::Time::Now() - base::TimeDelta::FromHours(2),
base::Time::Max());
EXPECT_THAT(hist.GetTopLanguages(), SizeIs(1));
EXPECT_THAT(hist.GetLanguageFrequency(kLang1), FloatEq(1.0));
}
} // namespace language