147 lines
5.6 KiB
C++
147 lines
5.6 KiB
C++
/**
|
|
* @file llsingleton_test.cpp
|
|
* @date 2011-08-11
|
|
* @brief Unit test for the LLSingleton class
|
|
*
|
|
* $LicenseInfo:firstyear=2011&license=viewerlgpl$
|
|
* Second Life Viewer Source Code
|
|
* Copyright (C) 2011, Linden Research, Inc.
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation;
|
|
* version 2.1 of the License only.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
*
|
|
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
|
* $/LicenseInfo$
|
|
*/
|
|
|
|
#include "linden_common.h"
|
|
|
|
#include "lltrace.h"
|
|
#include "lltracethreadrecorder.h"
|
|
#include "lltracerecording.h"
|
|
#include "../test/lltut.h"
|
|
|
|
#ifdef LL_WINDOWS
|
|
#pragma warning(disable : 4244) // possible loss of data on conversions
|
|
#endif
|
|
|
|
namespace LLUnits
|
|
{
|
|
// using powers of 2 to allow strict floating point equality
|
|
LL_DECLARE_BASE_UNIT(Ounces, "oz");
|
|
LL_DECLARE_DERIVED_UNIT(TallCup, "", Ounces, / 12);
|
|
LL_DECLARE_DERIVED_UNIT(GrandeCup, "", Ounces, / 16);
|
|
LL_DECLARE_DERIVED_UNIT(VentiCup, "", Ounces, / 20);
|
|
|
|
LL_DECLARE_BASE_UNIT(Grams, "g");
|
|
LL_DECLARE_DERIVED_UNIT(Milligrams, "mg", Grams, * 1000);
|
|
}
|
|
|
|
LL_DECLARE_UNIT_TYPEDEFS(LLUnits, Ounces);
|
|
LL_DECLARE_UNIT_TYPEDEFS(LLUnits, TallCup);
|
|
LL_DECLARE_UNIT_TYPEDEFS(LLUnits, GrandeCup);
|
|
LL_DECLARE_UNIT_TYPEDEFS(LLUnits, VentiCup);
|
|
LL_DECLARE_UNIT_TYPEDEFS(LLUnits, Grams);
|
|
LL_DECLARE_UNIT_TYPEDEFS(LLUnits, Milligrams);
|
|
|
|
|
|
namespace tut
|
|
{
|
|
using namespace LLTrace;
|
|
struct trace
|
|
{
|
|
ThreadRecorder mRecorder;
|
|
};
|
|
|
|
typedef test_group<trace> trace_t;
|
|
typedef trace_t::object trace_object_t;
|
|
tut::trace_t tut_singleton("LLTrace");
|
|
|
|
static CountStatHandle<S32> sCupsOfCoffeeConsumed("coffeeconsumed", "Delicious cup of dark roast.");
|
|
static SampleStatHandle<F32Milligrams> sCaffeineLevelStat("caffeinelevel", "Coffee buzz quotient");
|
|
static EventStatHandle<S32Ounces> sOuncesPerCup("cupsize", "Large, huge, or ginormous");
|
|
|
|
static F32 sCaffeineLevel(0.f);
|
|
const F32Milligrams sCaffeinePerOz(18.f);
|
|
|
|
void drink_coffee(S32 num_cups, S32Ounces cup_size)
|
|
{
|
|
add(sCupsOfCoffeeConsumed, num_cups);
|
|
for (S32 i = 0; i < num_cups; i++)
|
|
{
|
|
record(sOuncesPerCup, cup_size);
|
|
}
|
|
|
|
sCaffeineLevel += F32Ounces(num_cups * cup_size).value() * sCaffeinePerOz.value();
|
|
sample(sCaffeineLevelStat, sCaffeineLevel);
|
|
}
|
|
|
|
// basic data collection
|
|
template<> template<>
|
|
void trace_object_t::test<1>()
|
|
{
|
|
sample(sCaffeineLevelStat, sCaffeineLevel);
|
|
|
|
Recording all_day;
|
|
Recording at_work;
|
|
Recording after_3pm;
|
|
|
|
all_day.start();
|
|
{
|
|
// warm up with one grande cup
|
|
drink_coffee(1, S32TallCup(1));
|
|
|
|
// go to work
|
|
at_work.start();
|
|
{
|
|
// drink 3 tall cups, 1 after 3 pm
|
|
drink_coffee(2, S32GrandeCup(1));
|
|
after_3pm.start();
|
|
drink_coffee(1, S32GrandeCup(1));
|
|
}
|
|
at_work.stop();
|
|
drink_coffee(1, S32VentiCup(1));
|
|
}
|
|
// don't need to stop recordings to get accurate values out of them
|
|
//after_3pm.stop();
|
|
//all_day.stop();
|
|
|
|
ensure("count stats are counted when recording is active",
|
|
at_work.getSum(sCupsOfCoffeeConsumed) == 3
|
|
&& all_day.getSum(sCupsOfCoffeeConsumed) == 5
|
|
&& after_3pm.getSum(sCupsOfCoffeeConsumed) == 2);
|
|
ensure("measurement sums are counted when recording is active",
|
|
at_work.getSum(sOuncesPerCup) == S32Ounces(48)
|
|
&& all_day.getSum(sOuncesPerCup) == S32Ounces(80)
|
|
&& after_3pm.getSum(sOuncesPerCup) == S32Ounces(36));
|
|
ensure("measurement min is specific to when recording is active",
|
|
at_work.getMin(sOuncesPerCup) == S32GrandeCup(1)
|
|
&& all_day.getMin(sOuncesPerCup) == S32TallCup(1)
|
|
&& after_3pm.getMin(sOuncesPerCup) == S32GrandeCup(1));
|
|
ensure("measurement max is specific to when recording is active",
|
|
at_work.getMax(sOuncesPerCup) == S32GrandeCup(1)
|
|
&& all_day.getMax(sOuncesPerCup) == S32VentiCup(1)
|
|
&& after_3pm.getMax(sOuncesPerCup) == S32VentiCup(1));
|
|
ensure("sample min is specific to when recording is active",
|
|
at_work.getMin(sCaffeineLevelStat) == sCaffeinePerOz * ((S32Ounces)S32TallCup(1)).value()
|
|
&& all_day.getMin(sCaffeineLevelStat) == F32Milligrams(0.f)
|
|
&& after_3pm.getMin(sCaffeineLevelStat) == sCaffeinePerOz * ((S32Ounces)S32TallCup(1) + (S32Ounces)S32GrandeCup(2)).value());
|
|
ensure("sample max is specific to when recording is active",
|
|
at_work.getMax(sCaffeineLevelStat) == sCaffeinePerOz * ((S32Ounces)S32TallCup(1) + (S32Ounces)S32GrandeCup(3)).value()
|
|
&& all_day.getMax(sCaffeineLevelStat) == sCaffeinePerOz * ((S32Ounces)S32TallCup(1) + (S32Ounces)S32GrandeCup(3) + (S32Ounces)S32VentiCup(1)).value()
|
|
&& after_3pm.getMax(sCaffeineLevelStat) == sCaffeinePerOz * ((S32Ounces)S32TallCup(1) + (S32Ounces)S32GrandeCup(3) + (S32Ounces)S32VentiCup(1)).value());
|
|
}
|
|
|
|
}
|