Commit e1fe42b3 authored by captainwong's avatar captainwong

logstream unittest

parent bfc76fba
......@@ -124,8 +124,9 @@ public:
typedef detail::FixedBuffer<detail::SMALL_BUFFER> Buffer;
self& operator<<(bool v) {
if (v) { buffer_.append("true", 4); }
else { buffer_.append("false", 5); }
//if (v) { buffer_.append("true ", 5); }
//else { buffer_.append("false", 5); }
buffer_.append(v ? "1" : "0", 1);
return *this;
}
......@@ -239,6 +240,10 @@ template Format::Format(const char* fmt, unsigned long long);
template Format::Format(const char* fmt, float);
template Format::Format(const char* fmt, double);
inline LogStream& operator<<(LogStream& s, const Format& fmt) {
s.append(fmt.data(), fmt.length());
return s;
}
// Format quantity n in SI units (k, M, G, T, P, E).
// The returned string is atmost 5 characters long.
......
#include "../../jlib/base/logstream.h"
#include <limits>
#include <stdint.h>
#define BOOST_TEST_MAIN
#include <boost/test/unit_test.hpp>
using namespace jlib;
using std::string;
BOOST_AUTO_TEST_CASE(testLogStreamBooleans)
{
LogStream os;
const LogStream::Buffer& buf = os.buffer();
BOOST_CHECK_EQUAL(buf.toString(), string(""));
os << true;
BOOST_CHECK_EQUAL(buf.toString(), string("1"));
os << '\n';
BOOST_CHECK_EQUAL(buf.toString(), string("1\n"));
os << false;
BOOST_CHECK_EQUAL(buf.toString(), string("1\n0"));
}
BOOST_AUTO_TEST_CASE(testLogStreamIntegers)
{
LogStream os;
const LogStream::Buffer& buf = os.buffer();
BOOST_CHECK_EQUAL(buf.toString(), string(""));
os << 1;
BOOST_CHECK_EQUAL(buf.toString(), string("1"));
os << 0;
BOOST_CHECK_EQUAL(buf.toString(), string("10"));
os << -1;
BOOST_CHECK_EQUAL(buf.toString(), string("10-1"));
os.resetBuffer();
os << 0 << " " << 123 << 'x' << 0x64;
BOOST_CHECK_EQUAL(buf.toString(), string("0 123x100"));
}
BOOST_AUTO_TEST_CASE(testLogStreamIntegerLimits)
{
LogStream os;
const LogStream::Buffer& buf = os.buffer();
os << -2147483647;
BOOST_CHECK_EQUAL(buf.toString(), string("-2147483647"));
os << static_cast<int>(-2147483647 - 1);
BOOST_CHECK_EQUAL(buf.toString(), string("-2147483647-2147483648"));
os << ' ';
os << 2147483647;
BOOST_CHECK_EQUAL(buf.toString(), string("-2147483647-2147483648 2147483647"));
os.resetBuffer();
os << std::numeric_limits<int16_t>::min();
BOOST_CHECK_EQUAL(buf.toString(), string("-32768"));
os.resetBuffer();
os << std::numeric_limits<int16_t>::max();
BOOST_CHECK_EQUAL(buf.toString(), string("32767"));
os.resetBuffer();
os << std::numeric_limits<uint16_t>::min();
BOOST_CHECK_EQUAL(buf.toString(), string("0"));
os.resetBuffer();
os << std::numeric_limits<uint16_t>::max();
BOOST_CHECK_EQUAL(buf.toString(), string("65535"));
os.resetBuffer();
os << std::numeric_limits<int32_t>::min();
BOOST_CHECK_EQUAL(buf.toString(), string("-2147483648"));
os.resetBuffer();
os << std::numeric_limits<int32_t>::max();
BOOST_CHECK_EQUAL(buf.toString(), string("2147483647"));
os.resetBuffer();
os << std::numeric_limits<uint32_t>::min();
BOOST_CHECK_EQUAL(buf.toString(), string("0"));
os.resetBuffer();
os << std::numeric_limits<uint32_t>::max();
BOOST_CHECK_EQUAL(buf.toString(), string("4294967295"));
os.resetBuffer();
os << std::numeric_limits<int64_t>::min();
BOOST_CHECK_EQUAL(buf.toString(), string("-9223372036854775808"));
os.resetBuffer();
os << std::numeric_limits<int64_t>::max();
BOOST_CHECK_EQUAL(buf.toString(), string("9223372036854775807"));
os.resetBuffer();
os << std::numeric_limits<uint64_t>::min();
BOOST_CHECK_EQUAL(buf.toString(), string("0"));
os.resetBuffer();
os << std::numeric_limits<uint64_t>::max();
BOOST_CHECK_EQUAL(buf.toString(), string("18446744073709551615"));
os.resetBuffer();
int16_t a = 0;
int32_t b = 0;
int64_t c = 0;
os << a;
os << b;
os << c;
BOOST_CHECK_EQUAL(buf.toString(), string("000"));
}
BOOST_AUTO_TEST_CASE(testLogStreamFloats)
{
LogStream os;
const LogStream::Buffer& buf = os.buffer();
os << 0.0;
BOOST_CHECK_EQUAL(buf.toString(), string("0"));
os.resetBuffer();
os << 1.0;
BOOST_CHECK_EQUAL(buf.toString(), string("1"));
os.resetBuffer();
os << 0.1;
BOOST_CHECK_EQUAL(buf.toString(), string("0.1"));
os.resetBuffer();
os << 0.05;
BOOST_CHECK_EQUAL(buf.toString(), string("0.05"));
os.resetBuffer();
os << 0.15;
BOOST_CHECK_EQUAL(buf.toString(), string("0.15"));
os.resetBuffer();
double a = 0.1;
os << a;
BOOST_CHECK_EQUAL(buf.toString(), string("0.1"));
os.resetBuffer();
double b = 0.05;
os << b;
BOOST_CHECK_EQUAL(buf.toString(), string("0.05"));
os.resetBuffer();
double c = 0.15;
os << c;
BOOST_CHECK_EQUAL(buf.toString(), string("0.15"));
os.resetBuffer();
os << a + b;
BOOST_CHECK_EQUAL(buf.toString(), string("0.15"));
os.resetBuffer();
BOOST_CHECK(a + b != c);
os << 1.23456789;
BOOST_CHECK_EQUAL(buf.toString(), string("1.23456789"));
os.resetBuffer();
os << 1.234567;
BOOST_CHECK_EQUAL(buf.toString(), string("1.234567"));
os.resetBuffer();
os << -123.456;
BOOST_CHECK_EQUAL(buf.toString(), string("-123.456"));
os.resetBuffer();
}
BOOST_AUTO_TEST_CASE(testLogStreamVoid)
{
LogStream os;
const LogStream::Buffer& buf = os.buffer();
os << static_cast<void*>(0);
BOOST_CHECK_EQUAL(buf.toString(), string("0x0"));
os.resetBuffer();
os << reinterpret_cast<void*>(8888);
BOOST_CHECK_EQUAL(buf.toString(), string("0x22B8"));
os.resetBuffer();
}
BOOST_AUTO_TEST_CASE(testLogStreamStrings)
{
LogStream os;
const LogStream::Buffer& buf = os.buffer();
os << "Hello ";
BOOST_CHECK_EQUAL(buf.toString(), string("Hello "));
string chenshuo = "Shuo Chen";
os << chenshuo;
BOOST_CHECK_EQUAL(buf.toString(), string("Hello Shuo Chen"));
}
BOOST_AUTO_TEST_CASE(testLogStreamFmts)
{
LogStream os;
const LogStream::Buffer& buf = os.buffer();
os << Format("%4d", 1);
BOOST_CHECK_EQUAL(buf.toString(), string(" 1"));
os.resetBuffer();
os << Format("%4.2f", 1.2);
BOOST_CHECK_EQUAL(buf.toString(), string("1.20"));
os.resetBuffer();
os << Format("%4.2f", 1.2) << Format("%4d", 43);
BOOST_CHECK_EQUAL(buf.toString(), string("1.20 43"));
os.resetBuffer();
}
BOOST_AUTO_TEST_CASE(testLogStreamLong)
{
LogStream os;
const LogStream::Buffer& buf = os.buffer();
for (int i = 0; i < 399; ++i) {
os << "123456789 ";
BOOST_CHECK_EQUAL(buf.length(), 10 * (i + 1));
BOOST_CHECK_EQUAL(buf.avail(), 4096 - 10 * (i + 1));
}
os << "abcdefghi ";
BOOST_CHECK_EQUAL(buf.length(), 4000);
BOOST_CHECK_EQUAL(buf.avail(), 96);
os << "abcdefghi";
BOOST_CHECK_EQUAL(buf.length(), 4009);
BOOST_CHECK_EQUAL(buf.avail(), 87);
}
BOOST_AUTO_TEST_CASE(testFormatSI)
{
BOOST_CHECK_EQUAL(formatSI(0), string("0"));
BOOST_CHECK_EQUAL(formatSI(999), string("999"));
BOOST_CHECK_EQUAL(formatSI(1000), string("1.00k"));
BOOST_CHECK_EQUAL(formatSI(9990), string("9.99k"));
BOOST_CHECK_EQUAL(formatSI(9994), string("9.99k"));
BOOST_CHECK_EQUAL(formatSI(9995), string("10.0k"));
BOOST_CHECK_EQUAL(formatSI(10000), string("10.0k"));
BOOST_CHECK_EQUAL(formatSI(10049), string("10.0k"));
BOOST_CHECK_EQUAL(formatSI(10050), string("10.1k"));
BOOST_CHECK_EQUAL(formatSI(99900), string("99.9k"));
BOOST_CHECK_EQUAL(formatSI(99949), string("99.9k"));
BOOST_CHECK_EQUAL(formatSI(99950), string("100k"));
BOOST_CHECK_EQUAL(formatSI(100499), string("100k"));
// FIXME:
// BOOST_CHECK_EQUAL(formatSI(100500), string("101k"));
BOOST_CHECK_EQUAL(formatSI(100501), string("101k"));
BOOST_CHECK_EQUAL(formatSI(999499), string("999k"));
BOOST_CHECK_EQUAL(formatSI(999500), string("1.00M"));
BOOST_CHECK_EQUAL(formatSI(1004999), string("1.00M"));
// BOOST_CHECK_EQUAL(formatSI(1005000), string("1.01M"));
BOOST_CHECK_EQUAL(formatSI(1005001), string("1.01M"));
BOOST_CHECK_EQUAL(formatSI(INT64_MAX), string("9.22E"));
}
BOOST_AUTO_TEST_CASE(testFormatIEC)
{
BOOST_CHECK_EQUAL(formatIEC(0), string("0"));
BOOST_CHECK_EQUAL(formatIEC(1023), string("1023"));
BOOST_CHECK_EQUAL(formatIEC(1024), string("1.00Ki"));
BOOST_CHECK_EQUAL(formatIEC(10234), string("9.99Ki"));
BOOST_CHECK_EQUAL(formatIEC(10235), string("10.0Ki"));
BOOST_CHECK_EQUAL(formatIEC(10240), string("10.0Ki"));
BOOST_CHECK_EQUAL(formatIEC(10291), string("10.0Ki"));
BOOST_CHECK_EQUAL(formatIEC(10292), string("10.1Ki"));
BOOST_CHECK_EQUAL(formatIEC(102348), string("99.9Ki"));
BOOST_CHECK_EQUAL(formatIEC(102349), string("100Ki"));
BOOST_CHECK_EQUAL(formatIEC(102912), string("101Ki"));
BOOST_CHECK_EQUAL(formatIEC(102913), string("101Ki"));
BOOST_CHECK_EQUAL(formatIEC(1022976), string("999Ki"));
BOOST_CHECK_EQUAL(formatIEC(1047552), string("1023Ki"));
BOOST_CHECK_EQUAL(formatIEC(1047961), string("1023Ki"));
BOOST_CHECK_EQUAL(formatIEC(1048063), string("1023Ki"));
BOOST_CHECK_EQUAL(formatIEC(1048064), string("1.00Mi"));
BOOST_CHECK_EQUAL(formatIEC(1048576), string("1.00Mi"));
BOOST_CHECK_EQUAL(formatIEC(10480517), string("9.99Mi"));
BOOST_CHECK_EQUAL(formatIEC(10480518), string("10.0Mi"));
BOOST_CHECK_EQUAL(formatIEC(INT64_MAX), string("8.00Ei"));
}
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<VCProjectVersion>16.0</VCProjectVersion>
<ProjectGuid>{B8F4AB37-A049-443B-8B75-4D0C831B234B}</ProjectGuid>
<RootNamespace>logstreamunittest</RootNamespace>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="Shared">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup />
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<SDLCheck>true</SDLCheck>
<ConformanceMode>true</ConformanceMode>
<AdditionalIncludeDirectories>$(BOOST);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<AdditionalLibraryDirectories>$(BOOST)\stage\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<SDLCheck>true</SDLCheck>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="logstream_unittest.cpp" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Source Files">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
<Filter Include="Header Files">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hh;hpp;hxx;hm;inl;inc;ipp;xsd</Extensions>
</Filter>
<Filter Include="Resource Files">
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="logstream_unittest.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
</Project>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup />
</Project>
\ No newline at end of file
......@@ -243,6 +243,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test_logstream", "test_logs
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test_atomic", "test_atomic\test_atomic.vcxproj", "{58DA7AE8-9975-4F28-A1BF-44A7C01B6F7F}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "logstream_unittest", "logstream_unittest\logstream_unittest.vcxproj", "{B8F4AB37-A049-443B-8B75-4D0C831B234B}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x64 = Debug|x64
......@@ -417,6 +419,14 @@ Global
{58DA7AE8-9975-4F28-A1BF-44A7C01B6F7F}.Release|x64.Build.0 = Release|x64
{58DA7AE8-9975-4F28-A1BF-44A7C01B6F7F}.Release|x86.ActiveCfg = Release|Win32
{58DA7AE8-9975-4F28-A1BF-44A7C01B6F7F}.Release|x86.Build.0 = Release|Win32
{B8F4AB37-A049-443B-8B75-4D0C831B234B}.Debug|x64.ActiveCfg = Debug|x64
{B8F4AB37-A049-443B-8B75-4D0C831B234B}.Debug|x64.Build.0 = Debug|x64
{B8F4AB37-A049-443B-8B75-4D0C831B234B}.Debug|x86.ActiveCfg = Debug|Win32
{B8F4AB37-A049-443B-8B75-4D0C831B234B}.Debug|x86.Build.0 = Debug|Win32
{B8F4AB37-A049-443B-8B75-4D0C831B234B}.Release|x64.ActiveCfg = Release|x64
{B8F4AB37-A049-443B-8B75-4D0C831B234B}.Release|x64.Build.0 = Release|x64
{B8F4AB37-A049-443B-8B75-4D0C831B234B}.Release|x86.ActiveCfg = Release|Win32
{B8F4AB37-A049-443B-8B75-4D0C831B234B}.Release|x86.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
......@@ -464,6 +474,7 @@ Global
{2252B5D4-2D13-4F02-8008-AB2E0D38A154} = {D9BC4E5B-7E8F-4C86-BF15-CCB75CBC256F}
{7DC0D84B-7F96-4BB9-9B8A-D86B7B031E61} = {D9BC4E5B-7E8F-4C86-BF15-CCB75CBC256F}
{58DA7AE8-9975-4F28-A1BF-44A7C01B6F7F} = {D9BC4E5B-7E8F-4C86-BF15-CCB75CBC256F}
{B8F4AB37-A049-443B-8B75-4D0C831B234B} = {D9BC4E5B-7E8F-4C86-BF15-CCB75CBC256F}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {A8EBEA58-739C-4DED-99C0-239779F57D5D}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment