172 lines
3.9 KiB
C++
172 lines
3.9 KiB
C++
//===- llvm/unittest/ADT/StatisticTest.cpp - Statistic unit tests ---------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm/ADT/Statistic.h"
|
|
#include "llvm/Support/raw_ostream.h"
|
|
#include "gtest/gtest.h"
|
|
using namespace llvm;
|
|
|
|
using OptionalStatistic = Optional<std::pair<StringRef, unsigned>>;
|
|
|
|
namespace {
|
|
#define DEBUG_TYPE "unittest"
|
|
STATISTIC(Counter, "Counts things");
|
|
STATISTIC(Counter2, "Counts other things");
|
|
ALWAYS_ENABLED_STATISTIC(AlwaysCounter, "Counts things always");
|
|
|
|
#if LLVM_ENABLE_STATS
|
|
static void
|
|
extractCounters(const std::vector<std::pair<StringRef, unsigned>> &Range,
|
|
OptionalStatistic &S1, OptionalStatistic &S2) {
|
|
for (const auto &S : Range) {
|
|
if (S.first == "Counter")
|
|
S1 = S;
|
|
if (S.first == "Counter2")
|
|
S2 = S;
|
|
}
|
|
}
|
|
#endif
|
|
|
|
TEST(StatisticTest, Count) {
|
|
EnableStatistics();
|
|
|
|
Counter = 0;
|
|
EXPECT_EQ(Counter, 0u);
|
|
Counter++;
|
|
Counter++;
|
|
#if LLVM_ENABLE_STATS
|
|
EXPECT_EQ(Counter, 2u);
|
|
#else
|
|
EXPECT_EQ(Counter, 0u);
|
|
#endif
|
|
|
|
AlwaysCounter = 0;
|
|
EXPECT_EQ(AlwaysCounter, 0u);
|
|
AlwaysCounter++;
|
|
++AlwaysCounter;
|
|
EXPECT_EQ(AlwaysCounter, 2u);
|
|
}
|
|
|
|
TEST(StatisticTest, Assign) {
|
|
EnableStatistics();
|
|
|
|
Counter = 2;
|
|
#if LLVM_ENABLE_STATS
|
|
EXPECT_EQ(Counter, 2u);
|
|
#else
|
|
EXPECT_EQ(Counter, 0u);
|
|
#endif
|
|
|
|
AlwaysCounter = 2;
|
|
EXPECT_EQ(AlwaysCounter, 2u);
|
|
}
|
|
|
|
TEST(StatisticTest, API) {
|
|
EnableStatistics();
|
|
// Reset beforehand to make sure previous tests don't effect this one.
|
|
ResetStatistics();
|
|
|
|
Counter = 0;
|
|
EXPECT_EQ(Counter, 0u);
|
|
Counter++;
|
|
Counter++;
|
|
#if LLVM_ENABLE_STATS
|
|
EXPECT_EQ(Counter, 2u);
|
|
#else
|
|
EXPECT_EQ(Counter, 0u);
|
|
#endif
|
|
|
|
#if LLVM_ENABLE_STATS
|
|
{
|
|
const auto Range1 = GetStatistics();
|
|
EXPECT_NE(Range1.begin(), Range1.end());
|
|
EXPECT_EQ(Range1.begin() + 1, Range1.end());
|
|
|
|
OptionalStatistic S1;
|
|
OptionalStatistic S2;
|
|
extractCounters(Range1, S1, S2);
|
|
|
|
EXPECT_EQ(S1.hasValue(), true);
|
|
EXPECT_EQ(S2.hasValue(), false);
|
|
}
|
|
|
|
// Counter2 will be registered when it's first touched.
|
|
Counter2++;
|
|
|
|
{
|
|
const auto Range = GetStatistics();
|
|
EXPECT_NE(Range.begin(), Range.end());
|
|
EXPECT_EQ(Range.begin() + 2, Range.end());
|
|
|
|
OptionalStatistic S1;
|
|
OptionalStatistic S2;
|
|
extractCounters(Range, S1, S2);
|
|
|
|
EXPECT_EQ(S1.hasValue(), true);
|
|
EXPECT_EQ(S2.hasValue(), true);
|
|
|
|
EXPECT_EQ(S1->first, "Counter");
|
|
EXPECT_EQ(S1->second, 2u);
|
|
|
|
EXPECT_EQ(S2->first, "Counter2");
|
|
EXPECT_EQ(S2->second, 1u);
|
|
}
|
|
#else
|
|
Counter2++;
|
|
auto &Range = GetStatistics();
|
|
EXPECT_EQ(Range.begin(), Range.end());
|
|
#endif
|
|
|
|
#if LLVM_ENABLE_STATS
|
|
// Check that resetting the statistics works correctly.
|
|
// It should empty the list and zero the counters.
|
|
ResetStatistics();
|
|
{
|
|
auto &Range = GetStatistics();
|
|
EXPECT_EQ(Range.begin(), Range.end());
|
|
EXPECT_EQ(Counter, 0u);
|
|
EXPECT_EQ(Counter2, 0u);
|
|
OptionalStatistic S1;
|
|
OptionalStatistic S2;
|
|
extractCounters(Range, S1, S2);
|
|
EXPECT_EQ(S1.hasValue(), false);
|
|
EXPECT_EQ(S2.hasValue(), false);
|
|
}
|
|
|
|
// Now check that they successfully re-register and count.
|
|
Counter++;
|
|
Counter2++;
|
|
|
|
{
|
|
auto &Range = GetStatistics();
|
|
EXPECT_EQ(Range.begin() + 2, Range.end());
|
|
EXPECT_EQ(Counter, 1u);
|
|
EXPECT_EQ(Counter2, 1u);
|
|
|
|
OptionalStatistic S1;
|
|
OptionalStatistic S2;
|
|
extractCounters(Range, S1, S2);
|
|
|
|
EXPECT_EQ(S1.hasValue(), true);
|
|
EXPECT_EQ(S2.hasValue(), true);
|
|
|
|
EXPECT_EQ(S1->first, "Counter");
|
|
EXPECT_EQ(S1->second, 1u);
|
|
|
|
EXPECT_EQ(S2->first, "Counter2");
|
|
EXPECT_EQ(S2->second, 1u);
|
|
}
|
|
#else
|
|
// No need to test the output ResetStatistics(), there's nothing to reset so
|
|
// we can't tell if it failed anyway.
|
|
ResetStatistics();
|
|
#endif
|
|
}
|
|
|
|
} // end anonymous namespace
|