// Copyright (c) 2011 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 "chrome/common/thumbnail_score.h"
#include "testing/gtest/include/gtest/gtest.h"

// Tests that the different types of thumbnails are compared properly.
TEST(ThumbnailScoreTest, ShouldReplaceThumbnailWithType) {
  base::Time now = base::Time::Now();

  ThumbnailScore nothing_good(0.5, false, false, now);
  ThumbnailScore not_at_top(0.5, false, true, now);
  ThumbnailScore bad_clipping(0.5, true, false, now);
  ThumbnailScore life_is_awesome(0.5, true, true, now);

  EXPECT_TRUE(ShouldReplaceThumbnailWith(nothing_good, not_at_top));
  EXPECT_TRUE(ShouldReplaceThumbnailWith(nothing_good, bad_clipping));
  EXPECT_TRUE(ShouldReplaceThumbnailWith(nothing_good, life_is_awesome));
  EXPECT_TRUE(ShouldReplaceThumbnailWith(not_at_top, bad_clipping));
  EXPECT_TRUE(ShouldReplaceThumbnailWith(not_at_top, life_is_awesome));
  EXPECT_TRUE(ShouldReplaceThumbnailWith(bad_clipping, life_is_awesome));
}

// Tests that we'll replace old thumbnails will crappier but newer ones.
TEST(ThumbnailScoreTest, ShouldReplaceThumbnailWithTime) {
  // Use a really long time for the difference so we aren't sensitive to the
  // degrading schedule.
  base::Time now = base::Time::Now();
  base::Time last_year = now - base::TimeDelta::FromDays(365);

  ThumbnailScore oldie_but_goodie(0.1, true, true, last_year);
  ThumbnailScore newie_but_crappie(0.9, true, true, now);

  EXPECT_TRUE(ShouldReplaceThumbnailWith(oldie_but_goodie, newie_but_crappie));
}

// Having many redirects should age the thumbnail.
TEST(ThumbnailScoreTest, RedirectCount) {
  base::Time now = base::Time::Now();

  ThumbnailScore no_redirects(0.5, true, true, now);
  no_redirects.redirect_hops_from_dest = 0;
  ThumbnailScore some_redirects(0.5, true, true, now);
  some_redirects.redirect_hops_from_dest = 1;

  EXPECT_TRUE(ShouldReplaceThumbnailWith(some_redirects, no_redirects));

  // This one has a lot of redirects but a better score. It should still be
  // rejected.
  ThumbnailScore lotsa_redirects(0.4, true, true, now);
  lotsa_redirects.redirect_hops_from_dest = 4;
  EXPECT_FALSE(ShouldReplaceThumbnailWith(no_redirects, lotsa_redirects));
}

TEST(ThumbnailScoreTest, ShouldConsiderUpdating) {
  ThumbnailScore score;
  // By default, the score is low, thus we should generate a new thumbnail.
  EXPECT_TRUE(score.ShouldConsiderUpdating());

  // Make it very interesting, but this is not enough.
  score.boring_score = 0.0;
  EXPECT_TRUE(score.ShouldConsiderUpdating());

  // good_clipping is important, but sill not enough.
  score.good_clipping = true;
  EXPECT_TRUE(score.ShouldConsiderUpdating());

  // at_top is important, but still not enough.
  score.at_top = true;
  EXPECT_TRUE(score.ShouldConsiderUpdating());

  // load_completed is important. Finally, the thumbnail is new and
  // interesting enough.
  score.load_completed = true;
  EXPECT_FALSE(score.ShouldConsiderUpdating());

  // Make it very boring, but it won't change the result. The boring score
  // isn't used for judging whether we should update or not. See comments
  // at boring_score in thumbnail_score.h for why.
  score.boring_score = 1.0;
  EXPECT_FALSE(score.ShouldConsiderUpdating());

  // Make it old. Then, it's no longer new enough.
  score.time_at_snapshot -=
      base::TimeDelta::FromDays(ThumbnailScore::kUpdateThumbnailTimeDays);
  EXPECT_TRUE(score.ShouldConsiderUpdating());
}
